/[MITgcm]/MITgcm/pkg/aim/aim_external_forcing.F
ViewVC logotype

Contents of /MITgcm/pkg/aim/aim_external_forcing.F

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


Revision 1.5 - (show annotations) (download)
Tue Sep 25 19:53:57 2001 UTC (22 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: icebear2, checkpoint44h_pre, release1_p12, release1_p10, release1_p11, release1_p16, release1_p15, ecco_c44_e17, ecco_c44_e16, ecco_c44_e21, ecco_c44_e26, ecco_c44_e27, ecco_c44_e24, icebear5, icebear4, checkpoint44f_pre, icebear3, checkpoint46f_post, release1_p13_pre, checkpoint46d_pre, checkpoint46e_post, release1-branch_tutorials, release1_p14, checkpoint44g_post, checkpoint46h_pre, checkpoint44h_post, release1_p12_pre, checkpoint44e_post, checkpoint46e_pre, ecco-branch-mod4, checkpoint43a-release1mods, checkpoint45d_post, checkpoint45b_post, checkpoint46b_pre, chkpt44a_pre, release1-branch-end, release1_final_v1, ecco_c44_e19, checkpoint46, ecco_c44_e20, checkpoint44, release1_p13, ecco_c44_e18, checkpoint44f_post, release1_p17, release1_b1, checkpoint44b_post, chkpt44c_post, chkpt44d_post, checkpoint42, release1_p9, release1_p8, checkpoint43, checkpoint46g_pre, release1_p2, release1_p3, release1_p4, release1_p6, checkpoint46a_post, chkpt44a_post, checkpoint44b_pre, release1_p1, checkpoint46a_pre, ecco-branch-mod1, checkpoint45c_post, release1_p5, checkpoint44e_pre, chkpt44c_pre, release1_p7, ecco_ice2, ecco_ice1, checkpoint46b_post, checkpoint46d_post, ecco-branch-mod2, checkpoint46g_post, checkpoint45a_post, checkpoint46c_pre, ecco-branch-mod3, ecco-branch-mod5, ecco_c44_e22, release1_beta1, ecco_c44_e23, release1-branch_branchpoint, checkpoint46c_post, checkpoint45, checkpoint46h_post, release1_chkpt44d_post, ecco_c44_e25
Branch point for: c24_e25_ice, ecco-branch, release1_coupled, icebear, release1_final, release1-branch, release1, release1_50yr
Changes since 1.4: +76 -47 lines
add a CPP option to turn back to old AIM Interface.
diagnostic of surface stress consistent with dynamical effects.

1 C $Header: /u/gcmpack/models/MITgcmUV/pkg/aim/aim_external_forcing.F,v 1.4 2001/08/24 00:49:51 jmc Exp $
2 C $Name: $
3
4 #include "AIM_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE AIM_EXTERNAL_FORCING_U(
8 I iMin, iMax, jMin, jMax,bi,bj,kLev,
9 I myCurrentTime,myThid)
10 C /==========================================================\
11 C | S/R AIM_EXTERNAL_FORCING_U |
12 C | o Add AIM tendency terms to U tendency. |
13 C \==========================================================/
14 IMPLICIT rEAL*8 (A-H,O-Z)
15
16 C == Global data ==
17 #include "SIZE.h"
18 #include "EEPARAMS.h"
19 #include "PARAMS.h"
20 #include "GRID.h"
21 #include "DYNVARS.h"
22
23 #ifdef ALLOW_AIM
24 #include "AIM2DYN.h"
25 #include "AIM_DIAGS.h"
26 #endif /* ALLOW_AIM */
27
28 C == Routine arguments ==
29 C iMin - Working range of tile for applying forcing.
30 C iMax
31 C jMin
32 C jMax
33 C kLev
34 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
35 _RL myCurrentTime
36 INTEGER myThid
37 CEndOfInterface
38
39 #ifdef ALLOW_AIM
40 C == Local variables ==
41 C i,j - Loop counters
42 INTEGER i, j
43 _RL DDTT, uStr_tmp
44
45 DDTT = deltaTclock
46
47 #ifdef OLD_AIM_INTERFACE
48 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
49 C - to reproduce old results (coupled run, summer 2000) :
50 IF (kLev.eq.1) THEN
51 DO j=jMin,jMax
52 DO i=iMin,iMax
53 uStr_tmp = -aim_drag(i,j,bi,bj)*uVel(i,j,kLev,bi,bj)
54 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
55 & + uStr_tmp*horiVertRatio*recip_drF(kLev)
56 #ifdef ALLOW_TIMEAVE
57 USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
58 #endif
59 ENDDO
60 ENDDO
61 ELSE
62 DO j=jMin,jMax
63 DO i=iMin,iMax
64 IF ( maskW(i,j,kLev-1,bi,bj) .EQ. 0. ) THEN
65 uStr_tmp = -aim_drag(i,j,bi,bj)*uVel(i,j,kLev,bi,bj)
66 #ifdef ALLOW_TIMEAVE
67 USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
68 #endif
69 C - put the same bug as in the old setup :
70 IF ( maskC(i,j,kLev-1,bi,bj) .EQ. 1. ) uStr_tmp = 0.
71 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
72 & + uStr_tmp*horiVertRatio*recip_drF(kLev)
73 ENDIF
74 ENDDO
75 ENDDO
76 ENDIF
77 #else /* OLD_AIM_INTERFACE */
78 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
79 IF (kLev.eq.1) THEN
80 DO j=jMin,jMax
81 DO i=iMin,iMax
82 IF ( hFacW(i,j,kLev,bi,bj) .NE. 0. ) THEN
83 uStr_tmp =
84 & -( aim_drag(i-1,j,bi,bj)+aim_drag(i,j,bi,bj) )
85 & * 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
86 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
87 & + uStr_tmp*horiVertRatio*recip_drF(kLev)
88 #ifdef ALLOW_TIMEAVE
89 USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
90 #endif
91 ENDIF
92 ENDDO
93 ENDDO
94 ELSE
95 DO j=jMin,jMax
96 DO i=iMin,iMax
97 IF ( hFacW(i,j,kLev,bi,bj) .NE. 0. ) THEN
98 uStr_tmp =
99 & -( (1.-maskC(i-1,j,kLev-1,bi,bj))*aim_drag(i-1,j,bi,bj)
100 & +(1.-maskC( i ,j,kLev-1,bi,bj))*aim_drag( i ,j,bi,bj)
101 & )* 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
102 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
103 & + uStr_tmp*horiVertRatio*recip_drF(kLev)
104 #ifdef ALLOW_TIMEAVE
105 USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
106 #endif
107 ENDIF
108 ENDDO
109 ENDDO
110 ENDIF
111 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
112 #endif /* OLD_AIM_INTERFACE */
113
114 #endif /* ALLOW_AIM */
115
116 RETURN
117 END
118 CStartOfInterface
119 SUBROUTINE AIM_EXTERNAL_FORCING_V(
120 I iMin, iMax, jMin, jMax,bi,bj,kLev,
121 I myCurrentTime,myThid)
122 C /==========================================================\
123 C | S/R EXTERNAL_FORCING_V |
124 C | o Add AIM tendency to meridional velocity. |
125 C \==========================================================/
126 IMPLICIT rEAL*8 (A-H,O-Z)
127
128 C == Global data ==
129 #include "SIZE.h"
130 #include "EEPARAMS.h"
131 #include "PARAMS.h"
132 #include "GRID.h"
133 #include "DYNVARS.h"
134
135 #ifdef ALLOW_AIM
136 #include "AIM2DYN.h"
137 #include "AIM_DIAGS.h"
138 #endif /* ALLOW_AIM */
139
140 C == Routine arguments ==
141 C iMin - Working range of tile for applying forcing.
142 C iMax
143 C jMin
144 C jMax
145 C kLev
146 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
147 _RL myCurrentTime
148 INTEGER myThid
149 CEndOfInterface
150
151 #ifdef ALLOW_AIM
152 C == Local variables ==
153 C Loop counters
154 INTEGER i, j
155 _RL DDTT, vStr_tmp
156
157 DDTT = deltaTclock
158
159 C call CHKSUM_TILED( ' drag AAA ',aim_drag,1,bi,bj,myThid )
160
161 #ifdef OLD_AIM_INTERFACE
162 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
163 C - to reproduce old results (coupled run, summer 2000) :
164 IF (kLev.eq.1) THEN
165 DO j=jMin,jMax
166 DO i=iMin,iMax
167 vStr_tmp = -aim_drag(i,j,bi,bj)*vVel(i,j,kLev,bi,bj)
168 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
169 & + vStr_tmp*horiVertRatio*recip_drF(kLev)
170 #ifdef ALLOW_TIMEAVE
171 VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
172 #endif
173 ENDDO
174 ENDDO
175 ELSE
176 DO j=jMin,jMax
177 DO i=iMin,iMax
178 IF ( maskS(i,j,kLev-1,bi,bj) .EQ. 0. ) THEN
179 vStr_tmp = -aim_drag(i,j,bi,bj)*vVel(i,j,kLev,bi,bj)
180 #ifdef ALLOW_TIMEAVE
181 VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
182 #endif
183 C - put the same bug as in the old setup :
184 IF ( maskC(i,j,kLev-1,bi,bj) .EQ. 1. ) vStr_tmp = 0.
185 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
186 & + vStr_tmp*horiVertRatio*recip_drF(kLev)
187 ENDIF
188 ENDDO
189 ENDDO
190 ENDIF
191 #else /* OLD_AIM_INTERFACE */
192 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
193 IF (kLev.eq.1) THEN
194 DO j=jMin,jMax
195 DO i=iMin,iMax
196 IF ( hFacS(i,j,kLev,bi,bj) .NE. 0. ) THEN
197 vStr_tmp =
198 & -( aim_drag(i,j-1,bi,bj)+aim_drag(i,j,bi,bj) )
199 & * 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
200 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
201 & + vStr_tmp*horiVertRatio*recip_drF(kLev)
202 #ifdef ALLOW_TIMEAVE
203 VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
204 #endif
205 ENDIF
206 ENDDO
207 ENDDO
208 ELSE
209 DO j=jMin,jMax
210 DO i=iMin,iMax
211 IF ( hFacS(i,j,kLev,bi,bj) .NE. 0. ) THEN
212 vStr_tmp =
213 & -( (1.-maskC(i,j-1,kLev-1,bi,bj))*aim_drag(i,j-1,bi,bj)
214 & +(1.-maskC(i, j ,kLev-1,bi,bj))*aim_drag(i, j ,bi,bj)
215 & )* 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
216 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
217 & + vStr_tmp*horiVertRatio*recip_drF(kLev)
218 #ifdef ALLOW_TIMEAVE
219 VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
220 #endif
221 ENDIF
222 ENDDO
223 ENDDO
224 ENDIF
225 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
226 #endif /* OLD_AIM_INTERFACE */
227
228 #endif /* ALLOW_AIM */
229
230 RETURN
231 END
232 CStartOfInterface
233 SUBROUTINE AIM_EXTERNAL_FORCING_T(
234 I iMin, iMax, jMin, jMax,bi,bj,kLev,
235 I myCurrentTime,myThid)
236 C /==========================================================\
237 C | S/R AIM_EXTERNAL_FORCING_T |
238 C | o Add AIM tendency to T |
239 C \==========================================================/
240 IMPLICIT rEAL*8 (A-H,O-Z)
241
242 C == Global data ==
243 #include "SIZE.h"
244 #include "EEPARAMS.h"
245 #include "PARAMS.h"
246 #include "GRID.h"
247 #include "DYNVARS.h"
248
249 #ifdef ALLOW_AIM
250 #include "atparam0.h"
251 #include "atparam1.h"
252 INTEGER NGP
253 INTEGER NLON
254 INTEGER NLAT
255 INTEGER NLEV
256 PARAMETER ( NLON=IX, NLAT=IL, NLEV=KX, NGP=NLON*NLAT )
257 #include "com_physvar.h"
258 #include "AIM2DYN.h"
259 #endif
260
261 C == Routine arguments ==
262 C iMin - Working range of tile for applying forcing.
263 C iMax
264 C jMin
265 C jMax
266 C kLev
267 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
268 _RL myCurrentTime
269 INTEGER myThid
270 CEndOfInterface
271
272 #ifdef ALLOW_AIM
273 C == Local variables ==
274 C Loop counters
275 INTEGER I, J, I2, katm
276 _RL phiTemp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy,nSx,nSy)
277
278 C-- Forcing term
279 _RL pGround
280 _RL convert_fact
281
282
283 C-- Forcing:
284 C- AIM heating/cooling tendencies terms: Convert to Pot.Temp and Add to gT
285 pGround = 1. _d 5
286 RD = 287. _d 0
287 CPAIR = 1004. _d 0
288 katm = _KD2KA( Klev )
289 convert_fact = ((pGround/rC(kLev))**(RD/CPAIR))
290 DO J=1-OLy,sNy+OLy
291 DO I=1-OLx,sNx+OLx
292 C I2 = sNx*(J-1)+I
293 C phiTemp(I,J,bi,bj) = gT(i,j,kLev,bi,bj)
294 C & +convert_fact*(
295 C & TT_PBL(I2,katm)
296 C & +TT_CNV(I2,katm)
297 C & +TT_LSC(I2,katm)
298 C & +TT_RSW(I2,katm)
299 C & +TT_RLW(I2,katm)
300 C & )
301 phiTemp(I,J,bi,bj) = gT(i,j,kLev,bi,bj)
302 & +aim_dTdt(i,j,kLev,bi,bj)
303 ENDDO
304 ENDDO
305
306 C This can't stay here
307 C _EXCH_XY_R8( phiTemp , myThid)
308
309 DO J=1-OLy,sNy+OLy
310 DO I=1-OLx,sNx+OLx
311 gT(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)*phiTemp(I,J,bi,bj)
312 ENDDO
313 ENDDO
314
315 #endif /* ALLOW_AIM */
316
317 RETURN
318 END
319 CStartOfInterface
320 SUBROUTINE AIM_EXTERNAL_FORCING_S(
321 I iMin, iMax, jMin, jMax,bi,bj,kLev,
322 I myCurrentTime,myThid)
323 C /==========================================================\
324 C | S/R AIM_EXTERNAL_FORCING_S |
325 C | o Add AIM tendency to S. |
326 C \==========================================================/
327 IMPLICIT rEAL*8 (A-H,O-Z)
328
329 C == Global data ==
330 #include "SIZE.h"
331 #include "EEPARAMS.h"
332 #include "PARAMS.h"
333 #include "GRID.h"
334 #include "DYNVARS.h"
335
336 #ifdef ALLOW_AIM
337 #include "atparam0.h"
338 #include "atparam1.h"
339 INTEGER NGP
340 INTEGER NLON
341 INTEGER NLAT
342 INTEGER NLEV
343 PARAMETER ( NLON=IX, NLAT=IL, NLEV=KX, NGP=NLON*NLAT )
344 #include "com_physvar.h"
345 #include "AIM2DYN.h"
346 #endif
347
348
349 C == Routine arguments ==
350 C iMin - Working range of tile for applying forcing.
351 C iMax
352 C jMin
353 C jMax
354 C kLev
355 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
356 _RL myCurrentTime
357 INTEGER myThid
358 CEndOfInterface
359
360
361 #ifdef ALLOW_AIM
362 C == Local variables ==
363 C Loop counters
364 INTEGER I, J, I2, katm
365 _RL phiTemp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy,nSx,nSy)
366
367 katm = _KD2KA( kLev )
368 DO J=1-OLy,sNy+OLy
369 DO I=1-OLx,sNx+OLx
370 I2 = sNx*(J-1)+I
371 C phiTemp(i,j,bi,bj) = gS(i,j,kLev,bi,bj)
372 C & +QT_PBL(I2,katm)
373 C & +QT_CNV(I2,katm)
374 C & +QT_LSC(I2,katm)
375 phiTemp(I,J,bi,bj) = gS(i,j,kLev,bi,bj)
376 & +aim_dSdt(i,j,kLev,bi,bj)
377 ENDDO
378 ENDDO
379
380 C This can't stay here
381 C _EXCH_XY_R8( phiTemp , myThid)
382 C _EXCH_XYZ_R8( gS , myThid)
383
384 DO J=1-OLy,sNy+OLy
385 DO I=1-OLx,sNx+OLx
386 gS(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)*phiTemp(I,J,bi,bj)
387 ENDDO
388 ENDDO
389
390 #endif /* ALLOW_AIM */
391
392 RETURN
393 END

  ViewVC Help
Powered by ViewVC 1.1.22