C $Header: /u/gcmpack/MITgcm/model/src/do_the_model_io.F,v 1.53 2005/05/15 03:02:08 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     myTime,
     I     myIter,
     I     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     !USES:
      IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "DYNVARS.h"
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL 

C     !INPUT/OUTPUT PARAMETERS:
C     myThid - Thread number for this instance of the routine.
C     myIter - Iteration number
C     myTime - Current time of simulation ( s )
      INTEGER myThid
      INTEGER myIter
      _RL     myTime
CEOP


C     Generaly only thread 1 does IO here. It can not start until 
C     all threads fields are ready.
      IF (debugMode) 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
      CALL WRITE_STATE( myTime, myIter, myThid )

#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 time averages
      IF ( useLAND )
     &     CALL LAND_WRITE_DIAGS( myTime, myIter, myThid )
#endif                                                             

#ifdef ALLOW_OBCS
      IF (useOBCS .AND. myIter.NE.nIter0 )
     &     CALL OBCS_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_GMREDI
C     Do GMRedi output.
      IF (useGMRedi .AND. myIter.NE.nIter0 )
     &     CALL GMREDI_OUTPUT( myTime, myIter, myThid )
#endif

#ifdef ALLOW_KPP
C     Do KPP diagnostics.
      IF ( useKPP )
     &     CALL KPP_DO_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_PP81
C     Do PP81 diagnostics.
      IF (usePP81 .AND. myIter.NE.nIter0 )
     &     CALL PP81_DO_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_MY82
C     Do MY82 diagnostics.
      IF (useMY82 .AND. myIter.NE.nIter0 )
     &     CALL MY82_DO_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_OPPS
C--   Do OPPS diagnostics.
      IF (useOPPS .AND. myIter.NE.nIter0 )
     & CALL OPPS_DO_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_GGL90
C--   Do GGL90 diagnostics.
      IF (useGGL90 .AND. myIter.NE.nIter0 )
     & CALL GGL90_DO_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_SBO
C     Do SBO diagnostics.
      IF (useSBO .AND. myIter.NE.nIter0 ) THEN
        CALL SBO_CALC ( myTime, myIter, myThid )
        CALL SBO_DIAGS( myTime, myIter, myThid )
      ENDIF
#endif

#ifdef  ALLOW_SEAICE
      IF ( useSEAICE ) THEN
        CALL SEAICE_DO_DIAGS( myTime, myIter, myThid )
      ENDIF
#endif  /* ALLOW_SEAICE */

#ifdef ALLOW_BULK_FORCE
C     Do bulkf diagnostics.
      IF (useBulkForce .AND. myIter.NE.nIter0 )
     &     CALL BULKF_DIAGS( 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_DIAGS( myTime, myIter, myThid )
#endif

#ifdef COMPONENT_MODULE
      IF ( useCoupler )
     &     CALL CPL_WRITE_DIAGS( myTime, myIter, myThid )
#endif

#ifdef ALLOW_DIAGNOSTICS
      IF ( usediagnostics ) 
     &     CALL DIAGNOSTICS_WRITE( myTime, myIter, myThid )
#endif

      RETURN
      END