C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_diagnostics_init.F,v 1.10 2013/02/06 23:01:24 jmc Exp $
C $Name:  $

#include "GAD_OPTIONS.h"

CBOP
C     !ROUTINE: GAD_DIAGNOSTICS_INIT
C     !INTERFACE:
      SUBROUTINE GAD_DIAGNOSTICS_INIT( myThid )
C     !DESCRIPTION:
C     Routine to initialize Generic Advection/Diffusion diagnostics

C     !USES:
      IMPLICIT NONE
C     === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GAD.h"

C     !INPUT/OUTPUT PARAMETERS:
C     === Routine arguments ===
C     myThid   :: My Thread Id. number
      INTEGER myThid
CEOP

#ifdef ALLOW_DIAGNOSTICS
C     ! FUNCTIONS:
      CHARACTER*4  GAD_DIAG_SUFX
      CHARACTER*16 DIAGS_MK_UNITS
      CHARACTER*80 DIAGS_MK_TITLE
      EXTERNAL     
      EXTERNAL     
      EXTERNAL     

C     !LOCAL VARIABLES:
C     === Local variables ===
C     msgBuf   :: Informational/error meesage buffer
c     CHARACTER*(MAX_LEN_MBUF) msgBuf

      INTEGER        diagNum
      INTEGER        diagMate
      CHARACTER*8    diagName
      CHARACTER*16   diagCode
      CHARACTER*16   diagUnits
      CHARACTER*(80) diagTitle

      CHARACTER*10  flxUnits, trUnits
      CHARACTER*12  locName
      CHARACTER*4   diagSufx

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

C--   Add diagnostics to the (long) list
       IF ( usingPCoords ) THEN
         flxUnits = '.Pa.m^2/s '
       ELSE
         flxUnits = '.m^3/s    '
       ENDIF

C-     add diagnostics of advective & diffusive flux of Temp :
       IF ( fluidIsAir ) THEN
         trUnits = 'K'
       ELSE
         trUnits = 'degC'
       ENDIF
       diagUnits = DIAGS_MK_UNITS( trUnits//flxUnits, myThid )
       diagSufx = GAD_DIAG_SUFX( GAD_TEMPERATURE, myThid )

C-     Advective flux:
       diagName  = 'ADVr'//diagSufx
       diagTitle = 'Vertical   Advective Flux of Pot.Temperature'
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'ADVx'//diagSufx
       diagTitle = 'Zonal      Advective Flux of Pot.Temperature'
       diagCode  = 'UU      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'ADVy'//diagSufx
       diagTitle = 'Meridional Advective Flux of Pot.Temperature'
       diagCode  = 'VV      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
C-     Diffusive flux:
       diagName  = 'DFrE'//diagSufx
       diagTitle = 'Vertical Diffusive Flux of Pot.Temperature'
     &           //' (Explicit part)'
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'DFxE'//diagSufx
       diagTitle = 'Zonal      Diffusive Flux of Pot.Temperature'
       diagCode  = 'UU      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'DFyE'//diagSufx
       diagTitle = 'Meridional Diffusive Flux of Pot.Temperature'
       diagCode  = 'VV      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       diagName  = 'DFrI'//diagSufx
       diagTitle = 'Vertical Diffusive Flux of Pot.Temperature'
     &           //' (Implicit part)'
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

#ifdef GAD_ALLOW_TS_SOM_ADV
       diagUnits = DIAGS_MK_UNITS( trUnits, myThid )

       diagName  = 'SM_x'//diagSufx
       diagTitle = 'Pot.Temp.   1rst Order Moment Sx'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SM_y'//diagSufx
       diagTitle = 'Pot.Temp.   1rst Order Moment Sy'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SM_z'//diagSufx
       diagTitle = 'Pot.Temp.   1rst Order Moment Sz'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       diagName  = 'SMxx'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Sxx'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMyy'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Syy'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMzz'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Szz'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       diagName  = 'SMxy'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Sxy'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'SMxz'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Sxz'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMyz'//diagSufx
       diagTitle = 'Pot.Temp.   2nd Order Moment Syz'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       diagUnits = DIAGS_MK_UNITS( '('//trUnits//')^2', myThid )
       diagName  = 'SM_v'//diagSufx
       diagTitle = 'Pot.Temp.   sub-grid variance'
       diagCode  = 'SM P    MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
#endif /* GAD_ALLOW_TS_SOM_ADV */

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

C-     add diagnostics of advective & diffusive flux of Salt :
       IF ( fluidIsAir ) THEN
         locName = 'Water-Vapor '
         IF ( useAIM ) THEN
           trUnits = 'g/kg'
         ELSE
           trUnits = 'kg/kg'
         ENDIF
       ELSE
         locName = 'Salinity    '
         trUnits = 'psu'
       ENDIF
       diagUnits = DIAGS_MK_UNITS( trUnits//flxUnits, myThid )
       diagSufx = GAD_DIAG_SUFX( GAD_SALINITY, myThid )

C-     Advective flux:
       diagName  = 'ADVr'//diagSufx
       diagTitle = 'Vertical   Advective Flux of '//locName
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'ADVx'//diagSufx
       diagTitle = 'Zonal      Advective Flux of '//locName
       diagCode  = 'UU      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'ADVy'//diagSufx
       diagTitle = 'Meridional Advective Flux of '//locName
       diagCode  = 'VV      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
C-     Diffusive flux:
       diagName  = 'DFrE'//diagSufx
       diagTitle = 'Vertical Diffusive Flux of '//locName
     &           // '(Explicit part)'
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'DFxE'//diagSufx
       diagTitle = 'Zonal      Diffusive Flux of '//locName
       diagCode  = 'UU      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'DFyE'//diagSufx
       diagTitle = 'Meridional Diffusive Flux of '//locName
       diagCode  = 'VV      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       diagName  = 'DFrI'//diagSufx
       diagTitle = 'Vertical Diffusive Flux of '//locName
     &           //'(Implicit part)'
       diagCode  = 'WM      LR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       diagName  = 'SALTFILL'
       diagTitle = 'Filling of Negative Values of '//locName
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

#ifdef GAD_ALLOW_TS_SOM_ADV

       diagUnits = DIAGS_MK_UNITS( trUnits, myThid )

       diagName  = 'SM_x'//diagSufx
       diagTitle = locName//'1rst Order Moment Sx'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SM_y'//diagSufx
       diagTitle = locName//'1rst Order Moment Sy'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SM_z'//diagSufx
       diagTitle = locName//'1rst Order Moment Sz'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       diagName  = 'SMxx'//diagSufx
       diagTitle = locName//'2nd Order Moment Sxx'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMyy'//diagSufx
       diagTitle = locName//'2nd Order Moment Syy'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMzz'//diagSufx
       diagTitle = locName//'2nd Order Moment Szz'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       diagName  = 'SMxy'//diagSufx
       diagTitle = locName//'2nd Order Moment Sxy'
       diagCode  = 'SM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       diagName  = 'SMxz'//diagSufx
       diagTitle = locName//'2nd Order Moment Sxz'
       diagCode  = 'UM      MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )
       diagName  = 'SMyz'//diagSufx
       diagTitle = locName//'2nd Order Moment Syz'
       diagCode  = 'VM      MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       diagUnits = DIAGS_MK_UNITS( '('//trUnits//')^2', myThid )
       diagName  = 'SM_v'//diagSufx
       diagTitle = locName//'sub-grid variance'
       diagCode  = 'SM P    MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I      diagName, diagCode, diagUnits, diagTitle, 0, myThid )
#endif /* GAD_ALLOW_TS_SOM_ADV */

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

#endif /* ALLOW_DIAGNOSTICS */

      RETURN
      END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP 0 C !ROUTINE: GAD_DIAG_SUFX C !INTERFACE: CHARACTER*4 FUNCTION GAD_DIAG_SUFX( tracerId, myThid ) C !DESCRIPTION: C *==========================================================* C | FUNCTION GAD_DIAG_SUFX C | o Return diagnostic suffix (4 character long) for the C | "tracerId" tracer (used to build diagnostic names). C *==========================================================* C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "GAD.h" #ifdef ALLOW_PTRACERS c#include "PARAMS.h" # include "PTRACERS_SIZE.h" # include "PTRACERS_PARAMS.h" #endif /* ALLOW_PTRACERS */ C !INPUT PARAMETERS: C tracerId :: tracer identifier C myThid :: my thread Id number INTEGER tracerId INTEGER myThid CEOP C !LOCAL VARIABLES: C-- Set diagnostic suffix (4 character long) for the "tracerId" tracer IF ( tracerId.EQ.GAD_TEMPERATURE ) THEN GAD_DIAG_SUFX = '_TH ' ELSEIF( tracerId.EQ.GAD_SALINITY ) THEN GAD_DIAG_SUFX = '_SLT' #ifdef ALLOW_PTRACERS c ELSEIF( usePTRACERS c .AND. tracerId.GE.GAD_TR1 ELSEIF( tracerId.GE.GAD_TR1 & .AND. tracerId.LT.GAD_TR1+PTRACERS_num ) THEN c WRITE(GAD_DIAG_SUFX,'(A,A2)') c & 'Tr', PTRACERS_ioLabel( tracerId+1-GAD_TR1 ) GAD_DIAG_SUFX = 'Tr'//PTRACERS_ioLabel( tracerId+1-GAD_TR1 ) #endif /* ALLOW_PTRACERS */ ELSE GAD_DIAG_SUFX = 'aaaa' ENDIF RETURN END