/[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.207 - (show annotations) (download)
Sun Mar 30 21:45:11 2008 UTC (16 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.206: +19 -3 lines
new parameter "selectVortScheme" to select which scheme to use for
 vorticty-term (in Vector Inv.); remove "SadournyCoriolis" flag.

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

  ViewVC Help
Powered by ViewVC 1.1.22