/[MITgcm]/MITgcm/verification/aim.5l_Equatorial_Channel/code/aim_surf_bc.F
ViewVC logotype

Contents of /MITgcm/verification/aim.5l_Equatorial_Channel/code/aim_surf_bc.F

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


Revision 1.9 - (show annotations) (download)
Mon Dec 12 19:05:41 2011 UTC (12 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63g, checkpoint64, checkpoint65, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.8: +14 -2 lines
- bring this local copy up-to-date with standard version (from pkg/aim_v23)
- move delX,delY to new header file (SET_GRID.h)

1 C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/aim_surf_bc.F,v 1.18 2010/10/26 20:59:53 dfer Exp $
2 C $Name: $
3
4 #include "AIM_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: AIM_SURF_BC
8 C !INTERFACE:
9 SUBROUTINE AIM_SURF_BC(
10 U tYear,
11 O aim_sWght0, aim_sWght1,
12 I bi, bj, myTime, myIter, myThid )
13
14 C !DESCRIPTION: \bv
15 C *================================================================*
16 C | S/R AIM_SURF_BC
17 C | Set surface Boundary Conditions
18 C | for the atmospheric physics package
19 C *================================================================*
20 c | was part of S/R FORDATE in Franco Molteni SPEEDY code (ver23).
21 C | For now, surface BC are loaded from files (S/R AIM_FIELDS_LOAD)
22 C | and imposed (= surf. forcing).
23 C | In the future, will add
24 C | a land model and a coupling interface with an ocean GCM
25 C *================================================================*
26 C \ev
27
28 C !USES:
29 IMPLICIT NONE
30
31 C -------------- Global variables --------------
32 C-- size for MITgcm & Physics package :
33 #include "AIM_SIZE.h"
34
35 C-- MITgcm
36 #include "EEPARAMS.h"
37 #include "PARAMS.h"
38 C_EqCh: start
39 #ifdef ALLOW_EXCH2
40 # include "W2_EXCH2_SIZE.h"
41 #endif /* ALLOW_EXCH2 */
42 #include "SET_GRID.h"
43 C_EqCh: end
44 #include "GRID.h"
45 c #include "DYNVARS.h"
46 c #include "SURFACE.h"
47
48 C-- Physics package
49 #include "AIM_PARAMS.h"
50 #include "AIM_FFIELDS.h"
51 c #include "AIM_GRID.h"
52 #include "com_forcon.h"
53 #include "com_forcing.h"
54 c #include "com_physvar.h"
55 #include "AIM_CO2.h"
56
57 C-- Coupled to the Ocean :
58 #ifdef COMPONENT_MODULE
59 #include "CPL_PARAMS.h"
60 #include "ATMCPL.h"
61 #endif
62
63 C !INPUT/OUTPUT PARAMETERS:
64 C == Routine arguments ==
65 C tYear :: Fraction into year
66 C aim_sWght0 :: weight for time interpolation of surface BC
67 C aim_sWght1 :: 0/1 = time period before/after the current time
68 C bi,bj :: Tile indices
69 C myTime :: Current time of simulation ( s )
70 C myIter :: Current iteration number in simulation
71 C myThid :: my Thread number Id.
72 _RL tYear
73 _RL aim_sWght0, aim_sWght1
74 INTEGER bi, bj
75 _RL myTime
76 INTEGER myIter, myThid
77 CEOP
78
79 #ifdef ALLOW_AIM
80 C !FUNCTIONS:
81 C !LOCAL VARIABLES:
82 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
83 C-- Local Variables originally (Speedy) in common bloc (com_forcing.h):
84 C-- COMMON /FORDAY/ Daily forcing fields (updated in FORDATE)
85 C oice1 :: sea ice fraction
86 C snow1 :: snow depth (mm water)
87 _RL oice1(NGP)
88 _RL snow1(NGP)
89 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
90 C == Local variables ==
91 C i,j,k,I2,k :: Loop counters
92 INTEGER i,j,I2,k, nm0
93 _RL t0prd, tNcyc, tmprd, dTprd
94 _RL SDEP1, IDEP2, SDEP2, SWWIL2, RSW, soilw_0, soilw_1
95 _RL RSD, alb_land, oceTfreez, ALBSEA1, ALPHA, CZEN, CZEN2
96 _RL RZEN, ZS, ZC, SJ, CJ, TMPA, TMPB, TMPL, hlim
97 c _RL DALB, alb_sea
98 #ifdef ALLOW_AIM_CO2
99 #ifdef ALLOW_DIAGNOSTICS
100 _RL pCO2scl
101 #endif
102 #endif /* ALLOW_AIM_CO2 */
103
104 C_EqCh: start
105 CHARACTER*(MAX_LEN_MBUF) suff
106 _RL xBump, yBump, dxBump, dyBump
107 xBump = xgOrigin + delX(1)*64.
108 yBump = ygOrigin + delY(1)*11.5
109 dxBump= delX(1)*12.
110 dyBump= delY(1)*6.
111 C_EqCh: Fix solar insolation with Sun directly overhead on Equator
112 tYear = 0.25 _d 0 - 10. _d 0/365. _d 0
113 C_EqCh: end
114
115 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
116 C- Set Land-sea mask (in [0,1]) from aim_landFr to fMask1:
117 DO j=1,sNy
118 DO i=1,sNx
119 I2 = i+(j-1)*sNx
120 fMask1(I2,1,myThid) = aim_landFr(i,j,bi,bj)
121 ENDDO
122 ENDDO
123
124 IF (aim_useFMsurfBC) THEN
125 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
126
127 C aim_surfForc_TimePeriod :: Length of forcing time period (e.g. 1 month)
128 C aim_surfForc_NppCycle :: Number of time period per Cycle (e.g. 12)
129 C aim_surfForc_TransRatio ::
130 C- define how fast the (linear) transition is from one month to the next
131 C = 1 -> linear between 2 midle month
132 C > TimePeriod/deltaT -> jump from one month to the next one
133
134 C-- Calculate weight for linear interpolation between 2 month centers
135 t0prd = myTime / aim_surfForc_TimePeriod
136 tNcyc = aim_surfForc_NppCycle
137 tmprd = t0prd - 0.5 _d 0 + tNcyc
138 tmprd = MOD(tmprd,tNcyc)
139 C- indices of previous month (nm0) and next month (nm1):
140 nm0 = 1 + INT(tmprd)
141 c nm1 = 1 + MOD(nm0,aim_surfForc_NppCycle)
142 C- interpolation weight:
143 dTprd = tmprd - (nm0 - 1)
144 aim_sWght1 = 0.5 _d 0+(dTprd-0.5 _d 0)*aim_surfForc_TransRatio
145 aim_sWght1 = MAX( 0. _d 0, MIN(1. _d 0, aim_sWght1) )
146 aim_sWght0 = 1. _d 0 - aim_sWght1
147
148 C-- Compute surface forcing at present time (linear Interp in time)
149 C using F.Molteni surface BC form ; fields needed are:
150 C 1. Sea Surface temperatures (in situ Temp. [K])
151 C 2. Land Surface temperatures (in situ Temp. [K])
152 C 3. Soil moisture (between 0-1)
153 C 4. Snow depth, Sea Ice : used to compute albedo (=> local arrays)
154 C 5. Albedo (between 0-1)
155
156 C- Surface Temperature:
157 DO j=1,sNy
158 DO i=1,sNx
159 I2 = i+(j-1)*sNx
160 sst1(I2,myThid) = aim_sWght0*aim_sst0(i,j,bi,bj)
161 & + aim_sWght1*aim_sst1(i,j,bi,bj)
162 stl1(I2,myThid) = aim_sWght0*aim_lst0(i,j,bi,bj)
163 & + aim_sWght1*aim_lst1(i,j,bi,bj)
164 ENDDO
165 ENDDO
166
167 C- Soil Water availability : (from F.M. INFORC S/R)
168 SDEP1 = 70. _d 0
169 IDEP2 = 3. _d 0
170 SDEP2 = IDEP2*SDEP1
171
172 SWWIL2= SDEP2*SWWIL
173 RSW = 1. _d 0/(SDEP1*SWCAP+SDEP2*(SWCAP-SWWIL))
174
175 DO j=1,sNy
176 DO i=1,sNx
177 I2 = i+(j-1)*sNx
178 soilw_0 = ( aim_sw10(i,j,bi,bj)
179 & +aim_veget(i,j,bi,bj)*
180 & MAX(IDEP2*aim_sw20(i,j,bi,bj)-SWWIL2, 0. _d 0)
181 & )*RSW
182 soilw_1 = ( aim_sw11(i,j,bi,bj)
183 & +aim_veget(i,j,bi,bj)*
184 & MAX(IDEP2*aim_sw21(i,j,bi,bj)-SWWIL2, 0. _d 0)
185 & )*RSW
186 soilw1(I2,myThid) = aim_sWght0*soilw_0
187 & + aim_sWght1*soilw_1
188 soilw1(I2,myThid) = MIN(1. _d 0, soilw1(I2,myThid) )
189 ENDDO
190 ENDDO
191
192 C- Set snow depth & sea-ice fraction :
193 DO j=1,sNy
194 DO i=1,sNx
195 I2 = i+(j-1)*sNx
196 snow1(I2) = aim_sWght0*aim_snw0(i,j,bi,bj)
197 & + aim_sWght1*aim_snw1(i,j,bi,bj)
198 oice1(I2) = aim_sWght0*aim_oic0(i,j,bi,bj)
199 & + aim_sWght1*aim_oic1(i,j,bi,bj)
200 ENDDO
201 ENDDO
202
203 IF (aim_splitSIOsFx) THEN
204 C- Split Ocean and Sea-Ice surf. temp. ; remove ice-fraction < 1 %
205 c oceTfreez = tFreeze - 1.9 _d 0
206 oceTfreez = celsius2K - 1.9 _d 0
207 DO J=1,NGP
208 sti1(J,myThid) = sst1(J,myThid)
209 IF ( oice1(J) .GT. 1. _d -2 ) THEN
210 sst1(J,myThid) = MAX(sst1(J,myThid),oceTfreez)
211 sti1(J,myThid) = sst1(J,myThid)
212 & +(sti1(J,myThid)-sst1(J,myThid))/oice1(J)
213 ELSE
214 oice1(J) = 0. _d 0
215 ENDIF
216 ENDDO
217 ELSE
218 DO J=1,NGP
219 sti1(J,myThid) = sst1(J,myThid)
220 ENDDO
221 ENDIF
222
223 C- Surface Albedo : (from F.M. FORDATE S/R)
224 c_FM DALB=ALBICE-ALBSEA
225 RSD=1. _d 0/SDALB
226 ALPHA= 2. _d 0*PI*(TYEAR+10. _d 0/365. _d 0)
227 #ifdef ALLOW_INSOLATION
228 ZS = - SIN(OBLIQ * deg2rad) * COS(ALPHA)
229 ZC = ASIN( ZS )
230 ZC = COS(ZC)
231 #else /* ALLOW_INSOLATION */
232 RZEN = COS(ALPHA) * ( -23.45 _d 0 * deg2rad)
233 ZC = COS(RZEN)
234 ZS = SIN(RZEN)
235 #endif /* ALLOW_INSOLATION */
236 DO j=1,sNy
237 DO i=1,sNx
238 c_FM SNOWC=MIN(1.,RSD*SNOW1(I,J))
239 c_FM ALBL=ALB0(I,J)+MAX(ALBSN-ALB0(I,J),0.0)*SNOWC
240 c_FM ALBS=ALBSEA+DALB*OICE1(I,J)
241 c_FM ALB1(I,J)=FMASK1(I,J)*ALBL+FMASK0(I,J)*ALBS
242 I2 = i+(j-1)*sNx
243 alb_land = aim_albedo(i,j,bi,bj)
244 & + MAX( 0. _d 0, ALBSN-aim_albedo(i,j,bi,bj) )
245 & *MIN( 1. _d 0, RSD*snow1(I2))
246 c alb_sea = ALBSEA + DALB*oice1(I2)
247 c alb1(I2,0,myThid) = alb_sea
248 c & + (alb_land - alb_sea)*fMask1(I2,1,myThid)
249 ALBSEA1 = ALBSEA
250 IF ( aim_selectOceAlbedo .EQ. 1) THEN
251 SJ = SIN(yC(i,j,bi,bj) * deg2rad)
252 CJ = COS(yC(i,j,bi,bj) * deg2rad)
253 TMPA = SJ*ZS
254 TMPB = CJ*ZC
255 TMPL = -TMPA/TMPB
256 IF (TMPL .GE. 1.0 _d 0) THEN
257 CZEN = 0.0 _d 0
258 ELSEIF (TMPL .LE. -1.0 _d 0) THEN
259 CZEN = (2.0 _d 0)*TMPA*PI
260 CZEN2= PI*((2.0 _d 0)*TMPA*TMPA + TMPB*TMPB)
261 CZEN = CZEN2/CZEN
262 ELSE
263 hlim = ACOS(TMPL)
264 CZEN = 2.0 _d 0*(TMPA*hlim + TMPB*SIN(hlim))
265 CZEN2= 2.0 _d 0*TMPA*TMPA*hlim
266 & + 4.0 _d 0*TMPA*TMPB*SIN(hlim)
267 & + TMPB*TMPB*( hlim + 0.5 _d 0*SIN(2.0 _d 0*hlim) )
268 CZEN = CZEN2/CZEN
269 ENDIF
270 ALBSEA1 = ( ( 2.6 _d 0 / (CZEN**(1.7 _d 0) + 0.065 _d 0) )
271 & + ( 15. _d 0 * (CZEN-0.1 _d 0) * (CZEN-0.5 _d 0)
272 & * (CZEN-1.0 _d 0) ) ) / 100.0 _d 0
273 ENDIF
274 alb1(I2,1,myThid) = alb_land
275 C_DE alb1(I2,2,myThid) = ALBSEA
276 alb1(I2,2,myThid) = 0.5 _d 0 * ALBSEA
277 & + 0.5 _d 0 * ALBSEA1
278 alb1(I2,3,myThid) = ALBICE
279 ENDDO
280 ENDDO
281
282 C-- else aim_useFMsurfBC
283 ELSE
284 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
285
286 C- safer to initialise output argument aim_sWght0,1
287 C even if they are not used when aim_useFMsurfBC=F
288 aim_sWght1 = 0. _d 0
289 aim_sWght0 = 1. _d 0
290
291 C- Set surface forcing fields needed by atmos. physics package
292 C 1. Albedo (between 0-1)
293 C 2. Sea Surface temperatures (in situ Temp. [K])
294 C 3. Land Surface temperatures (in situ Temp. [K])
295 C 4. Soil moisture (between 0-1)
296 C Snow depth, Sea Ice (<- no need for now)
297
298 C Set surface albedo data (in [0,1]) from aim_albedo to alb1 :
299 IF (aim_useMMsurfFc) THEN
300 DO j=1,sNy
301 DO i=1,sNx
302 I2 = i+(j-1)*sNx
303 alb1(I2,1,myThid) = aim_albedo(i,j,bi,bj)
304 alb1(I2,2,myThid) = aim_albedo(i,j,bi,bj)
305 alb1(I2,3,myThid) = aim_albedo(i,j,bi,bj)
306 ENDDO
307 ENDDO
308 ELSE
309 DO j=1,sNy
310 DO i=1,sNx
311 I2 = i+(j-1)*sNx
312 alb1(I2,1,myThid) = 0.
313 alb1(I2,2,myThid) = 0.
314 alb1(I2,3,myThid) = 0.
315 ENDDO
316 ENDDO
317 ENDIF
318 C Set surface temperature data from aim_S/LSurfTemp to sst1 & stl1 :
319 IF (aim_useMMsurfFc) THEN
320 DO j=1,sNy
321 DO i=1,sNx
322 I2 = i+(j-1)*sNx
323 sst1(I2,myThid) = aim_sst0(i,j,bi,bj)
324 stl1(I2,myThid) = aim_sst0(i,j,bi,bj)
325 sti1(I2,myThid) = aim_sst0(i,j,bi,bj)
326 ENDDO
327 ENDDO
328 ELSE
329 DO j=1,sNy
330 DO i=1,sNx
331 I2 = i+(j-1)*sNx
332 sst1(I2,myThid) = 300.
333 stl1(I2,myThid) = 300.
334 sti1(I2,myThid) = 300.
335 C_EqCh: start
336 sst1(I2,myThid) = 280.
337 & +20. _d 0 *exp( -((xC(i,j,bi,bj)-xBump)/dxBump)**2
338 & -((yC(i,j,bi,bj)-yBump)/dyBump)**2 )
339 stl1(I2,myThid) = sst1(I2,myThid)
340 sti1(I2,myThid) = sst1(I2,myThid)
341 C_EqCh: end
342 ENDDO
343 ENDDO
344 C_EqCh: start
345 IF (myIter.EQ.nIter0) THEN
346 WRITE(suff,'(I10.10)') myIter
347 CALL AIM_WRITE_PHYS( 'aim_SST.', suff, 1,sst1,
348 & 1, bi, bj, 1, myIter, myThid )
349 ENDIF
350 C_EqCh: end
351 ENDIF
352
353 C- Set soil water availability (in [0,1]) from aim_sw10 to soilw1 :
354 IF (aim_useMMsurfFc) THEN
355 DO j=1,sNy
356 DO i=1,sNx
357 I2 = i+(j-1)*sNx
358 soilw1(I2,myThid) = aim_sw10(i,j,bi,bj)
359 ENDDO
360 ENDDO
361 ELSE
362 DO j=1,sNy
363 DO i=1,sNx
364 I2 = i+(j-1)*sNx
365 soilw1(I2,myThid) = 0.
366 ENDDO
367 ENDDO
368 ENDIF
369
370 C- Set Snow depth and Sea Ice
371 C (not needed here since albedo is loaded from file)
372 DO j=1,sNy
373 DO i=1,sNx
374 I2 = i+(j-1)*sNx
375 oice1(I2) = 0.
376 snow1(I2) = 0.
377 ENDDO
378 ENDDO
379
380 C-- endif/else aim_useFMsurfBC
381 ENDIF
382
383 #ifdef COMPONENT_MODULE
384 IF ( useCoupler ) THEN
385 C-- take surface data from the ocean component
386 C to replace MxL fields (if use sea-ice) or directly AIM SST
387 CALL ATM_APPLY_IMPORT(
388 I aim_landFr,
389 U sst1(1,myThid), oice1,
390 I myTime, myIter, bi, bj, myThid )
391 ENDIF
392 #endif /* COMPONENT_MODULE */
393
394 #ifdef ALLOW_AIM_CO2
395 DO j=1,sNy
396 DO i=1,sNx
397 I2 = i+(j-1)*sNx
398 aim_CO2(I2,myThid)= atm_pCO2
399 ENDDO
400 ENDDO
401 #ifdef ALLOW_DIAGNOSTICS
402 IF ( useDiagnostics ) THEN
403 pCO2scl = 1. _d 6
404 CALL DIAGNOSTICS_SCALE_FILL( aim_CO2(1,myThid), pCO2scl, 1,
405 & 'aim_pCO2', 1, 1, 3, bi, bj, myThid )
406 ENDIF
407 #endif /* ALLOW_DIAGNOSTICS */
408 #endif /* ALLOW_AIM_CO2 */
409
410 #ifdef ALLOW_LAND
411 IF (useLand) THEN
412 C- Use land model output instead of prescribed Temp & moisture
413 CALL AIM_LAND2AIM(
414 I aim_landFr, aim_veget, aim_albedo, snow1,
415 U stl1(1,myThid), soilw1(1,myThid), alb1(1,1,myThid),
416 I myTime, myIter, bi, bj, myThid )
417 ENDIF
418 #endif /* ALLOW_LAND */
419
420 #ifdef ALLOW_THSICE
421 IF (useThSIce) THEN
422 C- Use thermo. sea-ice model output instead of prescribed Temp & albedo
423 CALL AIM_SICE2AIM(
424 I aim_landFr,
425 U sst1(1,myThid), oice1,
426 O sti1(1,myThid), alb1(1,3,myThid),
427 I myTime, myIter, bi, bj, myThid )
428 ENDIF
429 #endif /* ALLOW_THSICE */
430
431 C-- set the sea-ice & open ocean fraction :
432 DO J=1,NGP
433 fMask1(J,3,myThid) =(1. _d 0 - fMask1(J,1,myThid))
434 & *oice1(J)
435 fMask1(J,2,myThid) = 1. _d 0 - fMask1(J,1,myThid)
436 & - fMask1(J,3,myThid)
437 ENDDO
438
439 C-- set the mean albedo :
440 DO J=1,NGP
441 alb1(J,0,myThid) = fMask1(J,1,myThid)*alb1(J,1,myThid)
442 & + fMask1(J,2,myThid)*alb1(J,2,myThid)
443 & + fMask1(J,3,myThid)*alb1(J,3,myThid)
444 ENDDO
445
446 C-- initialize surf. temp. change to zero:
447 DO k=1,3
448 DO J=1,NGP
449 dTsurf(J,k,myThid) = 0.
450 ENDDO
451 ENDDO
452
453 IF (.NOT.aim_splitSIOsFx) THEN
454 DO J=1,NGP
455 fMask1(J,3,myThid) = 0. _d 0
456 fMask1(J,2,myThid) = 1. _d 0 - fMask1(J,1,myThid)
457 ENDDO
458 ENDIF
459
460 #endif /* ALLOW_AIM */
461
462 RETURN
463 END

  ViewVC Help
Powered by ViewVC 1.1.22