| 1 | sannino | 1.1 | C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.66 2006/05/03 15:38:42 heimbach Exp $ | 
| 2 |  |  | C $Name:  $ | 
| 3 |  |  |  | 
| 4 |  |  | #include "PACKAGES_CONFIG.h" | 
| 5 |  |  | #include "CPP_OPTIONS.h" | 
| 6 |  |  |  | 
| 7 |  |  | C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| | 
| 8 |  |  | CBOP | 
| 9 |  |  | C     !ROUTINE: SET_WRITE_GLOBAL_PICKUP | 
| 10 |  |  | C     !INTERFACE: | 
| 11 |  |  | SUBROUTINE SET_WRITE_GLOBAL_PICKUP( flag ) | 
| 12 |  |  |  | 
| 13 |  |  | C     !DESCRIPTION: | 
| 14 |  |  | C     Sets an internal logical state to indicate whether files written | 
| 15 |  |  | C     by subsequent calls to the READ_WRITE_FLD package should create | 
| 16 |  |  | C     "global" or "tiled" files: | 
| 17 |  |  | C     \begin{center} | 
| 18 |  |  | C       \begin{tabular}[h]{|l|l|}\hline | 
| 19 |  |  | C         \texttt{flag}  &  Meaning  \\\hline | 
| 20 |  |  | C         \texttt{.TRUE.}  &  use ``global'' files  \\ | 
| 21 |  |  | C         \texttt{.TRUE.}  &  use ``tiled'' files  \\\hline | 
| 22 |  |  | C       \end{tabular} | 
| 23 |  |  | C     \end{center} | 
| 24 |  |  |  | 
| 25 |  |  | C     !USES: | 
| 26 |  |  | IMPLICIT NONE | 
| 27 |  |  |  | 
| 28 |  |  | C     !INPUT PARAMETERS: | 
| 29 |  |  | LOGICAL flag | 
| 30 |  |  | CEOP | 
| 31 |  |  | COMMON /PCKP_GBLFLS/ globalFile | 
| 32 |  |  | LOGICAL globalFile | 
| 33 |  |  |  | 
| 34 |  |  | globalFile = flag | 
| 35 |  |  |  | 
| 36 |  |  | RETURN | 
| 37 |  |  | END | 
| 38 |  |  |  | 
| 39 |  |  | C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| | 
| 40 |  |  | CBOP | 
| 41 |  |  | C     !ROUTINE: READ_CHECKPOINT | 
| 42 |  |  | C     !INTERFACE: | 
| 43 |  |  | SUBROUTINE READ_CHECKPOINT( | 
| 44 |  |  | I     myIter, myThid ) | 
| 45 |  |  |  | 
| 46 |  |  | C     !DESCRIPTION: | 
| 47 |  |  | C     This is the controlling routine for IO to write restart (or | 
| 48 |  |  | C     ``pickup'' or ``checkpoint'') files.  It calls routines from other | 
| 49 |  |  | C     packages (\textit{eg.} mdsio and mnc) to do the per-variable | 
| 50 |  |  | C     reads. | 
| 51 |  |  |  | 
| 52 |  |  | C     !USES: | 
| 53 |  |  | IMPLICIT NONE | 
| 54 |  |  | #include "SIZE.h" | 
| 55 |  |  | #include "EEPARAMS.h" | 
| 56 |  |  | #include "PARAMS.h" | 
| 57 |  |  | #ifdef ALLOW_MNC | 
| 58 |  |  | #include "MNC_PARAMS.h" | 
| 59 |  |  | #endif | 
| 60 |  |  | #include "DYNVARS.h" | 
| 61 |  |  | #include "SURFACE.h" | 
| 62 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 63 |  |  | #include "NH_VARS.h" | 
| 64 |  |  | #endif | 
| 65 |  |  | INTEGER  IO_ERRCOUNT | 
| 66 |  |  | EXTERNAL IO_ERRCOUNT | 
| 67 |  |  |  | 
| 68 |  |  | C     !INPUT/OUTPUT PARAMETERS: | 
| 69 |  |  | C     myThid - Thread number for this instance of the routine. | 
| 70 |  |  | C     myIter - Iteration number | 
| 71 |  |  | INTEGER myThid | 
| 72 |  |  | INTEGER myIter | 
| 73 |  |  | CEOP | 
| 74 |  |  |  | 
| 75 |  |  | C     !LOCAL VARIABLES: | 
| 76 |  |  | C     oldPrec :: Temp. for hold I/O precision information | 
| 77 |  |  | C     prec | 
| 78 |  |  | C     fn      :: Temp. for building file name. | 
| 79 |  |  | INTEGER prec | 
| 80 |  |  | INTEGER i, nj | 
| 81 |  |  | CHARACTER*(MAX_LEN_FNAM) fn | 
| 82 |  |  | CHARACTER*(10) suff | 
| 83 |  |  | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 84 |  |  | INTEGER oldPrec | 
| 85 |  |  | #endif | 
| 86 |  |  | #ifdef ALLOW_ADAMSBASHFORTH_3 | 
| 87 |  |  | INTEGER j | 
| 88 |  |  | #endif | 
| 89 |  |  |  | 
| 90 |  |  | C     Suffix for pickup files | 
| 91 |  |  | DO i = 1,MAX_LEN_FNAM | 
| 92 |  |  | fn(i:i) = ' ' | 
| 93 |  |  | ENDDO | 
| 94 |  |  | IF (pickupSuff .EQ. ' ') THEN | 
| 95 |  |  | WRITE(suff,'(I10.10)') myIter | 
| 96 |  |  | ELSE | 
| 97 |  |  | WRITE(suff,'(A10)') pickupSuff | 
| 98 |  |  | ENDIF | 
| 99 |  |  | WRITE(fn,'(A,A10)') 'pickup.',suff | 
| 100 |  |  |  | 
| 101 |  |  | C     Going to really do some IO. Make everyone except master thread wait. | 
| 102 |  |  | _BARRIER | 
| 103 |  |  | C     _BEGIN_MASTER( myThid ) | 
| 104 |  |  |  | 
| 105 |  |  | IF (pickup_read_mdsio) THEN | 
| 106 |  |  |  | 
| 107 |  |  | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 108 |  |  |  | 
| 109 |  |  | C       Force 64-bit IO | 
| 110 |  |  | oldPrec        = readBinaryPrec | 
| 111 |  |  | readBinaryPrec = precFloat64 | 
| 112 |  |  |  | 
| 113 |  |  | C       Read model fields | 
| 114 |  |  | C       Raw fields | 
| 115 |  |  | CALL READ_REC_XYZ_RL(  'uVel',   uVel, 1,myIter,myThid) | 
| 116 |  |  | CALL READ_REC_XYZ_RL(    'gU',     gU, 1,myIter,myThid) | 
| 117 |  |  | CALL READ_REC_XYZ_RL( 'guNm1',  guNm1, 1,myIter,myThid) | 
| 118 |  |  | CALL READ_REC_XYZ_RL(  'vVel',   vVel, 1,myIter,myThid) | 
| 119 |  |  | CALL READ_REC_XYZ_RL(    'gV',     gV, 1,myIter,myThid) | 
| 120 |  |  | CALL READ_REC_XYZ_RL( 'gvNm1',  gvNm1, 1,myIter,myThid) | 
| 121 |  |  | CALL READ_REC_XYZ_RL( 'theta',  theta, 1,myIter,myThid) | 
| 122 |  |  | CALL READ_REC_XYZ_RL(    'gT',     gT, 1,myIter,myThid) | 
| 123 |  |  | CALL READ_REC_XYZ_RL( 'gtNm1',  gtNm1, 1,myIter,myThid) | 
| 124 |  |  | CALL READ_REC_XYZ_RL(  'salt',   salt, 1,myIter,myThid) | 
| 125 |  |  | CALL READ_REC_XYZ_RL(    'gS',     gS, 1,myIter,myThid) | 
| 126 |  |  | CALL READ_REC_XYZ_RL( 'gsNm1',  gsNm1, 1,myIter,myThid) | 
| 127 |  |  | CALL READ_REC_XY_RL (  'etaN',   etaN, 1,myIter,myThid) | 
| 128 |  |  |  | 
| 129 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 130 |  |  | IF ( use3Dsolver ) THEN | 
| 131 |  |  | CALL READ_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid) | 
| 132 |  |  | c         CALL READ_REC_XYZ_RL(    'gW',    gW,1,myIter,myThid) | 
| 133 |  |  | CALL READ_REC_XYZ_RL( 'gWnm1', gwNm1,1,myIter,myThid) | 
| 134 |  |  | ENDIF | 
| 135 |  |  | #endif | 
| 136 |  |  |  | 
| 137 |  |  | C       Reset default IO precision | 
| 138 |  |  | readBinaryPrec = oldPrec | 
| 139 |  |  |  | 
| 140 |  |  | #else /* OLD_STYLE_WITH_MANY_FILES */ | 
| 141 |  |  |  | 
| 142 |  |  | prec = precFloat64 | 
| 143 |  |  |  | 
| 144 |  |  | #ifdef ALLOW_MDSIO | 
| 145 |  |  |  | 
| 146 |  |  | C       Read model fields | 
| 147 |  |  | IF ( usePickupBeforeC54 ) THEN | 
| 148 |  |  | #ifndef ALLOW_ADAMSBASHFORTH_3 | 
| 149 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel,   1,myThid) | 
| 150 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gU,     2,myThid) | 
| 151 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,guNm1,  3,myThid) | 
| 152 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel,   4,myThid) | 
| 153 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gV,     5,myThid) | 
| 154 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gvNm1,  6,myThid) | 
| 155 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,theta,  7,myThid) | 
| 156 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gT,     8,myThid) | 
| 157 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gtNm1,  9,myThid) | 
| 158 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,salt,  10,myThid) | 
| 159 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gS,    11,myThid) | 
| 160 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gsNm1, 12,myThid) | 
| 161 |  |  | #endif /*  ALLOW_ADAMSBASHFORTH_3 */ | 
| 162 |  |  | CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,12*Nr+1,myThid) | 
| 163 |  |  | #ifdef NONLIN_FRSURF | 
| 164 |  |  | IF (nonlinFreeSurf .GE. 0) THEN | 
| 165 |  |  | CALL MDSREADFIELD(fn,prec,'RL',1,etaH,12*Nr+2,myThid) | 
| 166 |  |  | ENDIF | 
| 167 |  |  | #endif | 
| 168 |  |  | ELSE | 
| 169 |  |  | #ifdef ALLOW_ADAMSBASHFORTH_3 | 
| 170 |  |  | j = 3 | 
| 171 |  |  | IF ( startFromPickupAB2 ) j = 2 | 
| 172 |  |  | nj = 0 | 
| 173 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, nj+1,myThid) | 
| 174 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 175 |  |  | &                guNm(1-Olx,1-Oly,1,1,1,1),  nj+2,myThid) | 
| 176 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 177 |  |  | &                guNm(1-Olx,1-Oly,1,1,1,2),  nj+j,myThid) | 
| 178 |  |  | nj = j | 
| 179 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, nj+1,myThid) | 
| 180 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 181 |  |  | &                gvNm(1-Olx,1-Oly,1,1,1,1),  nj+2,myThid) | 
| 182 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 183 |  |  | &                gvNm(1-Olx,1-Oly,1,1,1,2),  nj+j,myThid) | 
| 184 |  |  | nj = 2*j | 
| 185 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,theta,nj+1,myThid) | 
| 186 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 187 |  |  | &                gtNm(1-Olx,1-Oly,1,1,1,1),  nj+2,myThid) | 
| 188 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 189 |  |  | &                gtNm(1-Olx,1-Oly,1,1,1,2),  nj+j,myThid) | 
| 190 |  |  | nj = 3*j | 
| 191 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, nj+1,myThid) | 
| 192 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 193 |  |  | &                gsNm(1-Olx,1-Oly,1,1,1,1),  nj+2,myThid) | 
| 194 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, | 
| 195 |  |  | &                gsNm(1-Olx,1-Oly,1,1,1,2),  nj+j,myThid) | 
| 196 |  |  | nj = 4*j | 
| 197 |  |  | #else /*  ALLOW_ADAMSBASHFORTH_3 */ | 
| 198 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel,   1,myThid) | 
| 199 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,guNm1,  2,myThid) | 
| 200 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel,   3,myThid) | 
| 201 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gvNm1,  4,myThid) | 
| 202 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,theta,  5,myThid) | 
| 203 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gtNm1,  6,myThid) | 
| 204 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,salt,   7,myThid) | 
| 205 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,gsNm1,  8,myThid) | 
| 206 |  |  | nj = 8 | 
| 207 |  |  | #endif /*  ALLOW_ADAMSBASHFORTH_3 */ | 
| 208 |  |  | CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,    nj*Nr+1,myThid) | 
| 209 |  |  | #ifdef EXACT_CONSERV | 
| 210 |  |  | IF (exactConserv) THEN | 
| 211 |  |  | CALL MDSREADFIELD(fn,prec,'RL',1,dEtaHdt,nj*Nr+2,myThid) | 
| 212 |  |  | ENDIF | 
| 213 |  |  | IF (nonlinFreeSurf .GT. 0) THEN | 
| 214 |  |  | CALL MDSREADFIELD(fn,prec,'RL',1,etaH,   nj*Nr+3,myThid) | 
| 215 |  |  | ENDIF | 
| 216 |  |  | #endif | 
| 217 |  |  | ENDIF | 
| 218 |  |  |  | 
| 219 |  |  | IF ( useDynP_inEos_Zc ) THEN | 
| 220 |  |  | WRITE(fn,'(A,A10)') 'pickup_ph.',suff | 
| 221 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,totPhiHyd,1,myThid) | 
| 222 |  |  | ENDIF | 
| 223 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 224 |  |  | IF ( use3Dsolver ) THEN | 
| 225 |  |  | WRITE(fn,'(A,A10)') 'pickup_nh.',suff | 
| 226 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid) | 
| 227 |  |  | c         CALL MDSREADFIELD(fn,prec,'RL',Nr,    gW,2,myThid) | 
| 228 |  |  | CALL MDSREADFIELD(fn,prec,'RL',Nr, gwNm1,2,myThid) | 
| 229 |  |  | ENDIF | 
| 230 |  |  | #endif | 
| 231 |  |  |  | 
| 232 |  |  | #endif /* ALLOW_MDSIO */ | 
| 233 |  |  |  | 
| 234 |  |  | #endif /* OLD_STYLE_WITH_MANY_FILES */ | 
| 235 |  |  |  | 
| 236 |  |  | ENDIF | 
| 237 |  |  |  | 
| 238 |  |  | #ifdef ALLOW_MNC | 
| 239 |  |  | IF (useMNC .AND. pickup_read_mnc) THEN | 
| 240 |  |  | WRITE(fn,'(A)') 'pickup' | 
| 241 |  |  | CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid) | 
| 242 |  |  | CALL MNC_CW_SET_UDIM(fn, 1, myThid) | 
| 243 |  |  | CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, -1, myThid) | 
| 244 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'U',uVel, myThid) | 
| 245 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'V',vVel, myThid) | 
| 246 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'Temp',theta, myThid) | 
| 247 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'S',salt, myThid) | 
| 248 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'Eta',etaN, myThid) | 
| 249 |  |  | #ifndef ALLOW_ADAMSBASHFORTH_3 | 
| 250 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'gUnm1',guNm1, myThid) | 
| 251 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'gVnm1',gvNm1, myThid) | 
| 252 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'gTnm1',gtNm1, myThid) | 
| 253 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'gSnm1',gsNm1, myThid) | 
| 254 |  |  | #endif /* ALLOW_ADAMSBASHFORTH_3 */ | 
| 255 |  |  | C#ifdef NONLIN_FRSURF | 
| 256 |  |  | C        IF ( nonlinFreeSurf.GE.0 .AND. usePickupBeforeC54 ) | 
| 257 |  |  | C     &    CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid) | 
| 258 |  |  | C#endif | 
| 259 |  |  | #ifdef EXACT_CONSERV | 
| 260 |  |  | IF (exactConserv) THEN | 
| 261 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'dEtaHdt',dEtaHdt,myThid) | 
| 262 |  |  | ENDIF | 
| 263 |  |  | IF (nonlinFreeSurf .GT. 0) THEN | 
| 264 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid) | 
| 265 |  |  | ENDIF | 
| 266 |  |  | #endif | 
| 267 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 268 |  |  | IF (use3Dsolver) THEN | 
| 269 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'phi_nh', phi_nh, myThid) | 
| 270 |  |  | c         CALL MNC_CW_RL_R('D',fn,0,0,'gW', gW, myThid) | 
| 271 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'gWnm1', gwNm1, myThid) | 
| 272 |  |  | ENDIF | 
| 273 |  |  | #endif | 
| 274 |  |  | IF ( useDynP_inEos_Zc ) THEN | 
| 275 |  |  | CALL MNC_CW_RL_R('D',fn,0,0,'phiHyd',totPhiHyd,myThid) | 
| 276 |  |  | ENDIF | 
| 277 |  |  | ENDIF | 
| 278 |  |  | #endif /*  ALLOW_MNC  */ | 
| 279 |  |  |  | 
| 280 |  |  | C     _END_MASTER( myThid ) | 
| 281 |  |  | _BARRIER | 
| 282 |  |  |  | 
| 283 |  |  | C     Fill in edge regions | 
| 284 |  |  | CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid) | 
| 285 |  |  | _EXCH_XYZ_R8(theta , myThid ) | 
| 286 |  |  | _EXCH_XYZ_R8(salt  , myThid ) | 
| 287 |  |  | c     CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid) | 
| 288 |  |  | c     _EXCH_XYZ_R8(gt    , myThid ) | 
| 289 |  |  | c     _EXCH_XYZ_R8(gs    , myThid ) | 
| 290 |  |  | #ifdef ALLOW_ADAMSBASHFORTH_3 | 
| 291 |  |  | CALL EXCH_UV_XYZ_RL(guNm(1-Olx,1-Oly,1,1,1,1), | 
| 292 |  |  | &                    gvNm(1-Olx,1-Oly,1,1,1,1),.TRUE.,myThid) | 
| 293 |  |  | _EXCH_XYZ_R8( gtNm(1-Olx,1-Oly,1,1,1,1), myThid ) | 
| 294 |  |  | _EXCH_XYZ_R8( gsNm(1-Olx,1-Oly,1,1,1,1), myThid ) | 
| 295 |  |  | CALL EXCH_UV_XYZ_RL(guNm(1-Olx,1-Oly,1,1,1,2), | 
| 296 |  |  | &                    gvNm(1-Olx,1-Oly,1,1,1,2),.TRUE.,myThid) | 
| 297 |  |  | _EXCH_XYZ_R8( gtNm(1-Olx,1-Oly,1,1,1,2), myThid ) | 
| 298 |  |  | _EXCH_XYZ_R8( gsNm(1-Olx,1-Oly,1,1,1,2), myThid ) | 
| 299 |  |  | #else /* ALLOW_ADAMSBASHFORTH_3 */ | 
| 300 |  |  | CALL EXCH_UV_XYZ_RL(guNm1,gvNm1,.TRUE.,myThid) | 
| 301 |  |  | _EXCH_XYZ_R8(gtNm1 , myThid ) | 
| 302 |  |  | _EXCH_XYZ_R8(gsNm1 , myThid ) | 
| 303 |  |  | #endif /* ALLOW_ADAMSBASHFORTH_3 */ | 
| 304 |  |  | _EXCH_XY_R8 (etaN, myThid ) | 
| 305 |  |  | _EXCH_XY_R8( etaH,    myThid ) | 
| 306 |  |  | #ifdef EXACT_CONSERV | 
| 307 |  |  | _EXCH_XY_R8( detaHdt, myThid ) | 
| 308 |  |  | #endif | 
| 309 |  |  |  | 
| 310 |  |  | IF ( useDynP_inEos_Zc ) | 
| 311 |  |  | &     _EXCH_XYZ_RL( totPhiHyd, myThid ) | 
| 312 |  |  |  | 
| 313 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 314 |  |  | IF ( use3Dsolver ) THEN | 
| 315 |  |  | _EXCH_XYZ_R8(phi_nh, myThid ) | 
| 316 |  |  | c       _EXCH_XYZ_R8(gW    , myThid ) | 
| 317 |  |  | _EXCH_XYZ_R8(gwNm1 , myThid ) | 
| 318 |  |  | ENDIF | 
| 319 |  |  | #endif | 
| 320 |  |  |  | 
| 321 |  |  | RETURN | 
| 322 |  |  | END | 
| 323 |  |  |  | 
| 324 |  |  | C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| | 
| 325 |  |  | CBOP | 
| 326 |  |  | C     !ROUTINE: WRITE_CHECKPOINT | 
| 327 |  |  | C     !INTERFACE: | 
| 328 |  |  | SUBROUTINE WRITE_CHECKPOINT( | 
| 329 |  |  | I     modelEnd, myTime, | 
| 330 |  |  | I     myIter, myThid ) | 
| 331 |  |  |  | 
| 332 |  |  | C     !DESCRIPTION: | 
| 333 |  |  | C     This is the controlling routine for IO to write restart (or | 
| 334 |  |  | C     ``pickup'' or ``checkpoint'') files.  It calls routines from other | 
| 335 |  |  | C     packages (\textit{eg.} mdsio and mnc) to do the per-variable | 
| 336 |  |  | C     writes. | 
| 337 |  |  | C | 
| 338 |  |  | C     Both ``rolling-checkpoint'' files and permanent checkpoint files | 
| 339 |  |  | C     are written here. A rolling checkpoint works through a circular | 
| 340 |  |  | C     list of suffices. Generally the circular list has two entries so | 
| 341 |  |  | C     that a rolling checkpoint will overwrite the last rolling | 
| 342 |  |  | C     checkpoint but one. This is useful for running long jobs without | 
| 343 |  |  | C     filling too much disk space.  In a permanent checkpoint, data is | 
| 344 |  |  | C     written suffixed by the current timestep number. Permanent | 
| 345 |  |  | C     checkpoints can be used to provide snap-shots from which the | 
| 346 |  |  | C     model can be restarted. | 
| 347 |  |  |  | 
| 348 |  |  | C     !USES: | 
| 349 |  |  | IMPLICIT NONE | 
| 350 |  |  | #include "SIZE.h" | 
| 351 |  |  | #include "EEPARAMS.h" | 
| 352 |  |  | #include "PARAMS.h" | 
| 353 |  |  | LOGICAL  DIFFERENT_MULTIPLE | 
| 354 |  |  | EXTERNAL DIFFERENT_MULTIPLE | 
| 355 |  |  | INTEGER  IO_ERRCOUNT | 
| 356 |  |  | EXTERNAL IO_ERRCOUNT | 
| 357 |  |  |  | 
| 358 |  |  | C     !INPUT PARAMETERS: | 
| 359 |  |  | C     modelEnd  :: Checkpoint call at end of model run. | 
| 360 |  |  | C     myThid    :: Thread number for this instance of the routine. | 
| 361 |  |  | C     myIter    :: Iteration number | 
| 362 |  |  | C     myTime    :: Current time of simulation ( s ) | 
| 363 |  |  | LOGICAL modelEnd | 
| 364 |  |  | INTEGER myThid | 
| 365 |  |  | INTEGER myIter | 
| 366 |  |  | _RL     myTime | 
| 367 |  |  | CEOP | 
| 368 |  |  |  | 
| 369 |  |  | C     !LOCAL VARIABLES: | 
| 370 |  |  | C     permCheckPoint :: Flag indicating whether a permanent checkpoint will | 
| 371 |  |  | C                       be written. | 
| 372 |  |  | C     tempCheckPoint :: Flag indicating if it is time to write a non-permanent | 
| 373 |  |  | C                       checkpoint (that will be permanent if permCheckPoint=T) | 
| 374 |  |  | LOGICAL permCheckPoint, tempCheckPoint | 
| 375 |  |  |  | 
| 376 |  |  | IF ( .NOT.useOffLine ) THEN | 
| 377 |  |  | permCheckPoint = .FALSE. | 
| 378 |  |  | tempCheckPoint = .FALSE. | 
| 379 |  |  | permCheckPoint = | 
| 380 |  |  | &     DIFFERENT_MULTIPLE(pChkPtFreq,myTime,deltaTClock) | 
| 381 |  |  | tempCheckPoint = | 
| 382 |  |  | &     DIFFERENT_MULTIPLE( chkPtFreq,myTime,deltaTClock) | 
| 383 |  |  |  | 
| 384 |  |  | #ifdef ALLOW_CAL | 
| 385 |  |  | IF ( useCAL ) THEN | 
| 386 |  |  | CALL CAL_TIME2DUMP( pChkPtFreq, deltaTClock, | 
| 387 |  |  | U                       permCheckPoint, | 
| 388 |  |  | I                       myTime, myIter, myThid ) | 
| 389 |  |  | CALL CAL_TIME2DUMP( chkPtFreq,  deltaTClock, | 
| 390 |  |  | U                       tempCheckPoint, | 
| 391 |  |  | I                       myTime, myIter, myThid ) | 
| 392 |  |  | ENDIF | 
| 393 |  |  | #endif | 
| 394 |  |  |  | 
| 395 |  |  | IF ( | 
| 396 |  |  | &     ( .NOT.modelEnd .AND. (permCheckPoint.OR.tempCheckPoint) ) | 
| 397 |  |  | &     .OR. | 
| 398 |  |  | &     ( modelEnd .AND. .NOT.(permCheckPoint.OR.tempCheckPoint) ) | 
| 399 |  |  | &    ) THEN | 
| 400 |  |  | CALL WRITE_CHECKPOINT_NOW( | 
| 401 |  |  | &       permCheckPoint, myTime, myIter, myThid ) | 
| 402 |  |  | ENDIF | 
| 403 |  |  |  | 
| 404 |  |  | cgmOASIS( | 
| 405 |  |  | c       CALL OASIS_RESTART (myTime, myIter, myThid) | 
| 406 |  |  | cgmOASIS) | 
| 407 |  |  |  | 
| 408 |  |  | C-    if not useOffLine: end | 
| 409 |  |  | ENDIF | 
| 410 |  |  |  | 
| 411 |  |  | RETURN | 
| 412 |  |  | END | 
| 413 |  |  |  | 
| 414 |  |  | C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| | 
| 415 |  |  | CBOP | 
| 416 |  |  | C     !ROUTINE: WRITE_CHECKPOINT_NOW | 
| 417 |  |  | C     !INTERFACE: | 
| 418 |  |  | SUBROUTINE WRITE_CHECKPOINT_NOW( | 
| 419 |  |  | I     permCheckPoint, myTime, | 
| 420 |  |  | I     myIter, myThid ) | 
| 421 |  |  |  | 
| 422 |  |  | C     !DESCRIPTION: | 
| 423 |  |  | C     Write the checkpoint and do it NOW. | 
| 424 |  |  |  | 
| 425 |  |  | C     !USES: | 
| 426 |  |  | IMPLICIT NONE | 
| 427 |  |  | #include "SIZE.h" | 
| 428 |  |  | #include "EEPARAMS.h" | 
| 429 |  |  | #include "PARAMS.h" | 
| 430 |  |  | #ifdef ALLOW_MNC | 
| 431 |  |  | #include "MNC_PARAMS.h" | 
| 432 |  |  | #endif | 
| 433 |  |  | #include "DYNVARS.h" | 
| 434 |  |  | #include "SURFACE.h" | 
| 435 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 436 |  |  | #include "NH_VARS.h" | 
| 437 |  |  | #endif | 
| 438 |  |  | INTEGER  IO_ERRCOUNT | 
| 439 |  |  | EXTERNAL IO_ERRCOUNT | 
| 440 |  |  | COMMON /PCKP_GBLFLS/ globalFile | 
| 441 |  |  | LOGICAL globalFile | 
| 442 |  |  |  | 
| 443 |  |  | C     !INPUT PARAMETERS: | 
| 444 |  |  | C     permCheckPoint  :: Is or is not a permanent checkpoint. | 
| 445 |  |  | C     myThid          :: Thread number for this instance of the routine. | 
| 446 |  |  | C     myIter          :: Iteration number | 
| 447 |  |  | C     myTime          :: Current time of simulation ( s ) | 
| 448 |  |  | LOGICAL permCheckPoint | 
| 449 |  |  | INTEGER myThid | 
| 450 |  |  | INTEGER myIter | 
| 451 |  |  | _RL     myTime | 
| 452 |  |  | CEOP | 
| 453 |  |  |  | 
| 454 |  |  | C     !LOCAL VARIABLES: | 
| 455 |  |  | C     oldPrc :: Temp. for holding I/O precision | 
| 456 |  |  | C     fn     :: Temp. for building file name string. | 
| 457 |  |  | C     lgf    :: Flag to indicate whether to use global file mode. | 
| 458 |  |  | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 459 |  |  | INTEGER oldPrec | 
| 460 |  |  | #endif | 
| 461 |  |  | INTEGER prec | 
| 462 |  |  | INTEGER i, nj | 
| 463 |  |  | CHARACTER*(MAX_LEN_FNAM) fn | 
| 464 |  |  | CHARACTER*(MAX_LEN_MBUF) msgBuf | 
| 465 |  |  | LOGICAL lgf | 
| 466 |  |  |  | 
| 467 |  |  | C     Write model fields | 
| 468 |  |  | DO i = 1,MAX_LEN_FNAM | 
| 469 |  |  | fn(i:i) = ' ' | 
| 470 |  |  | ENDDO | 
| 471 |  |  | IF ( permCheckPoint ) THEN | 
| 472 |  |  | WRITE(fn,'(A,I10.10)') 'pickup.',myIter | 
| 473 |  |  | ELSE | 
| 474 |  |  | WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev) | 
| 475 |  |  | ENDIF | 
| 476 |  |  |  | 
| 477 |  |  | C     Going to really do some IO. Make everyone except master thread wait. | 
| 478 |  |  | _BARRIER | 
| 479 |  |  | C     _BEGIN_MASTER( myThid ) | 
| 480 |  |  |  | 
| 481 |  |  | IF (pickup_write_mdsio) THEN | 
| 482 |  |  |  | 
| 483 |  |  | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 484 |  |  |  | 
| 485 |  |  | C       Force 64-bit IO | 
| 486 |  |  | oldPrec = writeBinaryPrec | 
| 487 |  |  | writeBinaryPrec = precFloat64 | 
| 488 |  |  | C       Write model fields | 
| 489 |  |  | C       Raw fields | 
| 490 |  |  | CALL WRITE_REC_XYZ_RL(  'uVel',   uVel, 1,myIter,myThid) | 
| 491 |  |  | CALL WRITE_REC_XYZ_RL(    'gU',     gU, 1,myIter,myThid) | 
| 492 |  |  | CALL WRITE_REC_XYZ_RL( 'gUNm1',  guNm1, 1,myIter,myThid) | 
| 493 |  |  | CALL WRITE_REC_XYZ_RL(  'vVel',   vVel, 1,myIter,myThid) | 
| 494 |  |  | CALL WRITE_REC_XYZ_RL(    'gV',     gV, 1,myIter,myThid) | 
| 495 |  |  | CALL WRITE_REC_XYZ_RL( 'gVNm1',  gvNm1, 1,myIter,myThid) | 
| 496 |  |  | CALL WRITE_REC_XYZ_RL( 'theta',  theta, 1,myIter,myThid) | 
| 497 |  |  | CALL WRITE_REC_XYZ_RL(    'gT',     gT, 1,myIter,myThid) | 
| 498 |  |  | CALL WRITE_REC_XYZ_RL( 'gTNm1',  gtNm1, 1,myIter,myThid) | 
| 499 |  |  | CALL WRITE_REC_XYZ_RL(  'salt',   salt, 1,myIter,myThid) | 
| 500 |  |  | CALL WRITE_REC_XYZ_RL(    'gS',     gS, 1,myIter,myThid) | 
| 501 |  |  | CALL WRITE_REC_XYZ_RL( 'gSNm1',  gsNm1, 1,myIter,myThid) | 
| 502 |  |  | CALL WRITE_REC_XY_RL (  'etaN',  etaN,  1,myIter,myThid) | 
| 503 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 504 |  |  | IF ( use3Dsolver ) THEN | 
| 505 |  |  | CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid) | 
| 506 |  |  | c         CALL WRITE_REC_XYZ_RL(    'gW',    gW,1,myIter,myThid) | 
| 507 |  |  | CALL WRITE_REC_XYZ_RL( 'gWnm1', gwNm1,1,myIter,myThid) | 
| 508 |  |  | ENDIF | 
| 509 |  |  | #endif | 
| 510 |  |  | C       Reset binary precision | 
| 511 |  |  | writeBinaryPrec = oldPrec | 
| 512 |  |  |  | 
| 513 |  |  | #else /* OLD_STYLE_WITH_MANY_FILES */ | 
| 514 |  |  |  | 
| 515 |  |  | prec = precFloat64 | 
| 516 |  |  | lgf = globalFile | 
| 517 |  |  |  | 
| 518 |  |  | #ifdef ALLOW_MDSIO | 
| 519 |  |  |  | 
| 520 |  |  | #ifdef ALLOW_ADAMSBASHFORTH_3 | 
| 521 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel,  1,myIter,myThid) | 
| 522 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 523 |  |  | &                     guNm(1-Olx,1-Oly,1,1,1,1), 2,myIter,myThid) | 
| 524 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 525 |  |  | &                     guNm(1-Olx,1-Oly,1,1,1,2), 3,myIter,myThid) | 
| 526 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel,  4,myIter,myThid) | 
| 527 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 528 |  |  | &                     gvNm(1-Olx,1-Oly,1,1,1,1), 5,myIter,myThid) | 
| 529 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 530 |  |  | &                     gvNm(1-Olx,1-Oly,1,1,1,2), 6,myIter,myThid) | 
| 531 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 7,myIter,myThid) | 
| 532 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 533 |  |  | &                     gtNm(1-Olx,1-Oly,1,1,1,1), 8,myIter,myThid) | 
| 534 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 535 |  |  | &                     gtNm(1-Olx,1-Oly,1,1,1,2), 9,myIter,myThid) | 
| 536 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 10,myIter,myThid) | 
| 537 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 538 |  |  | &                     gsNm(1-Olx,1-Oly,1,1,1,1),11,myIter,myThid) | 
| 539 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr, | 
| 540 |  |  | &                     gsNm(1-Olx,1-Oly,1,1,1,2),12,myIter,myThid) | 
| 541 |  |  | nj = 12 | 
| 542 |  |  | #else /*  ALLOW_ADAMSBASHFORTH_3 */ | 
| 543 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid) | 
| 544 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,guNm1,2,myIter,myThid) | 
| 545 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 3,myIter,myThid) | 
| 546 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gvNm1,4,myIter,myThid) | 
| 547 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta,5,myIter,myThid) | 
| 548 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gtNm1,6,myIter,myThid) | 
| 549 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 7,myIter,myThid) | 
| 550 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gsNm1,8,myIter,myThid) | 
| 551 |  |  | nj = 8 | 
| 552 |  |  | #endif /*  ALLOW_ADAMSBASHFORTH_3 */ | 
| 553 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN,   nj*Nr+1, | 
| 554 |  |  | &       myIter,myThid) | 
| 555 |  |  | #ifdef EXACT_CONSERV | 
| 556 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,dEtaHdt,nj*Nr+2, | 
| 557 |  |  | &       myIter,myThid) | 
| 558 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaHnm1,nj*Nr+3, | 
| 559 |  |  | &       myIter,myThid) | 
| 560 |  |  | #endif /* EXACT_CONSERV */ | 
| 561 |  |  | IF ( useDynP_inEos_Zc ) THEN | 
| 562 |  |  | IF ( permCheckPoint ) THEN | 
| 563 |  |  | WRITE(fn,'(A,I10.10)') 'pickup_ph.',myIter | 
| 564 |  |  | ELSE | 
| 565 |  |  | WRITE(fn,'(A,A)') 'pickup_ph.',checkPtSuff(nCheckLev) | 
| 566 |  |  | ENDIF | 
| 567 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,totPhiHyd, | 
| 568 |  |  | &         1,myIter,myThid) | 
| 569 |  |  | ENDIF | 
| 570 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 571 |  |  | IF ( use3Dsolver ) THEN | 
| 572 |  |  | IF ( permCheckPoint ) THEN | 
| 573 |  |  | WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter | 
| 574 |  |  | ELSE | 
| 575 |  |  | WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev) | 
| 576 |  |  | ENDIF | 
| 577 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh, 1, | 
| 578 |  |  | &         myIter,myThid) | 
| 579 |  |  | c         CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW,     2, | 
| 580 |  |  | c    &         myIter,myThid) | 
| 581 |  |  | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gwNm1,  2, | 
| 582 |  |  | &         myIter,myThid) | 
| 583 |  |  | ENDIF | 
| 584 |  |  | #endif /* ALLOW_NONHYDROSTATIC */ | 
| 585 |  |  |  | 
| 586 |  |  | #endif /* ALLOW_MDSIO */ | 
| 587 |  |  |  | 
| 588 |  |  | #endif /* OLD_STYLE_WITH_MANY_FILES */ | 
| 589 |  |  |  | 
| 590 |  |  | ENDIF | 
| 591 |  |  |  | 
| 592 |  |  | #ifdef ALLOW_MNC | 
| 593 |  |  | IF (useMNC .AND. pickup_write_mnc) THEN | 
| 594 |  |  | IF ( permCheckPoint ) THEN | 
| 595 |  |  | WRITE(fn,'(A)') 'pickup' | 
| 596 |  |  | ELSE | 
| 597 |  |  | WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev) | 
| 598 |  |  | ENDIF | 
| 599 |  |  | C       First ***define*** the file group name | 
| 600 |  |  | CALL MNC_CW_SET_UDIM(fn, 0, myThid) | 
| 601 |  |  | IF ( permCheckPoint ) THEN | 
| 602 |  |  | CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, 0, myThid) | 
| 603 |  |  | ELSE | 
| 604 |  |  | CALL MNC_CW_SET_CITER(fn, 2, -1, -1, -1, myThid) | 
| 605 |  |  | ENDIF | 
| 606 |  |  | C       Then set the actual unlimited dimension | 
| 607 |  |  | CALL MNC_CW_SET_UDIM(fn, 1, myThid) | 
| 608 |  |  | CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid) | 
| 609 |  |  | CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid) | 
| 610 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'U', uVel, myThid) | 
| 611 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'V', vVel, myThid) | 
| 612 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'Temp', theta, myThid) | 
| 613 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'S', salt, myThid) | 
| 614 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'Eta', etaN, myThid) | 
| 615 |  |  | #ifndef ALLOW_ADAMSBASHFORTH_3 | 
| 616 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'gUnm1', guNm1, myThid) | 
| 617 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'gVnm1', gvNm1, myThid) | 
| 618 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'gTnm1', gtNm1, myThid) | 
| 619 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'gSnm1', gsNm1, myThid) | 
| 620 |  |  | #endif /* ALLOW_ADAMSBASHFORTH_3 */ | 
| 621 |  |  | #ifdef EXACT_CONSERV | 
| 622 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'dEtaHdt', dEtaHdt, myThid) | 
| 623 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'EtaH', etaHnm1, myThid) | 
| 624 |  |  | #endif | 
| 625 |  |  | #ifdef ALLOW_NONHYDROSTATIC | 
| 626 |  |  | IF ( use3Dsolver ) THEN | 
| 627 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'phi_nh', phi_nh, myThid) | 
| 628 |  |  | c         CALL MNC_CW_RL_W('D',fn,0,0,'gW', gW, myThid) | 
| 629 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'gWnm1', gwNm1, myThid) | 
| 630 |  |  | ENDIF | 
| 631 |  |  | #endif | 
| 632 |  |  | IF ( useDynP_inEos_Zc ) THEN | 
| 633 |  |  | CALL MNC_CW_RL_W('D',fn,0,0,'phiHyd', totPhiHyd, myThid) | 
| 634 |  |  | ENDIF | 
| 635 |  |  | ENDIF | 
| 636 |  |  | #endif /*  ALLOW_MNC  */ | 
| 637 |  |  |  | 
| 638 |  |  | C     Write suffix for stdout information | 
| 639 |  |  | IF ( permCheckPoint ) THEN | 
| 640 |  |  | WRITE(fn,'(I10.10)') myIter | 
| 641 |  |  | ELSE | 
| 642 |  |  | WRITE(fn,'(A)') checkPtSuff(nCheckLev) | 
| 643 |  |  | ENDIF | 
| 644 |  |  |  | 
| 645 |  |  | IF ( .NOT. permCheckPoint ) THEN | 
| 646 |  |  | nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1 | 
| 647 |  |  | ENDIF | 
| 648 |  |  |  | 
| 649 |  |  | C     _END_MASTER(myThid) | 
| 650 |  |  | _BARRIER | 
| 651 |  |  |  | 
| 652 |  |  | C     Write information to stdout so there is a record that the | 
| 653 |  |  | C     checkpoint was completed | 
| 654 |  |  | _BEGIN_MASTER(myThid) | 
| 655 |  |  | WRITE(msgBuf,'(A11,I10,1X,A10)') | 
| 656 |  |  | &     "%CHECKPOINT ",myIter,fn | 
| 657 |  |  | CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1) | 
| 658 |  |  | _END_MASTER(myThid) | 
| 659 |  |  |  | 
| 660 |  |  | RETURN | 
| 661 |  |  | END |