SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_sfx_sea.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE get_sfx_sea (S, U, W, &
7  ocpl_seaice,owater, &
8  psea_fwsu,psea_fwsv,psea_heat,psea_snet, &
9  psea_wind,psea_fwsm,psea_evap,psea_rain, &
10  psea_snow,psea_watf, &
11  pseaice_heat,pseaice_snet,pseaice_evap )
12 ! ############################################################################
13 !
14 !!**** *GET_SFX_SEA* - routine to get some variables from surfex to
15 ! a oceanic general circulation model
16 !! PURPOSE
17 !! -------
18 !!
19 !!** METHOD
20 !! ------
21 !!
22 !! EXTERNAL
23 !! --------
24 !!
25 !!
26 !! IMPLICIT ARGUMENTS
27 !! ------------------
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !!
33 !! AUTHOR
34 !! ------
35 !! B. Decharme *Meteo France*
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !! Original 10/2013
40 !-------------------------------------------------------------------------------
41 !
42 !* 0. DECLARATIONS
43 ! ------------
44 !
45 !
46 USE modd_seaflux_n, ONLY : seaflux_t
47 USE modd_surf_atm_n, ONLY : surf_atm_t
48 USE modd_watflux_n, ONLY : watflux_t
49 !
50 USE modd_surf_par, ONLY : xundef
51 !
52 !
53 !
54 !
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 Declarations of arguments
63 ! -------------------------
64 !
65 !
66 TYPE(seaflux_t), INTENT(INOUT) :: s
67 TYPE(surf_atm_t), INTENT(INOUT) :: u
68 TYPE(watflux_t), INTENT(INOUT) :: w
69 !
70 LOGICAL, INTENT(IN) :: ocpl_seaice ! sea-ice / ocean key
71 LOGICAL, INTENT(IN) :: owater ! water included in sea smask
72 !
73 REAL, DIMENSION(:), INTENT(OUT) :: psea_fwsu ! Cumulated zonal wind stress (Pa.s)
74 REAL, DIMENSION(:), INTENT(OUT) :: psea_fwsv ! Cumulated meridian wind stress (Pa.s)
75 REAL, DIMENSION(:), INTENT(OUT) :: psea_heat ! Cumulated Non solar net heat flux (J/m2)
76 REAL, DIMENSION(:), INTENT(OUT) :: psea_snet ! Cumulated Solar net heat flux (J/m2)
77 REAL, DIMENSION(:), INTENT(OUT) :: psea_wind ! Cumulated 10m wind speed (m)
78 REAL, DIMENSION(:), INTENT(OUT) :: psea_fwsm ! Cumulated wind stress (Pa.s)
79 REAL, DIMENSION(:), INTENT(OUT) :: psea_evap ! Cumulated Evaporation (kg/m2)
80 REAL, DIMENSION(:), INTENT(OUT) :: psea_rain ! Cumulated Rainfall rate (kg/m2)
81 REAL, DIMENSION(:), INTENT(OUT) :: psea_snow ! Cumulated Snowfall rate (kg/m2)
82 REAL, DIMENSION(:), INTENT(OUT) :: psea_watf ! Cumulated Net water flux (kg/m2)
83 !
84 REAL, DIMENSION(:), INTENT(OUT) :: pseaice_heat ! Cumulated Sea-ice non solar net heat flux (J/m2)
85 REAL, DIMENSION(:), INTENT(OUT) :: pseaice_snet ! Cumulated Sea-ice solar net heat flux (J/m2)
86 REAL, DIMENSION(:), INTENT(OUT) :: pseaice_evap ! Cumulated Sea-ice sublimation (kg/m2)
87 !
88 !* 0.2 Declarations of local variables
89 ! -------------------------------
90 !
91 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zwind
92 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zfwsu
93 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zfwsv
94 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zsnet
95 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zheat
96 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zevap
97 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zrain
98 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zsnow
99 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zfwsm
100 !
101 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zsnet_ice
102 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zheat_ice
103 REAL, DIMENSION(SIZE(PSEA_HEAT)) :: zevap_ice
104 !
105 REAL(KIND=JPRB) :: zhook_handle
106 !
107 !-------------------------------------------------------------------------------
108 IF (lhook) CALL dr_hook('GET_SFX_SEA',0,zhook_handle)
109 !-------------------------------------------------------------------------------
110 !
111 !* 1.0 Initialization
112 ! --------------
113 !
114 psea_fwsu(:) = xundef
115 psea_fwsv(:) = xundef
116 psea_heat(:) = xundef
117 psea_snet(:) = xundef
118 psea_wind(:) = xundef
119 psea_fwsm(:) = xundef
120 psea_evap(:) = xundef
121 psea_rain(:) = xundef
122 psea_snow(:) = xundef
123 psea_watf(:) = xundef
124 !
125 pseaice_heat(:) = xundef
126 pseaice_snet(:) = xundef
127 pseaice_evap(:) = xundef
128 !
129 zfwsu(:) = xundef
130 zfwsv(:) = xundef
131 zheat(:) = xundef
132 zsnet(:) = xundef
133 zwind(:) = xundef
134 zfwsm(:) = xundef
135 zevap(:) = xundef
136 zrain(:) = xundef
137 zsnow(:) = xundef
138 !
139 zheat_ice(:) = xundef
140 zsnet_ice(:) = xundef
141 zevap_ice(:) = xundef
142 !
143 !* 2.0 Get variable over sea
144 ! ---------------------
145 !
146 IF(u%NSIZE_SEA>0)THEN
147 !
148  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_WIND(:),psea_wind(:),xundef)
149  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_FWSU(:),psea_fwsu(:),xundef)
150  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_FWSV(:),psea_fwsv(:),xundef)
151  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_SNET(:),psea_snet(:),xundef)
152  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_HEAT(:),psea_heat(:),xundef)
153  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_EVAP(:),psea_evap(:),xundef)
154  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_RAIN(:),psea_rain(:),xundef)
155  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_SNOW(:),psea_snow(:),xundef)
156  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEA_FWSM(:),psea_fwsm(:),xundef)
157  s%XCPL_SEA_WIND(:) = 0.0
158  s%XCPL_SEA_EVAP(:) = 0.0
159  s%XCPL_SEA_HEAT(:) = 0.0
160  s%XCPL_SEA_SNET(:) = 0.0
161  s%XCPL_SEA_FWSU(:) = 0.0
162  s%XCPL_SEA_FWSV(:) = 0.0
163  s%XCPL_SEA_RAIN(:) = 0.0
164  s%XCPL_SEA_SNOW(:) = 0.0
165  s%XCPL_SEA_FWSM(:) = 0.0
166 !
167  IF (ocpl_seaice) THEN
168  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEAICE_SNET(:),pseaice_snet(:),xundef)
169  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEAICE_HEAT(:),pseaice_heat(:),xundef)
170  CALL unpack_same_rank(u%NR_SEA(:),s%XCPL_SEAICE_EVAP(:),pseaice_evap(:),xundef)
171  s%XCPL_SEAICE_SNET(:) = 0.0
172  s%XCPL_SEAICE_EVAP(:) = 0.0
173  s%XCPL_SEAICE_HEAT(:) = 0.0
174  ENDIF
175 !
176 ENDIF
177 !
178 !* 3.0 Get variable over water without Flake
179 ! -------------------------------------
180 !
181 IF (owater.AND.u%NSIZE_WATER>0) THEN
182 !
183  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_WIND(:),zwind(:),xundef)
184  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_FWSU(:),zfwsu(:),xundef)
185  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_FWSV(:),zfwsv(:),xundef)
186  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_SNET(:),zsnet(:),xundef)
187  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_HEAT(:),zheat(:),xundef)
188  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_EVAP(:),zevap(:),xundef)
189  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_RAIN(:),zrain(:),xundef)
190  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_SNOW(:),zsnow(:),xundef)
191  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATER_FWSM(:),zfwsm(:),xundef)
192 !
193  WHERE(u%XWATER(:)>0.0)
194  psea_wind(:) = (u%XSEA(:)*psea_wind(:)+u%XWATER(:)*zwind(:))/(u%XSEA(:)+u%XWATER(:))
195  psea_fwsu(:) = (u%XSEA(:)*psea_fwsu(:)+u%XWATER(:)*zfwsu(:))/(u%XSEA(:)+u%XWATER(:))
196  psea_fwsv(:) = (u%XSEA(:)*psea_fwsv(:)+u%XWATER(:)*zfwsv(:))/(u%XSEA(:)+u%XWATER(:))
197  psea_snet(:) = (u%XSEA(:)*psea_snet(:)+u%XWATER(:)*zsnet(:))/(u%XSEA(:)+u%XWATER(:))
198  psea_heat(:) = (u%XSEA(:)*psea_heat(:)+u%XWATER(:)*zheat(:))/(u%XSEA(:)+u%XWATER(:))
199  psea_evap(:) = (u%XSEA(:)*psea_evap(:)+u%XWATER(:)*zevap(:))/(u%XSEA(:)+u%XWATER(:))
200  psea_rain(:) = (u%XSEA(:)*psea_rain(:)+u%XWATER(:)*zrain(:))/(u%XSEA(:)+u%XWATER(:))
201  psea_snow(:) = (u%XSEA(:)*psea_snow(:)+u%XWATER(:)*zsnow(:))/(u%XSEA(:)+u%XWATER(:))
202  psea_fwsm(:) = (u%XSEA(:)*psea_fwsm(:)+u%XWATER(:)*zfwsm(:))/(u%XSEA(:)+u%XWATER(:))
203  ENDWHERE
204 !
205  w%XCPL_WATER_WIND(:) = 0.0
206  w%XCPL_WATER_EVAP(:) = 0.0
207  w%XCPL_WATER_HEAT(:) = 0.0
208  w%XCPL_WATER_SNET(:) = 0.0
209  w%XCPL_WATER_FWSU(:) = 0.0
210  w%XCPL_WATER_FWSV(:) = 0.0
211  w%XCPL_WATER_RAIN(:) = 0.0
212  w%XCPL_WATER_SNOW(:) = 0.0
213  w%XCPL_WATER_FWSM(:) = 0.0
214 !
215  IF (ocpl_seaice) THEN
216  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATERICE_SNET(:),zsnet_ice(:),xundef)
217  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATERICE_HEAT(:),zheat_ice(:),xundef)
218  CALL unpack_same_rank(u%NR_WATER(:),w%XCPL_WATERICE_EVAP(:),zevap_ice(:),xundef)
219  WHERE(u%XWATER(:)>0.0)
220  pseaice_snet(:) = (u%XSEA(:)*pseaice_snet(:)+u%XWATER(:)*zsnet_ice(:))/(u%XSEA(:)+u%XWATER(:))
221  pseaice_heat(:) = (u%XSEA(:)*pseaice_heat(:)+u%XWATER(:)*zheat_ice(:))/(u%XSEA(:)+u%XWATER(:))
222  pseaice_evap(:) = (u%XSEA(:)*pseaice_evap(:)+u%XWATER(:)*zevap_ice(:))/(u%XSEA(:)+u%XWATER(:))
223  ENDWHERE
224  w%XCPL_WATERICE_SNET(:) = 0.0
225  w%XCPL_WATERICE_EVAP(:) = 0.0
226  w%XCPL_WATERICE_HEAT(:) = 0.0
227  ENDIF
228 !
229 ENDIF
230 !
231 !* 4.0 Net water flux
232 ! -----------------------
233 !
234 IF(u%NSIZE_SEA>0)THEN
235 !
236  psea_watf(:) = psea_rain(:) + psea_snow(:) - psea_evap(:)
237 !
238 ENDIF
239 !-------------------------------------------------------------------------------
240 IF (lhook) CALL dr_hook('GET_SFX_SEA',1,zhook_handle)
241 !-------------------------------------------------------------------------------
242 !
243 END SUBROUTINE get_sfx_sea
subroutine get_sfx_sea(S, U, W, OCPL_SEAICE, OWATER, PSEA_FWSU, PSEA_FWSV, PSEA_HEAT, PSEA_SNET, PSEA_WIND, PSEA_FWSM, PSEA_EVAP, PSEA_RAIN, PSEA_SNOW, PSEA_WATF, PSEAICE_HEAT, PSEAICE_SNET, PSEAICE_EVAP)
Definition: get_sfx_sea.F90:6