SURFEX v8.1
General documentation of Surfex
sfx_oasis_define.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 sfx_oasis_define (IO, U, HPROGRAM,KNPTS,KPARAL)
7 !###################################################
8 !
9 !!**** *SFX_OASIS_DEFINE* - Definitions for exchange of coupling fields
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!** METHOD
15 !! ------
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! B. Decharme *Meteo France*
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 10/2013
35 !! 10/2016 B. Decharme : bug surface/groundwater coupling
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 !
44 USE modd_surf_atm_n, ONLY : surf_atm_t
45 !
46 USE modd_surf_par, ONLY : nundef
47 !
50 !
51 USE modi_get_luout
52 USE modi_abor1_sfx
53 USE modi_sfx_oasis_check
54 !
55 #ifdef CPLOASIS
56 USE mod_oasis
57 #endif
58 !
59 USE yomhook ,ONLY : lhook, dr_hook
60 USE parkind1 ,ONLY : jprb
61 !
62 IMPLICIT NONE
63 !
64 !* 0.1 Declarations of arguments
65 ! -------------------------
66 !
67 !
68 TYPE(isba_options_t), INTENT(INOUT) :: IO
69 TYPE(surf_atm_t), INTENT(INOUT) :: U
70 !
71  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
72 INTEGER, INTENT(IN) :: KNPTS ! Number of grid point on this proc
73 INTEGER, DIMENSION(:), INTENT(IN) :: KPARAL
74 !
75 !
76 !* 0.2 Declarations of local parameter
77 ! -------------------------------
78 !
79 INTEGER, DIMENSION(2), PARAMETER :: IVAR_NODIMS = (/1,1/) ! rank and number of bundles in coupling field
80 !
81 !
82 !* 0.3 Declarations of local variables
83 ! -------------------------------
84 !
85 INTEGER, DIMENSION(2) :: IVAR_SHAPE ! indexes for the coupling field local dimension
86 !
87 INTEGER :: IPART_ID ! Local partition ID
88 INTEGER :: IERR ! Error info
89 !
90 INTEGER :: ILUOUT, IFLAG
91 !
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
93 !
94 !-------------------------------------------------------------------------------
95 !
96 IF (lhook) CALL dr_hook('SFX_OASIS_DEFINE',0,zhook_handle)
97 !
98 !-------------------------------------------------------------------------------
99 #ifdef CPLOASIS
100 !-------------------------------------------------------------------------------
101 !
102 !
103 !* 0. Initialize :
104 ! ------------
105 !
106  CALL get_luout(hprogram,iluout)
107 !
108  CALL sfx_oasis_check(io, u, iluout)
109 !
110 !-------------------------------------------------------------------------------
111 !
112 !* 1. Define parallel partitions:
113 ! ---------------------------
114 !
115  CALL oasis_def_partition(ipart_id,kparal(:),ierr)
116 !
117 IF(ierr/=oasis_ok)THEN
118  WRITE(iluout,*)'SFX_OASIS_DEFINE: OASIS def partition problem, err = ',ierr
119  CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def partition problem')
120 ENDIF
121 !
122 !-------------------------------------------------------------------------------
123 !
124 !* 2. Coupling fields shape :
125 ! -----------------------
126 !
127 ivar_shape(1)= 1
128 ivar_shape(2)= knpts
129 !
130 !-------------------------------------------------------------------------------
131 !
132 !* 3. Sea variables for Surfex - Oasis coupling :
133 ! -------------------------------------------
134 !
135 IF(lcpl_sea)THEN
136 !
137 ! Sea output fields
138 !
139  IF(len_trim(csea_fwsu)/=0)THEN
140  CALL oasis_def_var(nsea_fwsu_id,csea_fwsu,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
141  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea zonal wind stress')
142  ELSE
144  ENDIF
145 !
146  IF(len_trim(csea_fwsv)/=0)THEN
147  CALL oasis_def_var(nsea_fwsv_id,csea_fwsv,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
148  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea meridian wind stress')
149  ELSE
151  ENDIF
152 !
153  IF(len_trim(csea_heat)/=0)THEN
154  CALL oasis_def_var(nsea_heat_id,csea_heat,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
155  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Non solar net heat flux')
156  ELSE
158  ENDIF
159 !
160  IF(len_trim(csea_snet)/=0)THEN
161  CALL oasis_def_var(nsea_snet_id,csea_snet,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
162  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Solar net heat')
163  ELSE
165  ENDIF
166 !
167  IF(len_trim(csea_wind)/=0)THEN
168  CALL oasis_def_var(nsea_wind_id,csea_wind,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
169  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea 10m wind speed')
170  ELSE
172  ENDIF
173 !
174  IF(len_trim(csea_fwsm)/=0)THEN
175  CALL oasis_def_var(nsea_fwsm_id,csea_fwsm,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
176  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea wind stress')
177  ELSE
179  ENDIF
180 !
181  IF(len_trim(csea_evap)/=0)THEN
182  CALL oasis_def_var(nsea_evap_id,csea_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
183  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Evaporation')
184  ELSE
186  ENDIF
187 !
188  IF(len_trim(csea_rain)/=0)THEN
189  CALL oasis_def_var(nsea_rain_id,csea_rain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
190  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Rainfall rate')
191  ELSE
193  ENDIF
194 !
195  IF(len_trim(csea_snow)/=0)THEN
196  CALL oasis_def_var(nsea_snow_id,csea_snow,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
197  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Snowfall rate')
198  ELSE
200  ENDIF
201 !
202  IF(len_trim(csea_watf)/=0)THEN
203  CALL oasis_def_var(nsea_watf_id,csea_watf,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
204  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate')
205  ELSE
207  ENDIF
208 !
209 ! Sea intput fields
210 !
211  CALL oasis_def_var(nsea_sst_id,csea_sst,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
212  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea surface temperature')
213 !
214  CALL oasis_def_var(nsea_ucu_id,csea_ucu,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
215  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea u-current stress')
216 !
217  CALL oasis_def_var(nsea_vcu_id,csea_vcu,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
218  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea v-current stress')
219 !
220 ! Particular case due to Sea-ice
221 !
222  IF(lcpl_seaice)THEN
223 !
224 ! Output fields
225 !
226  IF(len_trim(cseaice_heat)/=0)THEN
227  CALL oasis_def_var(nseaice_heat_id,cseaice_heat,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
228  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
229  ELSE
231  ENDIF
232 !
233  IF(len_trim(cseaice_snet)/=0)THEN
234  CALL oasis_def_var(nseaice_snet_id,cseaice_snet,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
235  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice solar net heat flux')
236  ELSE
238  ENDIF
239 !
240  IF(len_trim(cseaice_evap)/=0)THEN
241  CALL oasis_def_var(nseaice_evap_id,cseaice_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
242  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice sublimation')
243  ELSE
245  ENDIF
246 !
247 ! Intput fields
248 !
249  CALL oasis_def_var(nseaice_sit_id,cseaice_sit,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
250  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
251 !
252  CALL oasis_def_var(nseaice_cvr_id,cseaice_cvr,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
253  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
254 !
255  CALL oasis_def_var(nseaice_alb_id,cseaice_alb,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
256  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
257 !
258  ENDIF
259 !
260 ENDIF
261 !
262 !-------------------------------------------------------------------------------
263 !
264 !* 4. Lake variables for Surfex - Oasis coupling :
265 ! -------------------------------------------
266 !
267 IF(lcpl_lake)THEN
268 !
269 ! Output fields
270 !
271  IF(len_trim(clake_evap)/=0)THEN
272  CALL oasis_def_var(nlake_evap_id,clake_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
273  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Evaporation')
274  ELSE
276  ENDIF
277 !
278  IF(len_trim(clake_rain)/=0)THEN
279  CALL oasis_def_var(nlake_rain_id,clake_rain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
280  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Rainfall rate')
281  ELSE
283  ENDIF
284 !
285  IF(len_trim(clake_snow)/=0)THEN
286  CALL oasis_def_var(nlake_snow_id,clake_snow,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
287  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Snowfall rate')
288  ELSE
290  ENDIF
291 !
292  IF(len_trim(clake_watf)/=0)THEN
293  CALL oasis_def_var(nlake_watf_id,clake_watf,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
294  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate')
295  ELSE
297  ENDIF
298 !
299 ENDIF
300 !
301 !-------------------------------------------------------------------------------
302 !
303 !* 5. Land surface variables for Surfex - Oasis coupling :
304 ! ----------------------------------------------------
305 !
306 IF(lcpl_land)THEN
307 !
308 ! Output Surface runoff
309 !
310  CALL oasis_def_var(nrunoff_id,crunoff,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
311  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Surface runoff')
312 !
313 ! Output Calving flux
314 !
315  IF(lcpl_calving)THEN
316 !
317 ! Output Calving flux
318  CALL oasis_def_var(ncalving_id,ccalving,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
319  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Calving flux')
320 !
321  ENDIF
322 !
323 ! Output Deep drainage
324 !
325  CALL oasis_def_var(ndrain_id,cdrain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
326  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Deep drainage')
327 !
328 ! Particular case due to water table depth / surface coupling
329 !
330  IF(lcpl_gw)THEN
331 !
332 ! Input Water table depth
333  CALL oasis_def_var(nwtd_id,cwtd,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
334  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Water table depth')
335 !
336 ! Input grid-cell fraction of WTD to rise
337  CALL oasis_def_var(nfwtd_id,cfwtd,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
338  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land fraction of WTD to rise')
339 !
340  ENDIF
341 !
342 ! Particular case due to floodplains coupling
343 !
344  IF(lcpl_flood)THEN
345 !
346 ! Output Flood precip interception
347  CALL oasis_def_var(nsrcflood_id,csrcflood,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
348  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains freshwater flux')
349 !
350 ! Input floodplains fraction
351  CALL oasis_def_var(nfflood_id,cfflood,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
352  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains fraction')
353 !
354 ! Input floodplains potential infiltration
355  CALL oasis_def_var(npiflood_id,cpiflood,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
356  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains potential infiltration')
357 !
358  ENDIF
359 !
360 ENDIF
361 !
362 !-------------------------------------------------------------------------------
363 !
364 !* 6. End of declaration phase:
365 ! --------------
366 !
367  CALL oasis_enddef(ierr)
368 !
369 IF(ierr/=oasis_ok)THEN
370  WRITE(iluout,*)'SFX_OASIS_DEFINE: OASIS enddef problem, err = ',ierr
371  CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS enddef problem')
372 ENDIF
373 !
374 !-------------------------------------------------------------------------------
375 #endif
376 !-------------------------------------------------------------------------------
377 !
378 IF (lhook) CALL dr_hook('SFX_OASIS_DEFINE',1,zhook_handle)
379 !
380 !-------------------------------------------------------------------------------
381 !
382 END SUBROUTINE sfx_oasis_define
character(len=8) csea_heat
character(len=8) cseaice_heat
character(len=8) cseaice_cvr
character(len=8) cseaice_sit
character(len=8) csea_evap
character(len=8) cfwtd
character(len=8) cfflood
character(len=8) csea_vcu
subroutine sfx_oasis_check(IO, U, KLUOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
character(len=8) clake_rain
character(len=8) csea_fwsu
integer, parameter nundef
character(len=8) clake_evap
character(len=8) cseaice_snet
character(len=8) cseaice_alb
character(len=8) cwtd
character(len=8) csea_snow
character(len=8) ccalving
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine sfx_oasis_define(IO, U, HPROGRAM, KNPTS, KPARAL)
character(len=8) csea_wind
logical lhook
Definition: yomhook.F90:15
character(len=8) csea_snet
character(len=8) crunoff
character(len=8) csea_rain
character(len=8) cseaice_evap
character(len=8) cpiflood
character(len=8) csea_sst
character(len=8) csea_watf
character(len=8) clake_watf
character(len=8) csea_ucu
character(len=8) cdrain
character(len=8) clake_snow
character(len=8) csea_fwsv
character(len=8) csrcflood
character(len=8) csea_fwsm