Oasis3-MCT
 All Classes Files Functions Variables Macros Pages
mod_oasis_auxiliary_routines.F90
Go to the documentation of this file.
1 
2 !> Auxiliary OASIS user interfaces
3 
5 !---------------------------------------------------------------------
6 
11  USE mod_oasis_timer
12  USE mod_oasis_var
13  USE mod_oasis_sys
14  USE mod_oasis_io
15  USE mod_oasis_mpi
16  USE mct_mod
17 
18  implicit none
19  private
20 
21  public oasis_get_localcomm
22  public oasis_set_couplcomm
24  public oasis_get_debug
25  public oasis_set_debug
26  public oasis_get_intercomm
27  public oasis_get_intracomm
28  public oasis_get_ncpl
29  public oasis_put_inquire
30  public oasis_get_freqs
31 
32 #include "oasis_os.h"
33 
34  integer(kind=ip_i4_p) istatus(mpi_status_size)
35 
36 !---------------------------------------------------------------------
37  CONTAINS
38 !---------------------------------------------------------------------
39 
40 !> OASIS user query for the local MPI communicator
41 
42  SUBROUTINE oasis_get_localcomm(localcomm,kinfo)
43 
44  IMPLICIT NONE
45 
46  INTEGER (kind=ip_intwp_p),intent(out) :: localcomm !< MPI communicator
47  INTEGER (kind=ip_intwp_p),intent(inout),optional :: kinfo !< return code
48 ! ---------------------------------------------------------
49  character(len=*),parameter :: subname = '(oasis_get_localcomm)'
50 ! ---------------------------------------------------------
51 
52  call oasis_debug_enter(subname)
53  if (present(kinfo)) then
54  kinfo = oasis_ok
55  endif
56 
57  ! from prism_data
58  localcomm = mpi_comm_local
59  IF (oasis_debug >= 2) THEN
60  WRITE(nulprt,*) 'localcomm :',localcomm
61  CALL oasis_flush(nulprt)
62  ENDIF
63 
64  call oasis_debug_exit(subname)
65 
66  END SUBROUTINE oasis_get_localcomm
67 !----------------------------------------------------------------------
68 
69 !> OASIS user call to specify a local communicator
70 
71  SUBROUTINE oasis_set_couplcomm(localcomm,kinfo)
72 
73  IMPLICIT NONE
74 
75  INTEGER (kind=ip_intwp_p),intent(in) :: localcomm !< MPI communicator
76  INTEGER (kind=ip_intwp_p),intent(inout),optional :: kinfo !< return code
77 ! ---------------------------------------------------------
78  integer(kind=ip_intwp_p) :: ierr
79  character(len=*),parameter :: subname = '(oasis_set_couplcomm)'
80 ! ---------------------------------------------------------
81 
82  call oasis_debug_enter(subname)
83  if (present(kinfo)) then
84  kinfo = oasis_ok
85  endif
86 
87  !------------------------
88  !--- update mpi_comm_local from component
89  !------------------------
90 
91  mpi_comm_local = localcomm
92 
93  !------------------------
94  !--- and now update necessary info
95  !------------------------
96 
97  mpi_size_local = -1
98  mpi_rank_local = -1
99  if (mpi_comm_local /= mpi_comm_null) then
100  CALL mpi_comm_size(mpi_comm_local,mpi_size_local,ierr)
101  CALL mpi_comm_rank(mpi_comm_local,mpi_rank_local,ierr)
102  mpi_root_local = 0
103  endif
104 
105  call oasis_debug_exit(subname)
106 
107  END SUBROUTINE oasis_set_couplcomm
108 !----------------------------------------------------------------------
109 
110 !> OASIS user call to create a new communicator
111 
112  SUBROUTINE oasis_create_couplcomm(icpl,allcomm,cplcomm,kinfo)
113 
114  IMPLICIT NONE
115 
116  INTEGER (kind=ip_intwp_p),intent(in) :: icpl !< coupling process flag
117  INTEGER (kind=ip_intwp_p),intent(in) :: allcomm !< input MPI communicator
118  INTEGER (kind=ip_intwp_p),intent(out) :: cplcomm !< reduced MPI communicator
119  INTEGER (kind=ip_intwp_p),intent(inout),optional :: kinfo !< return code
120 ! ---------------------------------------------------------
121  integer(kind=ip_intwp_p) :: ierr
122  character(len=*),parameter :: subname = '(oasis_create_couplcomm)'
123 ! ---------------------------------------------------------
124 
125  call oasis_debug_enter(subname)
126  if (present(kinfo)) then
127  kinfo = oasis_ok
128  endif
129 
130  !------------------------
131  !--- generate cplcomm from allcomm and icpl
132  !------------------------
133 
134  CALL mpi_comm_split(allcomm,icpl,1,cplcomm,ierr)
135  IF (ierr /= 0) THEN
136  WRITE (nulprt,*) subname,estr,'MPI_Comm_Split ierr = ',ierr
137  call oasis_abort()
138  ENDIF
139 
140  !------------------------
141  !--- update mpi_comm_local from component
142  !------------------------
143 
144  call oasis_set_couplcomm(cplcomm)
145 
146  IF (oasis_debug >= 2) THEN
147  WRITE (nulprt,*) 'New local coupling comm =',cplcomm
148  CALL oasis_flush(nulprt)
149  ENDIF
150 
151  call oasis_debug_exit(subname)
152 
153  END SUBROUTINE oasis_create_couplcomm
154 !----------------------------------------------------------------------
155 
156 !> OASIS user interface to query debug level
157 
158  SUBROUTINE oasis_get_debug(debug,kinfo)
159 
160  IMPLICIT NONE
161 
162  INTEGER (kind=ip_intwp_p),intent(out) :: debug !< debug level
163  INTEGER (kind=ip_intwp_p),intent(inout),optional :: kinfo !< return code
164 ! ---------------------------------------------------------
165  character(len=*),parameter :: subname = '(oasis_get_debug)'
166 ! ---------------------------------------------------------
167 
168  call oasis_debug_enter(subname)
169  if (present(kinfo)) then
170  kinfo = oasis_ok
171  endif
172 
173  debug = oasis_debug
174 
175  call oasis_debug_exit(subname)
176 
177  END SUBROUTINE oasis_get_debug
178 !----------------------------------------------------------------------
179 
180 !> OASIS user interface to set debug level
181 
182  SUBROUTINE oasis_set_debug(debug,kinfo)
183 
184  IMPLICIT NONE
185 
186  INTEGER (kind=ip_intwp_p),intent(in) :: debug !< debug level
187  INTEGER (kind=ip_intwp_p),intent(inout),optional :: kinfo !< return code
188 ! ---------------------------------------------------------
189  character(len=*),parameter :: subname = '(oasis_set_debug)'
190 ! ---------------------------------------------------------
191 
192  call oasis_debug_enter(subname)
193  if (present(kinfo)) then
194  kinfo = oasis_ok
195  endif
196 
197  oasis_debug = debug
198  if (oasis_debug >= 2) then
199  write(nulprt,*) subname,' set OASIS_debug to ',oasis_debug
200  CALL oasis_flush(nulprt)
201  endif
202 
203  call oasis_debug_exit(subname)
204 
205  END SUBROUTINE oasis_set_debug
206 !----------------------------------------------------------------------
207 
208 !> OASIS user interface to establish an intercomm communicator between the root of two models
209 
210  SUBROUTINE oasis_get_intercomm(new_comm, cdnam, kinfo)
211 
212  IMPLICIT NONE
213 
214  INTEGER (kind=ip_intwp_p),intent(out) :: new_comm !< out MPI communicator
215  CHARACTER(len=*),intent(in) :: cdnam !< other model name to link with
216  INTEGER (kind=ip_intwp_p),intent(out),optional :: kinfo !< return code
217 
218  integer(kind=ip_intwp_p) :: n, il, ierr, tag
219  LOGICAL :: found
220 ! ---------------------------------------------------------
221  character(len=*),parameter :: subname = '(oasis_get_intercomm)'
222 ! ---------------------------------------------------------
223 
224  call oasis_debug_enter(subname)
225  if (present(kinfo)) then
226  kinfo = oasis_ok
227  endif
228 
229  found = .false.
230  do n = 1,prism_amodels
231  if (trim(cdnam) == trim(prism_modnam(n))) then
232  if (found) then
233  write(nulprt,*) subname,estr,'found same model name twice'
234  call oasis_abort()
235  endif
236  il = n
237  found = .true.
238  endif
239  enddo
240 
241  if (.not. found) then
242  write(nulprt,*) subname,estr,'input model name not found'
243  call oasis_abort()
244  endif
245 
246  IF (oasis_debug >= 2) THEN
247  WRITE(nulprt,*) subname, 'cdnam :',trim(cdnam),' il :',il, &
248  'mpi_root_global(il) :',mpi_root_global(il),&
249  'mpi_comm_local :',mpi_comm_local
250  CALL oasis_flush(nulprt)
251  ENDIF
252 
253  tag=ichar(trim(compnm))+ichar(trim(cdnam))
254  CALL mpi_intercomm_create(mpi_comm_local, 0, mpi_comm_global, &
255  mpi_root_global(il), tag, new_comm, ierr)
256 
257  call oasis_debug_exit(subname)
258 
259  END SUBROUTINE oasis_get_intercomm
260 !----------------------------------------------------------------------
261 
262 !> OASIS user interface to establish an intracomm communicator between the root of two models
263 
264  SUBROUTINE oasis_get_intracomm(new_comm, cdnam, kinfo)
265 
266  IMPLICIT NONE
267 
268  INTEGER (kind=ip_intwp_p),intent(out) :: new_comm !< output MPI communicator
269  CHARACTER(len=*),intent(in) :: cdnam !< other model name
270  INTEGER (kind=ip_intwp_p),intent(out),optional :: kinfo !< return code
271 
272  integer(kind=ip_intwp_p) :: tmp_intercomm
273  integer(kind=ip_intwp_p) :: ierr
274 ! ---------------------------------------------------------
275  character(len=*),parameter :: subname = '(oasis_get_intracomm)'
276 ! ---------------------------------------------------------
277 
278  call oasis_debug_enter(subname)
279  if (present(kinfo)) then
280  kinfo = oasis_ok
281  endif
282 
283  call oasis_get_intercomm(tmp_intercomm, cdnam, kinfo)
284 
285  CALL mpi_intercomm_merge(tmp_intercomm,.false., new_comm, ierr)
286 
287  call oasis_debug_exit(subname)
288 
289  END SUBROUTINE oasis_get_intracomm
290 !----------------------------------------------------------------------
291 
292 !> OASIS user query for the number of unique couplings associated with a variable
293 
294  SUBROUTINE oasis_get_ncpl(varid, ncpl, kinfo)
295 
296  IMPLICIT none
297  !-------------------------------------
298  INTEGER(kind=ip_i4_p) , INTENT(in) :: varid !< variable id
299  INTEGER(kind=ip_i4_p) , INTENT(out) :: ncpl !< number of namcouple couplings
300  INTEGER(kind=ip_i4_p) , INTENT(out) :: kinfo !< return code
301  !-------------------------------------
302  CHARACTER(len=ic_lvar) :: vname
303  CHARACTER(len=*),PARAMETER :: subname = 'oasis_get_ncpl'
304  !-------------------------------------
305 
306  CALL oasis_debug_enter(subname)
307 
308  IF (mpi_comm_local == mpi_comm_null) THEN
309  WRITE(nulprt,*) subname,estr,'called on non coupling task'
310  CALL oasis_abort()
311  ENDIF
312 
313  kinfo = oasis_ok
314  vname = prism_var(varid)%name
315 
316  IF (varid == oasis_var_uncpl) THEN
317  WRITE(nulprt,*) subname,estr, &
318  'Routine is called for a variable not in namcouple: it will not be sent'
319  CALL oasis_abort()
320  ENDIF
321 
322  ncpl = prism_var(varid)%ncpl
323 
324  IF (ncpl <= 0) THEN
325  IF (oasis_debug >= 2) WRITE(nulprt,*) subname,' Variable not coupled ',&
326  trim(vname)
327  ELSE
328  IF (oasis_debug >= 2) WRITE(nulprt,*) subname,' Variable: ',trim(vname),&
329  ' used in ',ncpl,' couplings'
330  ENDIF
331 
332  CALL oasis_debug_exit(subname)
333 
334  END SUBROUTINE oasis_get_ncpl
335 !---------------------------------------------------------------------
336 
337 !> OASIS user query for the coupling periods for a given variable
338 
339  SUBROUTINE oasis_get_freqs(varid, mop, ncpl, cpl_freqs, kinfo)
340 
341  IMPLICIT none
342  !-------------------------------------
343  INTEGER(kind=ip_i4_p) , INTENT(in) :: varid !< variable id
344  INTEGER(kind=ip_i4_p) , INTENT(in) :: mop !< OASIS_Out or OASIS_In type
345  INTEGER(kind=ip_i4_p) , INTENT(in) :: ncpl !< number of namcouple couplings
346  INTEGER(kind=ip_i4_p) , INTENT(out) :: cpl_freqs(ncpl)!< coupling period (sec)
347  INTEGER(kind=ip_i4_p) , INTENT(out) :: kinfo !< return code
348  !-------------------------------------
349  CHARACTER(len=ic_lvar) :: vname
350  INTEGER(kind=ip_i4_p) :: ncpl_calc, cplid, nc
351  CHARACTER(len=*),PARAMETER :: subname = 'oasis_get_freqs'
352  !-------------------------------------
353 
354  CALL oasis_debug_enter(subname)
355 
356  IF (mpi_comm_local == mpi_comm_null) THEN
357  WRITE(nulprt,*) subname,estr,'called on non coupling task'
358  CALL oasis_abort()
359  ENDIF
360 
361  kinfo = oasis_ok
362  vname = prism_var(varid)%name
363 
364  IF (varid == oasis_var_uncpl) THEN
365  WRITE(nulprt,*) subname,estr, &
366  'Routine is called for a variable not in namcouple: it will not be sent'
367  CALL oasis_abort()
368  ENDIF
369 
370  ncpl_calc = prism_var(varid)%ncpl
371 
372  IF (ncpl_calc /= ncpl) THEN
373  WRITE(nulprt,*) subname,estr,' Wrong number of couplings for variable: ',trim(vname), &
374  ncpl_calc, ncpl
375  CALL oasis_abort()
376  ENDIF
377 
378  IF (ncpl <= 0) THEN
379  IF (oasis_debug >= 2) WRITE(nulprt,*) subname,' variable not coupled ',&
380  trim(vname)
381  ENDIF
382 
383  DO nc = 1,ncpl
384  cplid = prism_var(varid)%cpl(nc)
385  IF (mop == oasis_out) THEN
386  cpl_freqs(nc) = prism_coupler_put(cplid)%dt
387  ENDIF
388  IF (mop == oasis_in ) THEN
389  cpl_freqs(nc) = prism_coupler_get(cplid)%dt
390  ENDIF
391 
392  IF (oasis_debug >=2 ) THEN
393  WRITE(nulprt,*) subname,' Coupling frequency of this field ',trim(vname),&
394  ' for coupling ',nc, ' is ',cpl_freqs(nc)
395  ENDIF
396 
397  IF (cpl_freqs(nc) .le. 0) THEN
398  WRITE(nulprt,*) subname,estr,' The coupling frequency is < or equal to 0'
399  CALL oasis_abort()
400  ENDIF
401  ENDDO
402 
403  CALL oasis_debug_exit(subname)
404 
405  END SUBROUTINE oasis_get_freqs
406 !---------------------------------------------------------------------
407 
408 !> OASIS user query to indicate put return code expected at a specified time for a given variable
409 
410  SUBROUTINE oasis_put_inquire(varid,msec,kinfo)
411 
412  IMPLICIT none
413  !-------------------------------------
414  integer(kind=ip_i4_p) , intent(in) :: varid !< variable id
415  integer(kind=ip_i4_p) , intent(in) :: msec !< model time in seconds
416  integer(kind=ip_i4_p) , intent(out) :: kinfo !< return code
417  !-------------------------------------
418  character(len=ic_lvar) :: vname
419  INTEGER(kind=ip_i4_p) :: ncpl, nc, cplid
420  INTEGER(kind=ip_i4_p) :: lag, mseclag, trans, dt, getput, maxtime
421  LOGICAL :: time_now, sndrcv, output
422  character(len=*),parameter :: subname = 'oasis_put_inquire'
423  !-------------------------------------
424 
425  CALL oasis_debug_enter(subname)
426 
427  IF (mpi_comm_local == mpi_comm_null) THEN
428  WRITE(nulprt,*) subname,estr,'called on non coupling task'
429  CALL oasis_abort()
430  ENDIF
431 
432  kinfo = oasis_ok
433  vname = prism_var(varid)%name
434 
435  IF (varid == oasis_var_uncpl) THEN
436  WRITE(nulprt,*) subname,estr, &
437  'Routine oasis_put is called for a variable not in namcouple: it will not be sent'
438  CALL oasis_abort()
439  ENDIF
440 
441  ncpl = prism_var(varid)%ncpl
442 
443  IF (ncpl <= 0) THEN
444  IF (oasis_debug >= 2) WRITE(nulprt,*) subname,' variable not coupled ',&
445  trim(vname)
446  ENDIF
447 
448  DO nc = 1,ncpl
449 
450  cplid = prism_var(varid)%cpl(nc)
451  dt = prism_coupler_put(cplid)%dt
452  lag = prism_coupler_put(cplid)%lag
453  getput = prism_coupler_put(cplid)%getput
454  sndrcv = prism_coupler_put(cplid)%sndrcv
455  maxtime = prism_coupler_put(cplid)%maxtime
456  output = prism_coupler_put(cplid)%output
457  trans = prism_coupler_put(cplid)%trans
458 
459  !------------------------------------------------
460  ! check that lag is reasonable
461  !------------------------------------------------
462 
463  IF (abs(lag) > dt) THEN
464  WRITE(nulprt,*) subname,estr,' ERROR lag gt dt for cplid',cplid
465  CALL oasis_abort()
466  ENDIF
467 
468  !------------------------------------------------
469  ! check that field is OASIS_PUT
470  !------------------------------------------------
471 
472  IF (getput == oasis3_get) THEN
473  WRITE(nulprt,*) subname,estr,'routine can only be called for OASIS_PUT variable'
474  CALL oasis_abort()
475  ENDIF
476 
477  CALL oasis_debug_note(subname//' set mseclag')
478  IF (getput == oasis3_put) THEN
479  mseclag = msec + lag
480  ENDIF
481 
482  !------------------------------------------------
483  ! check that model hasn't gone past maxtime
484  !------------------------------------------------
485 
486  if (msec >= maxtime) then
487  write(nulprt,*) subname,' at ',msec,mseclag,' ERROR: ',trim(vname)
488  write(nulprt,*) subname,estr,'model time beyond namcouple maxtime',&
489  msec,maxtime
490  call oasis_abort()
491  endif
492 
493  time_now = .false.
494  IF (mod(mseclag,dt) == 0) time_now = .true.
495 
496  !-------------------------------------------------------------------
497  ! Test what is the current status of the field if time_now = .TRUE.
498  !-------------------------------------------------------------------
499 
500  IF (time_now .EQV. .true.) THEN
501 
502  IF (oasis_debug >= 2) THEN
503  WRITE(nulprt,*) subname,' Coupling time for : ',trim(vname)
504  WRITE(nulprt,*) subname,' Coupling time for var for nc : ',&
505  trim(mct_avect_exportrlist2c(prism_coupler_put(cplid)%avect1)),nc
506  WRITE(nulprt,*) subname,' dt,msec,mseclag = ',dt,msec,mseclag
507  CALL oasis_flush(nulprt)
508  ENDIF
509 
510  IF ( (trans == ip_average) .OR. (trans == ip_accumul) .OR. (trans == ip_max) &
511  .OR. (trans == ip_min) ) THEN
512  IF (kinfo == oasis_ok) kinfo = oasis_loctrans
513  IF (oasis_debug >= 2) THEN
514  WRITE(nulprt,*) subname,' status at ',msec,mseclag,' WTRN '
515  CALL oasis_flush(nulprt)
516  ENDIF
517  ENDIF
518 
519  !-------------------------------------------------------------------
520  ! past namcouple runtime (maxtime) no communication
521  ! do restart if time+lag = maxtime, this assumes coupling
522  ! period and lag and maxtime are all nicely consistent
523  !-------------------------------------------------------------------
524  IF (mseclag >= maxtime) THEN
525  IF (getput == oasis3_put .AND. lag > 0 .AND. mseclag == maxtime) THEN
526  kinfo = oasis_torest
527  IF (oasis_debug >= 2) THEN
528  WRITE(nulprt,*) subname,' status at ',msec,mseclag,' WRST '
529  CALL oasis_flush(nulprt)
530  ENDIF
531  ENDIF
532  ENDIF
533 
534  !------------------------------------------------
535  ! communication
536  !------------------------------------------------
537  IF (sndrcv) THEN
538  IF (getput == oasis3_put) THEN
539  kinfo = oasis_sent
540  IF (oasis_debug >= 2) THEN
541  WRITE(nulprt,*) subname,' status at ',msec,mseclag,' will be SENT '
542  CALL oasis_flush(nulprt)
543  ENDIF
544  ENDIF
545  ENDIF
546 
547  !------------------------------------------------
548  ! save debug file if EXPOUT or OUTPUT
549  !------------------------------------------------
550  IF (output) THEN
551  IF (kinfo == oasis_sent) THEN
552  kinfo = oasis_sentout
553  ELSEIF (kinfo == oasis_torest) THEN
554  kinfo = oasis_torestout
555  ELSE
556  kinfo = oasis_output
557  ENDIF
558  IF (oasis_debug >= 2) THEN
559  WRITE(nulprt,*) subname,' status at ',msec,mseclag,' will be WRIT '
560  CALL oasis_flush(nulprt)
561  ENDIF
562  ENDIF
563 
564  !------------------------------------------------
565  ! sav non-instant loctrans operations for future restart
566  ! at the end of the run only
567  !------------------------------------------------
568 
569  IF (mseclag + dt >= maxtime .AND. &
570  getput == oasis3_put .and. trans /= ip_instant) then
571  IF (oasis_debug >= 2) THEN
572  WRITE(nulprt,*) subname,' at ',msec,mseclag,' will be WTRN: '
573  CALL oasis_flush(nulprt)
574  ENDIF
575  ENDIF
576  ELSE
577  IF (oasis_debug >=2) THEN
578  WRITE(nulprt,*) 'Nothing to do'
579  ENDIF
580  ENDIF ! time_now
581 
582  IF (oasis_debug >= 2) THEN
583  WRITE(nulprt,*) subname,' kinfo: ',kinfo
584  CALL oasis_flush(nulprt)
585  ENDIF
586  ENDDO ! nc
587 
588  CALL oasis_debug_exit(subname)
589 
590  END SUBROUTINE oasis_put_inquire
591 
592 !---------------------------------------------------------------------------------
594 
subroutine, public oasis_debug_exit(string)
Used when a subroutine is exited, write info to log file at some debug level.
subroutine, public oasis_get_intracomm(new_comm, cdnam, kinfo)
OASIS user interface to establish an intracomm communicator between the root of two models...
System type methods.
subroutine, public oasis_get_intercomm(new_comm, cdnam, kinfo)
OASIS user interface to establish an intercomm communicator between the root of two models...
Provides a generic and simpler interface into MPI calls for OASIS.
subroutine, public oasis_set_debug(debug, kinfo)
OASIS user interface to set debug level.
subroutine, public oasis_get_localcomm(localcomm, kinfo)
OASIS user query for the local MPI communicator.
subroutine, public oasis_set_couplcomm(localcomm, kinfo)
OASIS user call to specify a local communicator.
subroutine, public oasis_get_debug(debug, kinfo)
OASIS user interface to query debug level.
Provides a common location for several OASIS variables.
subroutine, public oasis_get_freqs(varid, mop, ncpl, cpl_freqs, kinfo)
OASIS user query for the coupling periods for a given variable.
subroutine, public oasis_debug_enter(string)
Used when a subroutine is entered, write info to log file at some debug level.
Defines kinds for OASIS.
subroutine, public oasis_debug_note(string)
Used to write information from a subroutine, write info to log file at some debug level...
subroutine, public oasis_flush(nu)
Flushes output to file.
Initialize the OASIS coupler infrastructure.
Auxiliary OASIS user interfaces.
Performance timer methods.
subroutine, public oasis_abort(id_compid, cd_routine, cd_message)
OASIS abort method, publically available to users.
subroutine, public oasis_create_couplcomm(icpl, allcomm, cplcomm, kinfo)
OASIS user call to create a new communicator.
subroutine, public oasis_put_inquire(varid, msec, kinfo)
OASIS user query to indicate put return code expected at a specified time for a given variable...
subroutine, public oasis_get_ncpl(varid, ncpl, kinfo)
OASIS user query for the number of unique couplings associated with a variable.
Provides reusable IO routines for OASIS.
Definition: mod_oasis_io.F90:4
OASIS variable data and methods.
Defines parameters for OASIS.