1 SUBROUTINE SETUP SETUP.1
3 C PURPOSE : INITIALIZES THE CONSTANTS AND VARIABLES WHICH CAN BE SETUP.3
4 C DETERMINED BASED ON THE INPUT NAMELIST VARIABLES. SETUP.4
5 C CALLS : THE INTRINSIC FUNCTIONS SIN, COS, TAN, ALOG, AND ALOG10. SETUP.5
6 C CALLED BY :THE MAIN PROGRAM TERRAIN. SETUP.6
8 C THE COMMON BLOCKS /MAPS/, /NESTDMN/, /FUDG/, /TRFUDGE/, /OPTION/, SETUP.8
9 C /LTDATA/, AND /HEADER/ ARE USED IN THIS SUBROUTINE. THERE ARE FIVE SETUP.9
10 C NAMELISTS /MAPBG/, /DOMAIN/, /OPTN/, /FUDGE/, AND /FUDGET/ IN THIS SETUP.10
11 C SUBROUTINE. THIS SUBROUTINE HAS NO DUMMY ARGUMENTS. PLEASE SEE SETUP.11
12 C SECTION 5.1.1 AND 5.2.1 FOR DETAILS. SETUP.12
15 # include <nestdmn.incl>
16 # include <namelist1.incl>
20 DATA CONV/57.29578/, A/6370./ SETUP.56
21 DATA NPROJ/'LAMCON','POLSTR','MERCAT'/ SETUP.57
23 PRINT *,' ==> CALL SETUP <==' SETUP.60
27 READ(15,MAPBG,ERR=55,END=55)
28 c .. Namelist MAPBG available:
30 c .. Namelist MAPBG unavailable:
34 56 READ(15,DOMAINS,ERR=66,END=66)
35 c .. Namelist DOMAINS available:
37 c .. Namelist DOMAINS unavailable:
44 if (iproj.eq.'CYLEQU') then
49 C DEFINE THE PARAMETERS OF MAP BASED ON THE IPROJ: SETUP.147
51 XN = -1.0E36 SETUP.150
52 IF(PHIC.LT.0) THEN SETUP.151
53 SIGN=-1. ! SOUTH HEMESPHERE SETUP.152
55 SIGN=1. ! NORTH HEMESPHERE SETUP.154
59 IF (IPROJ.EQ.NPROJ(1)) THEN SETUP.157
61 print '("Map projection=",a)',NPROJ(1)
62 IF(ABS(TRUELAT1).GT.90.) THEN SETUP.158
63 TRUELAT1=60. SETUP.159
64 TRUELAT2=30. SETUP.160
65 TRUELAT1=SIGN*TRUELAT1 SETUP.161
66 TRUELAT2=SIGN*TRUELAT2 SETUP.162
69 ! In case of TRUELAT1 == TRUELAT2 (YRG 09/22/2005):
71 if (abs(TRUELAT1-TRUELAT2)==0.0) then
73 TRUELAT1 = TRUELAT0 - 1.e-2
74 TRUELAT2 = TRUELAT0 + 1.e-2
77 XN = ALOG10(COS(TRUELAT1 / CONV)) - SETUP.164
78 * ALOG10(COS(TRUELAT2 / CONV)) SETUP.165
79 XN = XN/(ALOG10(TAN((45.0 - SIGN*TRUELAT1/2.0) / CONV)) - SETUP.166
80 * ALOG10(TAN((45.0 - SIGN*TRUELAT2/2.0) / CONV))) SETUP.167
85 PSI1=90.-SIGN*TRUELAT1 SETUP.168
86 PROJECT='LC' SETUP.169
88 ELSE IF (IPROJ.EQ.NPROJ(2)) THEN SETUP.170
90 print '("Map projection=",a)',NPROJ(2)
92 IF(ABS(TRUELAT1).GT.90.) THEN SETUP.172
93 TRUELAT1=60. SETUP.173
95 TRUELAT1=SIGN*TRUELAT1 SETUP.175
96 TRUELAT2=SIGN*TRUELAT2 SETUP.176
98 C PSI1 IS THE PSEUDO-LATITUDE SETUP.178
99 PSI1=90.-SIGN*TRUELAT1 SETUP.179
100 PROJECT='ST' SETUP.180
102 ELSE IF (IPROJ.EQ.NPROJ(3)) THEN SETUP.181
105 IF(ABS(TRUELAT1).GT.90.) THEN SETUP.183
106 TRUELAT1=0. SETUP.184
107 TRUELAT2=0. SETUP.185
110 C -------------------------------------------------------------------
111 C For Map plotting on Mercator projection, adjusted the
112 C TRUELAT1 and TRUELAT2 to zero by increasing the grid
113 C distance because MAPDRV can only support the TRUELAT=0.0
114 C Y.R. Guo 09/23/2005
116 if (TRUELAT1 .NE. TRUELAT2) THEN
117 TRUELAT1 = max(TRUELAT1,TRUELAT2)
118 TRUELAT2 = max(TRUELAT1,TRUELAT2)
120 print '(/"MERCATOR MAP PROJECTION=",a,a,2F8.2)',
121 - IPROJ, " TRUELAT 1,2=",TRUELAT1, TRUELAT2
123 IF(TRUELAT1.NE.0.) THEN SETUP.187
126 print '(I2," Original dis=",f10.3)', nm, dis(nm)
127 dis(nm) = dis(nm) / COS(TRUELAT1*3.1415926/180.)
128 print '(" Adjusted DIS=",F10.3)', dis(nm)
130 TRUELAT1=0. SETUP.190
131 TRUELAT2=0. SETUP.190
132 c print '("TRUELAT1 and 2:",2F8.2/)', TRUELAT1, TRUELAT2
134 c PRINT *,'TERRAIN AND MAPDRV ONLY SUPPORT MERCATOR PROJECTION SETUP.188
135 c *AT 0 DEGREE TURE LATITUDE, RESET TRUELAT1=0.' SETUP.189
136 C ---------------------------------------------------------------------
140 PROJECT='ME' SETUP.193
143 PSI1 = PSI1/CONV SETUP.196
144 IF (PHIC.LT.0.) THEN SETUP.197
145 PSI1 = -PSI1 SETUP.198
146 POLE = -POLE SETUP.199
149 C--------CALCULATE R SETUP.202
150 IF (IPROJ.NE.NPROJ(3)) THEN SETUP.203
151 PSX = (POLE-PHIC)/CONV SETUP.204
152 IF (IPROJ.EQ.NPROJ(1)) THEN SETUP.205
153 CELL = A*SIN(PSI1)/XN SETUP.206
154 CELL2 = (TAN(PSX/2.))/(TAN(PSI1/2.)) SETUP.207
156 IF (IPROJ.EQ.NPROJ(2)) THEN SETUP.209
157 CELL = A*SIN(PSX)/XN SETUP.210
158 CELL2 = (1. + COS(PSI1))/(1. + COS(PSX)) SETUP.211
160 R = CELL*(CELL2)**XN SETUP.213
161 XCNTR = 0.0 SETUP.214
164 C-----FOR MERCATOR PROJECTION, THE PROJECTION IS TRUE AT LAT AT PHI1 SETUP.217
165 IF (IPROJ.EQ.NPROJ(3)) THEN SETUP.218
166 C2 = A*COS(PSI1) SETUP.219
167 XCNTR = 0.0 SETUP.220
168 PHICTR = PHIC/CONV SETUP.221
169 CELL = COS(PHICTR)/(1.0+SIN(PHICTR)) SETUP.222
170 YCNTR = - C2*ALOG(CELL) SETUP.223
172 PRINT 10,XCNTR,YCNTR SETUP.226
173 10 FORMAT(1X,'COARSE GRID CENTER IS AT X =',F8.1,' KM AND Y = ', SETUP.227
174 1 F8.1,' KM ') SETUP.228
179 C CHECK THE COMPATIBILITY OF NEST DOMAINS WITH THE COARSE DOMAINS SETUP.231
180 C AND CALCULATE THE IRATIOS, INORTHS, ISOUTHS, IWESTS AND IEASTS SETUP.232
182 C A) EXTENDING THE COARSE DOMAIN IF IEXP = 1 SETUP.234
184 IXEX = NESTIX(1) SETUP.236
185 JXEX = NESTJX(1) SETUP.237
188 IF (IEXP.EQ.1) THEN SETUP.240
189 INCR = INT(AEXP/DIS(1) + 1.001) SETUP.241
190 IXEX = NESTIX(1) + INCR*2 SETUP.242
191 JXEX = NESTJX(1) + INCR*2 SETUP.243
192 IOFFST = INCR SETUP.244
193 JOFFST = INCR SETUP.245
195 PRINT 20,INCR SETUP.253
196 PRINT 22,IXEX,JXEX SETUP.254
197 20 FORMAT(2X,'$$$$ GRID IS EXPANDED BY ',I3, SETUP.255
198 1 ' GRID POINTS ON EACH EDGE $$$$') SETUP.256
199 22 FORMAT(5X,'EXTENDED IXEX IS ',I3,5X,'EXTENDED JXEX IS ',I3) SETUP.257
201 C-----CENTER OF GRID IN THE COARSE DOMAIN SETUP.259
202 CNTRJ0 = FLOAT(JXEX+1)/2. SETUP.260
203 CNTRI0 = FLOAT(IXEX+1)/2. SETUP.261
204 PRINT 21,NESTIX(1),NESTJX(1) SETUP.262
205 21 FORMAT(2X,'COARSE DOMAIN SIZE (IX,JX) =',2I5) SETUP.263
207 C MIX, MJX ARE USED IN SUB. TFUDGE: SETUP.265
210 DO 23 M = 1, MAXNES SETUP.268
211 MIX = MAX0(NESTIX(M),MIX) SETUP.269
212 MJX = MAX0(NESTJX(M),MJX) SETUP.270
213 23 CONTINUE SETUP.271
214 PRINT 24, MIX,MJX SETUP.275
215 24 FORMAT(' ++> THE MAXIMUM DIMENSION = (',2I5,') <++') SETUP.276
217 C CHECK IF POLE IS INSIDE THE DOMAIN OR NOT FOR LAMBERT PROJECTION: SETUP.278
218 HDSIZE = (IXEX-1)*DIS(1)/2. SETUP.279
219 IF (HDSIZE.GT.ABS(YCNTR) .AND. IPROJ.EQ.NPROJ(1))THEN SETUP.280
220 PRINT *,'-------------------------------------------------' SETUP.281
221 PRINT *,'HALF DOMAIN SIZE IN Y-DIRECTION = ',HDSIZE SETUP.282
222 PRINT *,' DISTANCE FROM CNTER TO POLE = ',ABS(YCNTR) SETUP.283
223 PRINT *,'NOT MAKE SENSE WITH THE POLE IS INSIDE THE DOMAIN ' SETUP.284
224 PRINT *,' FOR LAMBERT CONFORMAL PROJECTION!' SETUP.285
225 PRINT *,'=== PLEASE RE-SPECIFY THE CENTER OR DOMAIN SIZE. ===' SETUP.286
229 C B) CALCULATING THE IRATIOS, INORTHS AND IEASTS: SETUP.290
231 IRATIO(1) = 1 SETUP.292
232 NRATIO(1) = 1 SETUP.293
233 XSOUTH(1) = 1. SETUP.294
234 XWEST(1) = 1. SETUP.295
235 XNORTH(1) = FLOAT(IXEX) SETUP.296
236 XEAST(1) = FLOAT(JXEX) SETUP.297
237 XJC = (XEAST(1) + 1.0)/2. SETUP.298
239 PRINT 27,XSOUTH(1),XWEST(1),XNORTH(1),XEAST(1),DIS(1), SETUP.300
240 1 IRATIO(1),NRATIO(1) SETUP.301
241 27 FORMAT(1X,'XSOUTH(1)= ',F6.1,2X,'XWEST(1)= ',F6.1,2X, SETUP.302
242 1'XNORTH(1)= ',F6.1,2X,'XEAST(1)= ',F6.1,2X,'DIS(1)= ',F6.1, SETUP.303
243 22X,'IRATIO(1)= ',I3,2X,'NRATIO(1)= ',I3) SETUP.304
245 MISMATCH = 0 SETUP.307
247 DO 30 NM = 2, MAXNES SETUP.309
250 C DOMAINS' CONSISTENCY CHECK: SETUP.312
252 NMC = NUMC(NM) SETUP.314
253 IF (AMOD((DIS(NMC)+0.09),DIS(NM)) .GT. 0.1) THEN SETUP.315
254 MISMATCH = MISMATCH + 1 SETUP.316
255 PRINT 29, NM,NMC SETUP.317
256 PRINT 31,NM,DIS(NM),NMC,DIS(NMC) SETUP.318
257 29 FORMAT(2X,'DOMAIN ',I2,' HAS INCORRECT GRID SIZE ', SETUP.319
258 1' IT HAS TO BE THE MULTIPLE OF DOMAIN ',I2) SETUP.320
259 31 FORMAT(2X,'DOMAIN ',I2,' GRID SIZE= ',F6.1,' KM', SETUP.321
260 1 ' DOMAIN ',I2,' GRID SIZE= ',F6.1,' KM') SETUP.322
263 IRATIO(NM) = NINT(DIS(NMC)/DIS(NM)) SETUP.325
264 NRATIO(NM) = NINT(DIS(1)/DIS(NM)) SETUP.326
266 C MAKE SURE THE 4 CORNER POINTS OF NEST DOMAINS ARE ON THE SETUP.328
267 C PREVIOUS DOMAIN GRID-POINTS SETUP.329
269 IF (MOD((NESTIX(NM)-1),IRATIO(NM)).NE.0) THEN SETUP.331
270 MISMATCH = MISMATCH + 1 SETUP.332
271 IIMXN = (INT(FLOAT(NESTIX(NM)-1)/IRATIO(NM))+1)*IRATIO(NM) + 1 SETUP.333
272 PRINT 32,NM,NESTIX(NM),IRATIO(NM),IIMXN SETUP.334
273 32 FORMAT(2X,'NESTIX(',I2,')=',I4,' AND IRATIO=',I2,' DOES NOT MATC SETUP.335
274 1H, YOU MAY SET NESTIX TO ',I4) SETUP.336
276 IF (MOD((NESTJX(NM)-1),IRATIO(NM)).NE.0) THEN SETUP.338
277 MISMATCH = MISMATCH + 1 SETUP.339
278 JJMXN = (INT(FLOAT(NESTJX(NM)-1)/IRATIO(NM))+1)*IRATIO(NM) + 1 SETUP.340
279 PRINT 33,NM,NESTJX(NM),IRATIO(NM),JJMXN SETUP.341
280 33 FORMAT(2X,'NESTJX(',I2,')=',I4,' AND IRATIO=',I2,' DOES NOT MATC SETUP.342
281 1H, YOU MAY SET NESTJX TO ',I4) SETUP.343
284 C--------REDEFINE LOCATION OF LOWER LEFT CORNER OF FINE MESH (IN TERMS SETUP.346
285 C OF EXTENDED COARSE MESH - DOMAIN 1 INDICES) IF USING EXTENDED G SETUP.347
287 PRINT 34,NM,NESTIX(NM),NESTJX(NM),DIS(NM),NESTI(NM),NESTJ(NM) SETUP.349
288 1, NUMC(NM),IRATIO(NM),NRATIO(NM),IEXP SETUP.350
289 34 FORMAT(/1X,'DOMAIN ',I2,2X,'IX=',I3,2X,'JX=',I3,2X, SETUP.351
290 1 'DS= ',F6.1,2X,'ICNS=',I4,2X,'JCNS=',I4,2X, SETUP.352
291 2 'NUMC= ',I2,2X,'IRATIO= ',I2,2X,'NRATIO= ',I2,2X, SETUP.353
292 3 'IEXP= ',I2) SETUP.354
298 40 CONTINUE SETUP.360
299 XDIS = (NESTI(ND1)-1)*DIS(ND2) + XDIS SETUP.361
300 YDIS = (NESTJ(ND1)-1)*DIS(ND2) + YDIS SETUP.362
301 IF (ND2 .GT. 1) THEN SETUP.363
303 ND2 = NUMC(ND2) SETUP.365
307 XSOUTH(NM) = XDIS/DIS(1) + FLOAT(IOFFST) + 1 SETUP.369
308 XWEST(NM) = YDIS/DIS(1) + FLOAT(JOFFST) + 1 SETUP.370
309 XNORTH(NM) = XSOUTH(NM) + FLOAT(NESTIX(NM)-1)*DIS(NM)/DIS(1) SETUP.371
310 XEAST(NM) = XWEST(NM) + FLOAT(NESTJX(NM)-1)*DIS(NM)/DIS(1) SETUP.372
313 PRINT 36,XSOUTH(NM),XWEST(NM),XNORTH(NM),XEAST(NM) SETUP.375
314 35 FORMAT(2X,'COARSE MESH INDICES FOR THE 4 CORNER POINTS ARE') SETUP.376
315 36 FORMAT(2X,'SOUTH=',F6.1,3X,'WEST=',F6.1,3X,'NORTH =',F6.1,3X, SETUP.377
316 1 'EAST = ',F6.1) SETUP.378
318 30 CONTINUE SETUP.380
320 IF (MISMATCH.GT.0) THEN SETUP.382
321 PRINT *, 'TERRAIN STOP IN SUBROUTINE SETUP DUE TO INCORRECT NEST SETUP.383
322 1 DOMAIN SET UP' SETUP.384
323 cc STOP 1111 SETUP.385