C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_diagnostics_init.F,v 1.9 2010/09/05 22:28:14 jmc Exp $
C $Name:  $

#include "PTRACERS_OPTIONS.h"

CBOP
C     !ROUTINE: PTRACERS_DIAGNOSTICS_INIT
C     !INTERFACE:
      SUBROUTINE PTRACERS_DIAGNOSTICS_INIT( myThid )

C     !DESCRIPTION:
C     Routine to initialize pTracers diagnostics

C     !USES:
      IMPLICIT NONE
C     === Global variables ===
#include "SIZE.h"
#include "PTRACERS_SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "PTRACERS_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     !LOCAL VARIABLES:
C     === Local variables ===
C     msgBuf      :: Informational/error message buffer
c     CHARACTER*(MAX_LEN_MBUF) msgBuf

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

      INTEGER      iTrc, ilnb, tracerId
      CHARACTER*7  trcUnits
      CHARACTER*9  flxUnits, wUnits
      CHARACTER*30 locName
      CHARACTER*4  diagSufx
C     Functions ::
      INTEGER     ILNBLNK
      EXTERNAL    
      CHARACTER*4 GAD_DIAG_SUFX
      EXTERNAL    

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

C--   Add diagnostics to the (long) list

      IF ( usingPCoords ) THEN
         flxUnits = '.Pa.m^2/s'
         wUnits   = '.Pa/s    '
      ELSE
         flxUnits = '.m^3/s   '
         wUnits   = '.m/s     '
      ENDIF

      DO iTrc=1,PTRACERS_num
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C--    Set default name & tracer Units:
       WRITE(locName,'(A,I4,A)') 'Tracer ',iTrc
       trcUnits  = '(kg/kg)'
C-     use name & units from data.ptracers :
       ilnb = ILNBLNK(PTRACERS_units(iTrc))
       IF ( ilnb.GE.1 ) THEN
         ilnb = LEN(trcUnits)
         trcUnits = PTRACERS_units(iTrc)(1:ilnb)
       ENDIF
       ilnb = ILNBLNK(PTRACERS_long_names(iTrc))
       IF ( ilnb.GE.1 ) THEN
         ilnb = MIN(LEN(locName),ilnb)
         WRITE(locName,'(A)') PTRACERS_long_names(iTrc)(1:ilnb)
       ELSE
         ilnb = ILNBLNK(PTRACERS_names(iTrc))
         IF ( ilnb.GE.1 ) THEN
           ilnb = MIN(LEN(locName),ilnb)
           WRITE(locName,'(A)') PTRACERS_names(iTrc)(1:ilnb)
         ENDIF
       ENDIF
       ilnb = MAX(ILNBLNK(locName),1)

C--    Add diagnostics of Tracer concentration & u,v,w Transport
       WRITE(diagName,'(A4,A2,A2)') 'TRAC',PTRACERS_ioLabel(iTrc),'  '
       WRITE(diagTitle,'(2A)') locName(1:ilnb), ' concentration'
       diagUnits = trcUnits//'         '
       diagCode  = 'SMR     MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I           diagName, diagCode, diagUnits, diagTitle, 0, myThid )

       WRITE(diagName,'(A5,A2,A1)') 'UTRAC',PTRACERS_ioLabel(iTrc),' '
       WRITE(diagTitle,'(2A)') 'Zonal Mass-Weighted Transp of ',
     &                 locName(1:ilnb)
       diagUnits = trcUnits//'.m/s   '
       diagCode  = 'UUr     MR      '
       diagMate  = diagNum + 2
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I    diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       WRITE(diagName,'(A5,A2,A1)') 'VTRAC',PTRACERS_ioLabel(iTrc),' '
       WRITE(diagTitle,'(2A)') 'Merid Mass-Weighted Transp of ',
     &                 locName(1:ilnb)
       diagUnits = trcUnits//'.m/s   '
       diagCode  = 'VVr     MR      '
       diagMate  = diagNum
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I    diagName, diagCode, diagUnits, diagTitle, diagMate, myThid )

       WRITE(diagName,'(A5,A2,A1)') 'WTRAC',PTRACERS_ioLabel(iTrc),' '
       WRITE(diagTitle,'(2A)') 'Vert  Mass-Weighted Transp of ',
     &                 locName(1:ilnb)
       diagUnits = trcUnits//wUnits
       diagCode  = 'WM      MR      '
       CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I           diagName, diagCode, diagUnits, diagTitle, 0, myThid )

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C--    add diagnostics of advective & diffusive flux:
       diagUnits = trcUnits//flxUnits
       tracerId = iTrc + GAD_TR1 - 1
       diagSufx = GAD_DIAG_SUFX( tracerId, myThid )

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

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

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

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C--    add diagnostics for other pkg contribution to ptracer solution
       IF ( useKPP ) THEN
        diagName  = 'KPPg'//diagSufx
        WRITE(diagTitle,'(2A)') 'KPP non-local Flux of ',
     &                 locName(1:ilnb)
        diagCode  = 'WM      LR      '
        CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I          diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       ENDIF

       IF ( useDOWN_SLOPE ) THEN
        diagName  = 'DSLP'//diagSufx
        WRITE(diagTitle,'(2A)') locName(1:ilnb),
     &                   ' tendency from Down-Slope package'
        diagCode  = 'SM      MR      '
        diagUnits = trcUnits//'/s       '
        CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I           diagName, diagCode, diagUnits, diagTitle, 0, myThid )
       ENDIF

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

      diagName  = 'Add2EmP '
      diagTitle = 'additional EmP from salt relaxation'
      diagUnits = 'kg/m^2/s        '
      diagCode  = 'SM      U1      '
      CALL DIAGNOSTICS_ADDTOLIST( diagNum,
     I          diagName, diagCode, diagUnits, diagTitle, 0, myThid )

#endif /* ALLOW_DIAGNOSTICS */

      RETURN
      END