SURFEX v8.1
General documentation of Surfex
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
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_sfx_sea(S, U, W, OCPL_SEAICE, OWATER,
Definition: get_sfx_sea.F90:8
logical lhook
Definition: yomhook.F90:15