/[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.193 - (show annotations) (download)
Thu Apr 5 22:51:48 2007 UTC (17 years, 1 month ago) by dimitri
Branch: MAIN
Changes since 1.192: +2 -3 lines
Modified capability for 3D specification of background vertical diffusion
coefficient as per JM requests.  3D diffusion is now specified by
(i) #define ALLOW_3D_DIFFKR in CPP_OPTIONS.h and
(ii) specifying file diffKrFile in runtime "data" file that contains
     the 3D vertical diffusivity coefficients.

1 C $Header: /u/gcmpack/MITgcm/model/src/ini_parms.F,v 1.192 2007/04/05 00:02:49 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 & rhoConst, rhoConstFresh, buoyancyRelation, HeatCapacity_Cp,
186 & writeBinaryPrec, readBinaryPrec, writeStatePrec,
187 & nonHydrostatic, quasiHydrostatic, globalFiles, useSingleCpuIO,
188 & allowFreezing, useOldFreezing, ivdc_kappa,
189 & usePickupBeforeC35, usePickupBeforeC54, debugMode, debugLevel,
190 & tempAdvScheme, tempVertAdvScheme,
191 & saltAdvScheme, saltVertAdvScheme, tracerAdvScheme,
192 & multiDimAdvection, useEnergyConservingCoriolis,
193 & useCDscheme, useJamartWetPoints, useJamartMomAdv, useNHMTerms,
194 & SadournyCoriolis, upwindVorticity, highOrderVorticity,
195 & useAbsVorticity, upwindShear, selectKEscheme,
196 & useRealFreshWaterFlux, convertFW2Salt,
197 & temp_EvPrRn, salt_EvPrRn, trac_EvPrRn,
198 & zonal_filt_lat,
199 & inAdExact, smoothAbsFuncRange,
200 & balanceEmPmR, balanceQnet, balancePrintMean
201
202 C-- Elliptic solver parameters
203 NAMELIST /PARM02/
204 & cg2dMaxIters, cg2dChkResFreq, cg2dTargetResidual,
205 & cg2dTargetResWunit, cg2dpcOffDFac, cg2dPreCondFreq,
206 & cg3dMaxIters, cg3dChkResFreq, cg3dTargetResidual
207
208 C-- Time stepping parammeters
209 NAMELIST /PARM03/
210 & nIter0, nTimeSteps, nEndIter, pickupSuff,
211 & deltaT, deltaTClock, deltaTmom,
212 & deltaTtracer, dTtracerLev, deltaTfreesurf,
213 & forcing_In_AB, momForcingOutAB, tracForcingOutAB,
214 & momDissip_In_AB, doAB_onGtGs,
215 & abEps, alph_AB, beta_AB, startFromPickupAB2,
216 & tauCD, rCD,
217 & baseTime, startTime, endTime, chkPtFreq,
218 & dumpFreq, dumpInitAndLast, adjDumpFreq, taveFreq, tave_lastIter,
219 & diagFreq, monitorFreq, adjMonitorFreq, pChkPtFreq, cAdjFreq,
220 & outputTypesInclusive,
221 & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
222 & tauThetaClimRelax3Dim, tauSaltClimRelax3Dim, tauTr1ClimRelax,
223 & periodicExternalForcing, externForcingPeriod, externForcingCycle,
224 & calendarDumps
225
226 C-- Gridding parameters
227 NAMELIST /PARM04/
228 & usingCartesianGrid, usingCylindricalGrid,
229 & dxSpacing, dySpacing, delX, delY, delXFile, delYFile,
230 & usingSphericalPolarGrid, phiMin, thetaMin, rSphere,
231 & usingCurvilinearGrid, horizGridFile, deepAtmosphere,
232 & Ro_SeaLevel, delZ, delP, delR, delRc, delRFile, delRcFile,
233 & rkFac, groundAtK1
234
235 C-- Input files
236 NAMELIST /PARM05/
237 & bathyFile, topoFile, shelfIceFile,
238 & hydrogThetaFile, hydrogSaltFile, diffKrFile,
239 & zonalWindFile, meridWindFile,
240 & thetaClimFile, saltClimFile,
241 & surfQfile, surfQnetFile, surfQswFile, EmPmRfile, saltFluxFile,
242 & lambdaThetaFile, lambdaSaltFile,
243 & uVelInitFile, vVelInitFile, pSurfInitFile,
244 & dQdTFile, ploadFile,tCylIn,tCylOut,
245 & eddyTauxFile, eddyTauyFile,
246 & mdsioLocalDir,
247 & the_run_name
248 CEOP
249
250 C
251 _BEGIN_MASTER(myThid)
252
253 C Defaults values for input parameters
254 CALL SET_DEFAULTS(
255 O viscArDefault, diffKrTDefault, diffKrSDefault,
256 O hFacMinDrDefault, delRDefault, rkFacDefault,
257 I myThid )
258
259 C-- Initialise "which vertical coordinate system used" flags.
260 zCoordInputData = .FALSE.
261 pCoordInputData = .FALSE.
262 rCoordInputData = .FALSE.
263 coordsSet = 0
264
265 C-- Initialise retired parameters to unlikely value
266 nRetired = 0
267 tempDiffusion = .TRUE.
268 saltDiffusion = .TRUE.
269 tracerAdvScheme = UNSET_I
270 trac_EvPrRn = UNSET_RL
271 zonal_filt_lat = UNSET_RL
272 gravitySign = UNSET_RL
273 viscAstrain = UNSET_RL
274 viscAtension = UNSET_RL
275 useAnisotropicViscAgridMax=.TRUE.
276 usePickupBeforeC35 = .FALSE.
277 tauThetaClimRelax3Dim = UNSET_RL
278 tauSaltClimRelax3Dim = UNSET_RL
279 calendarDumps = .FALSE.
280 rkFac = UNSET_RL
281 groundAtK1 = .FALSE.
282
283 C-- Open the parameter file
284 #ifdef TARGET_BGL
285 OPEN(UNIT=scrUnit1,FILE='scratch1',STATUS='UNKNOWN')
286 OPEN(UNIT=scrUnit2,FILE='scratch2',STATUS='UNKNOWN')
287 #else
288 OPEN(UNIT=scrUnit1,STATUS='SCRATCH')
289 OPEN(UNIT=scrUnit2,STATUS='SCRATCH')
290 #endif
291 OPEN(UNIT=modelDataUnit,FILE='data',STATUS='OLD',
292 & IOSTAT=errIO)
293 IF ( errIO .LT. 0 ) THEN
294 WRITE(msgBuf,'(A)')
295 & 'S/R INI_PARMS'
296 CALL PRINT_ERROR( msgBuf, myThid )
297 WRITE(msgBuf,'(A)')
298 & 'Unable to open model parameter'
299 CALL PRINT_ERROR( msgBuf, myThid )
300 WRITE(msgBuf,'(A)')
301 & 'file "data"'
302 CALL PRINT_ERROR( msgBuf, myThid )
303 CALL MODELDATA_EXAMPLE( myThid )
304 STOP 'ABNORMAL END: S/R INI_PARMS'
305 ENDIF
306
307 DO WHILE ( .TRUE. )
308 READ(modelDataUnit,FMT='(A)',END=1001) RECORD
309 IL = MAX(ILNBLNK(RECORD),1)
310 IF ( RECORD(1:1) .NE. commentCharacter ) THEN
311 CALL NML_SET_TERMINATOR( RECORD )
312 WRITE(UNIT=scrUnit1,FMT='(A)') RECORD(:IL)
313 ENDIF
314 WRITE(UNIT=scrUnit2,FMT='(A)') RECORD(:IL)
315 ENDDO
316 1001 CONTINUE
317 CLOSE(modelDataUnit)
318
319 C-- Report contents of model parameter file
320 WRITE(msgBuf,'(A)')
321 &'// ======================================================='
322 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
323 & SQUEEZE_RIGHT, myThid )
324 WRITE(msgBuf,'(A)') '// Model parameter file "data"'
325 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
326 & SQUEEZE_RIGHT, myThid )
327 WRITE(msgBuf,'(A)')
328 &'// ======================================================='
329 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
330 & SQUEEZE_RIGHT, myThid )
331 iUnit = scrUnit2
332 REWIND(iUnit)
333 DO WHILE ( .TRUE. )
334 READ(UNIT=iUnit,FMT='(A)',END=2001) RECORD
335 IL = MAX(ILNBLNK(RECORD),1)
336 WRITE(msgBuf,'(A,A)') '>',RECORD(:IL)
337 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
338 & SQUEEZE_RIGHT, myThid )
339 ENDDO
340 2001 CONTINUE
341 CLOSE(iUnit)
342 WRITE(msgBuf,'(A)') ' '
343 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
344 & SQUEEZE_RIGHT, myThid )
345
346
347 C-- Read settings from model parameter file "data".
348 iUnit = scrUnit1
349 REWIND(iUnit)
350
351 C-- Set default "physical" parameters
352 viscAhW = UNSET_RL
353 viscA4W = UNSET_RL
354 viscAhD = UNSET_RL
355 viscAhZ = UNSET_RL
356 viscA4D = UNSET_RL
357 viscA4Z = UNSET_RL
358 viscAz = UNSET_RL
359 viscAr = UNSET_RL
360 viscAp = UNSET_RL
361 diffKzT = UNSET_RL
362 diffKpT = UNSET_RL
363 diffKrT = UNSET_RL
364 diffKzS = UNSET_RL
365 diffKpS = UNSET_RL
366 diffKrS = UNSET_RL
367 DO k=1,Nr
368 diffKrNrT(k) = UNSET_RL
369 diffKrNrS(k) = UNSET_RL
370 tRef(k) = UNSET_RL
371 sRef(k) = UNSET_RL
372 ENDDO
373 gBaro = UNSET_RL
374 rhoConst = UNSET_RL
375 omega = UNSET_RL
376 hFacMinDr = UNSET_RL
377 hFacMinDz = UNSET_RL
378 hFacMinDp = UNSET_RL
379 rhoConstFresh = UNSET_RL
380 convertFW2Salt = UNSET_RL
381 tAlpha = UNSET_RL
382 sBeta = UNSET_RL
383 tempVertAdvScheme = 0
384 saltVertAdvScheme = 0
385 C-- z,p,r coord input switching.
386 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM01'
387 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
388 & SQUEEZE_RIGHT, myThid )
389 READ(UNIT=iUnit,NML=PARM01) !,IOSTAT=errIO)
390 IF ( errIO .LT. 0 ) THEN
391 WRITE(msgBuf,'(A)')
392 & 'S/R INI_PARMS'
393 CALL PRINT_ERROR( msgBuf, myThid )
394 WRITE(msgBuf,'(A)')
395 & 'Error reading numerical model '
396 CALL PRINT_ERROR( msgBuf, myThid )
397 WRITE(msgBuf,'(A)')
398 & 'parameter file "data"'
399 CALL PRINT_ERROR( msgBuf, myThid )
400 WRITE(msgBuf,'(A)')
401 & 'Problem in namelist PARM01'
402 CALL PRINT_ERROR( msgBuf, myThid )
403 CALL MODELDATA_EXAMPLE( myThid )
404 STOP 'ABNORMAL END: S/R INI_PARMS'
405 ELSE
406 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM01 : OK'
407 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
408 & SQUEEZE_RIGHT, myThid )
409 ENDIF
410
411 C- set the type of vertical coordinate and type of fluid
412 C according to buoyancyRelation
413 usingPCoords = .FALSE.
414 usingZCoords = .FALSE.
415 fluidIsAir = .FALSE.
416 fluidIsWater = .FALSE.
417 IF ( buoyancyRelation.EQ.'ATMOSPHERIC' ) THEN
418 usingPCoords = .TRUE.
419 fluidIsAir = .TRUE.
420 ELSEIF ( buoyancyRelation.EQ.'OCEANICP') THEN
421 usingPCoords = .TRUE.
422 fluidIsWater = .TRUE.
423 ELSEIF ( buoyancyRelation.EQ.'OCEANIC' ) THEN
424 usingZCoords = .TRUE.
425 fluidIsWater = .TRUE.
426 ELSE
427 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS:',
428 & ' Bad value of buoyancyRelation '
429 CALL PRINT_ERROR( msgBuf, myThid )
430 STOP 'ABNORMAL END: S/R INI_PARMS'
431 ENDIF
432
433 IF ( .NOT.rigidLid .AND.
434 & .NOT.implicitFreeSurface ) THEN
435 C- No barotropic solver selected => use implicitFreeSurface as default
436 WRITE(msgBuf,'(A)')
437 & 'S/R INI_PARMS: No request for barotropic solver'
438 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
439 & SQUEEZE_RIGHT, myThid )
440 WRITE(msgBuf,'(A)')
441 & 'S/R INI_PARMS: => Use implicitFreeSurface as default'
442 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
443 & SQUEEZE_RIGHT, myThid )
444 implicitFreeSurface = .TRUE.
445 ENDIF
446 IF ( implicitFreeSurface ) freeSurfFac = 1.D0
447 IF ( rigidLid ) freeSurfFac = 0.D0
448 IF ( gBaro .EQ. UNSET_RL ) gBaro=gravity
449 IF ( rhoConst .EQ. UNSET_RL ) rhoConst=rhoNil
450 IF ( rhoConstFresh .EQ. UNSET_RL ) rhoConstFresh=rhoConst
451 IF ( omega .EQ. UNSET_RL ) THEN
452 omega = 0. _d 0
453 IF ( rotationPeriod .NE. 0. _d 0 )
454 & omega = 2.D0 * PI / rotationPeriod
455 ELSEIF ( omega .EQ. 0. _d 0 ) THEN
456 rotationPeriod = 0. _d 0
457 ELSE
458 rotationPeriod = 2.D0 * PI / omega
459 ENDIF
460 IF (atm_Rd .EQ. UNSET_RL) THEN
461 atm_Rd = atm_Cp * atm_kappa
462 ELSE
463 atm_kappa = atm_Rd / atm_Cp
464 ENDIF
465 C-- Non-hydrostatic/quasi-hydrostatic
466 IF (nonHydrostatic.AND.quasiHydrostatic) THEN
467 WRITE(msgBuf,'(A)')
468 & 'Illegal: both nonHydrostatic = quasiHydrostatic = TRUE'
469 CALL PRINT_ERROR( msgBuf, myThid )
470 STOP 'ABNORMAL END: S/R INI_PARMS'
471 ENDIF
472 C-- Advection and Forcing for Temp and salt
473 IF (tempVertAdvScheme.EQ.0) tempVertAdvScheme = tempAdvScheme
474 IF (saltVertAdvScheme.EQ.0) saltVertAdvScheme = saltAdvScheme
475 C-- horizontal viscosity for vertical moments
476 IF ( viscAhW .EQ. UNSET_RL ) viscAhW = viscAh
477 IF ( viscA4W .EQ. UNSET_RL ) viscA4W = viscA4
478 C-- horizontal viscosity (acting on Divergence or Vorticity)
479 IF ( viscAhD .EQ. UNSET_RL ) viscAhD = viscAh
480 IF ( viscAhZ .EQ. UNSET_RL ) viscAhZ = viscAh
481 IF ( viscA4D .EQ. UNSET_RL ) viscA4D = viscA4
482 IF ( viscA4Z .EQ. UNSET_RL ) viscA4Z = viscA4
483 C-- z,p,r coord input switching.
484 IF ( viscAz .NE. UNSET_RL ) zCoordInputData = .TRUE.
485 IF ( viscAp .NE. UNSET_RL ) pCoordInputData = .TRUE.
486 IF ( viscAr .NE. UNSET_RL ) rCoordInputData = .TRUE.
487 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscAz
488 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscAp
489 IF ( viscAr .EQ. UNSET_RL ) viscAr = viscArDefault
490
491 IF ( diffKzT .NE. UNSET_RL ) zCoordInputData = .TRUE.
492 IF ( diffKpT .NE. UNSET_RL ) pCoordInputData = .TRUE.
493 IF ( diffKrT .NE. UNSET_RL ) rCoordInputData = .TRUE.
494 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKzT
495 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKpT
496 IF ( diffKrT .EQ. UNSET_RL ) diffKrT = diffKrTDefault
497 diffKrSet = .TRUE.
498 DO k=1,Nr
499 IF ( diffKrNrT(k).EQ. UNSET_RL ) diffKrSet = .FALSE.
500 ENDDO
501 IF ( .NOT.diffKrSet ) THEN
502 DO k=1,Nr
503 diffKrNrT(k) = diffKrT
504 ENDDO
505 ELSEIF ( diffKrT.NE.diffKrTDefault ) THEN
506 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS: Cannot set both ',
507 & 'diffKrNrT and diffKrT (or Kp,Kz) in input file data'
508 CALL PRINT_ERROR( msgBuf, myThid )
509 STOP 'ABNORMAL END: S/R INI_PARMS'
510 ENDIF
511
512 IF ( diffKzS .NE. UNSET_RL ) zCoordInputData = .TRUE.
513 IF ( diffKpS .NE. UNSET_RL ) pCoordInputData = .TRUE.
514 IF ( diffKrS .NE. UNSET_RL ) rCoordInputData = .TRUE.
515 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKzS
516 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKpS
517 IF ( diffKrS .EQ. UNSET_RL ) diffKrS = diffKrSDefault
518 diffKrSet = .TRUE.
519 DO k=1,Nr
520 IF ( diffKrNrS(k).EQ. UNSET_RL ) diffKrSet = .FALSE.
521 ENDDO
522 IF ( .NOT.diffKrSet ) THEN
523 DO k=1,Nr
524 diffKrNrS(k) = diffKrS
525 ENDDO
526 ELSEIF ( diffKrS.NE.diffKrSDefault ) THEN
527 WRITE(msgBuf,'(2A)') 'S/R INI_PARMS: Cannot set both ',
528 & 'diffKrNrS and diffKrS (or Kp,Kz) in input file data'
529 CALL PRINT_ERROR( msgBuf, myThid )
530 STOP 'ABNORMAL END: S/R INI_PARMS'
531 ENDIF
532
533 IF ( hFacMinDz .NE. UNSET_RL ) zCoordInputData = .TRUE.
534 IF ( hFacMinDp .NE. UNSET_RL ) pCoordInputData = .TRUE.
535 IF ( hFacMinDr .NE. UNSET_RL ) rCoordInputData = .TRUE.
536 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDz
537 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDp
538 IF ( hFacMinDr .EQ. UNSET_RL ) hFacMinDr = hFacMinDrDefault
539
540 IF (convertFW2Salt.EQ.UNSET_RL) THEN
541 convertFW2Salt = 35.
542 IF (useRealFreshWaterFlux) convertFW2Salt=-1
543 ENDIF
544
545 IF ( ivdc_kappa .NE. 0. .AND. .NOT. implicitDiffusion ) THEN
546 WRITE(msgBuf,'(A,A)')
547 & 'S/R INI_PARMS: To use ivdc_kappa you must enable implicit',
548 & ' vertical diffusion.'
549 CALL PRINT_ERROR( msgBuf, myThid )
550 STOP 'ABNORMAL END: S/R INI_PARMS'
551 ENDIF
552
553 coordsSet = 0
554 IF ( zCoordInputData ) coordsSet = coordsSet + 1
555 IF ( pCoordInputData ) coordsSet = coordsSet + 1
556 IF ( rCoordInputData ) coordsSet = coordsSet + 1
557 IF ( coordsSet .GT. 1 ) THEN
558 WRITE(msgBuf,'(A)')
559 & 'S/R INI_PARMS: Cannot mix z, p and r in the input data.'
560 CALL PRINT_ERROR( msgBuf, myThid )
561 STOP 'ABNORMAL END: S/R INI_PARMS'
562 ENDIF
563 IF ( rhoConst .LE. 0. ) THEN
564 WRITE(msgBuf,'(A)')
565 & 'S/R INI_PARMS: rhoConst must be greater than 0.'
566 CALL PRINT_ERROR( msgBuf, myThid )
567 STOP 'ABNORMAL END: S/R INI_PARMS'
568 ELSE
569 recip_rhoConst = 1.D0 / rhoConst
570 ENDIF
571 IF ( rhoNil .LE. 0. ) THEN
572 WRITE(msgBuf,'(A)')
573 & 'S/R INI_PARMS: rhoNil must be greater than 0.'
574 CALL PRINT_ERROR( msgBuf, myThid )
575 STOP 'ABNORMAL END: S/R INI_PARMS'
576 ELSE
577 recip_rhoNil = 1.D0 / rhoNil
578 ENDIF
579 IF ( HeatCapacity_Cp .LE. 0. ) THEN
580 WRITE(msgBuf,'(A)')
581 & 'S/R INI_PARMS: HeatCapacity_Cp must be greater than 0.'
582 CALL PRINT_ERROR( msgBuf, myThid )
583 STOP 'ABNORMAL END: S/R INI_PARMS'
584 ELSE
585 recip_Cp = 1.D0 / HeatCapacity_Cp
586 ENDIF
587 IF ( gravity .LE. 0. ) THEN
588 WRITE(msgBuf,'(A)')
589 & 'S/R INI_PARMS: gravity must be greater than 0.'
590 CALL PRINT_ERROR( msgBuf, myThid )
591 STOP 'ABNORMAL END: S/R INI_PARMS'
592 ELSE
593 recip_gravity = 1.D0 / gravity
594 ENDIF
595 C This flags are now passed to RW and MDSIO packages in ini_model_io.F
596 C Set globalFiles flag for READ_WRITE_FLD package
597 c CALL SET_WRITE_GLOBAL_FLD( globalFiles )
598 C Set globalFiles flag for READ_WRITE_REC package
599 c CALL SET_WRITE_GLOBAL_REC( globalFiles )
600 C Set globalFiles flag for READ_WRITE_REC package
601 c CALL SET_WRITE_GLOBAL_PICKUP( globalFiles )
602
603 C Check for retired parameters still being used
604 nRetired = 0
605 IF ( zonal_filt_lat .NE. UNSET_RL ) THEN
606 nRetired = nRetired+1
607 WRITE(msgBuf,'(A,A)')
608 & 'S/R INI_PARMS: Paramater "zonal_filt_lat" is',
609 & ' no longer allowed in file "data".'
610 CALL PRINT_ERROR( msgBuf, myThid )
611 WRITE(msgBuf,'(A,A)')
612 & 'S/R INI_PARMS: Paramater "zonal_filt_lat" is',
613 & ' now read from file "data.zonfilt".'
614 CALL PRINT_ERROR( msgBuf, myThid )
615 ENDIF
616 IF ( gravitySign .NE. UNSET_RL ) THEN
617 nRetired = nRetired+1
618 WRITE(msgBuf,'(A,A)')
619 & 'S/R INI_PARMS: "gravitySign" is set according to vertical ',
620 & ' coordinate and is no longer allowed in file "data".'
621 CALL PRINT_ERROR( msgBuf, myThid )
622 ENDIF
623 IF ( tracerAdvScheme .NE. UNSET_I ) THEN
624 nRetired = nRetired+1
625 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tracerAdvScheme" ',
626 & '(old passive tracer code) is no longer allowed in file "data"'
627 CALL PRINT_ERROR( msgBuf, myThid )
628 ENDIF
629 IF ( trac_EvPrRn .NE. UNSET_RL ) THEN
630 nRetired = nRetired+1
631 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "trac_EvPrRn" ',
632 & '(old passive tracer code) is no longer allowed in file "data"'
633 CALL PRINT_ERROR( msgBuf, myThid )
634 ENDIF
635 IF ( .NOT. tempDiffusion ) THEN
636 nRetired = nRetired+1
637 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tempDiffusion" ',
638 & 'is no longer allowed in file "data"'
639 CALL PRINT_ERROR( msgBuf, myThid )
640 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to turn off diffusion',
641 & ' => set diffusivity to zero'
642 CALL PRINT_ERROR( msgBuf, myThid )
643 ENDIF
644 IF ( .NOT. saltDiffusion ) THEN
645 nRetired = nRetired+1
646 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "saltDiffusion" ',
647 & 'is no longer allowed in file "data"'
648 CALL PRINT_ERROR( msgBuf, myThid )
649 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to turn off diffusion',
650 & ' => set diffusivity to zero'
651 CALL PRINT_ERROR( msgBuf, myThid )
652 ENDIF
653 IF ( viscAstrain .NE. UNSET_RL ) THEN
654 nRetired = nRetired+1
655 WRITE(msgBuf,'(A,A)')
656 & 'S/R INI_PARMS: "viscAstrain" ',
657 & 'is no longer allowed in file "data"'
658 CALL PRINT_ERROR( msgBuf, myThid )
659 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to use Strain & Tension',
660 & ' formulation => set useStrainTensionVisc to TRUE'
661 CALL PRINT_ERROR( msgBuf, myThid )
662 ENDIF
663 IF ( viscAtension .NE. UNSET_RL ) THEN
664 nRetired = nRetired+1
665 WRITE(msgBuf,'(A,A)')
666 & 'S/R INI_PARMS: "viscAtension" ',
667 & 'is no longer allowed in file "data"'
668 CALL PRINT_ERROR( msgBuf, myThid )
669 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: to use Strain & Tension',
670 & ' formulation => set useStrainTensionVisc to TRUE'
671 CALL PRINT_ERROR( msgBuf, myThid )
672 ENDIF
673 IF ( .NOT.useAnisotropicViscAgridMax ) THEN
674 nRetired = nRetired+1
675 WRITE(msgBuf,'(A,A)')
676 & 'S/R INI_PARMS: "useAnisotropicViscAgridMax" ',
677 & 'is not allowed in "data" substitute useAreaViscLength=true'
678 CALL PRINT_ERROR( msgBuf, myThid )
679 ENDIF
680 IF ( usePickupBeforeC35 ) THEN
681 nRetired = nRetired+1
682 WRITE(msgBuf,'(A,A)')
683 & 'S/R INI_PARMS: "usePickupBeforeC35" ',
684 & 'is no longer supported & not longer allowed in file "data"'
685 CALL PRINT_ERROR( msgBuf, myThid )
686 ENDIF
687
688 C-- Elliptic solver parameters
689 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM02'
690 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
691 & SQUEEZE_RIGHT, myThid )
692 READ(UNIT=iUnit,NML=PARM02) !,IOSTAT=errIO)
693 IF ( errIO .LT. 0 ) THEN
694 WRITE(msgBuf,'(A)')
695 & 'S/R INI_PARMS'
696 CALL PRINT_ERROR( msgBuf, myThid )
697 WRITE(msgBuf,'(A)')
698 & 'Error reading numerical model '
699 CALL PRINT_ERROR( msgBuf, myThid )
700 WRITE(msgBuf,'(A)')
701 & 'parameter file "data".'
702 CALL PRINT_ERROR( msgBuf, myThid )
703 WRITE(msgBuf,'(A)')
704 & 'Problem in namelist PARM02'
705 CALL PRINT_ERROR( msgBuf, myThid )
706 CALL MODELDATA_EXAMPLE( myThid )
707 STOP 'ABNORMAL END: S/R INI_PARMS'
708 ELSE
709 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM02 : OK'
710 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
711 & SQUEEZE_RIGHT, myThid )
712 ENDIF
713
714 C-- Time stepping parameters
715 rCD = -1.D0
716 latBandClimRelax = UNSET_RL
717 deltaTtracer = 0. _d 0
718 forcing_In_AB = .TRUE.
719 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM03'
720 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
721 & SQUEEZE_RIGHT, myThid )
722 READ(UNIT=iUnit,NML=PARM03) !,IOSTAT=errIO)
723 IF ( errIO .LT. 0 ) THEN
724 WRITE(msgBuf,'(A)')
725 & 'S/R INI_PARMS'
726 CALL PRINT_ERROR( msgBuf, myThid )
727 WRITE(msgBuf,'(A)')
728 & 'Error reading numerical model '
729 CALL PRINT_ERROR( msgBuf, myThid )
730 WRITE(msgBuf,'(A)')
731 & 'parameter file "data"'
732 CALL PRINT_ERROR( msgBuf, myThid )
733 WRITE(msgBuf,'(A)')
734 & 'Problem in namelist PARM03'
735 CALL PRINT_ERROR( msgBuf, myThid )
736 CALL MODELDATA_EXAMPLE( myThid )
737 STOP 'ABNORMAL END: S/R INI_PARMS'
738 ELSE
739 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM03 : OK'
740 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
741 & SQUEEZE_RIGHT, myThid )
742 ENDIF
743 C Check for retired parameters still being used
744 IF ( tauThetaClimRelax3Dim .NE. UNSET_RL ) THEN
745 nRetired = nRetired+1
746 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tauThetaClimRelax3Dim" ',
747 & 'is no longer allowed in file "data"'
748 CALL PRINT_ERROR( msgBuf, myThid )
749 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: 3-dim. relaxation code',
750 & ' has moved to separate pkg/rbcs.'
751 CALL PRINT_ERROR( msgBuf, myThid )
752 ENDIF
753 IF ( tauSaltClimRelax3Dim .NE. UNSET_RL ) THEN
754 nRetired = nRetired+1
755 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "tauSaltClimRelax3Dim" ',
756 & 'is no longer allowed in file "data"'
757 CALL PRINT_ERROR( msgBuf, myThid )
758 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: 3-dim. relaxation code',
759 & ' has moved to separate pkg/rbcs.'
760 CALL PRINT_ERROR( msgBuf, myThid )
761 ENDIF
762 IF ( calendarDumps ) THEN
763 nRetired = nRetired+1
764 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: "calendarDumps" ',
765 & 'is no longer allowed in file "data"'
766 CALL PRINT_ERROR( msgBuf, myThid )
767 WRITE(msgBuf,'(A,A)') 'S/R INI_PARMS: calendarDumps',
768 & ' has moved to "data.cal"'
769 CALL PRINT_ERROR( msgBuf, myThid )
770 ENDIF
771
772 C Process "timestepping" params
773 C o Time step size
774 IF ( deltaTtracer .NE. dTtracerLev(1) .AND.
775 & deltaTtracer .NE. 0. .AND. dTtracerLev(1) .NE. 0. ) THEN
776 WRITE(msgBuf,'(A)')
777 & 'S/R INI_PARMS: deltaTtracer & dTtracerLev(1) not equal'
778 CALL PRINT_ERROR( msgBuf, myThid )
779 STOP 'ABNORMAL END: S/R INI_PARMS'
780 ELSEIF ( dTtracerLev(1) .NE. 0. ) THEN
781 deltaTtracer = dTtracerLev(1)
782 ENDIF
783 IF ( deltaT .EQ. 0. ) deltaT = deltaTClock
784 IF ( deltaT .EQ. 0. ) deltaT = deltaTtracer
785 IF ( deltaT .EQ. 0. ) deltaT = deltaTmom
786 IF ( deltaT .EQ. 0. ) deltaT = deltaTfreesurf
787 IF ( deltaTmom .EQ. 0. ) deltaTmom = deltaT
788 IF ( deltaTtracer .EQ. 0. ) deltaTtracer = deltaT
789 IF ( deltaTClock .EQ. 0. ) deltaTClock = deltaT
790 DO k=1,Nr
791 IF (dTtracerLev(k).EQ.0.) dTtracerLev(k)= deltaTtracer
792 ENDDO
793 C Note that this line should set deltaFreesurf=deltaTtracer
794 C but this would change a lot of existing set-ups so we are
795 C obliged to set the default inappropriately.
796 C Be advised that when using asynchronous time stepping
797 C it is better to set deltaTreesurf=deltaTtracer
798 IF ( deltaTfreesurf .EQ. 0. ) deltaTfreesurf = deltaTmom
799 IF ( periodicExternalForcing ) THEN
800 IF ( externForcingCycle*externForcingPeriod .EQ. 0. ) THEN
801 WRITE(msgBuf,'(A)')
802 & 'S/R INI_PARMS: externForcingCycle,externForcingPeriod =0'
803 CALL PRINT_ERROR( msgBuf, myThid )
804 STOP 'ABNORMAL END: S/R INI_PARMS'
805 ENDIF
806 IF ( INT(externForcingCycle/externForcingPeriod) .NE.
807 & externForcingCycle/externForcingPeriod ) THEN
808 WRITE(msgBuf,'(A)')
809 & 'S/R INI_PARMS: externForcingCycle <> N*externForcingPeriod'
810 CALL PRINT_ERROR( msgBuf, myThid )
811 STOP 'ABNORMAL END: S/R INI_PARMS'
812 ENDIF
813 IF ( externForcingCycle.lt.externForcingPeriod ) THEN
814 WRITE(msgBuf,'(A)')
815 & 'S/R INI_PARMS: externForcingCycle < externForcingPeriod'
816 CALL PRINT_ERROR( msgBuf, myThid )
817 STOP 'ABNORMAL END: S/R INI_PARMS'
818 ENDIF
819 IF ( externForcingPeriod.lt.deltaTclock ) THEN
820 WRITE(msgBuf,'(A)')
821 & 'S/R INI_PARMS: externForcingPeriod < deltaTclock'
822 CALL PRINT_ERROR( msgBuf, myThid )
823 STOP 'ABNORMAL END: S/R INI_PARMS'
824 ENDIF
825 ENDIF
826 C o Adams-Bashforth time stepping:
827 IF ( momForcingOutAB .EQ. UNSET_I ) THEN
828 momForcingOutAB = 1
829 IF ( forcing_In_AB ) momForcingOutAB = 0
830 ENDIF
831 IF ( tracForcingOutAB .EQ. UNSET_I ) THEN
832 tracForcingOutAB = 1
833 IF ( forcing_In_AB ) tracForcingOutAB = 0
834 ENDIF
835 C o Convection frequency
836 IF ( cAdjFreq .LT. 0. ) THEN
837 cAdjFreq = deltaTClock
838 ENDIF
839 IF ( ivdc_kappa .NE. 0. .AND. cAdjFreq .NE. 0. ) THEN
840 WRITE(msgBuf,'(A,A)')
841 & 'S/R INI_PARMS: You have enabled both ivdc_kappa and',
842 & ' convective adjustment.'
843 CALL PRINT_ERROR( msgBuf, myThid )
844 STOP 'ABNORMAL END: S/R INI_PARMS'
845 ENDIF
846 IF (useCDscheme) THEN
847 C o CD coupling (CD scheme):
848 IF ( tauCD .EQ. 0.D0 ) tauCD = deltaTmom
849 IF ( rCD .LT. 0. ) rCD = 1. _d 0 - deltaTMom/tauCD
850 ENDIF
851 C o Temperature climatology relaxation time scale
852 IF ( tauThetaClimRelax .EQ. 0.D0 ) THEN
853 doThetaClimRelax = .FALSE.
854 ELSE
855 doThetaClimRelax = .TRUE.
856 ENDIF
857 C o Salinity climatology relaxation time scale
858 IF ( tauSaltClimRelax .EQ. 0.D0 ) THEN
859 doSaltClimRelax = .FALSE.
860 ELSE
861 doSaltClimRelax = .TRUE.
862 ENDIF
863 C o Tracer 1 climatology relaxation time scale
864 IF ( tauTr1ClimRelax .EQ. 0.D0 ) THEN
865 doTr1ClimRelax = .FALSE.
866 lambdaTr1ClimRelax = 0.D0
867 ELSE
868 doTr1ClimRelax = .TRUE.
869 lambdaTr1ClimRelax = 1./tauTr1ClimRelax
870 ENDIF
871
872 C o Base time
873 IF ( nIter0.NE.0 .AND. startTime.NE.0. .AND. baseTime.EQ.0. )
874 & baseTime = startTime - deltaTClock*float(nIter0)
875 C o Start time
876 IF ( nIter0 .NE. 0 .AND. startTime .EQ. 0. )
877 & startTime = baseTime + deltaTClock*float(nIter0)
878 C o nIter0
879 IF ( nIter0 .EQ. 0 .AND. startTime .NE. baseTime )
880 & nIter0 = NINT( (startTime-baseTime)/deltaTClock )
881
882 C o nTimeSteps 1
883 IF ( nTimeSteps .EQ. 0 .AND. nEndIter .NE. 0 )
884 & nTimeSteps = nEndIter-nIter0
885 C o nTimeSteps 2
886 IF ( nTimeSteps .EQ. 0 .AND. endTime .NE. 0. )
887 & nTimeSteps = NINT((endTime-startTime)/deltaTclock)
888 C o nEndIter 1
889 IF ( nEndIter .EQ. 0 .AND. nTimeSteps .NE. 0 )
890 & nEndIter = nIter0+nTimeSteps
891 C o nEndIter 2
892 IF ( nEndIter .EQ. 0 .AND. endTime .NE. 0. )
893 & nEndIter = NINT((endTime-baseTime)/deltaTclock)
894 C o End Time 1
895 IF ( endTime .EQ. 0. .AND. nTimeSteps .NE. 0 )
896 & endTime = startTime + deltaTClock*float(nTimeSteps)
897 C o End Time 2
898 IF ( endTime .EQ. 0. .AND. nEndIter .NE. 0 )
899 & endTime = baseTime + deltaTClock*float(nEndIter)
900
901 C o Consistent?
902 IF ( startTime .NE. baseTime+deltaTClock*float(nIter0) ) THEN
903 WRITE(msgBuf,'(A)')
904 & 'S/R INI_PARMS: startTime, baseTime and nIter0 are inconsistent'
905 CALL PRINT_ERROR( msgBuf, myThid )
906 WRITE(msgBuf,'(A)')
907 & 'S/R INI_PARMS: Perhaps more than two were set at once'
908 CALL PRINT_ERROR( msgBuf, myThid )
909 STOP 'ABNORMAL END: S/R INI_PARMS'
910 ENDIF
911 IF ( nEndIter .NE. nIter0+nTimeSteps ) THEN
912 WRITE(msgBuf,'(A)')
913 & 'S/R INI_PARMS: nIter0, nTimeSteps and nEndIter are inconsistent'
914 CALL PRINT_ERROR( msgBuf, myThid )
915 WRITE(msgBuf,'(A)')
916 & 'S/R INI_PARMS: Perhaps more than two were set at once'
917 CALL PRINT_ERROR( msgBuf, myThid )
918 STOP 'ABNORMAL END: S/R INI_PARMS'
919 ENDIF
920 IF ( nTimeSteps .NE. NINT((endTime-startTime)/deltaTClock)
921 & ) THEN
922 WRITE(msgBuf,'(A)')
923 & 'S/R INI_PARMS: both endTime and nTimeSteps have been set'
924 CALL PRINT_ERROR( msgBuf, myThid )
925 WRITE(msgBuf,'(A)')
926 & 'S/R INI_PARMS: but are inconsistent'
927 CALL PRINT_ERROR( msgBuf, myThid )
928 STOP 'ABNORMAL END: S/R INI_PARMS'
929 ENDIF
930
931 C o Monitor (should also add CPP flag for monitor?)
932 IF (monitorFreq.LT.0.) THEN
933 monitorFreq=0.
934 IF (dumpFreq.NE.0.) monitorFreq=dumpFreq
935 IF (diagFreq.NE.0..AND.diagFreq.LT.monitorFreq)
936 & monitorFreq=diagFreq
937 IF (taveFreq.NE.0..AND.taveFreq.LT.monitorFreq)
938 & monitorFreq=taveFreq
939 IF (chkPtFreq.NE.0..AND.chkPtFreq.LT.monitorFreq)
940 & monitorFreq=chkPtFreq
941 IF (pChkPtFreq.NE.0..AND.pChkPtFreq.LT.monitorFreq)
942 & monitorFreq=pChkPtFreq
943 IF (monitorFreq.EQ.0.) monitorFreq=deltaTclock
944 ENDIF
945
946 C-- Grid parameters
947 C In cartesian coords distances are in metres
948 DO K =1,Nr
949 delZ(K) = UNSET_RL
950 delP(K) = UNSET_RL
951 delR(K) = UNSET_RL
952 ENDDO
953 C In spherical polar distances are in degrees
954 dxSpacing = UNSET_RL
955 dySpacing = UNSET_RL
956 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM04'
957 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
958 & SQUEEZE_RIGHT, myThid )
959 READ(UNIT=iUnit,NML=PARM04,IOSTAT=errIO)
960 IF ( errIO .LT. 0 ) THEN
961 WRITE(msgBuf,'(A)')
962 & 'S/R INI_PARMS'
963 CALL PRINT_ERROR( msgBuf, myThid )
964 WRITE(msgBuf,'(A)')
965 & 'Error reading numerical model '
966 CALL PRINT_ERROR( msgBuf, myThid )
967 WRITE(msgBuf,'(A)')
968 & 'parameter file "data"'
969 CALL PRINT_ERROR( msgBuf, myThid )
970 WRITE(msgBuf,'(A)')
971 & 'Problem in namelist PARM04'
972 CALL PRINT_ERROR( msgBuf, myThid )
973 CALL MODELDATA_EXAMPLE( myThid )
974 STOP 'ABNORMAL END: S/R INI_PARMS'
975 ELSE
976 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM04 : OK'
977 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
978 & SQUEEZE_RIGHT, myThid )
979 ENDIF
980
981 C Check for retired parameters still being used
982 IF ( rkFac .NE. UNSET_RL ) THEN
983 nRetired = nRetired+1
984 WRITE(msgBuf,'(A,A)')
985 & 'S/R INI_PARMS: "rkFac" has been replaced by -rkSign ',
986 & ' and is no longer allowed in file "data".'
987 CALL PRINT_ERROR( msgBuf, myThid )
988 ENDIF
989 IF ( groundAtK1 ) THEN
990 c nRetired = nRetired+1
991 WRITE(msgBuf,'(A,A)')
992 & 'S/R INI_PARMS: "groundAtK1" is set according to vertical ',
993 & ' coordinate and is no longer allowed in file "data".'
994 CALL PRINT_ERROR( msgBuf, myThid )
995 ENDIF
996
997 C X coordinate : Check for multiple definitions
998 goptCount = 0
999 IF ( delX(1) .NE. UNSET_RL ) goptCount = goptCount + 1
1000 IF ( dxSpacing .NE. UNSET_RL ) goptCount = goptCount + 1
1001 IF ( delXFile .NE. ' ' ) goptCount = goptCount + 1
1002 IF ( goptCount.GT.1 ) THEN
1003 WRITE(msgBuf,'(A,A)') 'Too many specifications for delX:',
1004 & 'Specify only one of delX, dxSpacing or delXfile'
1005 CALL PRINT_ERROR( msgBuf, myThid )
1006 STOP 'ABNORMAL END: S/R INI_PARMS'
1007 ENDIF
1008 IF ( dxSpacing .NE. UNSET_RL ) THEN
1009 DO i=1,Nx
1010 delX(i) = dxSpacing
1011 ENDDO
1012 ENDIF
1013 C Y coordinate : Check for multiple definitions
1014 goptCount = 0
1015 IF ( delY(1) .NE. UNSET_RL ) goptCount = goptCount + 1
1016 IF ( dySpacing .NE. UNSET_RL ) goptCount = goptCount + 1
1017 IF ( delYFile .NE. ' ' ) goptCount = goptCount + 1
1018 IF ( goptCount.GT.1 ) THEN
1019 WRITE(msgBuf,'(A,A)') 'Too many specifications for delY:',
1020 & 'Specify only one of delY, dySpacing or delYfile'
1021 CALL PRINT_ERROR( msgBuf, myThid )
1022 STOP 'ABNORMAL END: S/R INI_PARMS'
1023 ENDIF
1024 IF ( dySpacing .NE. UNSET_RL ) THEN
1025 DO j=1,Ny
1026 delY(j) = dySpacing
1027 ENDDO
1028 ENDIF
1029 C
1030 IF ( rSphere .NE. 0. ) THEN
1031 recip_rSphere = 1. _d 0/rSphere
1032 ELSE
1033 recip_rSphere = 0.
1034 ENDIF
1035 C-- Check for conflicting grid definitions.
1036 goptCount = 0
1037 IF ( usingCartesianGrid ) goptCount = goptCount+1
1038 IF ( usingSphericalPolarGrid ) goptCount = goptCount+1
1039 IF ( usingCurvilinearGrid ) goptCount = goptCount+1
1040 IF ( usingCylindricalGrid ) goptCount = goptCount+1
1041 IF ( goptCount .GT. 1 ) THEN
1042 WRITE(msgBuf,'(A)')
1043 & 'S/R INI_PARMS: More than one coordinate system requested'
1044 CALL PRINT_ERROR( msgBuf, myThid )
1045 STOP 'ABNORMAL END: S/R INI_PARMS'
1046 ENDIF
1047 IF ( goptCount .LT. 1 ) THEN
1048 C- No horizontal grid is specified => use Cartesian grid as default:
1049 WRITE(msgBuf,'(A)')
1050 & 'S/R INI_PARMS: No horizontal grid requested'
1051 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1052 & SQUEEZE_RIGHT, myThid )
1053 WRITE(msgBuf,'(A)')
1054 & 'S/R INI_PARMS: => Use Cartesian Grid as default'
1055 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1056 & SQUEEZE_RIGHT, myThid )
1057 usingCartesianGrid = .TRUE.
1058 ENDIF
1059 C-- Make metric term & Coriolis settings consistent with underlying grid.
1060 IF ( usingCartesianGrid ) THEN
1061 metricTerms = .FALSE.
1062 useNHMTerms = .FALSE.
1063 useBetaPlaneF = .TRUE.
1064 ENDIF
1065 IF ( usingCylindricalGrid ) THEN
1066 useNHMTerms = .FALSE.
1067 useBetaPlaneF = .TRUE.
1068 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; Cylinder OK'
1069 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1070 & SQUEEZE_RIGHT, myThid )
1071 ENDIF
1072 IF ( usingCurvilinearGrid ) THEN
1073 metricTerms = .FALSE.
1074 ENDIF
1075 IF ( useConstantF ) useBetaPlaneF = .FALSE.
1076 IF ( useConstantF ) useSphereF = .FALSE.
1077 IF ( useBetaPlaneF ) useSphereF = .FALSE.
1078 IF ( usingCartesianGrid .OR. usingCylindricalGrid
1079 & .OR. .NOT.(nonHydrostatic.OR.quasiHydrostatic) )
1080 & use3dCoriolis = .FALSE.
1081
1082 C-- Set default for latitude-band where relaxation to climatology applies
1083 C note: done later (once domain size is known) if using CartesianGrid
1084 IF ( latBandClimRelax .EQ. UNSET_RL) THEN
1085 IF ( usingSphericalPolarGrid ) latBandClimRelax= 180. _d 0
1086 IF ( usingCurvilinearGrid ) latBandClimRelax= 180. _d 0
1087 ENDIF
1088 C-- set cell Center depth and put Interface at the middle between 2 C
1089 setCenterDr = .FALSE.
1090 DO K=1,Nr+1
1091 IF ( delRc(K).EQ.UNSET_RL ) THEN
1092 IF ( setCenterDr ) THEN
1093 WRITE(msgBuf,'(A,I4)')
1094 & 'S/R INI_PARMS: No value for delRc at K =', K
1095 CALL PRINT_ERROR( msgBuf, myThid )
1096 STOP 'ABNORMAL END: S/R INI_PARMS'
1097 ENDIF
1098 ELSE
1099 IF ( k.EQ.1 ) setCenterDr = .TRUE.
1100 IF ( .NOT.setCenterDr ) THEN
1101 WRITE(msgBuf,'(A,I4)')
1102 & 'S/R INI_PARMS: No value for delRc at K <', K
1103 CALL PRINT_ERROR( msgBuf, myThid )
1104 STOP 'ABNORMAL END: S/R INI_PARMS'
1105 ENDIF
1106 ENDIF
1107 ENDDO
1108 IF ( setCenterDr ) rCoordInputData = .TRUE.
1109 C-- p, z, r coord parameters
1110 setInterFDr = .FALSE.
1111 DO K = 1, Nr
1112 IF ( delZ(K) .NE. UNSET_RL ) zCoordInputData = .TRUE.
1113 IF ( delP(K) .NE. UNSET_RL ) pCoordInputData = .TRUE.
1114 IF ( delR(K) .NE. UNSET_RL ) rCoordInputData = .TRUE.
1115 IF ( delR(K) .EQ. UNSET_RL ) delR(K) = delZ(K)
1116 IF ( delR(K) .EQ. UNSET_RL ) delR(K) = delP(K)
1117 IF ( delR(K) .EQ. UNSET_RL ) THEN
1118 IF ( setInterFDr ) THEN
1119 WRITE(msgBuf,'(A,I4)')
1120 & 'S/R INI_PARMS: No value for delZ/delP/delR at K =', K
1121 CALL PRINT_ERROR( msgBuf, myThid )
1122 STOP 'ABNORMAL END: S/R INI_PARMS'
1123 ENDIF
1124 ELSE
1125 IF ( k.EQ.1 ) setInterFDr = .TRUE.
1126 IF ( .NOT.setInterFDr ) THEN
1127 WRITE(msgBuf,'(A,I4)')
1128 & 'S/R INI_PARMS: No value for delZ/delP/delR at K <', K
1129 CALL PRINT_ERROR( msgBuf, myThid )
1130 STOP 'ABNORMAL END: S/R INI_PARMS'
1131 ENDIF
1132 ENDIF
1133 ENDDO
1134 C Check for multiple coordinate systems
1135 coordsSet = 0
1136 IF ( zCoordInputData ) coordsSet = coordsSet + 1
1137 IF ( pCoordInputData ) coordsSet = coordsSet + 1
1138 IF ( rCoordInputData ) coordsSet = coordsSet + 1
1139 IF ( coordsSet .GT. 1 ) THEN
1140 WRITE(msgBuf,'(A)')
1141 & 'S/R INI_PARMS: Cannot mix z, p and r in the input data.'
1142 CALL PRINT_ERROR( msgBuf, myThid )
1143 STOP 'ABNORMAL END: S/R INI_PARMS'
1144 ENDIF
1145 C- Check for double definition (file & namelist)
1146 IF ( delRcFile.NE.' ' ) THEN
1147 IF ( setCenterDr ) THEN
1148 WRITE(msgBuf,'(A)')
1149 & 'S/R INI_PARMS: Cannot set both delRc and delRcFile'
1150 CALL PRINT_ERROR( msgBuf, myThid )
1151 STOP 'ABNORMAL END: S/R INI_PARMS'
1152 ENDIF
1153 setCenterDr = .TRUE.
1154 ENDIF
1155 IF ( delRFile.NE.' ' ) THEN
1156 IF ( setInterFDr ) THEN
1157 WRITE(msgBuf,'(A)')
1158 & 'S/R INI_PARMS: Cannot set both delR and delRFile'
1159 CALL PRINT_ERROR( msgBuf, myThid )
1160 STOP 'ABNORMAL END: S/R INI_PARMS'
1161 ENDIF
1162 setInterFDr = .TRUE.
1163 ENDIF
1164 c IF ( setInterFDr .AND. setCenterDr ) THEN
1165 c WRITE(msgBuf,'(2A)') 'S/R INI_PARMS:',
1166 c & ' Cannot specify both delRc and delZ/delP/delR'
1167 c CALL PRINT_ERROR( msgBuf, myThid )
1168 c STOP 'ABNORMAL END: S/R INI_PARMS'
1169 c ENDIF
1170
1171 C-- Input files
1172 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; starts to read PARM05'
1173 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1174 & SQUEEZE_RIGHT, myThid )
1175 READ(UNIT=iUnit,NML=PARM05) !,IOSTAT=errIO)
1176 IF ( errIO .LT. 0 ) THEN
1177 WRITE(msgBuf,'(A)')
1178 & 'Error reading numerical model '
1179 CALL PRINT_ERROR( msgBuf, myThid )
1180 WRITE(msgBuf,'(A)')
1181 & 'parameter file "data"'
1182 CALL PRINT_ERROR( msgBuf, myThid )
1183 WRITE(msgBuf,'(A)')
1184 & 'Problem in namelist PARM05'
1185 CALL PRINT_ERROR( msgBuf, myThid )
1186 CALL MODELDATA_EXAMPLE( myThid )
1187 STOP 'ABNORMAL END: S/R INI_PARMS'
1188 ELSE
1189 WRITE(msgBuf,'(A)') 'S/R INI_PARMS ; read PARM05 : OK'
1190 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1191 & SQUEEZE_RIGHT, myThid )
1192 ENDIF
1193
1194 C-- Set factors required for mixing pressure and meters as vertical coordinate.
1195 C horiVertRatio is a parameter that maps horizontal units to vertical units.
1196 C It is used in certain special cases where lateral and vertical terms are
1197 C being combined and a single frame of reference is needed.
1198 horiVertRatio = 1. _d 0
1199 IF ( usingPCoords ) THEN
1200 horiVertRatio = Gravity * rhoConst
1201 ENDIF
1202 convertEmP2rUnit = rhoConstFresh*recip_rhoConst*horiVertRatio
1203 recip_horiVertRatio = 1. _d 0/horiVertRatio
1204
1205 c-- gradually replacing debugMode by debugLevel
1206 IF ( debugMode ) debugLevel = debLevB
1207
1208 c-- flag for approximate adjoint
1209 IF ( inAdExact ) THEN
1210 inAdTrue = .FALSE.
1211 inAdFALSE = .FALSE.
1212 ELSE
1213 inAdTrue = .TRUE.
1214 inAdFALSE = .FALSE.
1215 ENDIF
1216 C
1217 CLOSE(iUnit)
1218
1219 C-- Check whether any retired parameters were found.
1220 C-- Stop if they were
1221 IF ( nRetired .GT. 0 ) THEN
1222 WRITE(msgBuf,'(A)')
1223 & 'Error reading parameter file "data"'
1224 CALL PRINT_ERROR( msgBuf, myThid )
1225 WRITE(msgBuf,'(A)')
1226 & 'some out of date parameters were found in the namelist'
1227 CALL PRINT_ERROR( msgBuf, myThid )
1228 STOP 'ABNORMAL END: S/R INI_PARMS'
1229 ENDIF
1230
1231 _END_MASTER(myThid)
1232
1233 C-- Everyone else must wait for the parameters to be loaded
1234 _BARRIER
1235 C
1236 RETURN
1237 END

  ViewVC Help
Powered by ViewVC 1.1.22