C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_write_pickup.F,v 1.23 2014/05/27 15:24:00 mlosch Exp $ C $Name: $ #include "SEAICE_OPTIONS.h" CBOP C !ROUTINE: SEAICE_WRITE_PICKUP C !INTERFACE: SUBROUTINE SEAICE_WRITE_PICKUP ( permPickup, suff, I myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE SEAICE_WRITE_PICKUP C | o Write sea ice pickup file for restarting. C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "SEAICE_SIZE.h" #include "SEAICE_PARAMS.h" #include "SEAICE.h" #include "SEAICE_TRACER.h" C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C permPickup :: write a permanent pickup 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 LOGICAL permPickup CHARACTER*(*) suff _RL myTime INTEGER myIter INTEGER myThid C !LOCAL VARIABLES: C == Local variables == C fp :: pickup-file precision ( precFloat64 ) C glf :: local flag for "globalFiles" C fn :: Temp. for building file name. C nWrFlds :: number of fields being written C listDim :: dimension of "wrFldList" local array C wrFldList :: list of written fields C j :: loop index / field number C nj :: record number C msgBuf :: Informational/error message buffer INTEGER fp LOGICAL glf _RL timList(1) CHARACTER*(MAX_LEN_FNAM) fn INTEGER listDim, nWrFlds PARAMETER( listDim = 20 ) CHARACTER*(8) wrFldList(listDim) INTEGER j, nj CHARACTER*(MAX_LEN_MBUF) msgBuf #ifdef ALLOW_SITRACER CHARACTER*(8) fldName INTEGER iTrac #endif CEOP C-- Write model fields WRITE(fn,'(A,A)') 'pickup_seaice.',suff c IF ( seaice_pickup_write_mdsio ) THEN fp = precFloat64 j = 0 nj = 0 C record number < 0 : a hack not to write meta files now: C-- write Sea-Ice Thermodynamics State variables, starting with 3-D fields: IF ( .NOT.useThSIce ) THEN #ifdef SEAICE_ITD j = j + 1 CALL WRITE_REC_3D_RL( fn,fp, nITD, TICES, -j, myIter,myThid ) IF (j.LE.listDim) wrFldList(j) = 'siTICES ' j = j + 1 CALL WRITE_REC_3D_RL( fn,fp, nITD, AREAITD, -j, myIter,myThid ) IF (j.LE.listDim) wrFldList(j) = 'siAREAn ' j = j + 1 CALL WRITE_REC_3D_RL( fn,fp, nITD, HEFFITD, -j, myIter,myThid ) IF (j.LE.listDim) wrFldList(j) = 'siHEFFn ' j = j + 1 CALL WRITE_REC_3D_RL( fn,fp, nITD, HSNOWITD,-j, myIter,myThid ) IF (j.LE.listDim) wrFldList(j) = 'siHSNOWn' C- switch to 2-D fields: nj = -j*nITD #else /* SEAICE_ITD */ j = j + 1 nj = nj-1 IF (SEAICE_multDim.GT.1) THEN CALL WRITE_REC_3D_RL(fn,fp,nITD,TICES, nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siTICES ' C- switch to 2-D fields: c nj = nj*nITD nj = nj-nITD+1 ELSE CALL WRITE_REC_LEV_RL( fn, fp, nITD, 1, 1, TICES, I nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siTICE ' ENDIF C--- continue to write 2-D fields: j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, AREA , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siAREA ' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, HEFF , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siHEFF ' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, HSNOW , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siHSNOW ' #endif /* SEAICE_ITD */ #ifdef SEAICE_VARIABLE_SALINITY j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, HSALT , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siHSALT ' #endif #ifdef ALLOW_SITRACER DO iTrac = 1, SItrNumInUse WRITE(fldName,'(A6,I2.2)') 'siTrac', iTrac j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, & SItracer(1-OLx,1-OLy,1,1,iTrac), & nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = fldName ENDDO #endif ENDIF C-- write Sea-Ice Dynamics variables (all 2-D fields): j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, UICE , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siUICE ' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, VICE , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siVICE ' IF ( SEAICEuseBDF2 ) THEN j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, uIceNm1 , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siUicNm1' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, vIceNm1 , nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siVicNm1' ENDIF #if (defined(SEAICE_CGRID) defined(SEAICE_ALLOW_EVP)) IF ( SEAICEuseEVP ) THEN j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, seaice_sigma1, & nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siSigm1 ' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, seaice_sigma2, & nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siSigm2 ' j = j + 1 nj = nj-1 CALL WRITE_REC_3D_RL( fn, fp, 1, seaice_sigma12, & nj, myIter, myThid ) IF (j.LE.listDim) wrFldList(j) = 'siSigm12' ENDIF #endif /* SEAICE_ALLOW_EVP */ nWrFlds = j IF ( nWrFlds.GT.listDim ) THEN WRITE(msgBuf,'(2A,I5,A)') 'WRITE_SEAICE_PICKUP: ', & 'trying to write ',nWrFlds,' fields' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A,I5,A)') 'WRITE_SEAICE_PICKUP: ', & 'field-list dimension (listDim=',listDim,') too small' CALL PRINT_ERROR( msgBuf, myThid ) STOP 'ABNORMAL END: S/R WRITE_SEAICE_PICKUP (list-size Pb)' ENDIF #ifdef ALLOW_MDSIO C uses this specific S/R to write (with more informations) only meta files nj = ABS(nj) glf = globalFiles timList(1) = myTime CALL MDS_WR_METAFILES( fn, fp, glf, .FALSE., & 0, 0, 1, ' ', & nWrFlds, wrFldList, & 1, timList, oneRL, & nj, myIter, myThid ) C #endif /* ALLOW_MDSIO */ C-------------------------- c ENDIF RETURN END