C $Header: /u/gcmpack/MITgcm/model/src/do_the_model_io.F,v 1.68 2017/04/04 23:22:38 jmc Exp $
C $Name: $
#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: DO_THE_MODEL_IO
C !INTERFACE:
SUBROUTINE DO_THE_MODEL_IO(
I modelEnd,
I myTime, myIter, myThid )
C !DESCRIPTION:
C This is the controlling routine for IO in the model main
C time--stepping loop. Many systems do not have thread safe IO so it
C is easier to lump everything together and do dumping of fields and
C updating of forcing terms in a single place. The approach to IO
C used here is that writes are only performed by thread 1 and that a
C process only writes out its data (it does not know about anyone
C elses data!) Reading on the other hand is assumed to be from a
C file containing all the data for all the processes. Only the
C portion of data of interest to this process is actually loaded. To
C work well this assumes the existence of some reliable tool to join
C datasets together at the end of a run -- see joinds.
C !CALLING SEQUENCE:
C DO_THE_MODEL_IO
C |
C |-- WRITE_STATE
C |
C |-- TIMEAVE_STATV_WRITE
C |
C |-- FIZHI_WRITE_STATE
C |
C |-- AIM_WRITE_TAVE
C |
C |-- LAND_OUTPUT
C |
C |-- OBCS_OUTPUT
C |
C |-- GMREDI_OUTPUT
C |
C |-- KPP_OUTPUT
C |
C |-- PP81_OUTPUT
C |
C |-- KL10_OUTPUT
C |
C |-- MY82_OUTPUT
C |
C |-- OPPS_OUTPUT
C |
C |-- GGL90_OUTPUT
C |
C |-- SBO_CALC
C |-- SBO_OUTPUT
C |
C |-- SEAICE_OUTPUT
C |
C |-- SHELFICE_OUTPUT
C |
C |-- BULKF_OUTPUT
C |
C |-- THSICE_OUTPUT
C |
C |-- PTRACERS_OUTPUT
C |
C |-- MATRIX_OUTPUT
C |
C |-- GCHEM_OUTPUT
C |
C |-- CPL_OUTPUT
C |
C |-- LAYERS_CALC
C |-- LAYERS_OUTPUT
C |
C |-- DIAGNOSTICS_WRITE
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "DYNVARS.h"
C !INPUT/OUTPUT PARAMETERS:
C modelEnd :: true if call at end of model run.
C myTime :: Current time of simulation ( s )
C myIter :: Iteration number
C myThid :: Thread number for this instance of the routine.
LOGICAL modelEnd
_RL myTime
INTEGER myThid
INTEGER myIter
C !FUNCTIONS:
LOGICAL DIFFERENT_MULTIPLE
EXTERNAL
CEOP
C Generaly only thread 1 does IO here. It can not start until
C all threads fields are ready.
IF ( plotLevel.GE.debLevD ) THEN
IF ( DIFFERENT_MULTIPLE(dumpFreq,myTime,deltaTClock)
& ) THEN
_BARRIER
C Write "text-plots" of certain fields
CALL PLOT_FIELD_XYZRL( uVel , 'Current uVel ',
& Nr, myIter, myThid )
CALL PLOT_FIELD_XYZRL( vVel , 'Current vVel ',
& Nr, myIter, myThid )
CALL PLOT_FIELD_XYZRL( theta, 'Current theta ',
& Nr, myIter, myThid )
CALL PLOT_FIELD_XYRL( etaN , 'Current etaN ',
& myIter, myThid )
ENDIF
ENDIF
C Write model state to binary file
IF ( .NOT.useOffLine ) THEN
CALL WRITE_STATE( myTime, myIter, myThid )
ENDIF
#ifdef ALLOW_TIMEAVE
C Do time averages
IF (taveFreq.GT.0. .AND. myIter.NE.nIter0 ) THEN
CALL TIMEAVE_STATV_WRITE( myTime, myIter, myThid )
ENDIF
#endif
#ifdef ALLOW_FIZHI
IF ( useFIZHI )
& CALL FIZHI_WRITE_STATE( myTime, myIter, myThid )
#endif
#ifdef ALLOW_AIM
C Do AIM time averages
IF ( useAIM )
& CALL AIM_WRITE_TAVE( myTime, myIter, myThid )
#endif
#ifdef ALLOW_LAND
C Do LAND output
IF ( useLAND )
& CALL LAND_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_OBCS
IF (useOBCS )
& CALL OBCS_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_GMREDI
C Do GMRedi output.
IF (useGMRedi .AND. myIter.NE.nIter0 .AND. .NOT.useOffLine )
& CALL GMREDI_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_KPP
C Do KPP diagnostics.
IF ( useKPP )
& CALL KPP_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_PP81
C Do PP81 diagnostics.
IF ( usePP81 )
& CALL PP81_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_KL10
C Do KL10 diagnostics.
IF ( useKL10 )
& CALL KL10_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_MY82
C Do MY82 diagnostics.
IF ( useMY82 )
& CALL MY82_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_OPPS
C-- Do OPPS diagnostics.
IF ( useOPPS )
& CALL OPPS_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_GGL90
C-- Do GGL90 diagnostics.
IF ( useGGL90 )
& CALL GGL90_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_SBO
C Do SBO diagnostics.
IF ( useSBO ) THEN
CALL SBO_CALC( myTime, myIter, myThid )
CALL SBO_OUTPUT( myTime, myIter, myThid )
ENDIF
#endif
#ifdef ALLOW_SEAICE
IF ( useSEAICE ) THEN
CALL SEAICE_OUTPUT( myTime, myIter, myThid )
ENDIF
#endif /* ALLOW_SEAICE */
#ifdef ALLOW_SHELFICE
IF ( useShelfIce ) THEN
CALL SHELFICE_OUTPUT( myTime, myIter, myThid )
ENDIF
#endif /* ALLOW_SHELFICE */
#ifdef ALLOW_BULK_FORCE
C Do bulkf output.
IF ( useBulkForce .AND. myIter.NE.nIter0 )
& CALL BULKF_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_THSICE
C Do seaice output.
IF (useThSIce)
& CALL THSICE_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_PTRACERS
C-- Do ptracer output.
IF ( usePTRACERS )
& CALL PTRACERS_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_MATRIX
C-- Do matrix output
IF (useMATRIX)
& CALL MATRIX_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_GCHEM
C-- Do GCHEM diagnostics.
IF (useGCHEM)
& CALL GCHEM_OUTPUT( myTime, myIter, myThid )
#endif
#ifdef ALLOW_OFFLINE
C-- Do Off-Line variables output
c IF (useOffLine)
c & CALL OFFLINE_STATE( myTime, myIter, myThid )
#endif
#ifdef COMPONENT_MODULE
IF ( useCoupler )
& CALL CPL_OUTPUT( myTime, myIter, myThid )
#endif
C-- added by RPA
#ifdef ALLOW_LAYERS
IF ( useLayers ) THEN
CALL LAYERS_CALC( myTime, myIter, myThid )
CALL LAYERS_OUTPUT( myTime, myIter, myThid )
ENDIF
#endif /* ALLOW_LAYERS */
#ifdef ALLOW_DIAGNOSTICS
IF ( useDiagnostics )
& CALL DIAGNOSTICS_WRITE( modelEnd, myTime, myIter, myThid )
#endif
RETURN
END