C $Header: /u/gcmpack/MITgcm/pkg/land/land_output.F,v 1.7 2017/03/24 23:38:56 jmc Exp $ C $Name: $ #include "LAND_OPTIONS.h" CBOP C !ROUTINE: LAND_OUTPUT C !INTERFACE: SUBROUTINE LAND_OUTPUT( myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R LAND_OUTPUT C | o general routine for Land output C *==========================================================* C | - write snap-shot & time-average output C | - call monitor to write global quantities C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "LAND_SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "LAND_PARAMS.h" #include "LAND_VARS.h" #include "LAND_TAVE.h" #ifdef ALLOW_AIM #include "AIM_FFIELDS.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C myTime - Current time of simulation ( s ) C myIter - Iteration number C myThid - Number of this instance of the routine _RL myTime INTEGER myIter INTEGER myThid CEOP #ifdef ALLOW_LAND C !FUNCTIONS: LOGICAL DIFFERENT_MULTIPLE EXTERNAL C !LOCAL VARIABLES: C == Local variables == INTEGER bi, bj, k CHARACTER*(MAX_LEN_MBUF) msgBuf CHARACTER*(MAX_LEN_FNAM) fn CHARACTER*(10) suff #ifdef ALLOW_MNC CHARACTER*(1) pf #endif #ifdef ALLOW_AIM IF ( land_monFreq.NE.0. ) THEN CALL LAND_MONITOR( aim_landFr, myTime, myIter, myThid ) ENDIF #endif C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| IF ( & DIFFERENT_MULTIPLE( land_diagFreq, myTime, land_deltaT ) & .OR. dumpInitAndLast.AND.( myTime.EQ.endTime .OR. & myTime.EQ.startTime ) & ) THEN C-- Write snap-shot C jmc: previously done from LAND_DO_DIAGS, but much better here. IF ( land_snapshot_mdsio ) THEN IF ( rwSuffixType.EQ.0 ) THEN WRITE(suff,'(I10.10)') myIter ELSE CALL RW_GET_SUFFIX( suff, myTime, myIter, myThid ) ENDIF C-- Write ground Temp and soil moisture : CALL WRITE_FLD_3D_RL( 'land_groundT.', suff, land_nLev, & land_groundT, myIter, myThid ) CALL WRITE_FLD_3D_RL( 'land_enthalp.', suff, land_nLev, & land_enthalp, myIter, myThid ) CALL WRITE_FLD_3D_RL( 'land_groundW.', suff, land_nLev, & land_groundW, myIter, myThid ) C-- other (2-D) state variables: CALL WRITE_FLD_XY_RL( & 'land_skinT.', suff, land_skinT, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_hSnow.', suff, land_hSnow, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_snAge.', suff, land_snowAge, myIter, myThid ) IF ( myIter.NE.nIter0 ) THEN C-- fluxes (2-D map): CALL WRITE_FLD_XY_RL( & 'land_RunOff.', suff, land_runOff, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_enRnOf.', suff, land_enRnOf, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_HeatFx.', suff, land_HeatFlx, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_frWaFx.', suff, land_Pr_m_Ev, myIter, myThid ) CALL WRITE_FLD_XY_RL( & 'land_EnWaFx.', suff, land_EnWFlux, myIter, myThid ) ENDIF ENDIF #ifdef ALLOW_MNC IF ( land_snapshot_mnc ) THEN _BARRIER IF ( writeBinaryPrec .EQ. precFloat64 ) THEN pf(1:1) = 'D' ELSE pf(1:1) = 'R' ENDIF WRITE(fn,'(A)') 'land_snapshot' CALL MNC_CW_SET_UDIM(fn, -1, myThid) CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid) CALL MNC_CW_SET_UDIM(fn, 0, myThid) CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_groundT', land_groundT, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_enthalp', land_enthalp, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_groundW', land_groundW, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_skinT', land_skinT, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_hSnow', land_hSnow, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_snAge', land_snowAge, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_RunOff', land_runOff, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_enRnOf', land_enRnOf, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_HeatFx', land_HeatFlx, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_frWaFx', land_Pr_m_Ev, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_EnWaFx', land_EnWFlux, myThid) _BARRIER ENDIF #endif ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| #ifdef ALLOW_LAND_TAVE IF (land_taveFreq.LE.0.) RETURN IF ( myIter.EQ.nIter0 ) THEN C Initialize time-average arrays to zero DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) CALL TIMEAVE_RESET(land_grTtave,land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_entave, land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_grWtave,land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_sTtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_hStave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_sAtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_ROftave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_eROtave, 1, bi, bj, myThid) land_timeAve(bi,bj) = 0. ENDDO ENDDO C Dump files and restart average computation if needed ELSEIF ( & DIFFERENT_MULTIPLE( land_taveFreq, myTime, land_deltaT ) & ) THEN C Normalize by integrated time DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) CALL TIMEAVE_NORMALIZE( land_grTtave, land_timeAve, & land_nLev, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_entave, land_timeAve, & land_nLev, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_grWtave, land_timeAve, & land_nLev, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_sTtave, land_timeAve, & 1, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_hStave, land_timeAve, & 1, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_sAtave, land_timeAve, & 1, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_ROftave, land_timeAve, & 1, bi, bj, myThid ) CALL TIMEAVE_NORMALIZE( land_eROtave, land_timeAve, & 1, bi, bj, myThid ) ENDDO ENDDO IF ( land_timeave_mdsio ) THEN IF ( rwSuffixType.EQ.0 ) THEN WRITE(suff,'(I10.10)') myIter ELSE CALL RW_GET_SUFFIX( suff, myTime, myIter, myThid ) ENDIF WRITE(fn,'(2A)') 'land_tave.', suff CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, & land_grTtave, 1, myIter, myThid ) CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, & land_entave, 2, myIter, myThid ) CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, & land_grWtave, 3, myIter, myThid ) k = 3*land_nLev CALL WRITE_REC_XY_RL( fn, land_sTtave, k+1, myIter, myThid ) CALL WRITE_REC_XY_RL( fn, land_hStave, k+2, myIter, myThid ) CALL WRITE_REC_XY_RL( fn, land_sAtave, k+3, myIter, myThid ) CALL WRITE_REC_XY_RL( fn, land_ROftave, k+4, myIter, myThid ) CALL WRITE_REC_XY_RL( fn, land_eROtave, k+5, myIter, myThid ) ENDIF #ifdef ALLOW_MNC IF ( land_timeave_mnc ) THEN _BARRIER IF ( writeBinaryPrec .EQ. precFloat64 ) THEN pf(1:1) = 'D' ELSE pf(1:1) = 'R' ENDIF WRITE(fn,'(A)') 'land_tave' CALL MNC_CW_SET_UDIM(fn, -1, myThid) CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid) CALL MNC_CW_SET_UDIM(fn, 0, myThid) CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_groundT', land_grTtave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_enthalp', land_entave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_groundW', land_grWtave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_skinT', land_sTtave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_hSnow', land_hStave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_snAge', land_sAtave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_RunOff', land_ROftave, myThid) CALL MNC_CW_RL_W(pf,fn,0,0, & 'land_enRnOf', land_eROtave, myThid) _BARRIER ENDIF #endif WRITE(msgBuf,'(A,I10)') & '// Land Time-average written, t-step', myIter CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') ' ' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C Reset averages to zero DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) CALL TIMEAVE_RESET(land_grTtave,land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_entave, land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_grWtave,land_nLev, bi, bj, myThid) CALL TIMEAVE_RESET(land_sTtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_hStave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_sAtave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_ROftave, 1, bi, bj, myThid) CALL TIMEAVE_RESET(land_eROtave, 1, bi, bj, myThid) land_timeAve(bi,bj) = 0. ENDDO ENDDO ENDIF #endif /* ALLOW_LAND_TAVE */ #endif /* ALLOW_LAND */ RETURN END