/[MITgcm]/MITgcm/pkg/cheapaml/cheapaml_fields_load.F
ViewVC logotype

Contents of /MITgcm/pkg/cheapaml/cheapaml_fields_load.F

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


Revision 1.4 - (show annotations) (download)
Tue Apr 28 18:08:13 2009 UTC (15 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint61n, checkpoint61o, checkpoint61m, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.3: +11 -11 lines
change macros (EXCH & GLOBAL_SUM/MAX) sufix _R4/_R8 to _RS/_RL
 when applied to _RS/_RL variable

1 C $Header: /u/gcmpack/MITgcm/pkg/cheapaml/cheapaml_fields_load.F,v 1.3 2008/09/09 19:05:20 jmc Exp $
2 C $Name: $
3 #include "CHEAPAML_OPTIONS.h"
4
5 C !ROUTINE: CHEAPAML_FIELDS_LOAD
6 C !INTERFACE:
7 SUBROUTINE CHEAPAML_FIELDS_LOAD( myTime, myIter, myThid )
8 C *==========================================================*
9 C | SUBROUTINE CHEAPAML_FIELDS_LOAD
10 C | o Control reading of fields from external source.
11 C *==========================================================*
12
13 C !USES:
14 IMPLICIT NONE
15 C === Global variables ===
16 #include "SIZE.h"
17 #include "EEPARAMS.h"
18 #include "PARAMS.h"
19 #include "FFIELDS.h"
20 c #include "GRID.h"
21 c #include "DYNVARS.h"
22 C #include "BULKF.h"
23 #ifdef ALLOW_THSICE
24 #include "THSICE_VARS.h"
25 #endif
26 #include "CHEAPAML.h"
27
28 C !INPUT/OUTPUT PARAMETERS:
29 C === Routine arguments ===
30 C myThid - Thread no. that called this routine.
31 C myTime - Simulation time
32 C myIter - Simulation timestep number
33 C dsolms - Solar variation at Southern boundary
34 C dsolmn - Solar variation at Northern boundary
35 c xphaseinit - user input initial phase of year relative
36 c to mid winter. E.G. xphaseinit = pi implies time zero
37 c is mid summer.
38 INTEGER myThid
39 _RL myTime
40 _RL local ,bump
41 c _RL dsolms,dsolmn
42 c _RL xphaseinit
43 INTEGER myIter
44 INTEGER jg
45
46 C !LOCAL VARIABLES:
47 C === Local arrays ===
48 C trair[01] :: Relaxation temp. profile for air temperature
49 C qrair[01] :: Relaxation specific humidity profile for air
50 C solar[01] :: short wave flux
51 C uwind[01] :: zonal wind
52 C vwind[01] :: meridional wind
53
54 C aWght, bWght :: Interpolation weights
55 COMMON /BULKFFIELDS/
56 & trair0,
57 & trair1,
58 & qrair0,
59 & qrair1
60
61 _RS trair0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
62 _RS trair1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
63 _RS qrair0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
64 _RS qrair1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
65 _RS Solar0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
66 _RS Solar1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
67 _RS uwind0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
68 _RS uwind1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
69 _RS vwind0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
70 _RS vwind1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
71
72 INTEGER bi,bj,i,j,intime0,intime1
73 _RL aWght,bWght,rdt
74 _RL ssq0,ssq1,ssq2,lath,p0,ssqa,q
75 c xsolph - phase of year, assuming time zero is mid winter
76 c xinxx - cos ( xsolph )
77 _RL xsolph,xinxx
78 INTEGER nForcingPeriods,Imytm,Ifprd,Ifcyc,Iftm
79 c coefficients used to compute saturation specific humidity
80 DATA ssq0, ssq1, ssq2
81 & / 3.797915 _d 0 , 7.93252 _d -6 , 2.166847 _d -3 /
82
83 c latent heat (J/kg)
84 lath=2.5d6
85 c sea level pressure
86 p0=1000.d0
87
88 IF ( periodicExternalForcing ) THEN
89
90 write(*,*) 'TEST 1 ========================='
91
92 c the objective here is to give cheapaml a default periodic forcing
93 c consisting only of annually varying solar forcing, and thus Trelaxation
94 c variation. everything else, relative humidity, wind, are fixed. This
95 c keys off of solardata. if a solar data file exists, the model will
96 c assume there are files to be read and interpolated between, as is standard
97 c for the MITGCM.
98
99 IF ( SolarFile .EQ. ' ' ) THEN
100 if ( myIter .EQ. nIter0 )then
101 WRITE(*,*)
102 & 'S/R Assuming Standard Annually Varying Solar Forcing'
103 endif
104 xsolph=myTime*2.d0*3.14159 _d 0/365. _d 0/86400. _d 0
105 xinxx=cos(xsolph+xphaseinit+3.14159 _d 0)
106 DO bj = myByLo(myThid), myByHi(myThid)
107 DO bi = myBxLo(myThid), myBxHi(myThid)
108 DO j=1,sNy
109 DO i=1,sNx
110 jG = myYGlobalLo-1+(bj-1)*sNy+j
111 local=225.d0+dsolms*xinxx-float((jg-1))/float((ny-1))*
112 & (37.5d0-dsolmn*xinxx)
113 if ( jG .le. 3 ) local = local + 200
114 Solar(i,j,bi,bj) = local
115 ENDDO
116 ENDDO
117 ENDDO
118 ENDDO
119 _EXCH_XY_RS(solar, mythid)
120 c relaxation temperature in radiative equilibrium
121 DO bj = myByLo(myThid), myByHi(myThid)
122 DO bi = myBxLo(myThid), myBxHi(myThid)
123 DO j=1,sNy
124 DO i=1,sNx
125 jG = myYGlobalLo-1+(bj-1)*sNy+j
126 local=solar(i,j,bi,bj)
127 local=(2.d0*local/stefan)**(0.25d0)-273.16
128 bump=-5.d0*EXP(-(float(jg-127)*float(jg-127))/1920.0)
129 local=local+bump
130 TR(i,j,bi,bj) = local
131 ENDDO
132 ENDDO
133 ENDDO
134 ENDDO
135 _EXCH_XY_RS(TR, mythid)
136 c default specific humidity profile to 80% relative humidity
137 DO bj = myByLo(myThid), myByHi(myThid)
138 DO bi = myBxLo(myThid), myBxHi(myThid)
139 DO j=1,sNy
140 DO i=1,sNx
141 c jG = myYGlobalLo-1+(bj-1)*sNy+j
142 local = Tr(i,j,bi,bj)+273.16d0
143 ssqa = ssq0*exp( lath*(ssq1-ssq2/local)) / p0
144 qr(i,j,bi,bj) = 0.8d0*ssqa
145 ENDDO
146 ENDDO
147 ENDDO
148 ENDDO
149 _EXCH_XY_RS(qr, mythid)
150 c u wind field
151 DO bj = myByLo(myThid), myByHi(myThid)
152 DO bi = myBxLo(myThid), myBxHi(myThid)
153 DO j=1,sNy
154 DO i=1,sNx
155 jG = myYGlobalLo-1+(bj-1)*sNy+j
156 local=-5.d0*cos(2.d0*pi*float(jg-1)/(float(ny-1)))
157 uwind(i,j,bi,bj) = local
158 ENDDO
159 ENDDO
160 ENDDO
161 ENDDO
162 _EXCH_XY_RS(uwind, mythid)
163 c v wind field
164 DO bj = myByLo(myThid), myByHi(myThid)
165 DO bi = myBxLo(myThid), myBxHi(myThid)
166 DO j=1,sNy
167 DO i=1,sNx
168 jG = myYGlobalLo-1+(bj-1)*sNy+j
169 vwind(i,j,bi,bj) = 0.d0
170 ENDDO
171 ENDDO
172 ENDDO
173 ENDDO
174 _EXCH_XY_RS(vwind, mythid)
175 ELSE
176
177 c here for usual interpolative forcings
178 C First call requires that we initialize everything to zero for safety
179 IF ( myIter .EQ. nIter0 ) THEN
180 CALL LEF_ZERO( trair0 ,myThid )
181 CALL LEF_ZERO( trair1 ,myThid )
182 CALL LEF_ZERO( qrair0 ,myThid )
183 CALL LEF_ZERO( qrair1 ,myThid )
184 CALL LEF_ZERO( solar0 ,myThid )
185 CALL LEF_ZERO( solar1 ,myThid )
186 CALL LEF_ZERO( uwind0 ,myThid )
187 CALL LEF_ZERO( uwind1 ,myThid )
188 CALL LEF_ZERO( vwind0 ,myThid )
189 CALL LEF_ZERO( vwind1 ,myThid )
190 _BARRIER
191 ENDIF
192
193 C Now calculate whether it is time to update the forcing arrays
194 rdt=1. _d 0 / deltaTclock
195 nForcingPeriods=
196 & int(externForcingCycle/externForcingPeriod+0.5)
197 Imytm=int(myTime*rdt+0.5)
198 Ifprd=int(externForcingPeriod*rdt+0.5)
199 Ifcyc=int(externForcingCycle*rdt+0.5)
200 Iftm=mod( Imytm+Ifcyc-Ifprd/2 ,Ifcyc)
201
202 intime0=int(Iftm/Ifprd)
203 intime1=mod(intime0+1,nForcingPeriods)
204 c aWght=float( Iftm-Ifprd*intime0 )/float( Ifprd )
205 aWght=dfloat( Iftm-Ifprd*intime0 )/dfloat( Ifprd )
206 bWght=1.-aWght
207
208 intime0=intime0+1
209 intime1=intime1+1
210
211 IF (
212 & Iftm-Ifprd*(intime0-1) .EQ. 0
213 & .OR. myIter .EQ. nIter0
214 & ) THEN
215
216 C If the above condition is met then we need to read in
217 C data for the period ahead and the period behind myTime.
218 WRITE(*,*)
219 & 'S/R CHEAPAML_FIELDS_LOAD'
220 IF ( SolarFile .NE. ' ' ) THEN
221 CALL READ_REC_XY_RS( SolarFile,solar0,intime0,
222 & myIter,myThid )
223 CALL READ_REC_XY_RS( SolarFile,solar1,intime1,
224 & myIter,myThid )
225 ENDIF
226 IF ( TrFile .NE. ' ' ) THEN
227 CALL READ_REC_XY_RS( TRFile,trair0,intime0,
228 & myIter,myThid )
229 CALL READ_REC_XY_RS( TRFile,trair1,intime1,
230 & myIter,myThid )
231 ENDIF
232 IF ( QrFile .NE. ' ' ) THEN
233 CALL READ_REC_XY_RS( QrFile,qrair0,intime0,
234 & myIter,myThid )
235 CALL READ_REC_XY_RS( QrFile,qrair1,intime1,
236 & myIter,myThid )
237 ENDIF
238 IF ( UWindFile .NE. ' ' ) THEN
239 CALL READ_REC_XY_RS( UWindFile,uwind0,intime0,
240 & myIter,myThid )
241 CALL READ_REC_XY_RS( UWindFile,uwind1,intime1,
242 & myIter,myThid )
243 ENDIF
244 IF ( VWindFile .NE. ' ' ) THEN
245 CALL READ_REC_XY_RS( VWindFile,vwind0,intime0,
246 & myIter,myThid )
247 CALL READ_REC_XY_RS( VWindFile,vwind1,intime1,
248 & myIter,myThid )
249 ENDIF
250
251 _EXCH_XY_RS(trair0 , myThid )
252 _EXCH_XY_RS(qrair0 , myThid )
253 _EXCH_XY_RS(solar0 , myThid )
254 _EXCH_XY_RS(uwind0 , myThid )
255 _EXCH_XY_RS(vwind0 , myThid )
256 _EXCH_XY_RS(trair1 , myThid )
257 _EXCH_XY_RS(qrair1 , myThid )
258 _EXCH_XY_RS(solar1 , myThid )
259 _EXCH_XY_RS(uwind1 , myThid )
260 _EXCH_XY_RS(vwind1 , myThid )
261 C
262 ENDIF
263
264 C-- Interpolate TR, QR, SOLAR
265 DO bj = myByLo(myThid), myByHi(myThid)
266 DO bi = myBxLo(myThid), myBxHi(myThid)
267 DO j=1-Oly,sNy+Oly
268 DO i=1-Olx,sNx+Olx
269 TR(i,j,bi,bj) = bWght*trair0(i,j,bi,bj)
270 & +aWght*trair1(i,j,bi,bj) !+273.15
271 qr(i,j,bi,bj) = bWght*qrair0(i,j,bi,bj)
272 & +aWght*qrair1(i,j,bi,bj)
273 uwind(i,j,bi,bj) = bWght*uwind0(i,j,bi,bj)
274 & +aWght*uwind1(i,j,bi,bj)
275 vwind(i,j,bi,bj) = bWght*vwind0(i,j,bi,bj)
276 & +aWght*vwind1(i,j,bi,bj)
277 solar(i,j,bi,bj) = bWght*solar0(i,j,bi,bj)
278 & +aWght*solar1(i,j,bi,bj)
279 ENDDO
280 ENDDO
281 ENDDO
282 ENDDO
283 ENDIF
284 c end of periodic forcing options, on to steady option
285
286 ELSE
287 IF ( myIter .EQ. nIter0 ) THEN
288 IF ( SolarFile .NE. ' ' ) THEN
289 CALL READ_FLD_XY_RS( SolarFile,solar,' ',0,myThid )
290 ELSE
291 DO bj = myByLo(myThid), myByHi(myThid)
292 DO bi = myBxLo(myThid), myBxHi(myThid)
293 DO j=1,sNy
294 DO i=1,sNx
295 jG = myYGlobalLo-1+(bj-1)*sNy+j
296 local=225.d0-float((jg-1))/float((ny-1))*37.5d0
297 IF ( jG .le. 3 ) local =local + 200
298 Solar(i,j,bi,bj) = local
299 ENDDO
300 ENDDO
301 ENDDO
302 ENDDO
303 ENDIF
304 _EXCH_XY_RS(solar, mythid)
305 IF ( TrFile .NE. ' ' ) THEN
306 CALL READ_FLD_XY_RS( TrFile,tr,' ',0,myThid )
307 ELSE
308 DO bj = myByLo(myThid), myByHi(myThid)
309 DO bi = myBxLo(myThid), myBxHi(myThid)
310 DO j=1,sNy
311 DO i=1,sNx
312 jG = myYGlobalLo-1+(bj-1)*sNy+j
313 local=solar(i,j,bi,bj)
314 local=(2.d0*local/stefan)**(0.25d0)-273.16
315 bump=-5.d0*EXP(-(float(jg-127)*float(jg-127))/1920.0)
316 local=local+bump
317 TR(i,j,bi,bj) = local
318 ENDDO
319 ENDDO
320 ENDDO
321 ENDDO
322 ENDIF
323 _EXCH_XY_RS(TR, mythid)
324 c do specific humidity
325 IF ( QrFile .NE. ' ' ) THEN
326 CALL READ_FLD_XY_RS( QrFile,qr,' ',0,myThid )
327 ELSE
328 c default specific humidity profile to 80% relative humidity
329 DO bj = myByLo(myThid), myByHi(myThid)
330 DO bi = myBxLo(myThid), myBxHi(myThid)
331 DO j=1,sNy
332 DO i=1,sNx
333 c jG = myYGlobalLo-1+(bj-1)*sNy+j
334 local = Tr(i,j,bi,bj)+273.16d0
335 ssqa = ssq0*exp( lath*(ssq1-ssq2/local)) / p0
336 qr(i,j,bi,bj) = 0.8d0*ssqa
337 ENDDO
338 ENDDO
339 ENDDO
340 ENDDO
341 ENDIF
342 _EXCH_XY_RS(qr, mythid)
343 IF ( UWindFile .NE. ' ' ) THEN
344 CALL READ_FLD_XY_RS( UWindFile,uwind,' ',0,myThid )
345 ELSE
346 DO bj = myByLo(myThid), myByHi(myThid)
347 DO bi = myBxLo(myThid), myBxHi(myThid)
348 DO j=1,sNy
349 DO i=1,sNx
350 jG = myYGlobalLo-1+(bj-1)*sNy+j
351 c mod for debug
352 c to return to original code, uncomment following line
353 c comment out 2nd line
354 local=-5.d0*cos(2.d0*pi*float(jg-1)/(float(ny-1)))
355 c local=0.d0*cos(2.d0*pi*float(jg-1)/(float(ny-1)))
356 uwind(i,j,bi,bj) = local
357 ENDDO
358 ENDDO
359 ENDDO
360 ENDDO
361 _EXCH_XY_RS(uwind, mythid)
362 ENDIF
363 IF ( VWindFile .NE. ' ' ) THEN
364 CALL READ_FLD_XY_RS( VWindFile,vwind,' ',0,myThid )
365 ELSE
366 DO bj = myByLo(myThid), myByHi(myThid)
367 DO bi = myBxLo(myThid), myBxHi(myThid)
368 DO j=1,sNy
369 DO i=1,sNx
370 jG = myYGlobalLo-1+(bj-1)*sNy+j
371 vwind(i,j,bi,bj) = 0.d0
372 ENDDO
373 ENDDO
374 ENDDO
375 ENDDO
376 ENDIF
377 _EXCH_XY_RS(vwind, mythid)
378 ENDIF
379
380 C endif for periodicForcing
381 ENDIF
382
383 RETURN
384 END

  ViewVC Help
Powered by ViewVC 1.1.22