/[MITgcm]/MITgcm/model/src/ini_parms.F
ViewVC logotype

Contents of /MITgcm/model/src/ini_parms.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.202 - (show annotations) (download)
Wed Oct 17 22:08:13 2007 UTC (16 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59i
Changes since 1.201: +2 -12 lines
move (and fix) extension of mdsioLocalDir (with Proc.# appended)
 from ini_parms.F to ini_model_io.F (better place)

1 C $Header: /u/gcmpack/MITgcm/model/src/ini_parms.F,v 1.201 2007/10/17 17:08:20 dimitri Exp $
2 C $Name: $
3
4 c #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
8 CBOP
9 C !ROUTINE: INI_PARMS
10 C !INTERFACE:
11 SUBROUTINE INI_PARMS( myThid )
12
13 C !DESCRIPTION:
14 C Routine to load model "parameters" from parameter file "data"
15
16 C !USES:
17 IMPLICIT NONE
18 #include "SIZE.h"
19 #include "EEPARAMS.h"
20 #include "PARAMS.h"
21 c#include "GRID.h"
22 #include "EOS.h"
23
24 C !INPUT/OUTPUT PARAMETERS:
25 C myThid :: Number of this instance of INI_PARMS
26 INTEGER myThid
27
28 C !LOCAL VARIABLES:
29 C dxSpacing, dySpacing :: Default spacing in X and Y.
30 C :: Units are that of coordinate system
31 C :: i.e. cartesian => metres
32 C :: s. polar => degrees
33 C deltaTtracer :: Timestep for tracer equations ( s )
34 C forcing_In_AB :: flag to put all forcings (Temp,Salt,Tracers,Momentum)
35 C :: contribution in (or out of) Adams-Bashforth time stepping.
36 C goptCount :: Used to count the nuber of grid options (only one is allowed!)
37 C msgBuf :: Informational/error meesage buffer
38 C errIO :: IO error flag
39 C iUnit :: Work variable for IO unit number
40 C record :: Work variable for IO buffer
41 C K, I, J :: Loop counters
42 C xxxDefault :: Default value for variable xxx
43 _RL dxSpacing
44 _RL dySpacing
45 _RL deltaTtracer
46 CHARACTER*(MAX_LEN_MBUF) msgBuf
47 CHARACTER*(MAX_LEN_PREC) record
48 LOGICAL forcing_In_AB
49 INTEGER goptCount
50 INTEGER K, i, j, IL, iUnit
51 INTEGER errIO
52 INTEGER IFNBLNK
53 EXTERNAL IFNBLNK
54 INTEGER ILNBLNK
55 EXTERNAL ILNBLNK
56 C Default values for variables which have vertical coordinate system
57 C dependency.
58 _RL viscArDefault
59 _RL diffKrTDefault
60 _RL diffKrSDefault
61 _RL hFacMinDrDefault
62 _RL delRDefault(Nr)
63 _RS rkFacDefault
64 C zCoordInputData :: Variables used to select between different coordinate systems.
65 C pCoordInputData :: The vertical coordinate system in the rest of the model is
66 C rCoordInputData :: written in terms of r. In the model "data" file input data
67 C coordsSet :: can be interms of z, p or r.
68 C :: e.g. delZ or delP or delR for the vertical grid spacing.
69 C :: The following rules apply:
70 C :: All parameters must use the same vertical coordinate system.
71 C :: e.g. delZ and viscAz is legal but
72 C :: delZ and viscAr is an error.
73 C :: Similarly specifying delZ and delP is an error.
74 C :: zCoord..., pCoord..., rCoord... are used to flag when
75 C :: z, p or r are used.
76 C :: coordsSet counts how many vertical coordinate systems have
77 C :: been used to specify variables. coordsSet > 1 is an error.
78 C
79
80 LOGICAL zCoordInputData
81 LOGICAL pCoordInputData
82 LOGICAL rCoordInputData
83 INTEGER coordsSet
84 LOGICAL diffKrSet
85
86 C Variables which have vertical coordinate system dependency.
87 C delZ :: Vertical grid spacing ( m ).
88 C delP :: Vertical grid spacing ( Pa ).
89 C viscAz :: Eddy viscosity coeff. for mixing of momentum vertically ( m^2/s )
90 C viscAp :: Eddy viscosity coeff. for mixing of momentum vertically ( Pa^2/s )
91 C diffKzT :: Laplacian diffusion coeff. for mixing of heat vertically ( m^2/s )
92 C diffKpT :: Laplacian diffusion coeff. for mixing of heat vertically ( Pa^2/s )
93 C diffKzS :: Laplacian diffusion coeff. for mixing of salt vertically ( m^2/s )
94 C diffKpS :: Laplacian diffusion coeff. for mixing of salt vertically ( Pa^2/s )
95 _RL delZ(Nr)
96 _RL delP(Nr)
97 _RL viscAz
98 _RL viscAp
99 _RL diffKzT
100 _RL diffKpT
101 _RL diffKrT
102 _RL diffKzS
103 _RL diffKpS
104 _RL diffKrS
105
106 C Retired main data file parameters. Kept here to trap use of old data files.
107 C Namelist PARM01:
108 C tracerAdvScheme :: tracer advection scheme (old passive tracer code)
109 C trac_EvPrRn :: tracer conc. in Rain & Evap (old passive tracer code)
110 C saltDiffusion :: diffusion of salinity on/off (flag not used)
111 C tempDiffusion :: diffusion of temperature on/off (flag not used)
112 C zonal_filt_lat :: Moved to package "zonal_filt"
113 C gravitySign :: direction of gravity relative to R direction
114 C :: (removed from namelist and set according to z/p coordinate)
115 C viscAstrain :: replaced by standard viscosity coeff & useStrainTensionVisc
116 C viscAtension :: replaced by standard viscosity coeff & useStrainTensionVisc
117 C useAnisotropicViscAgridMax :: Changed to be default behavior. Can
118 C use old method by setting useAreaViscLength=.true.
119 C usePickupBeforeC35 :: to restart from old-pickup files (generated with code
120 C from before checkpoint-35, Feb 08, 2001): disabled (Jan 2007)
121 C Namelist PARM03:
122 C tauThetaClimRelax3Dim :: replaced by pkg/rbcs (3.D Relaxation B.Cs)
123 C tauSaltClimRelax3Dim :: replaced by pkg/rbcs (3.D Relaxation B.Cs)
124 C calendarDumps :: moved to package "cal" (calendar)
125 C Namelist PARM04:
126 C groundAtK1 :: put the surface(k=1) at the ground (replaced by usingPCoords)
127 C rkFac :: removed from namelist ; replaced by -rkSign
128 C nRetired :: Counter used to trap gracefully namelists containing "retired"
129 C :: parameters. These are parameters that are either no-longer used
130 C or that have moved to a different input file and/or namelist.
131 LOGICAL tempDiffusion, saltDiffusion
132 INTEGER tracerAdvScheme
133 _RL trac_EvPrRn
134 _RL zonal_filt_lat, gravitySign
135 _RL viscAstrain, viscAtension
136 LOGICAL useAnisotropicViscAgridMax
137 LOGICAL usePickupBeforeC35
138 C-
139 _RL tauThetaClimRelax3Dim, tauSaltClimRelax3Dim
140 LOGICAL calendarDumps
141 C-
142 LOGICAL groundAtK1
143 _RL rkFac
144 INTEGER nRetired
145
146 C-- Continuous equation parameters
147 NAMELIST /PARM01/
148 & gravitySign, nh_Am2,
149 & gravity, gBaro, rhonil, tAlpha, sBeta,
150 & f0, beta, omega, rotationPeriod,
151 & viscAh, viscAhW, viscAhMax,
152 & viscAhGrid, viscAhGridMax, viscAhGridMin,
153 & viscC2leith, viscC4leith,
154 & useFullLeith, useAnisotropicViscAgridMax, useStrainTensionVisc,
155 & useAreaViscLength,
156 & viscC2leithD, viscC4leithD, viscC2Smag, viscC4Smag,
157 & viscAhD, viscAhZ, viscA4D, viscA4Z,
158 & viscA4, viscA4W,
159 & viscA4Max, viscA4Grid, viscA4GridMax, viscA4GridMin,
160 & viscA4ReMax, viscAhReMax,
161 & viscAz, cosPower, viscAstrain, viscAtension,
162 & diffKhT, diffKzT, diffK4T,
163 & diffKhS, diffKzS, diffK4S,
164 & tRef, sRef, tRefFile, sRefFile, rhoRefFile,
165 & eosType, integr_GeoPot, selectFindRoSurf,
166 & atm_Cp, atm_Rd, atm_Rq,
167 & no_slip_sides, sideDragFactor,
168 & no_slip_bottom, bottomDragLinear, bottomDragQuadratic,
169 & momViscosity, momAdvection, momForcing, useCoriolis,
170 & useConstantF, useBetaPlaneF, useSphereF, use3dCoriolis,
171 & momPressureForcing, metricTerms, vectorInvariantMomentum,
172 & tempDiffusion, tempAdvection, tempForcing,
173 & saltDiffusion, saltAdvection, saltForcing,
174 & implicSurfPress, implicDiv2DFlow,
175 & implicitFreeSurface, rigidLid, freeSurfFac, hFacMin, hFacMinDz,
176 & exactConserv, linFSConserveTr, uniformLin_PhiSurf,
177 & nonlinFreeSurf, hFacInf, hFacSup, select_rStar,
178 & implicitIntGravWave, staggerTimeStep,
179 & tempStepping, saltStepping, momStepping,
180 & implicitDiffusion, implicitViscosity,
181 & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
182 & viscAr, diffKrT, diffKrS, diffKrNrT, diffKrNrS, hFacMinDr,
183 & viscAp, diffKpT, diffKpS, hFacMinDp,
184 & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
185 & BL79LatVary,
186 & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
187 & rhoConst, rhoConstFresh, buoyancyRelation, HeatCapacity_Cp,
188 & writeBinaryPrec, readBinaryPrec, writeStatePrec,
189 & nonHydrostatic, quasiHydrostatic, globalFiles, useSingleCpuIO,
190 & allowFreezing, useOldFreezing, ivdc_kappa, hMixCriteria,
191 & usePickupBeforeC35, usePickupBeforeC54, debugMode, debugLevel,
192 & tempAdvScheme, tempVertAdvScheme,
193 & saltAdvScheme, saltVertAdvScheme, tracerAdvScheme,
194 & multiDimAdvection, useEnergyConservingCoriolis,
195 & useCDscheme, useJamartWetPoints, useJamartMomAdv, useNHMTerms,
196 & SadournyCoriolis, upwindVorticity, highOrderVorticity,
197 & useAbsVorticity, upwindShear, selectKEscheme,
198 & useRealFreshWaterFlux, convertFW2Salt,
199 & temp_EvPrRn, salt_EvPrRn, trac_EvPrRn,
200 & zonal_filt_lat,
201 & inAdExact, smoothAbsFuncRange,
202 & balanceEmPmR, balanceQnet, balancePrintMean
203
204 C-- Elliptic solver parameters
205 NAMELIST /PARM02/
206 & cg2dMaxIters, cg2dChkResFreq, cg2dTargetResidual,
207 & cg2dTargetResWunit, cg2dpcOffDFac, cg2dPreCondFreq,
208 & cg3dMaxIters, cg3dChkResFreq, cg3dTargetResidual
209
210 C-- Time stepping parammeters
211 NAMELIST /PARM03/
212 & nIter0, nTimeSteps, nEndIter, pickupSuff,
213 & deltaT, deltaTClock, deltaTmom,
214 & deltaTtracer, dTtracerLev, deltaTfreesurf,
215 & forcing_In_AB, momForcingOutAB, tracForcingOutAB,
216 & momDissip_In_AB, doAB_onGtGs,
217 & abEps, alph_AB, beta_AB, startFromPickupAB2,
218 & tauCD, rCD,
219 & baseTime, startTime, endTime, chkPtFreq,
220 & dumpFreq, dumpInitAndLast, adjDumpFreq, taveFreq, tave_lastIter,
221 & diagFreq, monitorFreq, adjMonitorFreq, pChkPtFreq, cAdjFreq,
222 & outputTypesInclusive,
223 & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
224 & tauThetaClimRelax3Dim, tauSaltClimRelax3Dim, tauTr1ClimRelax,
225 & periodicExternalForcing, externForcingPeriod, externForcingCycle,
226 & calendarDumps
227
228 C-- Gridding parameters
229 NAMELIST /PARM04/
230 & usingCartesianGrid, usingCylindricalGrid,
231 & dxSpacing, dySpacing, delX, delY, delXFile, delYFile,
232 & usingSphericalPolarGrid, phiMin, thetaMin, rSphere,
233 & usingCurvilinearGrid, horizGridFile, deepAtmosphere,
234 & Ro_SeaLevel, delZ, delP, delR, delRc, delRFile, delRcFile,
235 & rkFac, groundAtK1
236
237 C-- Input files
238 NAMELIST /PARM05/
239 & bathyFile, topoFile, shelfIceFile,
240 & hydrogThetaFile, hydrogSaltFile, diffKrFile,
241 & zonalWindFile, meridWindFile,
242 & thetaClimFile, saltClimFile,
243 & surfQfile, surfQnetFile, surfQswFile, EmPmRfile, saltFluxFile,
244 & lambdaThetaFile, lambdaSaltFile,
245 & uVelInitFile, vVelInitFile, pSurfInitFile,
246 & dQdTFile, ploadFile,tCylIn,tCylOut,
247 & eddyTauxFile, eddyTauyFile,
248 & mdsioLocalDir,
249 & the_run_name
250 CEOP
251
252 C
253 _BEGIN_MASTER(myThid)
254
255 C Defaults values for input parameters
256 CALL SET_DEFAULTS(
257 O viscArDefault, diffKrTDefault, diffKrSDefault,
258 O hFacMinDrDefault, delRDefault, rkFacDefault,
259 I myThid )
260
261 C-- Initialise "which vertical coordinate system used" flags.
262 zCoordInputData = .FALSE.
263 pCoordInputData = .FALSE.
264 rCoordInputData = .FALSE.
265 coordsSet = 0
266
267 C-- Initialise retired parameters to unlikely value
268 nRetired = 0
269 tempDiffusion = .TRUE.
270 saltDiffusion = .TRUE.
271 tracerAdvScheme = UNSET_I
272 trac_EvPrRn = UNSET_RL
273 zonal_filt_lat = UNSET_RL
274 gravitySign = UNSET_RL
275 viscAstrain = UNSET_RL
276 viscAtension = UNSET_RL
277 useAnisotropicViscAgridMax=.TRUE.
278 usePickupBeforeC35 = .FALSE.
279 tauThetaClimRelax3Dim = UNSET_RL
280 tauSaltClimRelax3Dim = UNSET_RL
281 calendarDumps = .FALSE.
282 rkFac = UNSET_RL
283 groundAtK1 = .FALSE.
284
285 C-- Open the parameter file
286 #ifdef TARGET_BGL
287 OPEN(UNIT=scrUnit1,FILE='scratch1',STATUS='UNKNOWN')
288 OPEN(UNIT=scrUnit2,FILE='scratch2',STATUS='UNKNOWN')
289 #else
290 OPEN(UNIT=scrUnit1,STATUS='SCRATCH')
291 OPEN(UNIT=scrUnit2,STATUS='SCRATCH')
292 #endif
293 OPEN(UNIT=modelDataUnit,FILE='data',STATUS='OLD',
294 & IOSTAT=errIO)
295 IF ( errIO .LT. 0 ) THEN
296 WRITE(msgBuf,'(A)')
297 & 'S/R INI_PARMS'
298 CALL PRINT_ERROR( msgBuf, myThid )
299 WRITE(msgBuf,'(A)')
300 & 'Unable to open model parameter'
301 CALL PRINT_ERROR( msgBuf, myThid )
302 WRITE(msgBuf,'(A)')
303 & 'file "data"'
304 CALL PRINT_ERROR( msgBuf, myThid )
305 CALL MODELDATA_EXAMPLE( myThid )
306 STOP 'ABNORMAL END: S/R INI_PARMS'
307 ENDIF
308
309 DO WHILE ( .TRUE. )
310 READ(modelDataUnit,FMT='(A)',END=1001) RECORD
311 IL = MAX(ILNBLNK(RECORD),1)
312 IF ( RECORD(1:1) .NE. commentCharacter ) THEN
313 CALL NML_SET_TERMINATOR( RECORD )
314 WRITE(UNIT=scrUnit1,FMT='(A)') RECORD(:IL)
315 ENDIF
316 WRITE(UNIT=scrUnit2,FMT='(A)') RECORD(:IL)
317 ENDDO
318 1001 CONTINUE
319 CLOSE(modelDataUnit)
320
321 C-- Report contents of model parameter file
322 WRITE(msgBuf,'(A)')
323 &'// ======================================================='
324 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
325 & SQUEEZE_RIGHT, myThid )
326 WRITE(msgBuf,'(A)') '// Model parameter file "data"'
327 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
328 & SQUEEZE_RIGHT, myThid )
329 WRITE(msgBuf,'(A)')
330 &'// ======================================================='
331 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
332 & SQUEEZE_RIGHT, myThid )
333 iUnit = scrUnit2
334 REWIND(iUnit)
335 DO WHILE ( .TRUE. )
336 READ(UNIT=iUnit,FMT='(A)',END=2001) RECORD
337 IL = MAX(ILNBLNK(RECORD),1)
338 WRITE(msgBuf,'(A,A)') '>',RECORD(:IL)
339 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
340 & SQUEEZE_RIGHT, myThid )
341 ENDDO
342 2001 CONTINUE
343 CLOSE(iUnit)
344 WRITE(msgBuf,'(A)') ' '
345 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
346 & SQUEEZE_RIGHT, myThid )
347
348
349 C-- Read settings from model parameter file "data".
350 iUnit = scrUnit1
351 REWIND(iUnit)
352
353 C-- Set default "physical" parameters
354 viscAhW = UNSET_RL
355 viscA4W = UNSET_RL
356 viscAhD = UNSET_RL
357 viscAhZ = UNSET_RL
358 viscA4D = UNSET_RL
359 viscA4Z = UNSET_RL
360 viscAz = UNSET_RL
361 viscAr = UNSET_RL
362 viscAp = UNSET_RL
363 diffKzT = UNSET_RL
364 diffKpT = UNSET_RL
365 diffKrT = UNSET_RL
366 diffKzS = UNSET_RL
367 diffKpS = UNSET_RL
368 diffKrS = UNSET_RL
369 DO k=1,Nr
370 diffKrNrT(k) = UNSET_RL
371 diffKrNrS(k) = UNSET_RL
372 tRef(k) = UNSET_RL
373 sRef(k) = UNSET_RL
374 ENDDO
375 gBaro = UNSET_RL
376 rhoConst = UNSET_RL
377 omega = UNSET_RL
378 hFacMinDr = UNSET_RL
379 hFacMinDz = UNSET_RL
380 hFacMinDp = UNSET_RL
381 rhoConstFresh = UNSET_RL
382 convertFW2Salt = UNSET_RL
383 tAlpha = UNSET_RL
384 sBeta = UNSET_RL
385 tempVertAdvScheme = 0
386 saltVertAdvScheme = 0
387 C-- z,p,r coord input switching.
388 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM01'
389 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
390 & SQUEEZE_RIGHT, myThid )
391 READ(UNIT=iUnit,NML=PARM01) !,IOSTAT=errIO)
392 IF ( errIO .LT. 0 ) THEN
393 WRITE(msgBuf,'(A)')
394 & 'S/R INI_PARMS'
395 CALL PRINT_ERROR( msgBuf, myThid )
396 WRITE(msgBuf,'(A)')
397 & 'Error reading numerical model '
398 CALL PRINT_ERROR( msgBuf, myThid )
399 WRITE(msgBuf,'(A)')
400 & 'parameter file "data"'
401 CALL PRINT_ERROR( msgBuf, myThid )
402 WRITE(msgBuf,'(A)')
403 & 'Problem in namelist PARM01'
404 CALL PRINT_ERROR( msgBuf, myThid )
405 CALL MODELDATA_EXAMPLE( myThid )
406 STOP 'ABNORMAL END: S/R INI_PARMS'
407 ELSE
408 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM01 : OK'
409 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
410 & SQUEEZE_RIGHT, myThid )
411 ENDIF
412
413 C- set the type of vertical coordinate and type of fluid
414 C according to buoyancyRelation
415 usingPCoords = .FALSE.
416 usingZCoords = .FALSE.
417 fluidIsAir = .FALSE.
418 fluidIsWater = .FALSE.
419 IF ( buoyancyRelation.EQ.'ATMOSPHERIC' ) THEN
420 usingPCoords = .TRUE.
421 fluidIsAir = .TRUE.
422 ELSEIF ( buoyancyRelation.EQ.'OCEANICP') THEN
423 usingPCoords = .TRUE.
424 fluidIsWater = .TRUE.
425 ELSEIF ( buoyancyRelation.EQ.'OCEANIC' ) THEN
426 usingZCoords = .TRUE.
427 fluidIsWater = .TRUE.
428 ELSE
429 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS:',
430 & ' Bad value of buoyancyRelation '
431 CALL PRINT_ERROR( msgBuf, myThid )
432 STOP 'ABNORMAL END: S/R INI_PARMS'
433 ENDIF
434
435 IF ( .NOT.rigidLid .AND.
436 & .NOT.implicitFreeSurface ) THEN
437 C- No barotropic solver selected => use implicitFreeSurface as default
438 WRITE(msgBuf,'(A)')
439 & 'S/R INI_PARMS: No request for barotropic solver'
440 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
441 & SQUEEZE_RIGHT, myThid )
442 WRITE(msgBuf,'(A)')
443 & 'S/R INI_PARMS: => Use implicitFreeSurface as default'
444 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
445 & SQUEEZE_RIGHT, myThid )
446 implicitFreeSurface = .TRUE.
447 ENDIF
448 IF ( implicitFreeSurface ) freeSurfFac = 1.D0
449 IF ( rigidLid ) freeSurfFac = 0.D0
450 IF ( gBaro .EQ. UNSET_RL ) gBaro=gravity
451 IF ( rhoConst .EQ. UNSET_RL ) rhoConst=rhoNil
452 IF ( rhoConstFresh .EQ. UNSET_RL ) rhoConstFresh=rhoConst
453 IF ( omega .EQ. UNSET_RL ) THEN
454 omega = 0. _d 0
455 IF ( rotationPeriod .NE. 0. _d 0 )
456 & omega = 2.D0 * PI / rotationPeriod
457 ELSEIF ( omega .EQ. 0. _d 0 ) THEN
458 rotationPeriod = 0. _d 0
459 ELSE
460 rotationPeriod = 2.D0 * PI / omega
461 ENDIF
462 IF (atm_Rd .EQ. UNSET_RL) THEN
463 atm_Rd = atm_Cp * atm_kappa
464 ELSE
465 atm_kappa = atm_Rd / atm_Cp
466 ENDIF
467 C-- Non-hydrostatic/quasi-hydrostatic
468 IF (nonHydrostatic.AND.quasiHydrostatic) THEN
469 WRITE(msgBuf,'(A)')
470 & 'Illegal: both nonHydrostatic = quasiHydrostatic = TRUE'
471 CALL PRINT_ERROR( msgBuf, myThid )
472 STOP 'ABNORMAL END: S/R INI_PARMS'
473 ENDIF
474 C-- Advection and Forcing for Temp and salt
475 IF (tempVertAdvScheme.EQ.0) tempVertAdvScheme = tempAdvScheme
476 IF (saltVertAdvScheme.EQ.0) saltVertAdvScheme = saltAdvScheme
477 C-- horizontal viscosity for vertical moments
478 IF ( viscAhW .EQ. UNSET_RL ) viscAhW = viscAh
479 IF ( viscA4W .EQ. UNSET_RL ) viscA4W = viscA4
480 C-- horizontal viscosity (acting on Divergence or Vorticity)
481 IF ( viscAhD .EQ. UNSET_RL ) viscAhD = viscAh
482 IF ( viscAhZ .EQ. UNSET_RL ) viscAhZ = viscAh
483 IF ( viscA4D .EQ. UNSET_RL ) viscA4D = viscA4
484 IF ( viscA4Z .EQ. UNSET_RL ) viscA4Z = viscA4
485 C-- z,p,r coord input switching.
486 IF ( viscAz .NE. UNSET_RL ) zCoordInputData = .TRUE.
487 IF ( viscAp .NE. UNSET_RL ) pCoordInputData = .TRUE.
488 IF ( viscAr .NE. UNSET_RL ) rCoordInputData = .TRUE.
489 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscAz
490 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscAp
491 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscArDefault
492
493 IF ( diffKzT .NE. UNSET_RL ) zCoordInputData = .TRUE.
494 IF ( diffKpT .NE. UNSET_RL ) pCoordInputData = .TRUE.
495 IF ( diffKrT .NE. UNSET_RL ) rCoordInputData = .TRUE.
496 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKzT
497 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKpT
498 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKrTDefault
499 diffKrSet = .TRUE.
500 DO k=1,Nr
501 IF ( diffKrNrT(k).EQ. UNSET_RL ) diffKrSet = .FALSE.
502 ENDDO
503 IF ( .NOT.diffKrSet ) THEN
504 DO k=1,Nr
505 diffKrNrT(k) = diffKrT
506 ENDDO
507 ELSEIF ( diffKrT.NE.diffKrTDefault ) THEN
508 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS: Cannot set both ',
509 & 'diffKrNrT and diffKrT (or Kp,Kz) in input file data'
510 CALL PRINT_ERROR( msgBuf, myThid )
511 STOP 'ABNORMAL END: S/R INI_PARMS'
512 ENDIF
513
514 IF ( diffKzS .NE. UNSET_RL ) zCoordInputData = .TRUE.
515 IF ( diffKpS .NE. UNSET_RL ) pCoordInputData = .TRUE.
516 IF ( diffKrS .NE. UNSET_RL ) rCoordInputData = .TRUE.
517 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKzS
518 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKpS
519 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKrSDefault
520 diffKrSet = .TRUE.
521 DO k=1,Nr
522 IF ( diffKrNrS(k).EQ. UNSET_RL ) diffKrSet = .FALSE.
523 ENDDO
524 IF ( .NOT.diffKrSet ) THEN
525 DO k=1,Nr
526 diffKrNrS(k) = diffKrS
527 ENDDO
528 ELSEIF ( diffKrS.NE.diffKrSDefault ) THEN
529 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS: Cannot set both ',
530 & 'diffKrNrS and diffKrS (or Kp,Kz) in input file data'
531 CALL PRINT_ERROR( msgBuf, myThid )
532 STOP 'ABNORMAL END: S/R INI_PARMS'
533 ENDIF
534
535 IF (diffKrBLEQsurf .EQ. UNSET_RL) diffKrBLEQsurf = diffKrBL79surf
536 IF (diffKrBLEQdeep .EQ. UNSET_RL) diffKrBLEQdeep = diffKrBL79deep
537 IF (diffKrBLEQscl .EQ. UNSET_RL) diffKrBLEQscl = diffKrBL79scl
538 IF (diffKrBLEQHo .EQ. UNSET_RL) diffKrBLEQHo = diffKrBL79Ho
539
540 IF ( hFacMinDz .NE. UNSET_RL ) zCoordInputData = .TRUE.
541 IF ( hFacMinDp .NE. UNSET_RL ) pCoordInputData = .TRUE.
542 IF ( hFacMinDr .NE. UNSET_RL ) rCoordInputData = .TRUE.
543 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDz
544 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDp
545 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDrDefault
546
547 IF (convertFW2Salt.EQ.UNSET_RL) THEN
548 convertFW2Salt = 35.
549 IF (useRealFreshWaterFlux) convertFW2Salt=-1
550 ENDIF
551
552 IF ( ivdc_kappa .NE. 0. .AND. .NOT. implicitDiffusion ) THEN
553 WRITE(msgBuf,'(A,A)')
554 & 'S/R INI_PARMS: To use ivdc_kappa you must enable implicit',
555 & ' vertical diffusion.'
556 CALL PRINT_ERROR( msgBuf, myThid )
557 STOP 'ABNORMAL END: S/R INI_PARMS'
558 ENDIF
559
560 coordsSet = 0
561 IF ( zCoordInputData ) coordsSet = coordsSet + 1
562 IF ( pCoordInputData ) coordsSet = coordsSet + 1
563 IF ( rCoordInputData ) coordsSet = coordsSet + 1
564 IF ( coordsSet .GT. 1 ) THEN
565 WRITE(msgBuf,'(A)')
566 & 'S/R INI_PARMS: Cannot mix z, p and r in the input data.'
567 CALL PRINT_ERROR( msgBuf, myThid )
568 STOP 'ABNORMAL END: S/R INI_PARMS'
569 ENDIF
570 IF ( rhoConst .LE. 0. ) THEN
571 WRITE(msgBuf,'(A)')
572 & 'S/R INI_PARMS: rhoConst must be greater than 0.'
573 CALL PRINT_ERROR( msgBuf, myThid )
574 STOP 'ABNORMAL END: S/R INI_PARMS'
575 ELSE
576 recip_rhoConst = 1.D0 / rhoConst
577 ENDIF
578 IF ( rhoNil .LE. 0. ) THEN
579 WRITE(msgBuf,'(A)')
580 & 'S/R INI_PARMS: rhoNil must be greater than 0.'
581 CALL PRINT_ERROR( msgBuf, myThid )
582 STOP 'ABNORMAL END: S/R INI_PARMS'
583 ELSE
584 recip_rhoNil = 1.D0 / rhoNil
585 ENDIF
586 IF ( HeatCapacity_Cp .LE. 0. ) THEN
587 WRITE(msgBuf,'(A)')
588 & 'S/R INI_PARMS: HeatCapacity_Cp must be greater than 0.'
589 CALL PRINT_ERROR( msgBuf, myThid )
590 STOP 'ABNORMAL END: S/R INI_PARMS'
591 ELSE
592 recip_Cp = 1.D0 / HeatCapacity_Cp
593 ENDIF
594 IF ( gravity .LE. 0. ) THEN
595 WRITE(msgBuf,'(A)')
596 & 'S/R INI_PARMS: gravity must be greater than 0.'
597 CALL PRINT_ERROR( msgBuf, myThid )
598 STOP 'ABNORMAL END: S/R INI_PARMS'
599 ELSE
600 recip_gravity = 1.D0 / gravity
601 ENDIF
602 C This flags are now passed to RW and MDSIO packages in ini_model_io.F
603 C Set globalFiles flag for READ_WRITE_FLD package
604 c CALL SET_WRITE_GLOBAL_FLD( globalFiles )
605 C Set globalFiles flag for READ_WRITE_REC package
606 c CALL SET_WRITE_GLOBAL_REC( globalFiles )
607 C Set globalFiles flag for READ_WRITE_REC package
608 c CALL SET_WRITE_GLOBAL_PICKUP( globalFiles )
609
610 C Check for retired parameters still being used
611 nRetired = 0
612 IF ( zonal_filt_lat .NE. UNSET_RL ) THEN
613 nRetired = nRetired+1
614 WRITE(msgBuf,'(A,A)')
615 & 'S/R INI_PARMS: Paramater "zonal_filt_lat" is',
616 & ' no longer allowed in file "data".'
617 CALL PRINT_ERROR( msgBuf, myThid )
618 WRITE(msgBuf,'(A,A)')
619 & 'S/R INI_PARMS: Paramater "zonal_filt_lat" is',
620 & ' now read from file "data.zonfilt".'
621 CALL PRINT_ERROR( msgBuf, myThid )
622 ENDIF
623 IF ( gravitySign .NE. UNSET_RL ) THEN
624 nRetired = nRetired+1
625 WRITE(msgBuf,'(A,A)')
626 & 'S/R INI_PARMS: "gravitySign" is set according to vertical ',
627 & ' coordinate and is no longer allowed in file "data".'
628 CALL PRINT_ERROR( msgBuf, myThid )
629 ENDIF
630 IF ( tracerAdvScheme .NE. UNSET_I ) THEN
631 nRetired = nRetired+1
632 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tracerAdvScheme" ',
633 & '(old passive tracer code) is no longer allowed in file "data"'
634 CALL PRINT_ERROR( msgBuf, myThid )
635 ENDIF
636 IF ( trac_EvPrRn .NE. UNSET_RL ) THEN
637 nRetired = nRetired+1
638 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "trac_EvPrRn" ',
639 & '(old passive tracer code) is no longer allowed in file "data"'
640 CALL PRINT_ERROR( msgBuf, myThid )
641 ENDIF
642 IF ( .NOT. tempDiffusion ) THEN
643 nRetired = nRetired+1
644 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tempDiffusion" ',
645 & 'is no longer allowed in file "data"'
646 CALL PRINT_ERROR( msgBuf, myThid )
647 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to turn off diffusion',
648 & ' => set diffusivity to zero'
649 CALL PRINT_ERROR( msgBuf, myThid )
650 ENDIF
651 IF ( .NOT. saltDiffusion ) THEN
652 nRetired = nRetired+1
653 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "saltDiffusion" ',
654 & 'is no longer allowed in file "data"'
655 CALL PRINT_ERROR( msgBuf, myThid )
656 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to turn off diffusion',
657 & ' => set diffusivity to zero'
658 CALL PRINT_ERROR( msgBuf, myThid )
659 ENDIF
660 IF ( viscAstrain .NE. UNSET_RL ) THEN
661 nRetired = nRetired+1
662 WRITE(msgBuf,'(A,A)')
663 & 'S/R INI_PARMS: "viscAstrain" ',
664 & 'is no longer allowed in file "data"'
665 CALL PRINT_ERROR( msgBuf, myThid )
666 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to use Strain & Tension',
667 & ' formulation => set useStrainTensionVisc to TRUE'
668 CALL PRINT_ERROR( msgBuf, myThid )
669 ENDIF
670 IF ( viscAtension .NE. UNSET_RL ) THEN
671 nRetired = nRetired+1
672 WRITE(msgBuf,'(A,A)')
673 & 'S/R INI_PARMS: "viscAtension" ',
674 & 'is no longer allowed in file "data"'
675 CALL PRINT_ERROR( msgBuf, myThid )
676 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to use Strain & Tension',
677 & ' formulation => set useStrainTensionVisc to TRUE'
678 CALL PRINT_ERROR( msgBuf, myThid )
679 ENDIF
680 IF ( .NOT.useAnisotropicViscAgridMax ) THEN
681 nRetired = nRetired+1
682 WRITE(msgBuf,'(A,A)')
683 & 'S/R INI_PARMS: "useAnisotropicViscAgridMax" ',
684 & 'is not allowed in "data" substitute useAreaViscLength=true'
685 CALL PRINT_ERROR( msgBuf, myThid )
686 ENDIF
687 IF ( usePickupBeforeC35 ) THEN
688 nRetired = nRetired+1
689 WRITE(msgBuf,'(A,A)')
690 & 'S/R INI_PARMS: "usePickupBeforeC35" ',
691 & 'is no longer supported & not longer allowed in file "data"'
692 CALL PRINT_ERROR( msgBuf, myThid )
693 ENDIF
694
695 C-- Elliptic solver parameters
696 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM02'
697 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
698 & SQUEEZE_RIGHT, myThid )
699 READ(UNIT=iUnit,NML=PARM02) !,IOSTAT=errIO)
700 IF ( errIO .LT. 0 ) THEN
701 WRITE(msgBuf,'(A)')
702 & 'S/R INI_PARMS'
703 CALL PRINT_ERROR( msgBuf, myThid )
704 WRITE(msgBuf,'(A)')
705 & 'Error reading numerical model '
706 CALL PRINT_ERROR( msgBuf, myThid )
707 WRITE(msgBuf,'(A)')
708 & 'parameter file "data".'
709 CALL PRINT_ERROR( msgBuf, myThid )
710 WRITE(msgBuf,'(A)')
711 & 'Problem in namelist PARM02'
712 CALL PRINT_ERROR( msgBuf, myThid )
713 CALL MODELDATA_EXAMPLE( myThid )
714 STOP 'ABNORMAL END: S/R INI_PARMS'
715 ELSE
716 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM02 : OK'
717 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
718 & SQUEEZE_RIGHT, myThid )
719 ENDIF
720
721 C-- Time stepping parameters
722 rCD = -1.D0
723 latBandClimRelax = UNSET_RL
724 deltaTtracer = 0. _d 0
725 forcing_In_AB = .TRUE.
726 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM03'
727 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
728 & SQUEEZE_RIGHT, myThid )
729 READ(UNIT=iUnit,NML=PARM03) !,IOSTAT=errIO)
730 IF ( errIO .LT. 0 ) THEN
731 WRITE(msgBuf,'(A)')
732 & 'S/R INI_PARMS'
733 CALL PRINT_ERROR( msgBuf, myThid )
734 WRITE(msgBuf,'(A)')
735 & 'Error reading numerical model '
736 CALL PRINT_ERROR( msgBuf, myThid )
737 WRITE(msgBuf,'(A)')
738 & 'parameter file "data"'
739 CALL PRINT_ERROR( msgBuf, myThid )
740 WRITE(msgBuf,'(A)')
741 & 'Problem in namelist PARM03'
742 CALL PRINT_ERROR( msgBuf, myThid )
743 CALL MODELDATA_EXAMPLE( myThid )
744 STOP 'ABNORMAL END: S/R INI_PARMS'
745 ELSE
746 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM03 : OK'
747 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
748 & SQUEEZE_RIGHT, myThid )
749 ENDIF
750 C Check for retired parameters still being used
751 IF ( tauThetaClimRelax3Dim .NE. UNSET_RL ) THEN
752 nRetired = nRetired+1
753 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tauThetaClimRelax3Dim" ',
754 & 'is no longer allowed in file "data"'
755 CALL PRINT_ERROR( msgBuf, myThid )
756 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: 3-dim. relaxation code',
757 & ' has moved to separate pkg/rbcs.'
758 CALL PRINT_ERROR( msgBuf, myThid )
759 ENDIF
760 IF ( tauSaltClimRelax3Dim .NE. UNSET_RL ) THEN
761 nRetired = nRetired+1
762 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tauSaltClimRelax3Dim" ',
763 & 'is no longer allowed in file "data"'
764 CALL PRINT_ERROR( msgBuf, myThid )
765 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: 3-dim. relaxation code',
766 & ' has moved to separate pkg/rbcs.'
767 CALL PRINT_ERROR( msgBuf, myThid )
768 ENDIF
769 IF ( calendarDumps ) THEN
770 nRetired = nRetired+1
771 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "calendarDumps" ',
772 & 'is no longer allowed in file "data"'
773 CALL PRINT_ERROR( msgBuf, myThid )
774 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: calendarDumps',
775 & ' has moved to "data.cal"'
776 CALL PRINT_ERROR( msgBuf, myThid )
777 ENDIF
778
779 C Process "timestepping" params
780 C o Time step size
781 IF ( deltaTtracer .NE. dTtracerLev(1) .AND.
782 & deltaTtracer .NE. 0. .AND. dTtracerLev(1) .NE. 0. ) THEN
783 WRITE(msgBuf,'(A)')
784 & 'S/R INI_PARMS: deltaTtracer & dTtracerLev(1) not equal'
785 CALL PRINT_ERROR( msgBuf, myThid )
786 STOP 'ABNORMAL END: S/R INI_PARMS'
787 ELSEIF ( dTtracerLev(1) .NE. 0. ) THEN
788 deltaTtracer = dTtracerLev(1)
789 ENDIF
790 IF ( deltaT .EQ. 0. ) deltaT = deltaTClock
791 IF ( deltaT .EQ. 0. ) deltaT = deltaTtracer
792 IF ( deltaT .EQ. 0. ) deltaT = deltaTmom
793 IF ( deltaT .EQ. 0. ) deltaT = deltaTfreesurf
794 IF ( deltaTmom .EQ. 0. ) deltaTmom = deltaT
795 IF ( deltaTtracer .EQ. 0. ) deltaTtracer = deltaT
796 IF ( deltaTClock .EQ. 0. ) deltaTClock = deltaT
797 DO k=1,Nr
798 IF (dTtracerLev(k).EQ.0.) dTtracerLev(k)= deltaTtracer
799 ENDDO
800 C Note that this line should set deltaFreesurf=deltaTtracer
801 C but this would change a lot of existing set-ups so we are
802 C obliged to set the default inappropriately.
803 C Be advised that when using asynchronous time stepping
804 C it is better to set deltaTreesurf=deltaTtracer
805 IF ( deltaTfreesurf .EQ. 0. ) deltaTfreesurf = deltaTmom
806 IF ( periodicExternalForcing ) THEN
807 IF ( externForcingCycle*externForcingPeriod .EQ. 0. ) THEN
808 WRITE(msgBuf,'(A)')
809 & 'S/R INI_PARMS: externForcingCycle,externForcingPeriod =0'
810 CALL PRINT_ERROR( msgBuf, myThid )
811 STOP 'ABNORMAL END: S/R INI_PARMS'
812 ENDIF
813 IF ( INT(externForcingCycle/externForcingPeriod) .NE.
814 & externForcingCycle/externForcingPeriod ) THEN
815 WRITE(msgBuf,'(A)')
816 & 'S/R INI_PARMS: externForcingCycle <> N*externForcingPeriod'
817 CALL PRINT_ERROR( msgBuf, myThid )
818 STOP 'ABNORMAL END: S/R INI_PARMS'
819 ENDIF
820 IF ( externForcingCycle.lt.externForcingPeriod ) THEN
821 WRITE(msgBuf,'(A)')
822 & 'S/R INI_PARMS: externForcingCycle < externForcingPeriod'
823 CALL PRINT_ERROR( msgBuf, myThid )
824 STOP 'ABNORMAL END: S/R INI_PARMS'
825 ENDIF
826 IF ( externForcingPeriod.lt.deltaTclock ) THEN
827 WRITE(msgBuf,'(A)')
828 & 'S/R INI_PARMS: externForcingPeriod < deltaTclock'
829 CALL PRINT_ERROR( msgBuf, myThid )
830 STOP 'ABNORMAL END: S/R INI_PARMS'
831 ENDIF
832 ENDIF
833 C o Adams-Bashforth time stepping:
834 IF ( momForcingOutAB .EQ. UNSET_I ) THEN
835 momForcingOutAB = 1
836 IF ( forcing_In_AB ) momForcingOutAB = 0
837 ENDIF
838 IF ( tracForcingOutAB .EQ. UNSET_I ) THEN
839 tracForcingOutAB = 1
840 IF ( forcing_In_AB ) tracForcingOutAB = 0
841 ENDIF
842 C o Convection frequency
843 IF ( cAdjFreq .LT. 0. ) THEN
844 cAdjFreq = deltaTClock
845 ENDIF
846 IF ( ivdc_kappa .NE. 0. .AND. cAdjFreq .NE. 0. ) THEN
847 WRITE(msgBuf,'(A,A)')
848 & 'S/R INI_PARMS: You have enabled both ivdc_kappa and',
849 & ' convective adjustment.'
850 CALL PRINT_ERROR( msgBuf, myThid )
851 STOP 'ABNORMAL END: S/R INI_PARMS'
852 ENDIF
853 IF (useCDscheme) THEN
854 C o CD coupling (CD scheme):
855 IF ( tauCD .EQ. 0.D0 ) tauCD = deltaTmom
856 IF ( rCD .LT. 0. ) rCD = 1. _d 0 - deltaTMom/tauCD
857 ENDIF
858 C o Temperature climatology relaxation time scale
859 IF ( tauThetaClimRelax .EQ. 0.D0 ) THEN
860 doThetaClimRelax = .FALSE.
861 ELSE
862 doThetaClimRelax = .TRUE.
863 ENDIF
864 C o Salinity climatology relaxation time scale
865 IF ( tauSaltClimRelax .EQ. 0.D0 ) THEN
866 doSaltClimRelax = .FALSE.
867 ELSE
868 doSaltClimRelax = .TRUE.
869 ENDIF
870 C o Tracer 1 climatology relaxation time scale
871 IF ( tauTr1ClimRelax .EQ. 0.D0 ) THEN
872 doTr1ClimRelax = .FALSE.
873 lambdaTr1ClimRelax = 0.D0
874 ELSE
875 doTr1ClimRelax = .TRUE.
876 lambdaTr1ClimRelax = 1./tauTr1ClimRelax
877 ENDIF
878
879 C o Base time
880 IF ( nIter0.NE.0 .AND. startTime.NE.0. .AND. baseTime.EQ.0. )
881 & baseTime = startTime - deltaTClock*float(nIter0)
882 C o Start time
883 IF ( nIter0 .NE. 0 .AND. startTime .EQ. 0. )
884 & startTime = baseTime + deltaTClock*float(nIter0)
885 C o nIter0
886 IF ( nIter0 .EQ. 0 .AND. startTime .NE. baseTime )
887 & nIter0 = NINT( (startTime-baseTime)/deltaTClock )
888
889 C o nTimeSteps 1
890 IF ( nTimeSteps .EQ. 0 .AND. nEndIter .NE. 0 )
891 & nTimeSteps = nEndIter-nIter0
892 C o nTimeSteps 2
893 IF ( nTimeSteps .EQ. 0 .AND. endTime .NE. 0. )
894 & nTimeSteps = NINT((endTime-startTime)/deltaTclock)
895 C o nEndIter 1
896 IF ( nEndIter .EQ. 0 .AND. nTimeSteps .NE. 0 )
897 & nEndIter = nIter0+nTimeSteps
898 C o nEndIter 2
899 IF ( nEndIter .EQ. 0 .AND. endTime .NE. 0. )
900 & nEndIter = NINT((endTime-baseTime)/deltaTclock)
901 C o End Time 1
902 IF ( endTime .EQ. 0. .AND. nTimeSteps .NE. 0 )
903 & endTime = startTime + deltaTClock*float(nTimeSteps)
904 C o End Time 2
905 IF ( endTime .EQ. 0. .AND. nEndIter .NE. 0 )
906 & endTime = baseTime + deltaTClock*float(nEndIter)
907
908 C o Consistent?
909 IF ( startTime .NE. baseTime+deltaTClock*float(nIter0) ) THEN
910 WRITE(msgBuf,'(A)')
911 & 'S/R INI_PARMS: startTime, baseTime and nIter0 are inconsistent'
912 CALL PRINT_ERROR( msgBuf, myThid )
913 WRITE(msgBuf,'(A)')
914 & 'S/R INI_PARMS: Perhaps more than two were set at once'
915 CALL PRINT_ERROR( msgBuf, myThid )
916 STOP 'ABNORMAL END: S/R INI_PARMS'
917 ENDIF
918 IF ( nEndIter .NE. nIter0+nTimeSteps ) THEN
919 WRITE(msgBuf,'(A)')
920 & 'S/R INI_PARMS: nIter0, nTimeSteps and nEndIter are inconsistent'
921 CALL PRINT_ERROR( msgBuf, myThid )
922 WRITE(msgBuf,'(A)')
923 & 'S/R INI_PARMS: Perhaps more than two were set at once'
924 CALL PRINT_ERROR( msgBuf, myThid )
925 STOP 'ABNORMAL END: S/R INI_PARMS'
926 ENDIF
927 IF ( nTimeSteps .NE. NINT((endTime-startTime)/deltaTClock)
928 & ) THEN
929 WRITE(msgBuf,'(A)')
930 & 'S/R INI_PARMS: both endTime and nTimeSteps have been set'
931 CALL PRINT_ERROR( msgBuf, myThid )
932 WRITE(msgBuf,'(A)')
933 & 'S/R INI_PARMS: but are inconsistent'
934 CALL PRINT_ERROR( msgBuf, myThid )
935 STOP 'ABNORMAL END: S/R INI_PARMS'
936 ENDIF
937
938 C o Monitor (should also add CPP flag for monitor?)
939 IF (monitorFreq.LT.0.) THEN
940 monitorFreq=0.
941 IF (dumpFreq.NE.0.) monitorFreq=dumpFreq
942 IF (diagFreq.NE.0..AND.diagFreq.LT.monitorFreq)
943 & monitorFreq=diagFreq
944 IF (taveFreq.NE.0..AND.taveFreq.LT.monitorFreq)
945 & monitorFreq=taveFreq
946 IF (chkPtFreq.NE.0..AND.chkPtFreq.LT.monitorFreq)
947 & monitorFreq=chkPtFreq
948 IF (pChkPtFreq.NE.0..AND.pChkPtFreq.LT.monitorFreq)
949 & monitorFreq=pChkPtFreq
950 IF (monitorFreq.EQ.0.) monitorFreq=deltaTclock
951 ENDIF
952
953 C-- Grid parameters
954 C In cartesian coords distances are in metres
955 DO K =1,Nr
956 delZ(K) = UNSET_RL
957 delP(K) = UNSET_RL
958 delR(K) = UNSET_RL
959 ENDDO
960 C In spherical polar distances are in degrees
961 dxSpacing = UNSET_RL
962 dySpacing = UNSET_RL
963 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM04'
964 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
965 & SQUEEZE_RIGHT, myThid )
966 READ(UNIT=iUnit,NML=PARM04,IOSTAT=errIO)
967 IF ( errIO .LT. 0 ) THEN
968 WRITE(msgBuf,'(A)')
969 & 'S/R INI_PARMS'
970 CALL PRINT_ERROR( msgBuf, myThid )
971 WRITE(msgBuf,'(A)')
972 & 'Error reading numerical model '
973 CALL PRINT_ERROR( msgBuf, myThid )
974 WRITE(msgBuf,'(A)')
975 & 'parameter file "data"'
976 CALL PRINT_ERROR( msgBuf, myThid )
977 WRITE(msgBuf,'(A)')
978 & 'Problem in namelist PARM04'
979 CALL PRINT_ERROR( msgBuf, myThid )
980 CALL MODELDATA_EXAMPLE( myThid )
981 STOP 'ABNORMAL END: S/R INI_PARMS'
982 ELSE
983 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM04 : OK'
984 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
985 & SQUEEZE_RIGHT, myThid )
986 ENDIF
987
988 C Check for retired parameters still being used
989 IF ( rkFac .NE. UNSET_RL ) THEN
990 nRetired = nRetired+1
991 WRITE(msgBuf,'(A,A)')
992 & 'S/R INI_PARMS: "rkFac" has been replaced by -rkSign ',
993 & ' and is no longer allowed in file "data".'
994 CALL PRINT_ERROR( msgBuf, myThid )
995 ENDIF
996 IF ( groundAtK1 ) THEN
997 c nRetired = nRetired+1
998 WRITE(msgBuf,'(A,A)')
999 & 'S/R INI_PARMS: "groundAtK1" is set according to vertical ',
1000 & ' coordinate and is no longer allowed in file "data".'
1001 CALL PRINT_ERROR( msgBuf, myThid )
1002 ENDIF
1003
1004 C X coordinate : Check for multiple definitions
1005 goptCount = 0
1006 IF ( delX(1) .NE. UNSET_RL ) goptCount = goptCount + 1
1007 IF ( dxSpacing .NE. UNSET_RL ) goptCount = goptCount + 1
1008 IF ( delXFile .NE. ' ' ) goptCount = goptCount + 1
1009 IF ( goptCount.GT.1 ) THEN
1010 WRITE(msgBuf,'(A,A)') 'Too many specifications for delX:',
1011 & 'Specify only one of delX, dxSpacing or delXfile'
1012 CALL PRINT_ERROR( msgBuf, myThid )
1013 STOP 'ABNORMAL END: S/R INI_PARMS'
1014 ENDIF
1015 IF ( dxSpacing .NE. UNSET_RL ) THEN
1016 DO i=1,Nx
1017 delX(i) = dxSpacing
1018 ENDDO
1019 ENDIF
1020 C Y coordinate : Check for multiple definitions
1021 goptCount = 0
1022 IF ( delY(1) .NE. UNSET_RL ) goptCount = goptCount + 1
1023 IF ( dySpacing .NE. UNSET_RL ) goptCount = goptCount + 1
1024 IF ( delYFile .NE. ' ' ) goptCount = goptCount + 1
1025 IF ( goptCount.GT.1 ) THEN
1026 WRITE(msgBuf,'(A,A)') 'Too many specifications for delY:',
1027 & 'Specify only one of delY, dySpacing or delYfile'
1028 CALL PRINT_ERROR( msgBuf, myThid )
1029 STOP 'ABNORMAL END: S/R INI_PARMS'
1030 ENDIF
1031 IF ( dySpacing .NE. UNSET_RL ) THEN
1032 DO j=1,Ny
1033 delY(j) = dySpacing
1034 ENDDO
1035 ENDIF
1036 C
1037 IF ( rSphere .NE. 0. ) THEN
1038 recip_rSphere = 1. _d 0/rSphere
1039 ELSE
1040 recip_rSphere = 0.
1041 ENDIF
1042 C-- Check for conflicting grid definitions.
1043 goptCount = 0
1044 IF ( usingCartesianGrid ) goptCount = goptCount+1
1045 IF ( usingSphericalPolarGrid ) goptCount = goptCount+1
1046 IF ( usingCurvilinearGrid ) goptCount = goptCount+1
1047 IF ( usingCylindricalGrid ) goptCount = goptCount+1
1048 IF ( goptCount .GT. 1 ) THEN
1049 WRITE(msgBuf,'(A)')
1050 & 'S/R INI_PARMS: More than one coordinate system requested'
1051 CALL PRINT_ERROR( msgBuf, myThid )
1052 STOP 'ABNORMAL END: S/R INI_PARMS'
1053 ENDIF
1054 IF ( goptCount .LT. 1 ) THEN
1055 C- No horizontal grid is specified => use Cartesian grid as default:
1056 WRITE(msgBuf,'(A)')
1057 & 'S/R INI_PARMS: No horizontal grid requested'
1058 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1059 & SQUEEZE_RIGHT, myThid )
1060 WRITE(msgBuf,'(A)')
1061 & 'S/R INI_PARMS: => Use Cartesian Grid as default'
1062 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1063 & SQUEEZE_RIGHT, myThid )
1064 usingCartesianGrid = .TRUE.
1065 ENDIF
1066 C-- Make metric term & Coriolis settings consistent with underlying grid.
1067 IF ( usingCartesianGrid ) THEN
1068 metricTerms = .FALSE.
1069 useNHMTerms = .FALSE.
1070 useBetaPlaneF = .TRUE.
1071 ENDIF
1072 IF ( usingCylindricalGrid ) THEN
1073 useNHMTerms = .FALSE.
1074 useBetaPlaneF = .TRUE.
1075 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; Cylinder OK'
1076 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1077 & SQUEEZE_RIGHT, myThid )
1078 ENDIF
1079 IF ( usingCurvilinearGrid ) THEN
1080 metricTerms = .FALSE.
1081 ENDIF
1082 IF ( useConstantF ) useBetaPlaneF = .FALSE.
1083 IF ( useConstantF ) useSphereF = .FALSE.
1084 IF ( useBetaPlaneF ) useSphereF = .FALSE.
1085 IF ( usingCartesianGrid .OR. usingCylindricalGrid
1086 & .OR. .NOT.(nonHydrostatic.OR.quasiHydrostatic) )
1087 & use3dCoriolis = .FALSE.
1088
1089 C-- Set default for latitude-band where relaxation to climatology applies
1090 C note: done later (once domain size is known) if using CartesianGrid
1091 IF ( latBandClimRelax .EQ. UNSET_RL) THEN
1092 IF ( usingSphericalPolarGrid ) latBandClimRelax= 180. _d 0
1093 IF ( usingCurvilinearGrid ) latBandClimRelax= 180. _d 0
1094 ENDIF
1095 C-- set cell Center depth and put Interface at the middle between 2 C
1096 setCenterDr = .FALSE.
1097 DO K=1,Nr+1
1098 IF ( delRc(K).EQ.UNSET_RL ) THEN
1099 IF ( setCenterDr ) THEN
1100 WRITE(msgBuf,'(A,I4)')
1101 & 'S/R INI_PARMS: No value for delRc at K =', K
1102 CALL PRINT_ERROR( msgBuf, myThid )
1103 STOP 'ABNORMAL END: S/R INI_PARMS'
1104 ENDIF
1105 ELSE
1106 IF ( k.EQ.1 ) setCenterDr = .TRUE.
1107 IF ( .NOT.setCenterDr ) THEN
1108 WRITE(msgBuf,'(A,I4)')
1109 & 'S/R INI_PARMS: No value for delRc at K <', K
1110 CALL PRINT_ERROR( msgBuf, myThid )
1111 STOP 'ABNORMAL END: S/R INI_PARMS'
1112 ENDIF
1113 ENDIF
1114 ENDDO
1115 IF ( setCenterDr ) rCoordInputData = .TRUE.
1116 C-- p, z, r coord parameters
1117 setInterFDr = .FALSE.
1118 DO K = 1, Nr
1119 IF ( delZ(K) .NE. UNSET_RL ) zCoordInputData = .TRUE.
1120 IF ( delP(K) .NE. UNSET_RL ) pCoordInputData = .TRUE.
1121 IF ( delR(K) .NE. UNSET_RL ) rCoordInputData = .TRUE.
1122 IF ( delR(K) .EQ. UNSET_RL ) delR(K) = delZ(K)
1123 IF ( delR(K) .EQ. UNSET_RL ) delR(K) = delP(K)
1124 IF ( delR(K) .EQ. UNSET_RL ) THEN
1125 IF ( setInterFDr ) THEN
1126 WRITE(msgBuf,'(A,I4)')
1127 & 'S/R INI_PARMS: No value for delZ/delP/delR at K =', K
1128 CALL PRINT_ERROR( msgBuf, myThid )
1129 STOP 'ABNORMAL END: S/R INI_PARMS'
1130 ENDIF
1131 ELSE
1132 IF ( k.EQ.1 ) setInterFDr = .TRUE.
1133 IF ( .NOT.setInterFDr ) THEN
1134 WRITE(msgBuf,'(A,I4)')
1135 & 'S/R INI_PARMS: No value for delZ/delP/delR at K <', K
1136 CALL PRINT_ERROR( msgBuf, myThid )
1137 STOP 'ABNORMAL END: S/R INI_PARMS'
1138 ENDIF
1139 ENDIF
1140 ENDDO
1141 C Check for multiple coordinate systems
1142 coordsSet = 0
1143 IF ( zCoordInputData ) coordsSet = coordsSet + 1
1144 IF ( pCoordInputData ) coordsSet = coordsSet + 1
1145 IF ( rCoordInputData ) coordsSet = coordsSet + 1
1146 IF ( coordsSet .GT. 1 ) THEN
1147 WRITE(msgBuf,'(A)')
1148 & 'S/R INI_PARMS: Cannot mix z, p and r in the input data.'
1149 CALL PRINT_ERROR( msgBuf, myThid )
1150 STOP 'ABNORMAL END: S/R INI_PARMS'
1151 ENDIF
1152 C- Check for double definition (file & namelist)
1153 IF ( delRcFile.NE.' ' ) THEN
1154 IF ( setCenterDr ) THEN
1155 WRITE(msgBuf,'(A)')
1156 & 'S/R INI_PARMS: Cannot set both delRc and delRcFile'
1157 CALL PRINT_ERROR( msgBuf, myThid )
1158 STOP 'ABNORMAL END: S/R INI_PARMS'
1159 ENDIF
1160 setCenterDr = .TRUE.
1161 ENDIF
1162 IF ( delRFile.NE.' ' ) THEN
1163 IF ( setInterFDr ) THEN
1164 WRITE(msgBuf,'(A)')
1165 & 'S/R INI_PARMS: Cannot set both delR and delRFile'
1166 CALL PRINT_ERROR( msgBuf, myThid )
1167 STOP 'ABNORMAL END: S/R INI_PARMS'
1168 ENDIF
1169 setInterFDr = .TRUE.
1170 ENDIF
1171 c IF ( setInterFDr .AND. setCenterDr ) THEN
1172 c WRITE(msgBuf,'(2A)') 'S/R INI_PARMS:',
1173 c & ' Cannot specify both delRc and delZ/delP/delR'
1174 c CALL PRINT_ERROR( msgBuf, myThid )
1175 c STOP 'ABNORMAL END: S/R INI_PARMS'
1176 c ENDIF
1177
1178 C-- Input files
1179 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM05'
1180 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1181 & SQUEEZE_RIGHT, myThid )
1182 READ(UNIT=iUnit,NML=PARM05) !,IOSTAT=errIO)
1183 IF ( errIO .LT. 0 ) THEN
1184 WRITE(msgBuf,'(A)')
1185 & 'Error reading numerical model '
1186 CALL PRINT_ERROR( msgBuf, myThid )
1187 WRITE(msgBuf,'(A)')
1188 & 'parameter file "data"'
1189 CALL PRINT_ERROR( msgBuf, myThid )
1190 WRITE(msgBuf,'(A)')
1191 & 'Problem in namelist PARM05'
1192 CALL PRINT_ERROR( msgBuf, myThid )
1193 CALL MODELDATA_EXAMPLE( myThid )
1194 STOP 'ABNORMAL END: S/R INI_PARMS'
1195 ELSE
1196 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM05 : OK'
1197 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1198 & SQUEEZE_RIGHT, myThid )
1199 ENDIF
1200
1201 C-- Set Units conversion factor required to incorporate
1202 C surface forcing into z-p isomorphic equations:
1203 C mass2rUnit: from mass per unit area [kg/m2] to r-coordinate (z:=1/rho;p:=g)
1204 C rUnit2mass: from r-coordinate to mass per unit area [kg/m2] (z:=rho;p:=1/g)
1205 IF ( usingPCoords ) THEN
1206 mass2rUnit = gravity
1207 rUnit2mass = recip_gravity
1208 ELSE
1209 mass2rUnit = recip_rhoConst
1210 rUnit2mass = rhoConst
1211 ENDIF
1212
1213 c-- gradually replacing debugMode by debugLevel
1214 IF ( debugMode ) debugLevel = debLevB
1215 IF ( debugLevel .GE. debLevB ) debugMode = .TRUE.
1216
1217 c-- flag for approximate adjoint
1218 IF ( inAdExact ) THEN
1219 inAdTrue = .FALSE.
1220 inAdFALSE = .FALSE.
1221 ELSE
1222 inAdTrue = .TRUE.
1223 inAdFALSE = .FALSE.
1224 ENDIF
1225 C
1226 CLOSE(iUnit)
1227
1228 C-- Check whether any retired parameters were found.
1229 C-- Stop if they were
1230 IF ( nRetired .GT. 0 ) THEN
1231 WRITE(msgBuf,'(A)')
1232 & 'Error reading parameter file "data"'
1233 CALL PRINT_ERROR( msgBuf, myThid )
1234 WRITE(msgBuf,'(A)')
1235 & 'some out of date parameters were found in the namelist'
1236 CALL PRINT_ERROR( msgBuf, myThid )
1237 STOP 'ABNORMAL END: S/R INI_PARMS'
1238 ENDIF
1239
1240 _END_MASTER(myThid)
1241
1242 C-- Everyone else must wait for the parameters to be loaded
1243 _BARRIER
1244 C
1245 RETURN
1246 END

  ViewVC Help
Powered by ViewVC 1.1.22