C $Header: /u/gcmpack/MITgcm/pkg/atm_compon_interf/cpl_write_pickup.F,v 1.9 2016/01/13 21:36:26 jmc Exp $ C $Name: $ #include "ATM_CPL_OPTIONS.h" CBOP C !ROUTINE: CPL_WRITE_PICKUP C !INTERFACE: SUBROUTINE CPL_WRITE_PICKUP( I suff, myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE CPL_WRITE_PICKUP C | o Store coupling state for restart. C | - Atmospheric version - C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "CPL_PARAMS.h" #include "ATMCPL.h" C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C suff :: suffix for pickup file (eg. ckptA or 0000000010) C myTime :: Current time in simulation C myIter :: Current iteration number in simulation C myThid :: My Thread Id number CHARACTER*(*) suff _RL myTime INTEGER myIter INTEGER myThid CEOP #ifdef COMPONENT_MODULE C === Functions ==== INTEGER ILNBLNK EXTERNAL C !LOCAL VARIABLES: ==================================================== C j :: loop index / field number C nj :: record number C fp :: pickup-file precision C glf :: local flag for "globalFiles" C fn :: character buffer for creating filename C nWrFlds :: number of fields being written C listDim :: dimension of "wrFldList" local array C wrFldList :: list of written fields C msgBuf :: Informational/error message buffer INTEGER j, nj, fp, lChar LOGICAL glf _RL timList(1) CHARACTER*(MAX_LEN_FNAM) fn INTEGER listDim, nWrFlds PARAMETER( listDim = 18 ) CHARACTER*(8) wrFldList(listDim) CHARACTER*(MAX_LEN_MBUF) msgBuf CEOP lChar = ILNBLNK(suff) IF ( lChar.EQ.0 ) THEN WRITE(fn,'(2A)') 'pickup_cpl' ELSE WRITE(fn,'(2A)') 'pickup_cpl.',suff(1:lChar) ENDIF fp = precFloat64 j = 0 C- Firstly, write 3-D fields as consecutive records C- Then switch to 2-D fields: c nj = -j*Nr C record number < 0 : a hack not to write meta files now: c nj = nj-1 j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & HeatFlux , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'qHeatFlx' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & qShortWave, -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'qShortW ' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & tauX , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'surfTauX' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & tauY , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'surfTauY' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & EvMPrFlux , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'Evp-Prec' #ifdef ALLOW_LAND IF ( atm_cplExch_RunOff ) THEN j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & RunOffFlux, -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'RunOffFx' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & RunOffEnFx, -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'RnOfEnFx' ENDIF #endif /* ALLOW_LAND */ #ifdef ALLOW_THSICE IF ( atm_cplExch1W_sIce ) THEN j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & iceSaltFlx, -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'saltFlux' ENDIF IF ( atm_cplExch_SaltPl ) THEN j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & saltPlmFlx_cpl, -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'sltPlmFx' ENDIF #endif /* ALLOW_THSICE */ #ifdef ALLOW_AIM IF ( atm_cplExch_DIC ) THEN j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & airCO2 , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'atm-CO2 ' j = j + 1 CALL WRITE_REC_3D_RL( fn, fp, 1, & sWSpeed , -j, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'wndSpeed' ENDIF #endif /* ALLOW_AIM */ C- with only 2-D fields: nj = -j C-------------------------- nWrFlds = j IF ( nWrFlds.GT.listDim ) THEN WRITE(msgBuf,'(2A,I5,A)') 'CPL_WRITE_PICKUP: ', & 'trying to write ',nWrFlds,' fields' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A,I5,A)') 'CPL_WRITE_PICKUP: ', & 'field-list dimension (listDim=',listDim,') too small' CALL PRINT_ERROR( msgBuf, myThid ) CALL ALL_PROC_DIE( myThid ) STOP 'ABNORMAL END: S/R CPL_WRITE_PICKUP (list-size Pb)' ENDIF #ifdef ALLOW_MDSIO C uses this specific S/R to write (with more informations) only meta files j = 1 nj = ABS(nj) IF ( nWrFlds*Nr .EQ. nj ) THEN j = Nr nj = nWrFlds ENDIF glf = globalFiles timList(1) = myTime CALL MDS_WR_METAFILES( fn, fp, glf, .FALSE., & 0, 0, j, ' ', & nWrFlds, wrFldList, & 1, timList, oneRL, & nj, myIter, myThid ) #endif /* ALLOW_MDSIO */ C-------------------------- #endif /* COMPONENT_MODULE */ RETURN END