Back to home page

MITgcm

 
 

    


File indexing completed on 2021-09-30 05:16:06 UTC

view on githubraw file Latest commit 872ff0f0 on 2021-09-09 19:00:21 UTC
9476e7548f Patr*0001 #include "MONITOR_OPTIONS.h"
eded583e53 Jean*0002 #ifdef ALLOW_AUTODIFF
                0003 # include "AUTODIFF_OPTIONS.h"
                0004 #endif
                0005 #ifdef ALLOW_CTRL
                0006 # include "CTRL_OPTIONS.h"
                0007 #endif
967746e1a9 Patr*0008 #include "AD_CONFIG.h"
9476e7548f Patr*0009 
                0010 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0011 CBOP
                0012 C     !ROUTINE: MONITOR
                0013 
                0014 C     !INTERFACE:
                0015       SUBROUTINE ADMONITOR(
4f6d3a8d05 Jean*0016      I                      myTime, myIter, myThid )
9476e7548f Patr*0017 
                0018 C     !DESCRIPTION:
                0019 C     Monitor key dynamical variables: calculate over the full domain
                0020 C      some simple statistics (e.g., min,max,average) and write them.
                0021 
                0022 C     !USES:
                0023       IMPLICIT NONE
                0024 #include "SIZE.h"
                0025 #include "EEPARAMS.h"
                0026 #include "PARAMS.h"
                0027 #include "GRID.h"
                0028 #include "MONITOR.h"
                0029 #ifdef ALLOW_MNC
                0030 # include "MNC_PARAMS.h"
                0031 #endif
eded583e53 Jean*0032 #ifdef ALLOW_AUTODIFF_MONITOR
9a6281d071 Jean*0033 # include "AUTODIFF_PARAMS.h"
44d66f0517 Patr*0034 # include "adcommon.h"
9476e7548f Patr*0035 #endif
                0036 
                0037 C     !INPUT PARAMETERS:
                0038       _RL myTime
4f6d3a8d05 Jean*0039       INTEGER myIter
9476e7548f Patr*0040       INTEGER myThid
                0041 CEOP
                0042 
                0043 #if (defined (ALLOW_ADJOINT_RUN) || defined (ALLOW_ADMTLM))
eded583e53 Jean*0044 #ifdef ALLOW_AUTODIFF_MONITOR
9476e7548f Patr*0045 
                0046 C     === Functions ====
                0047       LOGICAL  DIFFERENT_MULTIPLE
                0048       EXTERNAL DIFFERENT_MULTIPLE
                0049       LOGICAL  MASTER_CPU_IO
                0050       EXTERNAL MASTER_CPU_IO
                0051 
                0052 C     !LOCAL VARIABLES:
                0053       CHARACTER*(MAX_LEN_MBUF) msgBuf
b082722712 Jean*0054       _RL dummyRL(6)
                0055       INTEGER k
9a6281d071 Jean*0056       _RL var2Du(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0057       _RL var2Dv(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0058       _RL var3Du(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0059       _RL var3Dv(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0060       _RS dumRS(1)
                0061       _RL dumRL(1)
9476e7548f Patr*0062 
872ff0f059 Jean*0063       IF ( DIFFERENT_MULTIPLE(adjMonitorFreq,myTime,deltaTClock) ) THEN
9476e7548f Patr*0064 
                0065         IF ( MASTER_CPU_IO(myThid) ) THEN
                0066 C--   only the master thread is allowed to switch On/Off mon_write_stdout
3daafce20b Jean*0067 C     & mon_write_mnc (since it is the only thread that uses those flags):
9476e7548f Patr*0068 
                0069           IF (monitor_stdio) THEN
                0070             mon_write_stdout = .TRUE.
                0071           ELSE
                0072             mon_write_stdout = .FALSE.
                0073           ENDIF
                0074           mon_write_mnc = .FALSE.
                0075 #ifdef ALLOW_MNC
                0076           IF (useMNC .AND. monitor_mnc) THEN
b082722712 Jean*0077             DO k = 1,MAX_LEN_MBUF
                0078               mon_fname(k:k) = ' '
9476e7548f Patr*0079             ENDDO
b082722712 Jean*0080             mon_fname(1:9) = 'admonitor'
9476e7548f Patr*0081             CALL MNC_CW_APPEND_VNAME(
                0082      &           'T', '-_-_--__-__t', 0,0, myThid)
                0083             CALL MNC_CW_SET_UDIM(mon_fname, -1, myThid)
                0084             CALL MNC_CW_RL_W_S(
                0085      &          'D',mon_fname,1,1,'T', myTime, myThid)
                0086             CALL MNC_CW_SET_UDIM(mon_fname, 0, myThid)
                0087             mon_write_mnc = .TRUE.
                0088           ENDIF
                0089 #endif /* ALLOW_MNC */
                0090 
                0091 C       Dynamics field monitor start
                0092           IF ( mon_write_stdout ) THEN
                0093             WRITE(msgBuf,'(2A)') '// ==========================',
                0094      &             '============================='
                0095             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0096             WRITE(msgBuf,'(A)')
fa12eee058 Jean*0097      &             '// Begin AD_MONITOR dynamic field statistics'
9476e7548f Patr*0098             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0099             WRITE(msgBuf,'(2A)') '// ==========================',
                0100      &             '============================='
                0101             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0102           ENDIF
                0103 
                0104 C--   endif master cpu io
                0105         ENDIF
                0106 
                0107 C       Print the time to make grepping the stdout easier
                0108         CALL MON_SET_PREF('ad_time',myThid)
                0109         CALL MON_OUT_I( '_tsnumber', myIter,mon_string_none,myThid)
                0110         CALL MON_OUT_RL('_secondsf', myTime,mon_string_none,myThid)
                0111 
                0112 C       Print the basic statistics of model state variables
                0113         CALL MON_SET_PREF('ad_dynstat',myThid)
9a6281d071 Jean*0114         IF ( mon_AdVarExch.EQ.1 ) THEN
                0115 #ifndef AUTODIFF_TAMC_COMPATIBILITY
                0116           CALL ADEXCH_3D_RL(  adEtaN, 1 , myThid )
                0117           CALL ADEXCH_UV_3D_RL( aduVel, advVel, .TRUE., Nr, myThid )
                0118           CALL ADEXCH_3D_RL( adwVel,  Nr, myThid )
                0119           CALL ADEXCH_3D_RL( adTheta, Nr, myThid )
                0120           CALL ADEXCH_3D_RL( adSalt,  Nr, myThid )
                0121 #endif
                0122         ENDIF
                0123         IF ( mon_AdVarExch.NE.2 ) THEN
                0124           CALL MON_WRITESTATS_RL(  1, adEtaN, '_adeta',
                0125      &             maskInC, maskInC, rA , drF, dummyRL, myThid )
                0126           CALL MON_WRITESTATS_RL( Nr, aduVel, '_aduvel',
                0127      &             hFacW, maskInW, rAw, drF, dummyRL, myThid )
                0128           CALL MON_WRITESTATS_RL( Nr, advVel, '_advvel',
                0129      &             hFacS, maskInS, rAs, drF, dummyRL, myThid )
                0130           CALL MON_WRITESTATS_RL( Nr, adwVel, '_adwvel',
                0131      &             maskC, maskInC, rA , drC, dummyRL, myThid )
                0132           CALL MON_WRITESTATS_RL( Nr, adTheta,'_adtheta',
                0133      &             hFacC, maskInC, rA , drF, dummyRL, myThid )
                0134           CALL MON_WRITESTATS_RL( Nr, adSalt, '_adsalt',
                0135      &             hFacC, maskInC, rA , drF, dummyRL, myThid )
                0136           IF ( monitorSelect.GE.3 .AND.
                0137      &         nSx.EQ.1 .AND. nSy.EQ.1 ) THEN
b082722712 Jean*0138 C-      print stats only if nSx=nSy=1 since otherwise stats are wrong
9a6281d071 Jean*0139            k = 1
                0140            IF ( usingPCoords ) k = Nr
                0141            CALL MON_WRITESTATS_RL( 1, adTheta(1-OLx,1-OLy,k,1,1),
                0142      &          '_adsst', maskInC, maskInC, rA, drF, dummyRL, myThid )
                0143            CALL MON_WRITESTATS_RL( 1, adSalt(1-OLx,1-OLy,k,1,1),
                0144      &          '_adsss', maskInC, maskInC, rA, drF, dummyRL, myThid )
                0145           ENDIF
                0146         ELSE
                0147 C       case dumpAdVarExch = 2
                0148           CALL COPY_ADVAR_OUTP( dumRS, adEtaN, var2Du, 1 , 12, myThid )
                0149           CALL MON_WRITESTATS_RL(  1, var2Du, '_adeta',
                0150      &             maskInC, maskInC, rA , drF, dummyRL, myThid )
                0151 
                0152           CALL COPY_AD_UV_OUTP( dumRS, dumRS, aduVel, advVel,
                0153      &                                 var3Du, var3Dv, Nr, 34, myThid )
                0154           CALL MON_WRITESTATS_RL( Nr, var3Du, '_aduvel',
                0155      &             hFacW, maskInW, rAw, drF, dummyRL, myThid )
                0156           CALL MON_WRITESTATS_RL( Nr, var3Dv, '_advvel',
                0157      &             hFacS, maskInS, rAs, drF, dummyRL, myThid )
                0158 
                0159           CALL COPY_ADVAR_OUTP( dumRS, adwVel, var3Du, Nr, 12, myThid )
                0160           CALL MON_WRITESTATS_RL( Nr, var3Du, '_adwvel',
                0161      &             maskC, maskInC, rA , drC, dummyRL, myThid )
                0162           CALL COPY_ADVAR_OUTP( dumRS, adTheta,var3Du, Nr, 12, myThid )
                0163           CALL COPY_ADVAR_OUTP( dumRS, adSalt, var3Dv, Nr, 12, myThid )
                0164           CALL MON_WRITESTATS_RL( Nr, var3Du, '_adtheta',
                0165      &             hFacC, maskInC, rA , drF, dummyRL, myThid )
                0166           CALL MON_WRITESTATS_RL( Nr, var3Dv, '_adsalt',
                0167      &             hFacC, maskInC, rA , drF, dummyRL, myThid )
                0168           IF ( monitorSelect.GE.3 .AND.
                0169      &         nSx.EQ.1 .AND. nSy.EQ.1 ) THEN
                0170 C-      print stats only if nSx=nSy=1 since otherwise stats are wrong
                0171            k = 1
                0172            IF ( usingPCoords ) k = Nr
                0173            CALL MON_WRITESTATS_RL( 1, var3Du(1-OLx,1-OLy,k,1,1),
                0174      &          '_adsst', maskInC, maskInC, rA, drF, dummyRL, myThid )
                0175            CALL MON_WRITESTATS_RL( 1, var3Dv(1-OLx,1-OLy,k,1,1),
                0176      &          '_adsss', maskInC, maskInC, rA, drF, dummyRL, myThid )
                0177           ENDIF
b082722712 Jean*0178         ENDIF
9476e7548f Patr*0179 
                0180 C       Print the basic statistics of external forcing
872ff0f059 Jean*0181         IF ( monitorSelect.GE.4 ) THEN
9a6281d071 Jean*0182           CALL MON_SET_PREF('ad_forcing',myThid)
                0183           IF ( mon_AdVarExch.NE.2 ) THEN
                0184            CALL MON_WRITESTATS_RS( 1, adQnet, '_adqnet',
                0185      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
9476e7548f Patr*0186 #ifdef SHORTWAVE_HEATING
9a6281d071 Jean*0187            CALL MON_WRITESTATS_RS( 1, adQsw , '_adqsw',
                0188      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
9476e7548f Patr*0189 #endif
9a6281d071 Jean*0190            CALL MON_WRITESTATS_RS( 1, adEmPmR,'_adempmr',
                0191      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
                0192            CALL MON_WRITESTATS_RS( 1, adfu ,  '_adfu',
                0193      &              maskInW, maskInW, rAw, drF, dummyRL, myThid )
                0194            CALL MON_WRITESTATS_RS( 1, adfv ,  '_adfv',
                0195      &              maskInS, maskInS, rAs, drF, dummyRL, myThid )
                0196           ELSE
                0197 C       case dumpAdVarExch = 2
                0198            CALL COPY_ADVAR_OUTP( adQnet, dumRL, var2Du, 1, 11, myThid )
                0199            CALL MON_WRITESTATS_RL( 1, var2Du, '_adqnet',
                0200      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
                0201 #ifdef SHORTWAVE_HEATING
                0202            CALL COPY_ADVAR_OUTP( adQsw,  dumRL, var2Du, 1, 11, myThid )
                0203            CALL MON_WRITESTATS_RL( 1, var2Du, '_adqsw',
                0204      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
                0205 #endif
                0206            CALL COPY_ADVAR_OUTP( adEmPmR,dumRL, var2Du, 1, 11, myThid )
                0207            CALL MON_WRITESTATS_RL( 1, var2Du, '_adempmr',
                0208      &              maskInC, maskInC, rA , drF, dummyRL, myThid )
                0209            CALL COPY_AD_UV_OUTP( adFu, adFv, dumRL, dumRL,
                0210      &                                  var2Du, var2Dv, 1, 33, myThid )
                0211            CALL MON_WRITESTATS_RL( 1, var2Du, '_adfu',
                0212      &              maskInW, maskInW, rAw, drF, dummyRL, myThid )
                0213            CALL MON_WRITESTATS_RL( 1, var2Dv, '_adfv',
                0214      &              maskInS, maskInS, rAs, drF, dummyRL, myThid )
                0215           ENDIF
                0216         ENDIF
9476e7548f Patr*0217 
                0218 C       Dynamics field monitor finish
                0219         IF ( MASTER_CPU_IO(myThid) ) THEN
                0220 C--   only the master thread is allowed to switch On/Off mon_write_stdout
3daafce20b Jean*0221 C     & mon_write_mnc (since it is the only thread that uses those flags):
9476e7548f Patr*0222 
                0223           IF ( mon_write_stdout ) THEN
                0224             WRITE(msgBuf,'(2A)') '// ==========================',
                0225      &             '============================='
                0226             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0227             WRITE(msgBuf,'(A)')
fa12eee058 Jean*0228      &             '// End AD_MONITOR dynamic field statistics'
9476e7548f Patr*0229             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0230             WRITE(msgBuf,'(2A)') '// ==========================',
                0231      &             '============================='
                0232             CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1)
                0233           ENDIF
                0234 
                0235           mon_write_stdout = .FALSE.
                0236           mon_write_mnc    = .FALSE.
                0237 
                0238 C--   endif master cpu io
                0239         ENDIF
                0240 
                0241 C     endif different multiple
                0242       ENDIF
                0243 
fb247706a7 Patr*0244 #ifdef ALLOW_EXF
                0245 cph This case is handled separately in exf_adjoint_snapshots_ad.F
                0246 #endif
                0247 
                0248 #ifdef ALLOW_SEAICE
                0249       CALL ADSEAICE_MONITOR ( myTime, myIter, myThid )
                0250 #endif
                0251 
0c43cc41de Patr*0252 #ifdef ALLOW_PTRACERS
                0253       CALL ADPTRACERS_MONITOR ( myTime, myIter, myThid )
                0254 #endif
                0255 
9476e7548f Patr*0256 #endif /* ALLOW_AUTODIFF_MONITOR */
                0257 #endif /* ALLOW_ADJOINT_RUN */
                0258 
                0259       RETURN
                0260       END