SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 (I, U, &
7  hprogram,knpts,kparal)
8 !###################################################
9 !
10 !!**** *SFX_OASIS_DEFINE* - Definitions for exchange of coupling fields
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! B. Decharme *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 10/2013
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 !
43 USE modd_isba_n, ONLY : isba_t
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_t), INTENT(INOUT) :: i
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(i, u, &
109  iluout)
110 !
111 !-------------------------------------------------------------------------------
112 !
113 !* 1. Define parallel partitions:
114 ! ---------------------------
115 !
116  CALL oasis_def_partition(ipart_id,kparal(:),ierr)
117 !
118 IF(ierr/=oasis_ok)THEN
119  WRITE(iluout,*)'SFX_OASIS_DEFINE: OASIS def partition problem, err = ',ierr
120  CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def partition problem')
121 ENDIF
122 !
123 !-------------------------------------------------------------------------------
124 !
125 !* 2. Coupling fields shape :
126 ! -----------------------
127 !
128 ivar_shape(1)= 1
129 ivar_shape(2)= knpts
130 !
131 !-------------------------------------------------------------------------------
132 !
133 !* 3. Sea variables for Surfex - Oasis coupling :
134 ! -------------------------------------------
135 !
136 IF(lcpl_sea)THEN
137 !
138 ! Sea output fields
139 !
140  IF(len_trim(csea_fwsu)/=0)THEN
141  CALL oasis_def_var(nsea_fwsu_id,csea_fwsu,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
142  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea zonal wind stress')
143  ELSE
144  nsea_fwsu_id=nundef
145  ENDIF
146 !
147  IF(len_trim(csea_fwsv)/=0)THEN
148  CALL oasis_def_var(nsea_fwsv_id,csea_fwsv,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
149  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea meridian wind stress')
150  ELSE
151  nsea_fwsv_id=nundef
152  ENDIF
153 !
154  IF(len_trim(csea_heat)/=0)THEN
155  CALL oasis_def_var(nsea_heat_id,csea_heat,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
156  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Non solar net heat flux')
157  ELSE
158  nsea_heat_id=nundef
159  ENDIF
160 !
161  IF(len_trim(csea_snet)/=0)THEN
162  CALL oasis_def_var(nsea_snet_id,csea_snet,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
163  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Solar net heat')
164  ELSE
165  nsea_snet_id=nundef
166  ENDIF
167 !
168  IF(len_trim(csea_wind)/=0)THEN
169  CALL oasis_def_var(nsea_wind_id,csea_wind,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
170  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea 10m wind speed')
171  ELSE
172  nsea_wind_id=nundef
173  ENDIF
174 !
175  IF(len_trim(csea_fwsm)/=0)THEN
176  CALL oasis_def_var(nsea_fwsm_id,csea_fwsm,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
177  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea wind stress')
178  ELSE
179  nsea_fwsm_id=nundef
180  ENDIF
181 !
182  IF(len_trim(csea_evap)/=0)THEN
183  CALL oasis_def_var(nsea_evap_id,csea_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
184  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Evaporation')
185  ELSE
186  nsea_evap_id=nundef
187  ENDIF
188 !
189  IF(len_trim(csea_rain)/=0)THEN
190  CALL oasis_def_var(nsea_rain_id,csea_rain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
191  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Rainfall rate')
192  ELSE
193  nsea_rain_id=nundef
194  ENDIF
195 !
196  IF(len_trim(csea_snow)/=0)THEN
197  CALL oasis_def_var(nsea_snow_id,csea_snow,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
198  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea Snowfall rate')
199  ELSE
200  nsea_snow_id=nundef
201  ENDIF
202 !
203  IF(len_trim(csea_watf)/=0)THEN
204  CALL oasis_def_var(nsea_watf_id,csea_watf,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
205  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate')
206  ELSE
207  nsea_watf_id=nundef
208  ENDIF
209 !
210 ! Sea intput fields
211 !
212  CALL oasis_def_var(nsea_sst_id,csea_sst,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
213  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea surface temperature')
214 !
215  CALL oasis_def_var(nsea_ucu_id,csea_ucu,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
216  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea u-current stress')
217 !
218  CALL oasis_def_var(nsea_vcu_id,csea_vcu,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
219  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea v-current stress')
220 !
221 ! Particular case due to Sea-ice
222 !
223  IF(lcpl_seaice)THEN
224 !
225 ! Output fields
226 !
227  IF(len_trim(cseaice_heat)/=0)THEN
228  CALL oasis_def_var(nseaice_heat_id,cseaice_heat,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
229  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
230  ELSE
231  nseaice_heat_id=nundef
232  ENDIF
233 !
234  IF(len_trim(cseaice_snet)/=0)THEN
235  CALL oasis_def_var(nseaice_snet_id,cseaice_snet,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
236  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice solar net heat flux')
237  ELSE
238  nseaice_snet_id=nundef
239  ENDIF
240 !
241  IF(len_trim(cseaice_evap)/=0)THEN
242  CALL oasis_def_var(nseaice_evap_id,cseaice_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
243  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice sublimation')
244  ELSE
245  nseaice_evap_id=nundef
246  ENDIF
247 !
248 ! Intput fields
249 !
250  CALL oasis_def_var(nseaice_sit_id,cseaice_sit,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
251  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
252 !
253  CALL oasis_def_var(nseaice_cvr_id,cseaice_cvr,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
254  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
255 !
256  CALL oasis_def_var(nseaice_alb_id,cseaice_alb,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
257  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat')
258 !
259  ENDIF
260 !
261 ENDIF
262 !
263 !-------------------------------------------------------------------------------
264 !
265 !* 4. Lake variables for Surfex - Oasis coupling :
266 ! -------------------------------------------
267 !
268 IF(lcpl_lake)THEN
269 !
270 ! Output fields
271 !
272  IF(len_trim(clake_evap)/=0)THEN
273  CALL oasis_def_var(nlake_evap_id,clake_evap,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
274  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Evaporation')
275  ELSE
276  nlake_evap_id=nundef
277  ENDIF
278 !
279  IF(len_trim(clake_rain)/=0)THEN
280  CALL oasis_def_var(nlake_rain_id,clake_rain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
281  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Rainfall rate')
282  ELSE
283  nlake_rain_id=nundef
284  ENDIF
285 !
286  IF(len_trim(clake_snow)/=0)THEN
287  CALL oasis_def_var(nlake_snow_id,clake_snow,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
288  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for lake Snowfall rate')
289  ELSE
290  nlake_snow_id=nundef
291  ENDIF
292 !
293  IF(len_trim(clake_watf)/=0)THEN
294  CALL oasis_def_var(nlake_watf_id,clake_watf,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
295  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate')
296  ELSE
297  nlake_watf_id=nundef
298  ENDIF
299 !
300 ENDIF
301 !
302 !-------------------------------------------------------------------------------
303 !
304 !* 5. Land surface variables for Surfex - Oasis coupling :
305 ! ----------------------------------------------------
306 !
307 IF(lcpl_land)THEN
308 !
309 ! Output Surface runoff
310 !
311  CALL oasis_def_var(nrunoff_id,crunoff,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
312  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Surface runoff')
313 !
314 ! Output Calving flux
315 !
316  IF(lcpl_calving)THEN
317 !
318 ! Output Calving flux
319  CALL oasis_def_var(ncalving_id,ccalving,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
320  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Calving flux')
321 !
322  ENDIF
323 !
324 ! Output Deep drainage
325 !
326  CALL oasis_def_var(ndrain_id,cdrain,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
327  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Deep drainage')
328 !
329 ! Particular case due to water table depth / surface coupling
330 !
331  IF(lcpl_gw)THEN
332 !
333 ! Output groundwater recharge
334  CALL oasis_def_var(nrecharge_id,crecharge,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
335  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land groundwater recharge')
336 !
337 ! Input Water table depth
338  CALL oasis_def_var(nwtd_id,cwtd,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
339  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Water table depth')
340 !
341 ! Input grid-cell fraction of WTD to rise
342  CALL oasis_def_var(nfwtd_id,cfwtd,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
343  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land fraction of WTD to rise')
344 !
345  ENDIF
346 !
347 ! Particular case due to floodplains coupling
348 !
349  IF(lcpl_flood)THEN
350 !
351 ! Output Flood precip interception
352  CALL oasis_def_var(nsrcflood_id,csrcflood,ipart_id,ivar_nodims,oasis_out,ivar_shape,oasis_double,ierr)
353  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains freshwater flux')
354 !
355 ! Input floodplains fraction
356  CALL oasis_def_var(nfflood_id,cfflood,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
357  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains fraction')
358 !
359 ! Input floodplains potential infiltration
360  CALL oasis_def_var(npiflood_id,cpiflood,ipart_id,ivar_nodims,oasis_in,ivar_shape,oasis_double,ierr)
361  IF(ierr/=oasis_ok) CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains potential infiltration')
362 !
363  ENDIF
364 !
365 ENDIF
366 !
367 !-------------------------------------------------------------------------------
368 !
369 !* 6. End of declaration phase:
370 ! --------------
371 !
372  CALL oasis_enddef(ierr)
373 !
374 IF(ierr/=oasis_ok)THEN
375  WRITE(iluout,*)'SFX_OASIS_DEFINE: OASIS enddef problem, err = ',ierr
376  CALL abor1_sfx('SFX_OASIS_DEFINE: OASIS enddef problem')
377 ENDIF
378 !
379 !-------------------------------------------------------------------------------
380 #endif
381 !-------------------------------------------------------------------------------
382 !
383 IF (lhook) CALL dr_hook('SFX_OASIS_DEFINE',1,zhook_handle)
384 !
385 !-------------------------------------------------------------------------------
386 !
387 END SUBROUTINE sfx_oasis_define
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine sfx_oasis_check(I, U, KLUOUT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine sfx_oasis_define(I, U, HPROGRAM, KNPTS, KPARAL)