1 |
C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_readparms.F,v 1.44 2007/04/22 19:56:22 mlosch Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "SEAICE_OPTIONS.h" |
5 |
|
6 |
SUBROUTINE SEAICE_READPARMS( myThid ) |
7 |
C /==========================================================\ |
8 |
C | SUBROUTINE SEAICE_READPARMS | |
9 |
C | o Routine to read in file data.seaice | |
10 |
C \==========================================================/ |
11 |
IMPLICIT NONE |
12 |
|
13 |
C === Global variables === |
14 |
#include "SIZE.h" |
15 |
#include "EEPARAMS.h" |
16 |
#include "PARAMS.h" |
17 |
#include "GRID.h" |
18 |
#include "SEAICE_PARAMS.h" |
19 |
#ifdef ALLOW_COST |
20 |
# include "SEAICE_COST.h" |
21 |
#endif |
22 |
#ifdef ALLOW_MNC |
23 |
# include "MNC_PARAMS.h" |
24 |
#endif |
25 |
#ifdef ALLOW_CAL |
26 |
# include "cal.h" |
27 |
#endif |
28 |
|
29 |
C === Routine arguments === |
30 |
C myThid - Number of this instance of SEAICE_READPARMS |
31 |
INTEGER myThid |
32 |
|
33 |
C === Local variables === |
34 |
C msgBuf - Informational/error meesage buffer |
35 |
C errIO - IO error flag |
36 |
C iUnit - Work variable for IO unit number |
37 |
|
38 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
39 |
INTEGER errIO, iUnit |
40 |
|
41 |
C-- SEAICE parameters |
42 |
NAMELIST /SEAICE_PARM01/ |
43 |
& SEAICEwriteState, SEAICEuseDYNAMICS, |
44 |
& SEAICEuseEVPpickup, SEAICEuseFluxForm, |
45 |
& useHB87stressCoupling, SEAICEuseFlooding, SEAICEadvSnow, |
46 |
& SEAICE_clipVelocities, SEAICE_maskRHS, SEAICE_no_slip, |
47 |
& LAD, IMAX_TICE, SEAICEadvScheme, SEAICEadvSchArea, |
48 |
& SEAICEadvSchHeff, SEAICEadvSchEnth, SEAICEadvSchSnow, |
49 |
& SEAICE_deltaTtherm, SEAICE_deltaTdyn, |
50 |
& SEAICE_deltaTevp, SEAICE_elasticParm, |
51 |
& SEAICE_monFreq, SEAICE_dumpFreq, SEAICE_taveFreq, |
52 |
& SEAICE_initialHEFF, |
53 |
& SEAICE_rhoAir, SEAICE_rhoIce, |
54 |
& SEAICE_drag, SEAICE_waterDrag, SEAICE_dryIceAlb, |
55 |
& SEAICE_wetIceAlb, SEAICE_drySnowAlb, SEAICE_wetSnowAlb, |
56 |
& SEAICE_waterAlbedo, SEAICE_strength, SEAICE_eccen, |
57 |
& SEAICE_sensHeat, SEAICE_latentWater, SEAICE_latentIce, |
58 |
& SEAICE_iceConduct, SEAICE_snowConduct, SEAICE_emissivity, |
59 |
& SEAICE_snowThick, SEAICE_shortwave, SEAICE_freeze, OCEAN_drag, |
60 |
& SEAICEstressFactor, |
61 |
& uwindFile, vwindFile, atempFile, aqhFile, lwdownFile, |
62 |
& swdownFile, precipFile, evapFile, runoffFile, HeffFile, |
63 |
& LSR_ERROR, DIFF1, A22, HO, |
64 |
& WindForcingStart, WindForcingEnd, WindForcingPeriod, |
65 |
& FluxForcingStart, FluxForcingEnd, FluxForcingPeriod, |
66 |
& SSTForcingStart, SSTForcingEnd, SSTForcingPeriod, |
67 |
& SSSForcingStart, SSSForcingEnd, SSSForcingPeriod, |
68 |
& StartingYear, EndingYear, |
69 |
& SEAICE_airTurnAngle, SEAICE_waterTurnAngle, |
70 |
& MAX_HEFF, MIN_ATEMP, MIN_LWDOWN, MAX_TICE, MIN_TICE, |
71 |
& SEAICE_EPS, SEAICE_EPS_SQ, |
72 |
& SEAICE_tave_mnc, SEAICE_dump_mnc, SEAICE_mon_mnc, |
73 |
& SEAICE_gamma_t, SEAICE_debugPointX, SEAICE_debugPointY |
74 |
|
75 |
#ifdef ALLOW_COST |
76 |
NAMELIST /SEAICE_PARM02/ |
77 |
& mult_ice, cost_ice_flag, |
78 |
& costIceStart1, costIceStart2, |
79 |
& costIceEnd1, costIceEnd2, |
80 |
& cost_ice_flag, |
81 |
& mult_smrarea, smrareadatfile, smrareabarfile, |
82 |
& wsmrarea0, wmean_smrarea, smrarea_errfile, |
83 |
& smrareastartdate1, smrareastartdate2, smrareaperiod |
84 |
#endif |
85 |
|
86 |
_BEGIN_MASTER(myThid) |
87 |
|
88 |
WRITE(msgBuf,'(A)') |
89 |
&' ' |
90 |
CALL PRINT_MESSAGE( msgBuf, standardmessageunit, |
91 |
& SQUEEZE_RIGHT , myThid) |
92 |
WRITE(msgBuf,'(A)') ' SEAICE_READPARMS: opening data.seaice' |
93 |
CALL PRINT_MESSAGE( msgBuf, standardmessageunit, |
94 |
& SQUEEZE_RIGHT , myThid) |
95 |
|
96 |
CALL OPEN_COPY_DATA_FILE( |
97 |
I 'data.seaice', 'SEAICE_READPARMS', |
98 |
O iUnit, |
99 |
I myThid ) |
100 |
|
101 |
C-- set default sea ice parameters |
102 |
SEAICEwriteState = .FALSE. |
103 |
#ifdef SEAICE_ALLOW_DYNAMICS |
104 |
SEAICEuseDYNAMICS = .TRUE. |
105 |
#else |
106 |
SEAICEuseDYNAMICS = .FALSE. |
107 |
#endif |
108 |
SEAICEuseEVP = .FALSE. |
109 |
SEAICEuseEVPpickup = .TRUE. |
110 |
SEAICEuseFluxForm = .FALSE. |
111 |
useHB87stressCoupling = .FALSE. |
112 |
SEAICEadvSnow = .FALSE. |
113 |
SEAICEuseFlooding = .FALSE. |
114 |
SEAICE_no_slip = .FALSE. |
115 |
SEAICE_clipVelocities = .TRUE. |
116 |
SEAICE_maskRHS = .FALSE. |
117 |
SEAICEadvScheme = 2 |
118 |
SEAICEadvSchArea = UNSET_I |
119 |
SEAICEadvSchHeff = UNSET_I |
120 |
SEAICEadvSchEnth = UNSET_I |
121 |
SEAICEadvSchSnow = UNSET_I |
122 |
SEAICE_deltaTtherm = dTtracerLev(1) |
123 |
SEAICE_deltaTdyn = dTtracerLev(1) |
124 |
SEAICE_deltaTevp = UNSET_RL |
125 |
SEAICE_monFreq = monitorFreq |
126 |
SEAICE_dumpFreq = dumpFreq |
127 |
SEAICE_taveFreq = taveFreq |
128 |
SEAICE_elasticParm = 0.33333333333333333333333333 _d 0 |
129 |
#ifdef ALLOW_MNC |
130 |
SEAICE_tave_mnc = timeave_mnc |
131 |
SEAICE_dump_mnc = snapshot_mnc |
132 |
SEAICE_mon_mnc = monitor_mnc |
133 |
#else |
134 |
SEAICE_tave_mnc = .FALSE. |
135 |
SEAICE_dump_mnc = .FALSE. |
136 |
SEAICE_mon_mnc = .FALSE. |
137 |
#endif |
138 |
SEAICE_initialHEFF = ZERO |
139 |
SEAICE_gamma_t = 3600.0*24.0*3.0 |
140 |
SEAICE_debugPointX = 1 |
141 |
SEAICE_debugPointY = 1 |
142 |
SEAICE_rhoAir = 1.3 _d 0 |
143 |
SEAICE_rhoIce = 0.91 _d +03 |
144 |
SEAICE_drag = 0.002 _d 0 |
145 |
OCEAN_drag = 0.001 _d 0 |
146 |
SEAICE_waterDrag = 5.5 _d 0 |
147 |
SEAICE_dryIceAlb = 0.75 _d 0 |
148 |
SEAICE_wetIceAlb = 0.66 _d 0 |
149 |
SEAICE_drySnowAlb = 0.84 _d 0 |
150 |
SEAICE_wetSnowAlb = 0.7 _d 0 |
151 |
SEAICE_waterAlbedo = 0.1 _d +00 |
152 |
SEAICE_strength = 2.75 _d +04 |
153 |
SEAICE_eccen = 2. _d 0 |
154 |
C SEAICE_sensHeat = 1.75 _d -03 * 1004 * 1.3 |
155 |
SEAICE_sensHeat = 2.284 _d +00 |
156 |
C SEAICE_latentWater = 1.75 _d -03 * 2.500 _d 06 * 1.3 |
157 |
SEAICE_latentWater = 5.6875 _d +03 |
158 |
C SEAICE_latentIce = 1.75 _d -03 * 2.834 _d 06 * 1.3 |
159 |
SEAICE_latentIce = 6.4474 _d +03 |
160 |
SEAICE_iceConduct = 2.1656 _d +00 |
161 |
SEAICE_snowConduct = 3.1 _d -01 |
162 |
SEAICE_emissivity = 5.5 _d -08 |
163 |
SEAICE_snowThick = 0.15 _d 0 |
164 |
SEAICE_shortwave = 0.30 _d 0 |
165 |
SEAICE_freeze = -1.96 _d 0 |
166 |
SEAICEstressFactor = 1. _d 0 |
167 |
uwindFile = ' ' |
168 |
vwindFile = ' ' |
169 |
atempFile = ' ' |
170 |
aqhFile = ' ' |
171 |
lwdownFile = ' ' |
172 |
swdownFile = ' ' |
173 |
precipFile = ' ' |
174 |
evapFile = ' ' |
175 |
runoffFile = ' ' |
176 |
HeffFile = ' ' |
177 |
LAD = 2 |
178 |
IMAX_TICE = 10 |
179 |
LSR_ERROR = 0.0001 _d 0 |
180 |
DIFF1 = .002 _d 0 |
181 |
DIFF1 = 2.0*DIFF1 |
182 |
A22 = 0.15 _d 0 |
183 |
HO = 0.5 _d 0 |
184 |
SEAICE_airTurnAngle = 0.0 _d 0 |
185 |
SEAICE_waterTurnAngle = 0.0 _d 0 |
186 |
WindForcingStart = -99999. |
187 |
WindForcingEnd = -99999. |
188 |
WindForcingPeriod = -99999. |
189 |
FluxForcingStart = -99999. |
190 |
FluxForcingEnd = -99999. |
191 |
FluxForcingPeriod = -99999. |
192 |
SSTForcingStart = -99999. |
193 |
SSTForcingEnd = -99999. |
194 |
SSTForcingPeriod = -99999. |
195 |
SSSForcingStart = -99999. |
196 |
SSSForcingEnd = -99999. |
197 |
SSSForcingPeriod = -99999. |
198 |
StartingYear = 1948. |
199 |
EndingYear = 2000. |
200 |
MAX_HEFF = 10. _d 0 |
201 |
MIN_ATEMP = -50. _d 0 |
202 |
MIN_LWDOWN = 60. _d 0 |
203 |
MAX_TICE = 30. _d 0 |
204 |
MIN_TICE = -50. _d 0 |
205 |
SEAICE_EPS = 1. _d -10 |
206 |
SEAICE_EPS_SQ = -99999. |
207 |
|
208 |
#ifdef ALLOW_COST |
209 |
mult_ice = 0. _d 0 |
210 |
costIceStart1 = 0 |
211 |
costIceStart2 = 0 |
212 |
costIceEnd1 = 0 |
213 |
costIceEnd2 = 0 |
214 |
cost_ice_flag = 1 |
215 |
c |
216 |
mult_smrarea = 0. _d 0 |
217 |
wsmrarea0 = 0.5 _d 0 |
218 |
wmean_smrarea = 0.5 _d 0 |
219 |
smrareabarfile = 'smrareabar' |
220 |
smrareadatfile = ' ' |
221 |
smrarea_errfile = ' ' |
222 |
# ifdef ALLOW_CAL |
223 |
smrareastartdate1 = startDate_1 |
224 |
smrareastartdate2 = startDate_2 |
225 |
# endif |
226 |
#endif |
227 |
|
228 |
C-- Read settings from model parameter file "data.seaice". |
229 |
READ(UNIT=iUnit,NML=SEAICE_PARM01,IOSTAT=errIO) |
230 |
IF ( errIO .LT. 0 ) THEN |
231 |
WRITE(msgBuf,'(A)') |
232 |
& 'S/R SEAICE_READPARMS' |
233 |
CALL PRINT_ERROR( msgBuf , myThid) |
234 |
WRITE(msgBuf,'(A)') |
235 |
& 'Error reading numerical model ' |
236 |
CALL PRINT_ERROR( msgBuf , myThid) |
237 |
WRITE(msgBuf,'(A)') |
238 |
& 'parameter file "data.seaice"' |
239 |
CALL PRINT_ERROR( msgBuf , myThid) |
240 |
WRITE(msgBuf,'(A)') |
241 |
& 'Problem in namelist SEAICE_PARM01' |
242 |
CALL PRINT_ERROR( msgBuf , myThid) |
243 |
C CALL MODELDATA_EXAMPLE( myThid ) |
244 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
245 |
ENDIF |
246 |
|
247 |
#ifdef ALLOW_COST |
248 |
READ(UNIT=iUnit,NML=SEAICE_PARM02,IOSTAT=errIO) |
249 |
IF ( errIO .LT. 0 ) THEN |
250 |
WRITE(msgBuf,'(A)') |
251 |
& 'S/R SEAICE_READPARMS' |
252 |
CALL PRINT_ERROR( msgBuf , myThid) |
253 |
WRITE(msgBuf,'(A)') |
254 |
& 'Error reading numerical model ' |
255 |
CALL PRINT_ERROR( msgBuf , myThid) |
256 |
WRITE(msgBuf,'(A)') |
257 |
& 'parameter file "data.seaice"' |
258 |
CALL PRINT_ERROR( msgBuf , myThid) |
259 |
WRITE(msgBuf,'(A)') |
260 |
& 'Problem in namelist SEAICE_PARM02' |
261 |
CALL PRINT_ERROR( msgBuf , myThid) |
262 |
C CALL MODELDATA_EXAMPLE( myThid ) |
263 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
264 |
ENDIF |
265 |
#endif |
266 |
|
267 |
CLOSE(iUnit) |
268 |
|
269 |
WRITE(msgBuf,'(A)') |
270 |
& ' SEAICE_READPARMS: finished reading data.seaice' |
271 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
272 |
& SQUEEZE_RIGHT , myThid) |
273 |
|
274 |
C Check that requested time step size is supported. The combination |
275 |
C below is the only one that is supported at this time. Does not |
276 |
C mean that something fancier will not work, just that it has not |
277 |
C yet been tried nor thought through. |
278 |
IF ( SEAICE_deltaTtherm .NE. dTtracerLev(1) .OR. |
279 |
& SEAICE_deltaTdyn .LT. SEAICE_deltaTtherm .OR. |
280 |
& (SEAICE_deltaTdyn/SEAICE_deltaTtherm) .NE. |
281 |
& INT(SEAICE_deltaTdyn/SEAICE_deltaTtherm) ) THEN |
282 |
WRITE(msgBuf,'(A)') |
283 |
& 'Unsupported combination of SEAICE_deltaTtherm,' |
284 |
CALL PRINT_ERROR( msgBuf , myThid) |
285 |
WRITE(msgBuf,'(A)') |
286 |
& ' SEAICE_deltaTdyn, and dTtracerLev(1)' |
287 |
CALL PRINT_ERROR( msgBuf , myThid) |
288 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
289 |
ENDIF |
290 |
#ifdef SEAICE_ALLOW_EVP |
291 |
SEAICEuseEVP = .FALSE. |
292 |
IF ( SEAICE_deltaTevp .NE. UNSET_RL ) SEAICEuseEVP = .TRUE. |
293 |
IF ( SEAICEuseEVP ) THEN |
294 |
IF ( (SEAICE_deltaTdyn/SEAICE_deltaTevp) .NE. |
295 |
& INT(SEAICE_deltaTdyn/SEAICE_deltaTevp) ) THEN |
296 |
WRITE(msgBuf,'(A)') |
297 |
& 'SEAICE_deltaTevp must be a factor of SEAICE_deltaTdyn.' |
298 |
CALL PRINT_ERROR( msgBuf , myThid) |
299 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
300 |
ENDIF |
301 |
IF ( SEAICE_elasticParm .LE. 0. _d 0 .OR. |
302 |
& SEAICE_elasticParm .GT. 1. _d 0 ) THEN |
303 |
WRITE(msgBuf,'(A)') |
304 |
& 'SEAICE_elasticParm must greater than 0 and less than 1.' |
305 |
CALL PRINT_ERROR( msgBuf , myThid) |
306 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
307 |
ENDIF |
308 |
ENDIF |
309 |
#endif /* SEAICE_ALLOW_EVP */ |
310 |
|
311 |
C Set advection schemes to some sensible values if not done |
312 |
C in data.seaice |
313 |
IF ( SEAICEadvSchArea .EQ. UNSET_I ) |
314 |
& SEAICEadvSchArea = SEAICEadvScheme |
315 |
IF ( SEAICEadvScheme .NE. SEAICEadvSchArea ) |
316 |
& SEAICEadvScheme = SEAICEadvSchArea |
317 |
IF ( SEAICEadvSchHeff .EQ. UNSET_I ) |
318 |
& SEAICEadvSchHeff = SEAICEadvSchArea |
319 |
IF ( SEAICEadvSchEnth .EQ. UNSET_I ) |
320 |
& SEAICEadvSchEnth = SEAICEadvSchArea |
321 |
IF ( SEAICEadvSchSnow .EQ. UNSET_I ) |
322 |
& SEAICEadvSchSnow = SEAICEadvSchHeff |
323 |
|
324 |
#ifndef SEAICE_EXTERNAL_FORCING |
325 |
IF ( FluxForcingStart .EQ. -99999. .OR. |
326 |
& FluxForcingEnd .EQ. -99999. .OR. |
327 |
& FluxForcingPeriod .EQ. -99999. ) THEN |
328 |
WRITE(msgBuf,'(A)') 'Specify FluxForcing* in data.seaice' |
329 |
CALL PRINT_ERROR( msgBuf , myThid) |
330 |
STOP 'ABNORMAL END: S/R SEAICE_READPARMS' |
331 |
ENDIF |
332 |
IF ( WindForcingStart .EQ. -99999. ) |
333 |
& WindForcingStart = FluxForcingStart |
334 |
IF ( WindForcingEnd .EQ. -99999. ) |
335 |
& WindForcingEnd = FluxForcingEnd |
336 |
IF ( WindForcingPeriod .EQ. -99999. ) |
337 |
& WindForcingPeriod = FluxForcingPeriod |
338 |
IF ( SSTForcingStart .EQ. -99999. ) |
339 |
& SSTForcingStart = FluxForcingStart |
340 |
IF ( SSTForcingEnd .EQ. -99999. ) |
341 |
& SSTForcingEnd = FluxForcingEnd |
342 |
IF ( SSTForcingPeriod .EQ. -99999. ) |
343 |
& SSTForcingPeriod = FluxForcingPeriod |
344 |
IF ( SSSForcingStart .EQ. -99999. ) |
345 |
& SSSForcingStart = FluxForcingStart |
346 |
IF ( SSSForcingEnd .EQ. -99999. ) |
347 |
& SSSForcingEnd = FluxForcingEnd |
348 |
IF ( SSSForcingPeriod .EQ. -99999. ) |
349 |
& SSSForcingPeriod = FluxForcingPeriod |
350 |
#endif /* SEAICE_EXTERNAL_FORCING */ |
351 |
|
352 |
IF ( SEAICE_EPS_SQ .EQ. -99999. ) |
353 |
& SEAICE_EPS_SQ = SEAICE_EPS * SEAICE_EPS |
354 |
|
355 |
C- Set Output type flags : |
356 |
SEAICE_tave_mdsio = .TRUE. |
357 |
SEAICE_dump_mdsio = .TRUE. |
358 |
SEAICE_mon_stdio = .TRUE. |
359 |
#ifdef ALLOW_MNC |
360 |
IF (useMNC) THEN |
361 |
IF ( .NOT.outputTypesInclusive |
362 |
& .AND. SEAICE_tave_mnc ) SEAICE_tave_mdsio = .FALSE. |
363 |
IF ( .NOT.outputTypesInclusive |
364 |
& .AND. SEAICE_dump_mnc ) SEAICE_dump_mdsio = .FALSE. |
365 |
IF ( .NOT.outputTypesInclusive |
366 |
& .AND. SEAICE_mon_mnc ) SEAICE_mon_stdio = .FALSE. |
367 |
ENDIF |
368 |
#endif |
369 |
|
370 |
_END_MASTER(myThid) |
371 |
|
372 |
C-- Everyone else must wait for the parameters to be loaded |
373 |
_BARRIER |
374 |
|
375 |
C-- Summarise pkg/seaice cofiguration |
376 |
CALL SEAICE_SUMMARY( myThid ) |
377 |
|
378 |
C Initialize MNC variable information for SEAICE |
379 |
IF ( useMNC .AND. |
380 |
& (seaice_tave_mnc.OR.seaice_dump_mnc.OR.SEAICE_mon_mnc) |
381 |
& ) THEN |
382 |
CALL SEAICE_MNC_INIT( myThid ) |
383 |
ENDIF |
384 |
|
385 |
RETURN |
386 |
END |