C $Header: /u/gcmpack/MITgcm/pkg/land/land_monitor.F,v 1.14 2010/03/16 00:14:47 jmc Exp $ C $Name: $ #include "LAND_OPTIONS.h" CBOP C !ROUTINE: LAND_MONITOR C !INTERFACE: SUBROUTINE LAND_MONITOR( land_frc, myTime, myIter, myThid ) C !DESCRIPTION: C Do land global and Hemispheric diagnostic C !USES: IMPLICIT NONE #include "LAND_SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "LAND_PARAMS.h" #include "LAND_VARS.h" #ifdef ALLOW_MONITOR # include "MONITOR.h" #endif C !INPUT/OUTPUT PARAMETERS: C land_frc :: land fraction [0-1] C myTime :: Current time of simulation ( s ) C myIter :: Iteration number C myThid :: Number of this instance of INI_FORCING _RS land_frc(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL myTime INTEGER myIter INTEGER myThid CEOP #ifdef ALLOW_LAND #ifdef ALLOW_MONITOR C === Functions ==== LOGICAL DIFFERENT_MULTIPLE EXTERNAL LOGICAL MASTER_CPU_IO EXTERNAL C == Local variables == C nLatBnd :: Number of latitude bands C msgBuf :: Informational/error message buffer C mon_var :: Variable sufix name C mon_sufx :: Latitude band sufix C n, k :: loop counter C yBand :: latitude separation C locDr :: thickness (= 1. here) C theMin :: lat. band minimum value C theMax :: lat. band maximum value C theMean :: lat. band mean value C theVar :: lat. band variance C theVol :: lat. band volume (or area if locDr=1.) C theMeanG :: global mean value C theVarG :: global variance C theVolG :: global volume (or area if locDr=1.) C theEng :: lat. band energy content C theEnergy :: total energy INTEGER nLatBnd PARAMETER ( nLatBnd = 3 ) CHARACTER*(MAX_LEN_MBUF) msgBuf CHARACTER*10 mon_var CHARACTER*2 mon_sufx(0:nLatBnd) INTEGER n, k _RS yBand(nLatBnd), locDr(land_nLev) _RL theMin(nLatBnd), theMax(nLatBnd) _RL theMean(nLatBnd), theVar(nLatBnd), theVol(nLatBnd) _RL theMeanG, theVolG _RL theEng(nLatBnd), theEnergy DATA yBand / 0. , -24. , 24. / DATA mon_sufx / '_G' , '_S' , '_T' , '_N' / C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| IF ( DIFFERENT_MULTIPLE(land_monFreq,myTime,deltaTClock) & .OR. myIter.EQ.nIter0 ) THEN IF ( MASTER_CPU_IO(myThid) ) THEN C-- only the master thread is allowed to switch On/Off mon_write_stdout C & mon_write_mnc (since it is the only thread that uses those flags): IF ( land_mon_stdio ) THEN mon_write_stdout = .TRUE. ELSE mon_write_stdout = .FALSE. ENDIF mon_write_mnc = .FALSE. #ifdef ALLOW_MNC IF ( useMNC .AND. land_mon_mnc ) THEN DO k = 1,MAX_LEN_MBUF mon_fname(k:k) = ' ' ENDDO mon_fname(1:12) = 'monitor_land' CALL MNC_CW_APPEND_VNAME( & 'T', '-_-_--__-__t', 0,0, myThid) CALL MNC_CW_SET_UDIM(mon_fname, -1, myThid) CALL MNC_CW_I_W_S( & 'I',mon_fname,1,1,'T', myIter, myThid) CALL MNC_CW_SET_UDIM(mon_fname, 0, myThid) mon_write_mnc = .TRUE. ENDIF #endif /* ALLOW_MNC */ IF ( mon_write_stdout ) THEN WRITE(msgBuf,'(2A)') '// ===========================', & '============================' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) WRITE(msgBuf,'(A)') '// Begin MONITOR Land statistics' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) WRITE(msgBuf,'(2A)') '// ===========================', & '============================' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) ENDIF C-- endif master cpu io ENDIF CALL MON_SET_PREF('land_',myThid) CALL MON_OUT_RL('time_sec', myTime,mon_string_none,myThid) DO k=1,land_nLev locDr(k)= 1. ENDDO C-- Snow thickness : CALL MON_STATS_LATBND_RL( I 1, 1, 1, nLatBnd, yBand, I land_hSnow, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theVolG = 0. theMeanG= 0. DO n=1,nLatBnd theVolG = theVolG + theVol(n) theMeanG = theMeanG + theMean(n)*theVol(n) theEng(n)= -land_rhoSnow*land_Lfreez*theMean(n)*theVol(n) ENDDO IF (theVolG.GT.0.) theMeanG = theMeanG / theVolG mon_var='SnwH_ave' CALL MON_OUT_RL(mon_var,theMeanG , mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theMean(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theMean(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theMean(3), mon_sufx(3), myThid) mon_var='SnwH_max' CALL MON_OUT_RL(mon_var, theMax(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMax(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMax(3), mon_sufx(3), myThid) IF ( myIter.EQ.1+nIter0 ) THEN _BEGIN_MASTER(myThid) WRITE(msgBuf,'(A,1PE16.9,A,0P9F7.2)') '%MON LAND : Area=', & theVolG, ' ; Lat sep=', (yBand(n),n=2,nLatBnd) CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1) WRITE(msgBuf,'(A,1P9E16.9)') '%MON LAND : LatA=', & (theVol(n),n=1,nLatBnd) CALL PRINT_MESSAGE( msgBuf, mon_ioUnit, SQUEEZE_RIGHT , 1) _END_MASTER(myThid) ENDIF C-- Surface Temp. : CALL MON_STATS_LATBND_RL( I 1, 1, 1, nLatBnd, yBand, I land_skinT, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theVolG = 0. theMeanG= 0. DO n=1,nLatBnd theVolG = theVolG + theVol(n) theMeanG = theMeanG + theMean(n)*theVol(n) ENDDO IF (theVolG.GT.0.) theMeanG = theMeanG / theVolG mon_var='Tsrf_ave' CALL MON_OUT_RL(mon_var,theMeanG , mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theMean(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theMean(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theMean(3), mon_sufx(3), myThid) mon_var='Tsrf_min' CALL MON_OUT_RL(mon_var, theMin(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMin(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMin(3), mon_sufx(3), myThid) mon_var='Tsrf_max' CALL MON_OUT_RL(mon_var, theMax(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMax(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMax(3), mon_sufx(3), myThid) C-- 1rst level (volume-mean) Temp. : CALL MON_STATS_LATBND_RL( I land_nLev, 1, 1, nLatBnd, yBand, I land_groundT, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theVolG = 0. theMeanG= 0. DO n=1,nLatBnd theVolG = theVolG + theVol(n) theMeanG = theMeanG + theMean(n)*theVol(n) ENDDO IF (theVolG.GT.0.) theMeanG = theMeanG / theVolG mon_var='Tgr1_ave' CALL MON_OUT_RL(mon_var,theMeanG , mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theMean(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theMean(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theMean(3), mon_sufx(3), myThid) mon_var='Tgr1_min' CALL MON_OUT_RL(mon_var, theMin(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMin(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMin(3), mon_sufx(3), myThid) mon_var='Tgr1_max' CALL MON_OUT_RL(mon_var, theMax(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMax(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMax(3), mon_sufx(3), myThid) C-- 2nd level (volume-mean) Temp. : CALL MON_STATS_LATBND_RL( I land_nLev, 1, 2, nLatBnd, yBand, I land_groundT, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theVolG = 0. theMeanG= 0. DO n=1,nLatBnd theVolG = theVolG + theVol(n) theMeanG = theMeanG + theMean(n)*theVol(n) ENDDO IF (theVolG.GT.0.) theMeanG = theMeanG / theVolG mon_var='Tgr2_ave' CALL MON_OUT_RL(mon_var,theMeanG , mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theMean(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theMean(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theMean(3), mon_sufx(3), myThid) mon_var='Tgr2_min' CALL MON_OUT_RL(mon_var, theMin(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMin(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMin(3), mon_sufx(3), myThid) mon_var='Tgr2_max' CALL MON_OUT_RL(mon_var, theMax(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMax(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMax(3), mon_sufx(3), myThid) C-- Total Energy : DO k=1,land_nLev locDr(k)= land_dzF(k) ENDDO CALL MON_STATS_LATBND_RL( I land_nLev, 1, 0, nLatBnd, yBand, I land_enthalp, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theEnergy = 0. DO n=1,nLatBnd theEng(n) = theEng(n) + theMean(n)*theVol(n) theEnergy = theEnergy + theEng(n) ENDDO mon_var='TotEnerg' CALL MON_OUT_RL(mon_var,theEnergy, mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theEng(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theEng(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theEng(3), mon_sufx(3), myThid) C-- Soil water content (level 1+2): CALL MON_STATS_LATBND_RL( I land_nLev, 1, 0, nLatBnd, yBand, I land_groundW, land_frc, maskInC, rA, yC, locDr, O theMin, theMax, theMean, theVar, theVol, I myThid ) theVolG = 0. theMeanG= 0. DO n=1,nLatBnd theVolG = theVolG + theVol(n) theMeanG = theMeanG + theMean(n)*theVol(n) ENDDO IF (theVolG.GT.0.) theMeanG = theMeanG / theVolG mon_var='grdW_ave' CALL MON_OUT_RL(mon_var,theMeanG , mon_sufx(0), myThid) CALL MON_OUT_RL(mon_var,theMean(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var,theMean(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var,theMean(3), mon_sufx(3), myThid) mon_var='grdW_min' CALL MON_OUT_RL(mon_var, theMin(1), mon_sufx(1), myThid) CALL MON_OUT_RL(mon_var, theMin(2), mon_sufx(2), myThid) CALL MON_OUT_RL(mon_var, theMin(3), mon_sufx(3), myThid) c mon_var='grdW_max' c CALL MON_OUT_RL(mon_var, theMax(1), mon_sufx(1), myThid) c CALL MON_OUT_RL(mon_var, theMax(2), mon_sufx(2), myThid) c CALL MON_OUT_RL(mon_var, theMax(3), mon_sufx(3), myThid) IF ( MASTER_CPU_IO(myThid) ) THEN C-- only the master thread is allowed to switch On/Off mon_write_stdout C & mon_write_mnc (since it is the only thread that uses those flags): IF (mon_write_stdout) THEN WRITE(msgBuf,'(2A)') '// ===========================', & '============================' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) WRITE(msgBuf,'(A)') '// End MONITOR Land statistics' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) WRITE(msgBuf,'(2A)') '// ===========================', & '============================' CALL PRINT_MESSAGE(msgBuf, mon_ioUnit, SQUEEZE_RIGHT, 1) ENDIF mon_write_stdout = .FALSE. mon_write_mnc = .FALSE. C-- endif master cpu io ENDIF C endif different multiple ENDIF #endif /* ALLOW_MONITOR */ #endif /* ALLOW_LAND */ RETURN END