SURFEX v8.1
General documentation of Surfex
trip_oasis_read_nam.F90
Go to the documentation of this file.
1 !#########
2 SUBROUTINE trip_oasis_read_nam(KLISTING,PRUNTIME)
3 !#######################################################
4 !
5 !!**** *TRIP_OASIS_READ_NAM* - routine to read the configuration for TRIP-OASIS coupling
6 !!
7 !! PURPOSE
8 !! -------
9 !!
10 !!** METHOD
11 !! ------
12 !!
13 !! EXTERNAL
14 !! --------
15 !!
16 !!
17 !! IMPLICIT ARGUMENTS
18 !! ------------------
19 !!
20 !! REFERENCE
21 !! ---------
22 !!
23 !!
24 !! AUTHOR
25 !! ------
26 !! B. Decharme *Meteo France*
27 !!
28 !! MODIFICATIONS
29 !! -------------
30 !! Original 05/2008
31 !! B. Decharme 10/2016 bug surface/groundwater coupling
32 !-------------------------------------------------------------------------------
33 !
34 !* 0. DECLARATIONS
35 ! ------------
36 !
37 USE modn_trip_run, ONLY : xtstep_run
38 !
39 USE modn_trip, ONLY : lflood, cgroundw
40 !
42 USE modd_trip_oasis, ONLY : lcpl_land, lcpl_sea, &
45 !
46 USE modi_trip_posnam
47 USE modi_abort_trip
48 USE modi_open_trip_namelist
49 USE modi_close_trip_namelist
50 !
51 USE yomhook ,ONLY : lhook, dr_hook
52 USE parkind1 ,ONLY : jprb
53 !
54 IMPLICIT NONE
55 !
56 !* 0.1 Declarations of arguments
57 ! -------------------------
58 !
59 INTEGER, INTENT(IN) :: KLISTING
60 REAL, INTENT(IN), OPTIONAL :: PRUNTIME
61 !
62 !
63 !* 0.2 Declarations of local parameter
64 ! -------------------------------
65 !
66 INTEGER, PARAMETER :: KIN = 1
67 INTEGER, PARAMETER :: KOUT = 0
68  CHARACTER(LEN=5), PARAMETER :: YLAND = 'land'
69  CHARACTER(LEN=5), PARAMETER :: YSEA = 'ocean'
70 !
71 !
72 !* 0.3 Declarations of local variables
73 ! -------------------------------
74 !
75 LOGICAL :: GFOUND ! Return code when searching namelist
76 INTEGER :: INAM ! logical unit of namelist file
77  CHARACTER(LEN=20) :: YKEY
78  CHARACTER(LEN=50) :: YCOMMENT
79 !
80 REAL(KIND=JPRB) :: ZHOOK_HANDLE
81 !
82 !-------------------------------------------------------------------------------
83 IF (lhook) CALL dr_hook('TRIP_OASIS_READ_NAM',0,zhook_handle)
84 !
85 !
86 !* 1. Read namelists and check status :
87 ! --------------------------------
88 !
89 lcpl_land = .false.
90 lcpl_calving = .false.
91 lcpl_gw = .false.
92 lcpl_flood = .false.
93 lcpl_sea = .false.
94 lcpl_calvsea = .false.
95 !
96  CALL open_trip_namelist(inam)
97 !
98  CALL trip_posnam(inam,'NAM_TRIP_LAND_CPL',gfound,klisting)
99 !
100 IF (gfound) THEN
101  READ(unit=inam,nml=nam_trip_land_cpl)
102 ELSE
103  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
104  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
105  WRITE(klisting,*)'NAM_TRIP_LAND_CPL not found : TRIP not coupled with land surface'
106  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
107  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
108 ENDIF
109 !
110  CALL trip_posnam(inam,'NAM_TRIP_SEA_CPL',gfound,klisting)
111 !
112 IF (gfound) THEN
113  READ(unit=inam,nml=nam_trip_sea_cpl)
114 ELSE
115  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
116  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
117  WRITE(klisting,*)'NAM_TRIP_SEA_CPL not found : TRIP not coupled with oceanic model'
118  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
119  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
120 ENDIF
121 !
122  CALL close_trip_namelist(inam)
123 !
124 IF(xtstep_cpl_land>0.0)lcpl_land=.true.
125 IF(xtstep_cpl_sea >0.0)lcpl_sea =.true.
126 !
127 IF(.NOT.lcpl_land.AND..NOT.lcpl_sea)THEN
128  CALL abort_trip('TRIP_OASIS_READ_NAM: OASIS USED BUT NAMELIST NOT FOUND')
129 ENDIF
130 !
131 !-------------------------------------------------------------------------------
132 !
133 !* 2. Check status for required field and time step consistency
134 ! ---------------------------------------------------------
135 !
136 ! * Land surface variables for Trip - Oasis coupling
137 !
138 IF(lcpl_land)THEN
139 !
140  IF(PRESENT(pruntime))THEN
143  WRITE(klisting,*)'! XTSTEP_RUN is superiror to XTSTEP_CPL_LAND !'
144  WRITE(klisting,*)'! Applied solution : XTSTEP_RUN = XTSTEP_CPL_LAND !'
145  ELSEIF(mod(xtstep_cpl_land,xtstep_run)/=0.)THEN
146  WRITE(klisting,*)'! XTSTEP_RUN and XTSTEP_CPL_LAND are not good !!!'
147  WRITE(klisting,*)'! XTSTEP_RUN =',xtstep_run,'XTSTEP_CPL_LAND =',xtstep_cpl_land
148  CALL abort_trip('TRIP_OASIS_READ_NAM: XTSTEP_RUN and XTSTEP_CPL_LAND are not good !!!')
149  ENDIF
150  ENDIF
151 !
152 ! Land Input variable
153 !
154  ykey ='CRUNOFF'
155  ycomment='Surface runoff'
156  CALL check_trip_field(crunoff,ykey,ycomment,yland,kin)
157 !
158  ykey ='CDRAIN'
159  ycomment='Deep drainage'
160  CALL check_trip_field(cdrain,ykey,ycomment,yland,kin)
161 !
162 ! Particular case due to calving case
163 !
164  IF(len_trim(ccalving)>0)THEN
165 !
166  lcpl_calving = .true.
167 !
168  ykey ='CCALVING'
169  ycomment='Calving flux from land glacier'
170  CALL check_trip_field(ccalving,ykey,ycomment,yland,kin)
171 !
172  ENDIF
173 !
174 ! Particular case due to groundwater scheme
175 !
176  IF(len_trim(cwtd)>0.OR.len_trim(cfwtd)>0)THEN
177  lcpl_gw = .true.
178  ENDIF
179 !
180  IF(lcpl_gw)THEN
181 !
182 ! Output variable
183 !
184  ykey ='CWTD'
185  ycomment='Water table depth'
186  CALL check_trip_field(cwtd,ykey,ycomment,yland,kout)
187 !
188  ykey ='CFWTD'
189  ycomment='Fraction of WTD to rise'
190  CALL check_trip_field(cfwtd,ykey,ycomment,yland,kout)
191 !
192  IF(cgroundw/='DIF')THEN
193  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
194  WRITE(klisting,*)'!!! Groundwater/surface coupling is asked !!!'
195  WRITE(klisting,*)'!!! But CGROUNDW /= DIF in NAM_TRIP !!!'
196  WRITE(klisting,*)'!!! Please check your TRIP_OPTIONS.nam !!!'
197  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
198  CALL abort_trip('TRIP_OASIS_READ_NAM: Groundwater/surface coupling but not groundwater scheme')
199  ENDIF
200 !
201  ENDIF
202 !
203 ! Particular case due to floodplains
204 !
205  IF(len_trim(csrcflood)>0.OR.len_trim(cfflood)>0.OR.len_trim(cpiflood)>0)THEN
206  lcpl_flood = .true.
207  ENDIF
208 !
209  IF(lcpl_flood)THEN
210 !
211 ! Input variable
212 !
213  ykey ='CSRCFLOOD'
214  ycomment='flood freshwater flux'
215  CALL check_trip_field(csrcflood,ykey,ycomment,yland,kin)
216 !
217 ! Output variable
218 !
219  ykey ='CFFLOOD'
220  ycomment='Flood fraction'
221  CALL check_trip_field(cfflood,ykey,ycomment,yland,kout)
222 !
223  ykey ='CPIFLOOD'
224  ycomment='Flood potential infiltration'
225  CALL check_trip_field(cpiflood,ykey,ycomment,yland,kout)
226 !
227  IF(.NOT.lflood)THEN
228  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
229  WRITE(klisting,*)'!!! Floodplains coupling with LSM is asked !!!'
230  WRITE(klisting,*)'!!! But LFLOOD = FALSE in NAM_TRIP !!!'
231  WRITE(klisting,*)'!!! Please check your TRIP_OPTIONS.nam !!!'
232  WRITE(klisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
233  CALL abort_trip('TRIP_OASIS_READ_NAM: Floodplains coupling but not Floodplains scheme')
234  ENDIF
235 !
236  ENDIF
237 !
238 ENDIF
239 !
240 IF(PRESENT(pruntime))THEN
241  IF(mod(pruntime,xtstep_run)/=0.)THEN
242  WRITE(klisting,*)'! MOD(PRUNTIME,XTSTEP_RUN)/=0 !!!'
243  WRITE(klisting,*)'! XTSTEP_RUN must be a multiple of $RUNTIME in oasis namcouple !!!'
244  WRITE(klisting,*)'XTSTEP_RUN =',xtstep_run,'$RUNTIME =',pruntime
245  CALL abort_trip('TRIP_OASIS_READ_NAM: XTSTEP_RUN must be a multiple of $RUNTIME in oasis namcouple !!!')
246  ENDIF
247 ENDIF
248 !
249 ! * Sea variables for Trip - Oasis coupling
250 !
251 IF(lcpl_sea)THEN
252 !
253  IF(lcpl_land.AND.mod(xtstep_cpl_sea,xtstep_cpl_land)/=0.)THEN
254  WRITE(klisting,*)'! XTSTEP_CPL_LAND and XTSTEP_CPL_SEA are not good !!!'
255  WRITE(klisting,*)'! XTSTEP_CPL_LAND =',xtstep_cpl_land,'XTSTEP_CPL_SEA =',xtstep_cpl_sea
257  WRITE(klisting,*)'! XTSTEP_CPL_LAND is superiror to XTSTEP_CPL_SEA !'
258  CALL abort_trip('TRIP_OASIS_READ_NAM: XTSTEP_CPL_LAND and XTSTEP_CPL_SEA are not good !!!')
259  ENDIF
260 !
261  IF(PRESENT(pruntime))THEN
262  IF(mod(xtstep_cpl_sea,xtstep_run)/=0.)THEN
263  WRITE(klisting,*)'! XTSTEP_RUN and XTSTEP_CPL_SEA are not good !!!'
264  WRITE(klisting,*)'! XTSTEP_RUN =',xtstep_run,'XTSTEP_CPL_SEA =',xtstep_cpl_sea
266  WRITE(klisting,*)'! XTSTEP_RUN is superiror to XTSTEP_CPL_SEA !'
267  CALL abort_trip('TRIP_OASIS_READ_NAM: XTSTEP_RUN and XTSTEP_CPL_SEA are not good !!!')
268  ENDIF
269  ENDIF
270 !
271 ! Sea Output variables
272 !
273  ykey ='CRIVDIS'
274  ycomment='River discharge'
275  CALL check_trip_field(crivdis,ykey,ycomment,ysea,kout)
276 !
277 ! Particular case due to calving case
278 !
279  IF(len_trim(ccalvgre)>0.OR.len_trim(ccalvant)>0)THEN
280  lcpl_calvsea=.true.
281  ENDIF
282 !
283  IF(lcpl_calvsea)THEN
284 !
285 ! Output variable
286 !
287  ykey ='CCALVGRE'
288  ycomment='Calving flux over greenland'
289  CALL check_trip_field(ccalvgre,ykey,ycomment,ysea,kout)
290 !
291  ykey ='CCALVANT'
292  ycomment='Calving flux over antarctica'
293  CALL check_trip_field(ccalvant,ykey,ycomment,ysea,kout)
294 !
295  ENDIF
296 !
297 ENDIF
298 !
299 IF (lhook) CALL dr_hook('TRIP_OASIS_READ_NAM',1,zhook_handle)
300 !
301 !-------------------------------------------------------------------------------
302  CONTAINS
303 !-------------------------------------------------------------------------------
304 !
305 SUBROUTINE check_trip_field(HFIELD,HKEY,HCOMMENT,HTYP,KID)
306 !
307 IMPLICIT NONE
308 !
309  CHARACTER(LEN=*), INTENT(IN) :: HFIELD
310  CHARACTER(LEN=*), INTENT(IN) :: HKEY
311  CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT
312  CHARACTER(LEN=*), INTENT(IN) :: HTYP
313 INTEGER, INTENT(IN) :: KID
314 !
315  CHARACTER(LEN=20) :: YWORK
316  CHARACTER(LEN=20) :: YNAMELIST
317  CHARACTER(LEN=128) :: YCOMMENT1
318  CHARACTER(LEN=128) :: YCOMMENT2
319 !
320 REAL(KIND=JPRB) :: ZHOOK_HANDLE
321 !
322 IF (lhook) CALL dr_hook('TRIP_OASIS_READ_NAM:CHECK_TRIP_FIELD',0,zhook_handle)
323 !
324 IF(len_trim(hfield)==0)THEN
325 !
326  IF(kid==0)THEN
327  ywork=trim(htyp)//' - TRIP'
328  ELSE
329  ywork='TRIP - '//trim(htyp)
330  ENDIF
331 !
332  SELECT CASE (htyp)
333  CASE('land')
334  ynamelist='NAM_TRIP_LAND_CPL'
335  CASE('ocean')
336  ynamelist='NAM_TRIP_SEA_CPL'
337  CASE DEFAULT
338  CALL abort_trip('TRIP_OASIS_READ_NAM: TYPE NOT SUPPORTED OR IMPLEMENTD : '//trim(htyp))
339  END SELECT
340 !
341  ycomment1= 'TRIP_OASIS_READ_NAM: '//trim(hcomment)//' is required by '//trim(ywork)//' coupling'
342  ycomment2= 'TRIP_OASIS_READ_NAM: Namelist key '//trim(hkey)//' is not in '//trim(ynamelist)
343 !
344  WRITE(klisting,*)trim(ycomment1)
345  WRITE(klisting,*)trim(ycomment2)
346  CALL abort_trip(ycomment1)
347 !
348 ENDIF
349 !
350 IF (lhook) CALL dr_hook('TRIP_OASIS_READ_NAM:CHECK_TRIP_FIELD',1,zhook_handle)
351 !
352 END SUBROUTINE check_trip_field
353 !
354 !-------------------------------------------------------------------------------
355 !
356 END SUBROUTINE trip_oasis_read_nam
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
logical lflood
Definition: modn_trip.F90:62
subroutine check_trip_field(HFIELD, HKEY, HCOMMENT, HTYP, KID)
character(len=8) cwtd
character(len=8) crivdis
character(len=8) cdrain
subroutine trip_oasis_read_nam(KLISTING, PRUNTIME)
integer, parameter jprb
Definition: parkind1.F90:32
character(len=8) ccalvant
character(len=8) crunoff
character(len=3) cgroundw
Definition: modn_trip.F90:49
character(len=8) cpiflood
logical lhook
Definition: yomhook.F90:15
subroutine close_trip_namelist(KLUNAM)
character(len=8) ccalvgre
character(len=8) ccalving
subroutine open_trip_namelist(KLUNAM)
subroutine abort_trip(YTEXT)
Definition: abort_trip.F90:3
character(len=8) csrcflood
character(len=8) cfwtd
character(len=8) cfflood
subroutine trip_posnam(KULNAM, HDNAML, OFOUND, KLISTING)
Definition: trip_posnam.F90:3