| 1 | C $Header: /u/u0/gcmpack/MITgcm/model/src/checkpoint.F,v 1.18 2002/12/11 14:25:39 cheisey Exp $ | 
| 2 | C $Name: checkpoint48 $ | 
| 3 |  | 
| 4 | #include "CPP_OPTIONS.h" | 
| 5 |  | 
| 6 | C--  File read_write.F: Routines to handle mid-level I/O interface. | 
| 7 | C--   Contents | 
| 8 | C--   o SET_WRITE_GLOBAL_PICKUP | 
| 9 | C--   o READ_CHECKPOINT - Write out checkpoint files for restarting. | 
| 10 | C--   o WRITE_CHECKPOINT - Write out checkpoint files for restarting. | 
| 11 |  | 
| 12 | SUBROUTINE SET_WRITE_GLOBAL_PICKUP ( flag ) | 
| 13 | IMPLICIT NONE | 
| 14 | C SET_WRITE_GLOBAL_FLD( flag ) sets an internal logical state to | 
| 15 | C indicate whether files written by subsequent call to the | 
| 16 | C READ_WRITE_FLD package should create "global" or "tiled" files. | 
| 17 | C   flag = .TRUE.  indicates "global" files | 
| 18 | C   flag = .FALSE. indicates "tiled" files | 
| 19 | C | 
| 20 | C Arguments | 
| 21 | LOGICAL flag | 
| 22 | C Common | 
| 23 | COMMON /PCKP_GBLFLS/ globalFile | 
| 24 | LOGICAL globalFile | 
| 25 | C | 
| 26 | globalFile=flag | 
| 27 | C | 
| 28 | RETURN | 
| 29 | END | 
| 30 |  | 
| 31 | CBOP | 
| 32 | C     !ROUTINE: READ_CHECKPOINT | 
| 33 | C     !INTERFACE: | 
| 34 | SUBROUTINE READ_CHECKPOINT ( myIter, myThid ) | 
| 35 | C     !DESCRIPTION: \bv | 
| 36 | C     *==========================================================* | 
| 37 | C     | SUBROUTINE READ_PICKUP | 
| 38 | C     | o Controlling routine for IO to write restart file. | 
| 39 | C     *==========================================================* | 
| 40 | C     | Read model checkpoint files for use in restart. | 
| 41 | C     *==========================================================* | 
| 42 | C     \ev | 
| 43 | C     !USES: | 
| 44 | IMPLICIT NONE | 
| 45 | C     == Global variables === | 
| 46 | #include "SIZE.h" | 
| 47 | #include "EEPARAMS.h" | 
| 48 | #include "PARAMS.h" | 
| 49 | #include "DYNVARS.h" | 
| 50 | #ifdef ALLOW_NONHYDROSTATIC | 
| 51 | #include "GW.h" | 
| 52 | #include "SOLVE_FOR_PRESSURE3D.h" | 
| 53 | #endif | 
| 54 | INTEGER  IO_ERRCOUNT | 
| 55 | EXTERNAL IO_ERRCOUNT | 
| 56 |  | 
| 57 | C     !INPUT/OUTPUT PARAMETERS: | 
| 58 | C     == Routine arguments == | 
| 59 | C     myThid - Thread number for this instance of the routine. | 
| 60 | C     myIter - Iteration number | 
| 61 | INTEGER myThid | 
| 62 | INTEGER myIter | 
| 63 |  | 
| 64 | C     !LOCAL VARIABLES: | 
| 65 | C     == Local variables == | 
| 66 | C     oldPrec :: Temp. for hold I/O precision information | 
| 67 | C     prec | 
| 68 | C     fn      :: Temp. for building file name. | 
| 69 | INTEGER oldPrec | 
| 70 | CHARACTER*(MAX_LEN_FNAM) fn | 
| 71 | INTEGER prec | 
| 72 | CEOP | 
| 73 |  | 
| 74 | C--    Going to really do some IO. Make everyone except master thread wait. | 
| 75 | _BARRIER | 
| 76 | _BEGIN_MASTER( myThid ) | 
| 77 |  | 
| 78 | C       Force 64-bit IO | 
| 79 | oldPrec        = readBinaryPrec | 
| 80 | readBinaryPrec = precFloat64 | 
| 81 |  | 
| 82 | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 83 | C--     Read model fields | 
| 84 | C       Raw fields | 
| 85 | CALL READ_REC_XYZ_RL(  'uVel',   uVel, 1,myIter, myThid) | 
| 86 | CALL READ_REC_XYZ_RL(    'gU',     gU, 1,myIter, myThid) | 
| 87 | CALL READ_REC_XYZ_RL( 'guNm1',  gUNm1, 1,myIter, myThid) | 
| 88 | CALL READ_REC_XYZ_RL(  'vVel',   vVel, 1,myIter, myThid) | 
| 89 | CALL READ_REC_XYZ_RL(    'gV',     gV, 1,myIter, myThid) | 
| 90 | CALL READ_REC_XYZ_RL( 'gvNm1',  gVNm1, 1,myIter, myThid) | 
| 91 | CALL READ_REC_XYZ_RL( 'theta',  theta, 1,myIter, myThid) | 
| 92 | CALL READ_REC_XYZ_RL(    'gT',     gT, 1,myIter, myThid) | 
| 93 | CALL READ_REC_XYZ_RL( 'gtNm1',  gTNm1, 1,myIter, myThid) | 
| 94 | CALL READ_REC_XYZ_RL(  'salt',   salt, 1,myIter, myThid) | 
| 95 | CALL READ_REC_XYZ_RL(    'gS',     gS, 1,myIter, myThid) | 
| 96 | CALL READ_REC_XYZ_RL( 'gsNm1',  gSNm1, 1,myIter, myThid) | 
| 97 | CALL READ_REC_XY_RL ('etaN', etaN, 1,myIter, myThid) | 
| 98 | #ifdef INCLUDE_CD_CODE | 
| 99 | CALL READ_REC_XY_RL ('etaNm1', etaNm1, 1,myIter, myThid) | 
| 100 | CALL READ_REC_XYZ_RL(  'uVelD', uVelD, 1,myIter, myThid) | 
| 101 | CALL READ_REC_XYZ_RL(  'vVelD', vVelD, 1,myIter, myThid) | 
| 102 | CALL READ_REC_XYZ_RL(  'uNm1',  uNM1, 1,myIter, myThid) | 
| 103 | CALL READ_REC_XYZ_RL(  'vNm1',  vNM1, 1,myIter, myThid) | 
| 104 | CALL READ_REC_XYZ_RL(  'guCD',  guCD, 1,myIter, myThid) | 
| 105 | CALL READ_REC_XYZ_RL(  'gvCD',  gvCD, 1,myIter, myThid) | 
| 106 | #endif | 
| 107 |  | 
| 108 | #ifdef ALLOW_NONHYDROSTATIC | 
| 109 | IF ( nonHydrostatic ) THEN | 
| 110 | CALL READ_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid) | 
| 111 | CALL READ_REC_XYZ_RL( 'gW',gW,       1,myIter,myThid) | 
| 112 | c        CALL READ_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid) | 
| 113 | ENDIF | 
| 114 | #endif | 
| 115 | #else /* OLD_STYLE_WITH_MANY_FILES */ | 
| 116 |  | 
| 117 | prec = precFloat64 | 
| 118 |  | 
| 119 | C--     Read model fields | 
| 120 | WRITE(fn,'(A,I10.10)') 'pickup.',myIter | 
| 121 | CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel,   1,myThid) | 
| 122 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gU,     2,myThid) | 
| 123 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gUnm1,  3,myThid) | 
| 124 | CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel,   4,myThid) | 
| 125 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gV,     5,myThid) | 
| 126 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gVnm1,  6,myThid) | 
| 127 | CALL MDSREADFIELD(fn,prec,'RL',Nr,wVel,  7,myThid) | 
| 128 | CALL MDSREADFIELD(fn,prec,'RL',Nr,theta,  8,myThid) | 
| 129 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gT,     9,myThid) | 
| 130 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gTnm1,  10,myThid) | 
| 131 | CALL MDSREADFIELD(fn,prec,'RL',Nr,salt,  11,myThid) | 
| 132 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gS,    12,myThid) | 
| 133 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gSnm1, 13,myThid) | 
| 134 | CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,13*Nr+1,myThid) | 
| 135 | #ifdef NONLIN_FRSURF | 
| 136 | IF ( nonlinFreeSurf.GE.0) | 
| 137 | &  CALL MDSREADFIELD(fn,prec,'RL',1,etaH,13*Nr+2,myThid) | 
| 138 | #endif | 
| 139 | #ifdef INCLUDE_CD_CODE | 
| 140 | WRITE(fn,'(A,I10.10)') 'pickup_cd.',myIter | 
| 141 | CALL MDSREADFIELD(fn,prec,'RL',Nr,uVelD,    1,myThid) | 
| 142 | CALL MDSREADFIELD(fn,prec,'RL',Nr,vVelD,    2,myThid) | 
| 143 | CALL MDSREADFIELD(fn,prec,'RL',Nr,uNM1,     3,myThid) | 
| 144 | CALL MDSREADFIELD(fn,prec,'RL',Nr,vNM1,     4,myThid) | 
| 145 | CALL MDSREADFIELD(fn,prec,'RL',Nr,guCD,     5,myThid) | 
| 146 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gvCD,     6,myThid) | 
| 147 | CALL MDSREADFIELD(fn,prec,'RL', 1,etaNm1,6*Nr+1,myThid) | 
| 148 | #endif /* INCLUDE_CD_CODE */ | 
| 149 |  | 
| 150 | #ifdef ALLOW_NONHYDROSTATIC | 
| 151 | IF ( nonHydrostatic ) THEN | 
| 152 | WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter | 
| 153 | CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid) | 
| 154 | CALL MDSREADFIELD(fn,prec,'RL',Nr,gW,   2,myThid) | 
| 155 | c        CALL MDSREADFIELD(fn,prec,'RL',Nr,gWnm1,3,myThid) | 
| 156 | ENDIF | 
| 157 | #endif | 
| 158 |  | 
| 159 |  | 
| 160 |  | 
| 161 | C Create suffix to pass on to package pickup routines | 
| 162 | WRITE(fn,'(I10.10)') myIter | 
| 163 |  | 
| 164 | C SPK 4/9/01: Open boundary checkpointing | 
| 165 | #ifdef  ALLOW_OBCS | 
| 166 | IF (useOBCS) THEN | 
| 167 | CALL OBCS_READ_CHECKPOINT(prec, myIter, myThid) | 
| 168 | ENDIF | 
| 169 | #endif  /* ALLOW_OBCS */ | 
| 170 |  | 
| 171 | #endif /* OLD_STYLE_WITH_MANY_FILES */ | 
| 172 |  | 
| 173 | C       Reset default IO precision | 
| 174 | readBinaryPrec = oldPrec | 
| 175 |  | 
| 176 | _END_MASTER( myThid ) | 
| 177 | _BARRIER | 
| 178 |  | 
| 179 | #ifdef ALLOW_PTRACERS | 
| 180 | C Write restart file for passive tracers | 
| 181 | IF (usePTRACERS) THEN | 
| 182 | CALL PTRACERS_READ_CHECKPOINT(myIter,myThid) | 
| 183 | ENDIF | 
| 184 | #endif /* ALLOW_PTRACERS */ | 
| 185 |  | 
| 186 | C--    Fill in edge regions | 
| 187 | CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid) | 
| 188 | CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid) | 
| 189 | CALL EXCH_UV_XYZ_RL(gUnm1,gVnm1,.TRUE.,myThid) | 
| 190 | c     _EXCH_XYZ_R8(uVel  , myThid ) | 
| 191 | c     _EXCH_XYZ_R8(gu    , myThid ) | 
| 192 | c     _EXCH_XYZ_R8(guNM1 , myThid ) | 
| 193 | c     _EXCH_XYZ_R8(vVel  , myThid ) | 
| 194 | c     _EXCH_XYZ_R8(gv    , myThid ) | 
| 195 | c     _EXCH_XYZ_R8(gvNM1 , myThid ) | 
| 196 | _EXCH_XYZ_R8(theta , myThid ) | 
| 197 | _EXCH_XYZ_R8(gt    , myThid ) | 
| 198 | _EXCH_XYZ_R8(gtNM1 , myThid ) | 
| 199 | _EXCH_XYZ_R8(salt  , myThid ) | 
| 200 | _EXCH_XYZ_R8(gs    , myThid ) | 
| 201 | _EXCH_XYZ_R8(gsNM1 , myThid ) | 
| 202 | _EXCH_XY_R8 (etaN, myThid ) | 
| 203 | _EXCH_XY_R8( etaH, myThid ) | 
| 204 |  | 
| 205 | #ifdef INCLUDE_CD_CODE | 
| 206 | c**** CALL EXCH_DUV_XYZ_RL(uVelD,vVelD,.TRUE.,myThid) | 
| 207 | c**** CALL EXCH_DUV_XYZ_RL(guCD,gvCD,.TRUE.,myThid) | 
| 208 | _EXCH_XYZ_R8( uVelD,    myThid ) | 
| 209 | _EXCH_XYZ_R8( vVelD,    myThid ) | 
| 210 | CALL EXCH_UV_XYZ_RL(uNM1,vNM1,.TRUE.,myThid) | 
| 211 | c     _EXCH_XYZ_R8( uNM1,     myThid ) | 
| 212 | c     _EXCH_XYZ_R8( vNM1,     myThid ) | 
| 213 | _EXCH_XYZ_R8( guCD,     myThid ) | 
| 214 | _EXCH_XYZ_R8( gvCD,     myThid ) | 
| 215 | _EXCH_XY_R8( etaNm1, myThid ) | 
| 216 | #endif | 
| 217 | #ifdef ALLOW_NONHYDROSTATIC | 
| 218 | IF ( nonHydrostatic ) THEN | 
| 219 | _EXCH_XYZ_R8(phi_nh, myThid ) | 
| 220 | _EXCH_XYZ_R8(gW    , myThid ) | 
| 221 | c        _EXCH_XYZ_R8(gWNM1 , myThid ) | 
| 222 | ENDIF | 
| 223 | #endif | 
| 224 |  | 
| 225 | RETURN | 
| 226 | END | 
| 227 |  | 
| 228 | CBOP | 
| 229 | C     !ROUTINE: WRITE_CHECKPOINT | 
| 230 | C     !INTERFACE: | 
| 231 | SUBROUTINE WRITE_CHECKPOINT ( modelEnd, myTime, | 
| 232 | &                              myIter, myThid ) | 
| 233 | C     !DESCRIPTION: \bv | 
| 234 | C     *==========================================================* | 
| 235 | C     | SUBROUTINE WRITE_CHECKPOINT | 
| 236 | C     | o Controlling routine for IO to write restart file. | 
| 237 | C     *==========================================================* | 
| 238 | C     | Write model checkpoint files for use in restart. | 
| 239 | C     | This routine writes both "rolling-checkpoint" files | 
| 240 | C     | and permanent checkpoint files. A rolling checkpoint | 
| 241 | C     | works through a circular list of suffices. Generally the | 
| 242 | C     | circular list has two entries so that a rolling | 
| 243 | C     | checkpoint will overwrite the last rolling checkpoint | 
| 244 | C     | but one. This is useful for running long jobs without | 
| 245 | C     | filling too much disk space. | 
| 246 | C     |  In a permanent checkpoint data is written suffixed by | 
| 247 | C     | the current timestep number. This sort of checkpoint can | 
| 248 | C     | be used to provided a snap-shot from which the model | 
| 249 | C     | can be rerun. | 
| 250 | C     *==========================================================* | 
| 251 | C     \ev | 
| 252 |  | 
| 253 | C     !USES: | 
| 254 | IMPLICIT NONE | 
| 255 | C     == Global variables === | 
| 256 | #include "SIZE.h" | 
| 257 | #include "EEPARAMS.h" | 
| 258 | #include "PARAMS.h" | 
| 259 | #include "DYNVARS.h" | 
| 260 | #ifdef ALLOW_NONHYDROSTATIC | 
| 261 | #include "GW.h" | 
| 262 | #include "SOLVE_FOR_PRESSURE3D.h" | 
| 263 | #endif | 
| 264 | LOGICAL  DIFFERENT_MULTIPLE | 
| 265 | EXTERNAL DIFFERENT_MULTIPLE | 
| 266 | INTEGER  IO_ERRCOUNT | 
| 267 | EXTERNAL IO_ERRCOUNT | 
| 268 |  | 
| 269 | C     !INPUT/OUTPUT PARAMETERS: | 
| 270 | C     == Routine arguments == | 
| 271 | C     modelEnd    :: Checkpoint call at end of model run. | 
| 272 | C     myThid :: Thread number for this instance of the routine. | 
| 273 | C     myIter :: Iteration number | 
| 274 | C     myTime :: Current time of simulation ( s ) | 
| 275 | LOGICAL modelEnd | 
| 276 | INTEGER myThid | 
| 277 | INTEGER myIter | 
| 278 | _RL     myTime | 
| 279 |  | 
| 280 | C     == Common blocks == | 
| 281 | COMMON /PCKP_GBLFLS/ globalFile | 
| 282 | LOGICAL globalFile | 
| 283 |  | 
| 284 | C     !LOCAL VARIABLES: | 
| 285 | C     == Local variables == | 
| 286 | C     permCheckPoint :: Flag indicating whether a permanent checkpoint will | 
| 287 | C                       be written. | 
| 288 | C     oldPrc :: Temp. for holding I/O precision | 
| 289 | C     fn     :: Temp. for building file name string. | 
| 290 | C     lgf    :: Flag to indicate whether to use global file mode. | 
| 291 | LOGICAL permCheckPoint | 
| 292 | INTEGER oldPrec | 
| 293 | CHARACTER*(MAX_LEN_FNAM) fn | 
| 294 | INTEGER prec | 
| 295 | LOGICAL lgf | 
| 296 | CEOP | 
| 297 |  | 
| 298 | permCheckPoint = .FALSE. | 
| 299 | permCheckPoint= | 
| 300 | & DIFFERENT_MULTIPLE(pChkptFreq,myTime, | 
| 301 | &                    myTime-deltaTClock) | 
| 302 |  | 
| 303 | IF ( | 
| 304 | &    (.NOT. modelEnd .AND. ( | 
| 305 | &     permCheckPoint | 
| 306 | &     .OR. | 
| 307 | &     DIFFERENT_MULTIPLE(chkptFreq, | 
| 308 | &    myTime,myTime-deltaTClock) | 
| 309 | &     ) .AND. myIter.NE.nIter0 | 
| 310 | &    ) | 
| 311 | &     .OR. | 
| 312 | &    ( | 
| 313 | &     modelEnd | 
| 314 | &     .AND. .NOT. | 
| 315 | &     permCheckPoint | 
| 316 | &     .AND. .NOT. | 
| 317 | &     DIFFERENT_MULTIPLE(chkptFreq, | 
| 318 | &    myTime,myTime-deltaTClock) | 
| 319 | &    ) | 
| 320 | & ) THEN | 
| 321 |  | 
| 322 | C--    Going to really do some IO. Make everyone except master thread wait. | 
| 323 | _BARRIER | 
| 324 | _BEGIN_MASTER( myThid ) | 
| 325 |  | 
| 326 | C       Force 64-bit IO | 
| 327 | oldPrec = writeBinaryPrec | 
| 328 | writeBinaryPrec = precFloat64 | 
| 329 |  | 
| 330 | #ifdef OLD_STYLE_WITH_MANY_FILES | 
| 331 | C--     Write model fields | 
| 332 | C       Raw fields | 
| 333 | CALL WRITE_REC_XYZ_RL(  'uVel',   uVel,  1,myIter, myThid) | 
| 334 | CALL WRITE_REC_XYZ_RL(    'gU',     gU,  1,myIter, myThid) | 
| 335 | CALL WRITE_REC_XYZ_RL( 'gUNm1',  gUNm1,  1,myIter, myThid) | 
| 336 | CALL WRITE_REC_XYZ_RL(  'vVel',   vVel,  1,myIter, myThid) | 
| 337 | CALL WRITE_REC_XYZ_RL(    'gV',     gV,  1,myIter, myThid) | 
| 338 | CALL WRITE_REC_XYZ_RL( 'gVNm1',  gVNm1,  1,myIter, myThid) | 
| 339 | CALL WRITE_REC_XYZ_RL( 'theta',  theta,  1,myIter, myThid) | 
| 340 | CALL WRITE_REC_XYZ_RL(    'gT',     gT,  1,myIter, myThid) | 
| 341 | CALL WRITE_REC_XYZ_RL( 'gTNm1',  gTNm1,  1,myIter, myThid) | 
| 342 | CALL WRITE_REC_XYZ_RL(  'salt',   salt,  1,myIter, myThid) | 
| 343 | CALL WRITE_REC_XYZ_RL(    'gS',     gS,  1,myIter, myThid) | 
| 344 | CALL WRITE_REC_XYZ_RL( 'gSNm1',  gSNm1,  1,myIter, myThid) | 
| 345 | CALL WRITE_REC_XY_RL ('etaN', etaN,  1,myIter, myThid) | 
| 346 | #ifdef INCLUDE_CD_CODE | 
| 347 | CALL WRITE_REC_XY_RL | 
| 348 | &   ( 'etaNm1', etaNm1,  1,myIter, myThid) | 
| 349 | CALL WRITE_REC_XYZ_RL(  'uVelD', uVelD,  1,myIter, myThid) | 
| 350 | CALL WRITE_REC_XYZ_RL(  'vVelD', vVelD,  1,myIter, myThid) | 
| 351 | CALL WRITE_REC_XYZ_RL(  'uNM1',  uNM1,  1,myIter, myThid) | 
| 352 | CALL WRITE_REC_XYZ_RL(  'vNM1',  vNM1,  1,myIter, myThid) | 
| 353 | CALL WRITE_REC_XYZ_RL(  'guCD',  guCD,  1,myIter, myThid) | 
| 354 | CALL WRITE_REC_XYZ_RL(  'gvCD',  gvCD,  1,myIter, myThid) | 
| 355 | #endif | 
| 356 |  | 
| 357 |  | 
| 358 |  | 
| 359 | #ifdef ALLOW_NONHYDROSTATIC | 
| 360 | IF ( nonHydrostatic ) THEN | 
| 361 | CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid) | 
| 362 | CALL WRITE_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid) | 
| 363 | c        CALL WRITE_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid) | 
| 364 | ENDIF | 
| 365 | #endif | 
| 366 |  | 
| 367 | #else /* OLD_STYLE_WITH_MANY_FILES */ | 
| 368 |  | 
| 369 | prec = precFloat64 | 
| 370 | lgf = globalFile | 
| 371 |  | 
| 372 | C--     Write model fields | 
| 373 | IF ( permCheckPoint ) THEN | 
| 374 | WRITE(fn,'(A,I10.10)') 'pickup.',myIter | 
| 375 | ELSE | 
| 376 | WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev) | 
| 377 | ENDIF | 
| 378 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel,  1,myIter,myThid) | 
| 379 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gU,    2,myIter,myThid) | 
| 380 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gUnm1, 3,myIter,myThid) | 
| 381 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel,  4,myIter,myThid) | 
| 382 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gV,    5,myIter,myThid) | 
| 383 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gVnm1, 6,myIter,myThid) | 
| 384 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,wVel, 7,myIter,myThid) | 
| 385 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 8,myIter,myThid) | 
| 386 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gT,    9,myIter,myThid) | 
| 387 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gTnm1, 10,myIter,myThid) | 
| 388 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 11,myIter,myThid) | 
| 389 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gS,   12,myIter,myThid) | 
| 390 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gSnm1,13,myIter,myThid) | 
| 391 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN,13*Nr+1, | 
| 392 | &                     myIter,myThid) | 
| 393 | #ifdef NONLIN_FRSURF | 
| 394 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaH,13*Nr+2, | 
| 395 | &                     myIter,myThid) | 
| 396 | #endif | 
| 397 | #ifdef INCLUDE_CD_CODE | 
| 398 | IF ( permCheckPoint ) THEN | 
| 399 | WRITE(fn,'(A,I10.10)') 'pickup_cd.',myIter | 
| 400 | ELSE | 
| 401 | WRITE(fn,'(A,A)') 'pickup_cd.',checkPtSuff(nCheckLev) | 
| 402 | ENDIF | 
| 403 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVelD,1,myIter,myThid) | 
| 404 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVelD,2,myIter,myThid) | 
| 405 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uNM1, 3,myIter,myThid) | 
| 406 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vNM1, 4,myIter,myThid) | 
| 407 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,guCD, 5,myIter,myThid) | 
| 408 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gvCD, 6,myIter,myThid) | 
| 409 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaNm1,6*Nr+1, | 
| 410 | &                     myIter,myThid) | 
| 411 | #endif /* INCLUDE_CD_CODE */ | 
| 412 | #ifdef ALLOW_NONHYDROSTATIC | 
| 413 | IF ( nonHydrostatic ) THEN | 
| 414 | IF ( permCheckPoint ) THEN | 
| 415 | WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter | 
| 416 | ELSE | 
| 417 | WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev) | 
| 418 | ENDIF | 
| 419 | WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter | 
| 420 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh,1,myIter,myThid) | 
| 421 | CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW,   2,myIter,myThid) | 
| 422 | c        CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gWnm1,3,myIter,myThid) | 
| 423 | ENDIF | 
| 424 | #endif | 
| 425 |  | 
| 426 | C Create suffix to pass on to package pickup routines | 
| 427 | IF ( permCheckPoint ) THEN | 
| 428 | WRITE(fn,'(I10.10)') myIter | 
| 429 | ELSE | 
| 430 | WRITE(fn,'(A)') checkPtSuff(nCheckLev) | 
| 431 | ENDIF | 
| 432 |  | 
| 433 | #ifdef  ALLOW_OBCS | 
| 434 | C SPK 4/9/01: Open boundary checkpointing | 
| 435 | IF (useOBCS) THEN | 
| 436 | CALL OBCS_WRITE_CHECKPOINT( | 
| 437 | &               prec, lgf, permCheckPoint, myIter, myThid) | 
| 438 | ENDIF | 
| 439 | #endif  /* ALLOW_OBCS */ | 
| 440 |  | 
| 441 | #ifdef ALLOW_FLT | 
| 442 | C--     Write restart file for floats | 
| 443 | IF (useFLT) THEN | 
| 444 | CALL FLT_RESTART(myTime, myIter, myThid) | 
| 445 | ENDIF | 
| 446 | #endif | 
| 447 |  | 
| 448 | IF ( .NOT. permCheckPoint ) THEN | 
| 449 | nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1 | 
| 450 | ENDIF | 
| 451 |  | 
| 452 | #endif /* OLD_STYLE_WITH_MANY_FILES */ | 
| 453 |  | 
| 454 | C--     Reset binary precision | 
| 455 | writeBinaryPrec = oldPrec | 
| 456 |  | 
| 457 | _END_MASTER( myThid ) | 
| 458 | _BARRIER | 
| 459 |  | 
| 460 | #ifdef ALLOW_PTRACERS | 
| 461 | C Write restart file for passive tracers | 
| 462 | IF (usePTRACERS) THEN | 
| 463 | CALL PTRACERS_WRITE_CHECKPOINT(fn,myIter,myTime,myThid) | 
| 464 | ENDIF | 
| 465 | #endif /* ALLOW_PTRACERS */ | 
| 466 |  | 
| 467 | ENDIF | 
| 468 |  | 
| 469 | RETURN | 
| 470 | END |