SURFEX v8.1
General documentation of Surfex
sfx_oasis_read_nam.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_read_nam(HPROGRAM,PTSTEP_SURF,HINIT)
7 !##################################################################
8 !
9 !!**** *SFX_OASIS_READ_NAM* - routine to read the configuration for SFX-OASIS coupling
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 05/2008
35 !! 10/2016 B. Decharme : bug surface/groundwater coupling
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
42 !
43 USE modd_sfx_oasis, ONLY : loasis, xruntime, &
47 !
48 USE mode_pos_surf
49 !
50 USE modi_get_luout
51 USE modi_open_namelist
52 USE modi_close_namelist
53 !
54 USE modi_abor1_sfx
55 !
56 USE yomhook ,ONLY : lhook, dr_hook
57 USE parkind1 ,ONLY : jprb
58 !
59 IMPLICIT NONE
60 !
61 !* 0.1 Declarations of arguments
62 ! -------------------------
63 !
64  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
65 REAL, INTENT(IN) :: PTSTEP_SURF ! Surfex time step
66  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HINIT ! choice of fields to initialize
67 !
68 !* 0.2 Declarations of local parameter
69 ! -------------------------------
70 !
71 INTEGER, PARAMETER :: KIN = 1
72 INTEGER, PARAMETER :: KOUT = 0
73  CHARACTER(LEN=5), PARAMETER :: YLAND = 'land'
74  CHARACTER(LEN=5), PARAMETER :: YLAKE = 'lake'
75  CHARACTER(LEN=5), PARAMETER :: YSEA = 'ocean'
76 !
77 !* 0.3 Declarations of local variables
78 ! -------------------------------
79 !
80 LOGICAL :: GFOUND ! Return code when searching namelist
81 INTEGER :: ILUOUT ! Listing id
82 INTEGER :: ILUNAM ! logical unit of namelist file
83  CHARACTER(LEN=20) :: YKEY
84  CHARACTER(LEN=50) :: YCOMMENT
85  CHARACTER(LEN=3) :: YINIT
86 !
87 REAL(KIND=JPRB) :: ZHOOK_HANDLE
88 !
89 !-------------------------------------------------------------------------------
90 !
91 IF (lhook) CALL dr_hook('SFX_OASIS_READ_NAM',0,zhook_handle)
92 !
93 !
94 !* 0. Initialize :
95 ! ------------
96 !
97 lcpl_land = .false.
98 lcpl_gw = .false.
99 lcpl_flood = .false.
100 lcpl_calving = .false.
101 lcpl_lake = .false.
102 lcpl_sea = .false.
103 lcpl_seaice = .false.
104 !
105 IF(.NOT.loasis)THEN
106  IF (lhook) CALL dr_hook('SFX_OASIS_READ_NAM',1,zhook_handle)
107  RETURN
108 ENDIF
109 !
110 yinit = 'ALL'
111 IF(PRESENT(hinit))yinit=hinit
112 !
113  CALL get_luout(hprogram,iluout)
114 !
115 !* 1. Read namelists and check status :
116 ! --------------------------------
117 !
118  CALL open_namelist(hprogram,ilunam)
119 !
120  CALL posnam(ilunam,'NAM_SFX_LAND_CPL',gfound,iluout)
121 !
122 IF (gfound) THEN
123  READ(unit=ilunam,nml=nam_sfx_land_cpl)
124 ELSE
125  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
126  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
127  WRITE(iluout,*)'NAM_SFX_LAND_CPL not found : Surfex land not coupled with river routing'
128  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
129  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
130 ENDIF
131 !
132  CALL posnam(ilunam,'NAM_SFX_SEA_CPL',gfound,iluout)
133 !
134 IF (gfound) THEN
135  READ(unit=ilunam,nml=nam_sfx_sea_cpl)
136 ELSE
137  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
138  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
139  WRITE(iluout,*)'NAM_SFX_SEA_CPL not found : Surfex sea not coupled with ocean model'
140  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
141  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
142 ENDIF
143 !
144  CALL posnam(ilunam,'NAM_SFX_LAKE_CPL',gfound,iluout)
145 !
146 IF (gfound) THEN
147  READ(unit=ilunam,nml=nam_sfx_lake_cpl)
148 ELSE
149  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
150  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
151  WRITE(iluout,*)'NAM_SFX_LAKE_CPL not found : Surfex lake not coupled with ocean model'
152  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
153  WRITE(iluout,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
154 ENDIF
155 !
156  CALL close_namelist(hprogram,ilunam)
157 !
158 IF(xtstep_cpl_land>0.0)lcpl_land=.true.
159 IF(xtstep_cpl_lake>0.0)lcpl_lake=.true.
160 IF(xtstep_cpl_sea >0.0)lcpl_sea =.true.
161 !
162 IF(.NOT.lcpl_land.AND..NOT.lcpl_sea)THEN
163  CALL abor1_sfx('SFX_OASIS_READ_NAM: OASIS USED BUT NAMELIST NOT FOUND')
164 ENDIF
165 !
166 !-------------------------------------------------------------------------------
167 !
168 !* 2. Check time step consistency
169 ! ---------------------------
170 !
171 IF(yinit/='PRE')THEN
172  IF(mod(xruntime,ptstep_surf)/=0.)THEN
173  WRITE(iluout,*)'! MOD(XRUNTIME,XTSTEP_SURF)/=0 !!!'
174  WRITE(iluout,*)'! XTSTEP_SURF (model timestep) must be a multiple of $RUNTIME in oasis namcouple !!!'
175  CALL abor1_sfx('SFX_OASIS_READ_NAM: XTSTEP_SURF must be a multiple of $RUNTIME in oasis namcouple !!!')
176  ENDIF
177 ENDIF
178 !
179 !-------------------------------------------------------------------------------
180 !
181 !* 3. Check status for Land surface fields
182 ! ------------------------------------
183 !
184 IF(lcpl_land)THEN
185 !
186  IF(yinit/='PRE')THEN
187  IF(mod(xtstep_cpl_land,ptstep_surf)/=0.)THEN
188  WRITE(iluout,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_LAND) /= 0 !'
189  WRITE(iluout,*)'XTSTEP_SURF =',ptstep_surf,'XTSTEP_CPL_LAND = ',xtstep_cpl_land
190  IF(ptstep_surf>xtstep_cpl_land) &
191  WRITE(iluout,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_LAND !'
192  CALL abor1_sfx('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_LAND not consistent !!!')
193  ENDIF
194  ENDIF
195 !
196 ! Land Output variable
197 !
198  ykey ='CRUNOFF'
199  ycomment='Surface runoff'
200  CALL check_field(crunoff,ykey,ycomment,yland,kout)
201 !
202  ykey ='CDRAIN'
203  ycomment='Deep drainage'
204  CALL check_field(cdrain,ykey,ycomment,yland,kout)
205 !
206 ! Particular case due to calving case
207 !
208  IF(len_trim(ccalving)>0)THEN
209  lcpl_calving = .true.
210  ENDIF
211 !
212  IF(lcpl_calving)THEN
213  ykey ='CCALVING'
214  ycomment='Calving flux'
215  CALL check_field(ccalving,ykey,ycomment,yland,kout)
216  ENDIF
217 !
218 ! Particular case due to water table depth / surface coupling
219 !
220  IF(len_trim(cwtd)>0.OR.len_trim(cfwtd)>0)THEN
221  lcpl_gw = .true.
222  ENDIF
223 !
224  IF(lcpl_gw)THEN
225 !
226 ! Input variable
227 !
228  ykey ='CWTD'
229  ycomment='Water table depth'
230  CALL check_field(cwtd,ykey,ycomment,yland,kin)
231 !
232  ykey ='CFWTD'
233  ycomment='Fraction of WTD to rise'
234  CALL check_field(cfwtd,ykey,ycomment,yland,kin)
235 !
236  ENDIF
237 !
238 ! Particular case due to floodplains coupling
239 !
240  IF(len_trim(csrcflood)>0.OR.len_trim(cfflood)>0.OR.len_trim(cpiflood)>0)THEN
241  lcpl_flood = .true.
242  ENDIF
243 !
244  IF(lcpl_flood)THEN
245 !
246 ! Output variable
247 !
248  ykey ='CSRCFLOOD'
249  ycomment='flood freshwater flux'
250  CALL check_field(csrcflood,ykey,ycomment,yland,kout)
251 !
252 ! Input variable
253 !
254  ykey ='CFFLOOD'
255  ycomment='Flood fraction'
256  CALL check_field(cfflood,ykey,ycomment,yland,kin)
257 !
258  ykey ='CPIFLOOD'
259  ycomment='Flood potential infiltration'
260  CALL check_field(cpiflood,ykey,ycomment,yland,kin)
261 !
262  ENDIF
263 !
264 ENDIF
265 !
266 !-------------------------------------------------------------------------------
267 !
268 !* 4. Check status for Land surface fields
269 ! ------------------------------------
270 !
271 IF(lcpl_lake)THEN
272 !
273  IF(yinit/='PRE')THEN
274  IF(mod(xtstep_cpl_lake,ptstep_surf)/=0.)THEN
275  WRITE(iluout,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_LAKE) /= 0 !'
276  WRITE(iluout,*)'XTSTEP_SURF =',ptstep_surf,'XTSTEP_CPL_LAKE = ',xtstep_cpl_lake
277  IF(ptstep_surf>xtstep_cpl_lake) &
278  WRITE(iluout,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_LAKE !'
279  CALL abor1_sfx('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_LAKE not consistent !!!')
280  ENDIF
281  ENDIF
282 !
283 ! Output variables
284 !
285  ykey ='CLAKE_EVAP'
286  ycomment='Evaporation rate'
287  CALL check_field(clake_evap,ykey,ycomment,ylake,kout)
288 !
289  ykey ='CLAKE_RAIN'
290  ycomment='Rainfall rate'
291  CALL check_field(clake_rain,ykey,ycomment,ylake,kout)
292 !
293  ykey ='CLAKE_SNOW'
294  ycomment='Snowfall rate'
295  CALL check_field(clake_snow,ykey,ycomment,ylake,kout)
296 !
297  ykey ='CLAKE_WATF'
298  ycomment='Freshwater flux'
299  CALL check_field(clake_watf,ykey,ycomment,ylake,kout)
300 !
301 ENDIF
302 !
303 !-------------------------------------------------------------------------------
304 !
305 !* 5. Check status for Sea fields
306 ! ---------------------------
307 !
308 IF(lcpl_sea)THEN
309 !
310  IF(yinit/='PRE')THEN
311  IF(mod(xtstep_cpl_sea,ptstep_surf)/=0.)THEN
312  WRITE(iluout,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_SEA) /= 0 !'
313  WRITE(iluout,*)'XTSTEP_SURF =',ptstep_surf,'XTSTEP_CPL_SEA = ',xtstep_cpl_sea
314  IF(ptstep_surf>xtstep_cpl_sea) &
315  WRITE(iluout,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_SEA !'
316  CALL abor1_sfx('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_SEA not consistent !!!')
317  ENDIF
318  ENDIF
319 !
320 ! Sea Output variables
321 !
322  ykey ='CSEA_FWSU'
323  ycomment='zonal wind stress'
324  CALL check_field(csea_fwsu,ykey,ycomment,ysea,kout)
325 !
326  ykey ='CSEA_FWSV'
327  ycomment='meridian wind stress'
328  CALL check_field(csea_fwsv,ykey,ycomment,ysea,kout)
329 !
330  ykey ='CSEA_HEAT'
331  ycomment='Non solar net heat flux'
332  CALL check_field(csea_heat,ykey,ycomment,ysea,kout)
333 !
334  ykey ='CSEA_SNET'
335  ycomment='Solar net heat flux'
336  CALL check_field(csea_snet,ykey,ycomment,ysea,kout)
337 !
338  ykey ='CSEA_WIND'
339  ycomment='module of 10m wind speed'
340  CALL check_field(csea_wind,ykey,ycomment,ysea,kout)
341 !
342  ykey ='CSEA_FWSM'
343  ycomment='module of wind stress'
344  CALL check_field(csea_fwsm,ykey,ycomment,ysea,kout)
345 !
346  ykey ='CSEA_EVAP'
347  ycomment='Evaporation rate'
348  CALL check_field(csea_evap,ykey,ycomment,ysea,kout)
349 !
350  ykey ='CSEA_RAIN'
351  ycomment='Rainfall rate'
352  CALL check_field(csea_rain,ykey,ycomment,ysea,kout)
353 !
354  ykey ='CSEA_SNOW'
355  ycomment='Snowfall rate'
356  CALL check_field(csea_snow,ykey,ycomment,ysea,kout)
357 !
358  ykey ='CSEA_WATF'
359  ycomment='Freshwater flux'
360  CALL check_field(csea_watf,ykey,ycomment,ysea,kout)
361 !
362 ! Sea Input variables
363 !
364  ykey ='CSEA_SST'
365  ycomment='Sea surface temperature'
366  CALL check_field(csea_sst,ykey,ycomment,ysea,kin)
367 !
368  ykey ='CSEA_UCU'
369  ycomment='Sea u-current stress'
370  CALL check_field(csea_ucu,ykey,ycomment,ysea,kin)
371 !
372  ykey ='CSEA_VCU'
373  ycomment='Sea v-current stress'
374  CALL check_field(csea_vcu,ykey,ycomment,ysea,kin)
375 !
376 ! Sea-ice fluxes
377 !
378  IF(len_trim(cseaice_heat)>0.OR.len_trim(cseaice_snet)>0.OR. &
379  len_trim(cseaice_evap)>0.OR.len_trim(cseaice_sit )>0.OR. &
380  len_trim(cseaice_cvr )>0.OR.len_trim(cseaice_alb )>0 )THEN
381  lcpl_seaice=.true.
382  ENDIF
383 !
384  IF(lcpl_seaice)THEN
385 !
386 ! Sea-ice Output variables
387 !
388  ykey ='CSEAICE_HEAT'
389  ycomment='Sea-ice non solar net heat flux'
390  CALL check_field(cseaice_heat,ykey,ycomment,ysea,kout)
391 !
392  ykey ='CSEAICE_SNET'
393  ycomment='Sea-ice solar net heat flux'
394  CALL check_field(cseaice_snet,ykey,ycomment,ysea,kout)
395 !
396  ykey ='CSEAICE_EVAP'
397  ycomment='Sea-ice sublimation'
398  CALL check_field(cseaice_evap,ykey,ycomment,ysea,kout)
399 !
400 ! Sea-ice Input variables
401 !
402  ykey ='CSEAICE_SIT'
403  ycomment='Sea-ice temperature'
404  CALL check_field(cseaice_sit,ykey,ycomment,ysea,kin)
405 !
406  ykey ='CSEAICE_CVR'
407  ycomment='Sea-ice cover'
408  CALL check_field(cseaice_cvr,ykey,ycomment,ysea,kin)
409 !
410  ykey ='CSEAICE_ALB'
411  ycomment='Sea-ice albedo'
412  CALL check_field(cseaice_alb,ykey,ycomment,ysea,kin)
413 !
414  ENDIF
415 !
416 ENDIF
417 !
418 IF (lhook) CALL dr_hook('SFX_OASIS_READ_NAM',1,zhook_handle)
419 !
420 !-------------------------------------------------------------------------------
421 CONTAINS
422 !-------------------------------------------------------------------------------
423 !
424 SUBROUTINE check_field(HFIELD,HKEY,HCOMMENT,HTYP,KID)
425 !
426 IMPLICIT NONE
427 !
428  CHARACTER(LEN=*), INTENT(IN) :: HFIELD
429  CHARACTER(LEN=*), INTENT(IN) :: HKEY
430  CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT
431  CHARACTER(LEN=*), INTENT(IN) :: HTYP
432 INTEGER, INTENT(IN) :: KID
433 !
434  CHARACTER(LEN=20) :: YWORK
435  CHARACTER(LEN=20) :: YNAMELIST
436  CHARACTER(LEN=128) :: YCOMMENT1
437  CHARACTER(LEN=128) :: YCOMMENT2
438 LOGICAL :: LSTOP
439 !
440 REAL(KIND=JPRB) :: ZHOOK_HANDLE
441 !
442 IF (lhook) CALL dr_hook('SFX_OASIS_READ_NAM:CHECK_FIELD',0,zhook_handle)
443 !
444 IF(len_trim(hfield)==0)THEN
445 !
446  IF(kid==0)THEN
447  ywork=trim(htyp)//' - SFX'
448  ELSE
449  ywork='SFX - '//trim(htyp)
450  ENDIF
451 !
452  SELECT CASE (htyp)
453  CASE(yland)
454  ynamelist='NAM_SFX_LAND_CPL'
455  CASE(ysea)
456  ynamelist='NAM_SFX_SEA_CPL'
457  CASE(ylake)
458  ynamelist='NAM_SFX_LAKE_CPL'
459  CASE DEFAULT
460  CALL abor1_sfx('SFX_OASIS_READ_NAM: TYPE NOT SUPPORTED OR IMPLEMENTD : '//trim(htyp))
461  END SELECT
462 !
463  ycomment1= 'SFX_OASIS_READ_NAM: '//trim(hcomment)//' is not done for '//trim(ywork)//' coupling'
464  ycomment2= 'SFX_OASIS_READ_NAM: Namelist key '//trim(hkey)//' is not in '//trim(ynamelist)
465 !
466  WRITE(iluout,*)trim(ycomment1)
467  WRITE(iluout,*)trim(ycomment2)
468 !
469 ! For oceanic coupling do not stop the model if a field from surfex to ocean is
470 ! not done because many particular case can be used
471 !
472  IF(kid==0.AND.htyp/=yland)THEN
473  lstop=.false.
474  ELSE
475  lstop=.true.
476  ENDIF
477 !
478  IF(lstop)THEN
479  CALL abor1_sfx(ycomment1)
480  ENDIF
481 !
482 ENDIF
483 !
484 IF (lhook) CALL dr_hook('SFX_OASIS_READ_NAM:CHECK_FIELD',1,zhook_handle)
485 !
486 END SUBROUTINE check_field
487 !
488 !-------------------------------------------------------------------------------
489 !
490 END SUBROUTINE sfx_oasis_read_nam
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
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
subroutine sfx_oasis_read_nam(HPROGRAM, PTSTEP_SURF, HINIT)
character(len=8) cfwtd
character(len=8) cfflood
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
character(len=8) csea_vcu
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
character(len=8) clake_evap
subroutine close_namelist(HPROGRAM, KLUNAM)
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
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
subroutine check_field(HFIELD, HKEY, HCOMMENT, HTYP, KID)
character(len=8) cdrain
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
character(len=8) clake_snow
character(len=8) csea_fwsv
character(len=8) csrcflood
character(len=8) csea_fwsm