SURFEX v8.1
General documentation of Surfex
sfx_oasis_init.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 SUBROUTINE sfx_oasis_init(HNAMELIST,KLOCAL_COMM,HINIT)
6 !!
7 !!
8 !! PURPOSE
9 !! --------
10 !!
11 !! Initialize coupled mode communication and XIOS I/O scheme
12 !!
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! Depending on namelist flags for Oasis and XIOS, either call :
18 !! - XIOS_INITIALIZE alone (when LXIOS and not LOASIS) , or
19 !! - OASIS_INIT_COMP (when LOASIS) and then, depending on LXIOS,
20 !! * either XIOS_INITALIZE
21 !! * or OASIS_GET_LOCAL_COMM
22 !!
23 !! Note : OASIS-MCT interface must be initialized before any DR_HOOK call
24 !!
25 !! EXTERNAL
26 !! --------
27 !!
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !! S. Valcke et al., 2013: OASIS-MCT User Guide
33 !! CERFACS, Toulouse, France, 50 pp.
34 !! https://verc.enes.org/oasis/oasis-dedicated-user-support-1/documentation/oasis3-mct-user-guide
35 !!
36 !! XIOS Reference guide - Yann Meurdesoif - 10/10/2014 -
37 !! svn co -r 515 http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0 <dir> ; cd <dir>/doc ; ....
38 !!
39 !!
40 !! AUTHOR
41 !! ------
42 !!
43 !! B. Decharme, CNRM
44 !!
45 !! MODIFICATION
46 !! --------------
47 !!
48 !! Original 10/2013
49 !! S.Sénési 08/2015 - handle XIOS
50 !! B.Decharme 09/2016 - no CALL ABORT if no namelist in Arpege
51 !!
52 !-------------------------------------------------------------------------------
53 !
54 !* 0. DECLARATIONS
55 ! ------------
56 !
58 USE modi_abor1_sfx
59 !
60 USE modd_xios , ONLY : lxios ! Should we call XIOS_INITIALIZE instead of OASIS_GET_LOCAL_COMM
61 !
62 #ifdef WXIOS
63 USE xios, ONLY : xios_initialize
64 #endif
65 !
66 #ifdef CPLOASIS
67 USE mod_oasis
68 #endif
69 !
70 IMPLICIT NONE
71 !
72 #ifdef CPLOASIS
73 include 'mpif.h'
74 #endif
75 !
76 !* 0.1 Declarations of arguments
77 ! -------------------------
78 !
79  CHARACTER(LEN=28), INTENT(IN ) :: HNAMELIST
80 INTEGER, INTENT(OUT) :: KLOCAL_COMM ! value of local communicator
81  CHARACTER(LEN=3), INTENT(IN ), OPTIONAL :: HINIT ! choice of fields to initialize
82 !
83 !* 0.2 Declarations of local variables
84 ! -------------------------------
85 !
86  CHARACTER(LEN=9) :: YWORD, YTIMERUN
87  CHARACTER(LEN=1000):: YLINE, YFOUND
88 INTEGER :: IERR, IWORK, IRANK
89 INTEGER :: ICOMP_ID
90 INTEGER :: ITIMERUN
91 LOGICAL :: GFOUND
92  CHARACTER(LEN=3) :: YINIT
93 !
94 !
95 !* 0.3 Declarations of namelist variables
96 ! ----------------------------------
97 !
98 NAMELIST/nam_oasis/loasis,cmodel_name
99 !
100 !-------------------------------------------------------------------------------
101 !
102 ! ATTENTION : Do not introduce DR_HOOK in this routine
103 !
104 !* 0. Initialization:
105 ! ---------------
106 !
107 loasis = .false.
108  cmodel_name = 'surfex'
109 xruntime = 0.0
110 !
111 yinit = 'ALL'
112 IF(PRESENT(hinit))yinit=hinit
113 !
114 !-------------------------------------------------------------------------------
115 !
116 !* 1. Read namelist:
117 ! --------------
118 !
119 IF(len_trim(hnamelist)/=0)THEN
120 !
121  OPEN(unit=11,file=hnamelist,action='READ',form="FORMATTED",position="REWIND",status='OLD',iostat=ierr)
122 !
123  IF (ierr /= 0) THEN
124  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
125  WRITE(*,'(A)' )' WARNING WARNING WARNING WARNING WARNING '
126  WRITE(*,'(A)' )' --------------------------------------- '
127  WRITE(*,'(2A)')'SFX_OASIS_INIT: SFX NAMELIST FILE NOT FOUND: ',trim(hnamelist)
128  WRITE(*,'(A)' )'------------------------------------------- '
129  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
130 #ifndef SFX_ARO
131  CALL abort
132  stop
133 #endif
134  ELSE
135  READ (unit=11,nml=nam_oasis,iostat=ierr)
136  CLOSE(unit=11)
137  ENDIF
138  !
139 ENDIF
140 !
141 !-------------------------------------------------------------------------------
142 !
143 !* 2. Setup OASIS (possibly via XIOS) and XIOS
144 ! ----------------------------------------
145 !
146 IF (lxios) THEN
147 !
148 !
149 #ifdef WXIOS
150  ! NOTE : XIOS_INITIALIZE will call OASIS_INIT_COMP and
151  ! OASIS_GET_LOCALCOMM if its own config file calls for Oasis
152 !$OMP SINGLE
153  CALL xios_initialize(cmodel_name, return_comm=klocal_comm)
154 !$OMP END SINGLE
155 !
156 #else
157 !
158  WRITE(*,*) 'SFX_OASIS_INIT : BINARY WAS NOT COMPILED WITH XIOS SUPPORT '
159  CALL abor1_sfx('SFX_OASIS_INIT : BINARY WAS NOT COMPILED WITH XIOS SUPPORT')
160 !
161 #endif
162 !
163 !
164 ELSE ! (i.e. .NOT. LXIOS)
165 !
166 #ifdef CPLOASIS
167 
168  IF (loasis ) THEN
169  irank=0
170  CALL oasis_init_comp(icomp_id,cmodel_name,ierr)
171  IF (ierr/=oasis_ok) THEN
172  WRITE(*,'(A)' )'SFX : Error initializing OASIS'
173  WRITE(*,'(A,I4)')'SFX : Return code from oasis_init_comp : ',ierr
174  CALL oasis_abort(icomp_id,cmodel_name,'SFX_OASIS_INIT: Error initializing OASIS')
175  CALL abort
176  stop
177  ENDIF
178  CALL oasis_get_localcomm(klocal_comm,ierr)
179  IF (ierr/=oasis_ok) THEN
180  IF(irank==0)THEN
181  WRITE(*,'(A)' )'SFX : Error getting local communicator from OASIS'
182  WRITE(*,'(A,I4)')'SFX : Return code from oasis_get_local_comm : ',ierr
183  ENDIF
184  CALL oasis_abort(icomp_id,cmodel_name,'SFX_OASIS_INIT: Error getting local communicator')
185  CALL abort
186  stop
187  ENDIF
188 !
189  ELSE
190  klocal_comm=0
191  RETURN
192  ENDIF
193 
194 #else
195 
196  klocal_comm=0
197  RETURN
198 
199 #endif
200 !
201 ENDIF
202 !
203 #ifdef SFX_MPI
204  CALL mpi_comm_rank(klocal_comm,irank,iwork)
205 #endif
206 IF(irank==0)THEN
207  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
208  IF (loasis) WRITE(*,'(A)')'OASIS used for model : '//trim(cmodel_name)
209  IF (lxios) WRITE(*,'(A)')'XIOS used for model : '//trim(cmodel_name)
210  WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
211 ENDIF
212 !
213 IF(yinit=='PRE')THEN
214  RETURN
215 ENDIF
216 
217 #ifdef CPLOASIS
218 IF (loasis) THEN
219 !
220 !-------------------------------------------------------------------------------
221 !
222 !* 5. Read total simulated time in namcouple
223 ! --------------------------------------
224 !
225  OPEN (unit=11,file ='namcouple',status='OLD',form ='FORMATTED',position="REWIND",iostat=ierr)
226  IF (ierr /= 0) THEN
227  IF(irank==0)THEN
228  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
229  WRITE(*,'(A)' )'SFX : OASIS namcouple not found'
230  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
231  ENDIF
232  CALL abort
233  stop
234  ENDIF
235 !
236  ytimerun=' $RUNTIME'
237  itimerun=-1
238 !
239  DO WHILE (itimerun==-1)
240  READ (unit = 11,fmt = '(A9)',iostat=ierr) yword
241  IF(ierr/=0)THEN
242  IF(irank==0)THEN
243  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
244  WRITE(*,'(A)' )'SFX : Problem $RUNTIME empty in namcouple'
245  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
246  ENDIF
247  CALL abort
248  stop
249  ENDIF
250  IF (yword==ytimerun)THEN
251  READ (unit = 11,fmt = '(A1000)',iostat=ierr) yline
252  IF(ierr/=0)THEN
253  IF(irank==0)THEN
254  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
255  WRITE(*,'(A)' )'SFX : Problem looking for $RUNTIME in namcouple'
256  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
257  ENDIF
258  CALL abort
259  stop
260  ENDIF
261  CALL found_timerun (yline, yfound, 1000, gfound)
262  IF (gfound) THEN
263  READ (yfound,fmt = '(I100)',iostat=ierr) itimerun
264  IF(ierr/=0)THEN
265  IF(irank==0)THEN
266  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
267  WRITE(*,'(A)' )'SFX : Problem reading $RUNTIME in namcouple'
268  WRITE(*,'(2A)' )'$RUNTIME = ', trim(yfound)
269  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
270  ENDIF
271  CALL abort
272  stop
273  ENDIF
274  ENDIF
275  ENDIF
276  ENDDO
277  CLOSE(11)
278 !
279  xruntime = REAL(itimerun)
280 !
281 ENDIF
282 #endif
283 !
284 !-------------------------------------------------------------------------------
285  CONTAINS
286 !-------------------------------------------------------------------------------
287 !
288 SUBROUTINE found_timerun(HIN, HOUT, KLEN, OFOUND)
289 !
290 IMPLICIT NONE
291 !
292 INTEGER , INTENT (IN ) :: KLEN
293  CHARACTER (LEN=*), INTENT (INOUT) :: HIN
294  CHARACTER (LEN=*), INTENT (INOUT) :: HOUT
295 LOGICAL, INTENT (OUT ) :: OFOUND
296 !
297 !* ---------------------------- Local declarations -------------------
298 !
299  CHARACTER(LEN=1), PARAMETER :: YBLANK = ' '
300  CHARACTER(LEN=1), PARAMETER :: YNADA = '#'
301 
302  CHARACTER(LEN=KLEN) :: YLINE
303  CHARACTER(LEN=KLEN) :: YWORK
304 !
305 INTEGER :: ILEN
306 INTEGER :: IERR
307 !
308 !
309 !* 1. Skip line if it is a comment
310 ! ----------------------------
311 !
312 DO WHILE (hin(1:1)==ynada)
313  READ (unit = 11, fmt = '(A9)',iostat=ierr) yline
314  IF(ierr/=0)THEN
315  IF(irank==0)THEN
316  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
317  WRITE(*,'(A)' )'SFX : Problem looking for $RUNTINE line in namcouple'
318  WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
319  ENDIF
320  CALL abort
321  stop
322  ENDIF
323  hin(1:klen) = yline(1:klen)
324 ENDDO
325 !
326 !* Fill HOUT with blanks
327 !
328 hout = yblank
329 !
330 !* Fill temporary string and remove leading blanks
331 !
332 ywork = adjustl(hin)
333 !
334 IF(len_trim(ywork)<=0)THEN
335  ofound = .false.
336  RETURN
337 ENDIF
338 !
339 !* Find the length of this set of characters
340 !
341 ilen = index(ywork,yblank) - 1
342 !
343 !* Copy to HOUT
344 !
345 hout(1:ilen) = ywork(1:ilen)
346 !
347 ofound = .true.
348 !
349 END SUBROUTINE found_timerun
350 !
351 !-------------------------------------------------------------------------------
352 !
353 END SUBROUTINE sfx_oasis_init
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
logical lxios
Definition: modd_xios.F90:41
subroutine found_timerun(HIN, HOUT, KLEN, OFOUND)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine sfx_oasis_init(HNAMELIST, KLOCAL_COMM, HINIT)
ERROR in index
Definition: ecsort_shared.h:90
character(len=6) cmodel_name