SURFEX v8.1
General documentation of Surfex
trip_oasis_init.F90
Go to the documentation of this file.
1 SUBROUTINE trip_oasis_init(OOASIS,OXIOS,KLOCAL_COMM,PRUNTIME,LPREP)
2 !!
3 !!
4 !! PURPOSE
5 !! --------
6 !!
7 !! Initialize jointly coupled mode and XIOS communication
8 !!
9 !!
10 !! METHOD
11 !! ------
12 !!
13 !! If XIOS is used, it will init Oasis
14 !! OASIS-MCT interface must be initialized before any DR_HOOK call
15 !!
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !! XIOS library
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !! S. Valcke et al., 2013: OASIS-MCT User Guide
26 !! CERFACS, Toulouse, France, 50 pp.
27 !! https://verc.enes.org/oasis/oasis-dedicated-user-support-1/documentation/oasis3-mct-user-guide
28 !!
29 !! Y.Meurdesoif, 2015 : XIOS ....
30 !!
31 !! AUTHOR
32 !! ------
33 !!
34 !! B. Decharme, CNRM
35 !!
36 !! MODIFICATION
37 !! --------------
38 !!
39 !! Original 10/2013
40 !! 09/2016 - S.Senesi - Add XIOS setup
41 !!
42 !-------------------------------------------------------------------------------
43 !
44 !* 0. DECLARATIONS
45 ! ------------
46 !
48 !
49 #ifdef CPLOASIS
50 USE mod_oasis
51 #endif
52 #ifdef WXIOS
53 USE xios
54 #endif
55 !
56 IMPLICIT NONE
57 !
58 !* 0.1 Declarations of arguments
59 ! -------------------------
60 !
61 LOGICAL, INTENT(OUT) :: OOASIS ! key to use OASIS
62 LOGICAL, INTENT(OUT) :: OXIOS ! key to use XIOS
63 INTEGER, INTENT(OUT) :: KLOCAL_COMM ! value of local communicator
64 REAL , INTENT(OUT), OPTIONAL :: PRUNTIME ! total simulated time (s)
65 LOGICAL, INTENT(IN), OPTIONAL :: LPREP
66 !
67 !* 0.2 Declarations of local variables
68 ! -------------------------------
69 !
70  CHARACTER(LEN=9) :: YWORD, YTIMERUN
71  CHARACTER(LEN=1000):: YLINE, YFOUND
72 INTEGER :: IERR
73 INTEGER :: ICOMP_ID
74 INTEGER :: ITIMERUN
75 LOGICAL :: GFOUND
76 !
77 !* 0.3 Declarations of namelist variables
78 ! ----------------------------------
79 !
80 LOGICAL :: GPREP
81 !
82 LOGICAL :: LOASIS ! key to use OASIS
83 LOGICAL :: LXIOS ! key to use XIOS
84 !
85 NAMELIST/nam_oasis/loasis,lxios,cmodel_name
86 !
87 !-------------------------------------------------------------------------------
88 !
89 ! ATTENTION : Do not introduce DR_HOOK in this routine
90 !
91 !* 0. Initialization:
92 ! ---------------
93 !
94 gprep = .false.
95 IF(PRESENT(lprep)) gprep = lprep
96 !
97 loasis = .false.
98 lxios = .false.
99 !
100 IF(PRESENT(pruntime)) pruntime = 0.0
101 !
102 !-------------------------------------------------------------------------------
103 !
104 !* 1. Read namelist:
105 ! --------------
106 !
107 OPEN(unit=11,file=cnamelist,action='READ',form="FORMATTED",position="REWIND",status='OLD',iostat=ierr)
108 !
109 IF (ierr /= 0) THEN
110  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
111  WRITE(*,'(2A)')'TRIP_OASIS_INIT: TRIP NAMELIST NOT FOUND: ',trim(cnamelist)
112  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
113  CALL abort
114  stop
115 ENDIF
116 !
117 READ (unit=11,nml=nam_oasis,iostat=ierr)
118 !
119  CLOSE(unit=11)
120 !
121 IF(gprep) lxios = .false.
122 !
123 !-------------------------------------------------------------------------------
124 !
125 !* 2. Put specified param for OASIS coupling
126 ! --------------------------------------
127 !
128 ooasis = loasis
129 oxios = lxios
130 !
131 IF(loasis)THEN
132 #ifdef CPLOASIS
133  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
134  WRITE(*,'(A)')'OASIS used for model : ',trim(cmodel_name)
135  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
136 #else
137  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
138  WRITE(*,'(A)')'TRIP_OASIS_INIT: When OASIS used, TRIP must be compiled with -DCPLOASIS cpp key'
139  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
140  CALL abort
141  stop
142 #endif
143 ENDIF
144 !
145 IF(lxios)THEN
146 #ifdef WXIOS
147  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
148  WRITE(*,'(A)')'XIOS used for model : ',trim(cmodel_name)
149  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
150 #else
151  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
152  WRITE(*,'(A)')'TRIP_OASIS_INIT: When XIOS used, TRIP must be compiled with -DWXIOS cpp key'
153  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
154  CALL abort
155  stop
156 #endif
157 ENDIF
158 !
159 IF (lxios) THEN
160 #ifdef WXIOS
161  CALL xios_initialize(cmodel_name,return_comm=klocal_comm)
162 #endif
163 ELSE
164 !
165  IF ( .NOT. loasis) THEN
166 
167  klocal_comm=0
168  RETURN
169 
170  ELSE
171 !
172 !-------------------------------------------------------------------------------
173 #ifdef CPLOASIS
174 !-------------------------------------------------------------------------------
175 !
176 !* 3. Setup OASIS
177 ! -----------
178 !
179  CALL oasis_init_comp(icomp_id,cmodel_name,ierr)
180 !
181  IF (ierr/=oasis_ok) THEN
182  WRITE(*,'(A)' )'TRIP : Error initializing OASIS'
183  WRITE(*,'(A,I4)')'TRIP : Return code from oasis_init_comp : ',ierr
184  CALL oasis_abort(icomp_id,cmodel_name,'TRIP_OASIS_INIT: Error initializing OASIS')
185  CALL abort
186  stop
187  ENDIF
188 !
189 !-------------------------------------------------------------------------------
190 !
191 !* 4. Get local communicator
192 ! ----------------------
193 !
194  CALL oasis_get_localcomm(klocal_comm,ierr)
195 !
196  IF (ierr/=oasis_ok) THEN
197  WRITE(*,'(A)' )'TRIP : Error getting local communicator from OASIS'
198  WRITE(*,'(A,I4)')'TRIP : Return code from oasis_get_local_comm : ',ierr
199  CALL oasis_abort(icomp_id,cmodel_name,'TRIP_OASIS_INIT: Error getting local communicator')
200  CALL abort
201  stop
202  ENDIF
203 !
204 !-------------------------------------------------------------------------------
205 #endif
206 !-------------------------------------------------------------------------------
207  ENDIF
208 ENDIF
209 !
210 IF (loasis) THEN
211  !
212  !* 5. Read total simulated time in namcouple
213  ! --------------------------------------
214  !
215  IF(.NOT.PRESENT(pruntime))THEN
216  RETURN
217  ENDIF
218  !
219  OPEN (unit=11,file ='namcouple',status='OLD',form ='FORMATTED',position="REWIND",iostat=ierr)
220  IF (ierr /= 0) THEN
221  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
222  WRITE(*,'(A)' )'TRIP : OASIS namcouple not found'
223  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
224  CALL abort
225  stop
226  ENDIF
227 !
228  ytimerun=' $RUNTIME'
229  itimerun=-1
230 !
231  DO WHILE (itimerun==-1)
232  READ (unit = 11,fmt = '(A9)',iostat=ierr) yword
233  IF(ierr/=0)THEN
234  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
235  WRITE(*,'(A)' )'TRIP : Problem $RUNTIME empty in namcouple'
236  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
237  CALL abort
238  stop
239  ENDIF
240  IF (yword==ytimerun)THEN
241  READ (unit = 11,fmt = '(A1000)',iostat=ierr) yline
242  IF(ierr/=0)THEN
243  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
244  WRITE(*,'(A)' )'TRIP : Problem looking for $RUNTIME in namcouple'
245  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
246  CALL abort
247  stop
248  ENDIF
249  CALL trip_found_timerun (yline, yfound, 1000, gfound)
250  IF (gfound) THEN
251  READ (yfound,fmt = '(I100)',iostat=ierr) itimerun
252  IF(ierr/=0)THEN
253  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
254  WRITE(*,'(A)' )'TRIP : Problem reading $RUNTIME in namcouple'
255  WRITE(*,'(2A)' )'$RUNTIME = ', trim(yfound)
256  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
257  CALL abort
258  stop
259  ENDIF
260  ENDIF
261  ENDIF
262  ENDDO
263  CLOSE(11)
264 !
265  pruntime = REAL(itimerun)
266 !
267  WRITE(*,'(A)' )'-----------------------------'
268 !
269 ENDIF
270 !
271 !-------------------------------------------------------------------------------
272  CONTAINS
273 !-------------------------------------------------------------------------------
274 !
275 SUBROUTINE trip_found_timerun(HIN, HOUT, KLEN, OFOUND)
276 !
277 IMPLICIT NONE
278 !
279 INTEGER , INTENT (IN ) :: KLEN
280  CHARACTER (LEN=*), INTENT (INOUT) :: HIN
281  CHARACTER (LEN=*), INTENT (INOUT) :: HOUT
282 LOGICAL, INTENT (OUT ) :: OFOUND
283 !
284 !* ---------------------------- Local declarations -------------------
285 !
286  CHARACTER(LEN=1), PARAMETER :: YBLANK = ' '
287  CHARACTER(LEN=1), PARAMETER :: YNADA = '#'
288 
289  CHARACTER(LEN=KLEN) :: YLINE
290  CHARACTER(LEN=KLEN) :: YWORK
291 !
292 INTEGER :: ILEN
293 INTEGER :: IERR
294 !
295 !
296 !* 1. Skip line if it is a comment
297 ! ----------------------------
298 !
299 DO WHILE (hin(1:1)==ynada)
300  READ (unit = 11, fmt = '(A9)',iostat=ierr) yline
301  IF(ierr/=0)THEN
302  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
303  WRITE(*,'(A)' )'TRIP : Problem looking for $RUNTINE line in namcouple'
304  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
305  CALL abort
306  stop
307  ENDIF
308  hin(1:klen) = yline(1:klen)
309 ENDDO
310 !
311 !* Fill HOUT with blanks
312 !
313 hout = yblank
314 !
315 !* Fill temporary string and remove leading blanks
316 !
317 ywork = adjustl(hin)
318 !
319 IF(len_trim(ywork)<=0)THEN
320  ofound = .false.
321  RETURN
322 ENDIF
323 !
324 !* Find the length of this set of characters
325 !
326 ilen = index(ywork,yblank) - 1
327 !
328 !* Copy to HOUT
329 !
330 hout(1:ilen) = ywork(1:ilen)
331 !
332 ofound = .true.
333 !
334 END SUBROUTINE trip_found_timerun
335 !
336 !-------------------------------------------------------------------------------
337 !
338 END SUBROUTINE trip_oasis_init
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine trip_oasis_init(OOASIS, OXIOS, KLOCAL_COMM, PRUNTIME, LPREP)
character(len=6) cmodel_name
subroutine trip_found_timerun(HIN, HOUT, KLEN, OFOUND)
character(len=28), parameter cnamelist
ERROR in index
Definition: ecsort_shared.h:90