/[MITgcm]/MITgcm/pkg/aim_v23/aim_tendency_apply.F
ViewVC logotype

Contents of /MITgcm/pkg/aim_v23/aim_tendency_apply.F

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


Revision 1.8 - (show annotations) (download)
Tue Aug 29 16:41:03 2006 UTC (17 years, 9 months ago) by dfer
Branch: MAIN
CVS Tags: checkpoint59, checkpoint58y_post, checkpoint58t_post, checkpoint60, checkpoint61, checkpoint62, checkpoint58w_post, checkpoint58p_post, checkpoint58q_post, checkpoint58r_post, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint58v_post, checkpoint61f, checkpoint58x_post, checkpoint61n, checkpoint61q, checkpoint61z, checkpoint61e, checkpoint58u_post, checkpoint58s_post, checkpoint61g, checkpoint61d, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61x, checkpoint61y
Changes since 1.7: +23 -3 lines
add diagnostics of KE sink due to surface and stratospheric stresses

1 C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/aim_tendency_apply.F,v 1.7 2004/12/14 04:37:29 jmc Exp $
2 C $Name: $
3
4 #include "AIM_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE AIM_TENDENCY_APPLY_U(
8 I iMin, iMax, jMin, jMax,bi,bj,kLev,
9 I myTime,myThid)
10 C *==========================================================*
11 C | S/R AIM_TENDENCY_APPLY_U
12 C | o Add AIM tendency terms to U tendency.
13 C *==========================================================*
14 IMPLICIT NONE
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 #include "AIM_PARAMS.h"
24 #include "AIM2DYN.h"
25 #include "AIM_DIAGS.h"
26
27 C == Routine arguments ==
28 C iMin - Working range of tile for applying forcing.
29 C iMax
30 C jMin
31 C jMax
32 C kLev
33 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
34 _RL myTime
35 INTEGER myThid
36 CEndOfInterface
37
38 #ifdef ALLOW_AIM
39 C == Local variables in common block ==
40 C aim_uStress :: surface stress applied to zonal wind
41 COMMON /LOCAL_AIM_TENDENCY_APPLY_U/ aim_uStress,aim_KEuStr
42 _RL aim_uStress(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
43 _RL aim_KEuStr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
44 C == Local variables ==
45 C i,j - Loop counters
46 INTEGER i, j
47 _RL DDTT, uStr_tmp
48
49 DDTT = deltaTclock
50
51 IF ( myTime.EQ.startTime .AND. kLev.EQ.1 ) THEN
52 C- Initialise diagnostic array aim_uStress
53 DO j=1-Oly,sNy+Oly
54 DO i=1-Olx,sNx+Olx
55 aim_uStress(i,j,bi,bj) = 0.
56 aim_KEuStr(i,j,bi,bj) = 0.
57 ENDDO
58 ENDDO
59 ENDIF
60
61 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
62 IF ( kLev.EQ.Nr .AND. aim_dragStrato.GT.0. ) THEN
63 C- Note: exclusive IF / ELSE is legitimate here since surface drag
64 C is not supposed to be applied in stratosphere
65 DO j=jMin,jMax
66 DO i=iMin,iMax
67 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
68 & -maskW(i,j,kLev,bi,bj)*uVel(i,j,kLev,bi,bj)/aim_dragStrato
69 aim_KEuStr(i,j,bi,bj) = aim_KEuStr(i,j,bi,bj)
70 & -maskW(i,j,kLev,bi,bj)*uVel(i,j,kLev,bi,bj)
71 & *uVel(i,j,kLev,bi,bj)*hFacW(i,j,kLev,bi,bj)*drF(kLev)
72 & /aim_dragStrato/gravity
73 ENDDO
74 ENDDO
75 ELSEIF (kLev.eq.1) THEN
76 DO j=jMin,jMax
77 DO i=iMin,iMax
78 IF ( maskW(i,j,kLev,bi,bj) .NE. 0. ) THEN
79 uStr_tmp =
80 & -( aim_drag(i-1,j,bi,bj)+aim_drag(i,j,bi,bj) )
81 & * 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
82 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
83 & + uStr_tmp*gravity*recip_drF(kLev)
84 & * recip_hFacW(i,j,kLev,bi,bj)
85 aim_uStress(i,j,bi,bj) = uStr_tmp
86 aim_KEuStr(i,j,bi,bj) = uStr_tmp * uVel(i,j,kLev,bi,bj)
87 ENDIF
88 ENDDO
89 ENDDO
90 ELSE
91 DO j=jMin,jMax
92 DO i=iMin,iMax
93 IF ( maskW(i,j,kLev-1,bi,bj) .EQ. 0.
94 & .AND. maskW(i,j,kLev,bi,bj) .NE. 0. ) THEN
95 uStr_tmp =
96 & -( (1.-maskC(i-1,j,kLev-1,bi,bj))*aim_drag(i-1,j,bi,bj)
97 & +(1.-maskC( i ,j,kLev-1,bi,bj))*aim_drag( i ,j,bi,bj)
98 & )* 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
99 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
100 & + uStr_tmp*gravity*recip_drF(kLev)
101 & * recip_hFacW(i,j,kLev,bi,bj)
102 aim_uStress(i,j,bi,bj) = uStr_tmp
103 aim_KEuStr(i,j,bi,bj) = uStr_tmp * uVel(i,j,kLev,bi,bj)
104 ENDIF
105 ENDDO
106 ENDDO
107 ENDIF
108 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
109
110 #ifdef ALLOW_AIM_TAVE
111 IF (aim_taveFreq.NE.0 .AND. kLev.EQ.Nr) THEN
112 CALL TIMEAVE_CUMULATE( USTRtave, aim_uStress, 1,
113 & deltaTclock, bi, bj, myThid )
114 ENDIF
115 #endif
116 #ifdef ALLOW_DIAGNOSTICS
117 IF (usediagnostics .AND. kLev.EQ.Nr) THEN
118 CALL DIAGNOSTICS_FILL( aim_uStress, 'UFLUX ',
119 & 0,1,1,bi,bj,myThid)
120 CALL DIAGNOSTICS_FILL( aim_KEuStr, 'dKE_Ustr',
121 & 0,1,1,bi,bj,myThid)
122 ENDIF
123 #endif
124
125 #endif /* ALLOW_AIM */
126
127 RETURN
128 END
129 CStartOfInterface
130 SUBROUTINE AIM_TENDENCY_APPLY_V(
131 I iMin, iMax, jMin, jMax,bi,bj,kLev,
132 I myTime,myThid)
133 C *==========================================================*
134 C | S/R TENDENCY_APPLY_V
135 C | o Add AIM tendency terms to V tendency.
136 C *==========================================================*
137 IMPLICIT NONE
138
139 C == Global data ==
140 #include "SIZE.h"
141 #include "EEPARAMS.h"
142 #include "PARAMS.h"
143 #include "GRID.h"
144 #include "DYNVARS.h"
145
146 #include "AIM_PARAMS.h"
147 #include "AIM2DYN.h"
148 #include "AIM_DIAGS.h"
149
150 C == Routine arguments ==
151 C iMin - Working range of tile for applying forcing.
152 C iMax
153 C jMin
154 C jMax
155 C kLev
156 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
157 _RL myTime
158 INTEGER myThid
159 CEndOfInterface
160
161 #ifdef ALLOW_AIM
162 C == Local variables in common block ==
163 C aim_uStress :: surface stress applied to meridional wind
164 COMMON /LOCAL_AIM_TENDENCY_APPLY_V/ aim_vStress,aim_KEvStr
165 _RL aim_vStress(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
166 _RL aim_KEvStr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
167 C == Local variables ==
168 C Loop counters
169 INTEGER i, j
170 _RL DDTT, vStr_tmp
171
172 DDTT = deltaTclock
173
174 IF ( myTime.EQ.startTime .AND. kLev.EQ.1 ) THEN
175 C- Initialise diagnostic array aim_uStress
176 DO j=1-Oly,sNy+Oly
177 DO i=1-Olx,sNx+Olx
178 aim_vStress(i,j,bi,bj) = 0.
179 aim_KEvStr(i,j,bi,bj) = 0.
180 ENDDO
181 ENDDO
182 ENDIF
183
184 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
185 IF ( kLev.EQ.Nr .AND. aim_dragStrato.GT.0. ) THEN
186 C- Note: exclusive IF / ELSE is legitimate here since surface drag
187 C is not supposed to be applied in the stratosphere
188 DO j=jMin,jMax
189 DO i=iMin,iMax
190 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
191 & -maskS(i,j,kLev,bi,bj)*vVel(i,j,kLev,bi,bj)/aim_dragStrato
192 aim_KEvStr(i,j,bi,bj) = aim_KEvStr(i,j,bi,bj)
193 & -maskS(i,j,kLev,bi,bj)*vVel(i,j,kLev,bi,bj)
194 & *vVel(i,j,kLev,bi,bj)*hFacS(i,j,kLev,bi,bj)*drF(kLev)
195 & /aim_dragStrato/gravity
196 ENDDO
197 ENDDO
198 ELSEIF (kLev.eq.1) THEN
199 DO j=jMin,jMax
200 DO i=iMin,iMax
201 IF ( maskS(i,j,kLev,bi,bj) .NE. 0. ) THEN
202 vStr_tmp =
203 & -( aim_drag(i,j-1,bi,bj)+aim_drag(i,j,bi,bj) )
204 & * 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
205 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
206 & + vStr_tmp*gravity*recip_drF(kLev)
207 & * recip_hFacS(i,j,kLev,bi,bj)
208 aim_vStress(i,j,bi,bj) = vStr_tmp
209 aim_KEvStr(i,j,bi,bj) = vStr_tmp * vVel(i,j,kLev,bi,bj)
210 ENDIF
211 ENDDO
212 ENDDO
213 ELSE
214 DO j=jMin,jMax
215 DO i=iMin,iMax
216 IF ( maskS(i,j,kLev-1,bi,bj) .EQ. 0.
217 & .AND. maskS(i,j,kLev,bi,bj) .NE. 0. ) THEN
218 vStr_tmp =
219 & -( (1.-maskC(i,j-1,kLev-1,bi,bj))*aim_drag(i,j-1,bi,bj)
220 & +(1.-maskC(i, j ,kLev-1,bi,bj))*aim_drag(i, j ,bi,bj)
221 & )* 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
222 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
223 & + vStr_tmp*gravity*recip_drF(kLev)
224 & * recip_hFacS(i,j,kLev,bi,bj)
225 aim_vStress(i,j,bi,bj) = vStr_tmp
226 aim_KEvStr(i,j,bi,bj) = vStr_tmp * vVel(i,j,kLev,bi,bj)
227 ENDIF
228 ENDDO
229 ENDDO
230 ENDIF
231 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
232
233 #ifdef ALLOW_AIM_TAVE
234 IF (aim_taveFreq.NE.0 .AND. kLev.EQ.Nr) THEN
235 CALL TIMEAVE_CUMULATE( VSTRtave, aim_vStress, 1,
236 & deltaTclock, bi, bj, myThid )
237 ENDIF
238 #endif
239 #ifdef ALLOW_DIAGNOSTICS
240 IF (usediagnostics .AND. kLev.EQ.Nr) THEN
241 CALL DIAGNOSTICS_FILL( aim_vStress, 'VFLUX ',
242 & 0,1,1,bi,bj,myThid)
243 CALL DIAGNOSTICS_FILL( aim_KEvStr, 'dKE_Vstr',
244 & 0,1,1,bi,bj,myThid)
245 ENDIF
246 #endif
247
248 #endif /* ALLOW_AIM */
249
250 RETURN
251 END
252 CStartOfInterface
253 SUBROUTINE AIM_TENDENCY_APPLY_T(
254 I iMin, iMax, jMin, jMax,bi,bj,kLev,
255 I myTime,myThid)
256 C *==========================================================*
257 C | S/R AIM_TENDENCY_APPLY_T
258 C | o Add AIM tendency to gT
259 C *==========================================================*
260 IMPLICIT NONE
261
262 C == Global data ==
263 #include "SIZE.h"
264 #include "EEPARAMS.h"
265 #include "PARAMS.h"
266 #include "GRID.h"
267 #include "DYNVARS.h"
268
269 #include "AIM2DYN.h"
270
271 C == Routine arguments ==
272 C iMin - Working range of tile for applying forcing.
273 C iMax
274 C jMin
275 C jMax
276 C kLev
277 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
278 _RL myTime
279 INTEGER myThid
280 CEndOfInterface
281
282 #ifdef ALLOW_AIM
283 C == Local variables ==
284 C Loop counters
285 INTEGER I, J
286
287 C-- Forcing: add AIM heating/cooling tendency to gT:
288 DO J=1,sNy
289 DO I=1,sNx
290 gT(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)
291 & *( gT(i,j,kLev,bi,bj) + aim_dTdt(i,j,kLev,bi,bj) )
292 ENDDO
293 ENDDO
294
295 #endif /* ALLOW_AIM */
296
297 RETURN
298 END
299 CStartOfInterface
300 SUBROUTINE AIM_TENDENCY_APPLY_S(
301 I iMin, iMax, jMin, jMax,bi,bj,kLev,
302 I myTime,myThid)
303 C *==========================================================*
304 C | S/R AIM_TENDENCY_APPLY_S
305 C | o Add AIM tendency to gS.
306 C *==========================================================*
307 IMPLICIT NONE
308
309 C == Global data ==
310 #include "SIZE.h"
311 #include "EEPARAMS.h"
312 #include "PARAMS.h"
313 #include "GRID.h"
314 #include "DYNVARS.h"
315
316 #include "AIM2DYN.h"
317
318 C == Routine arguments ==
319 C iMin - Working range of tile for applying forcing.
320 C iMax
321 C jMin
322 C jMax
323 C kLev
324 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
325 _RL myTime
326 INTEGER myThid
327 CEndOfInterface
328
329
330 #ifdef ALLOW_AIM
331 C == Local variables ==
332 C Loop counters
333 INTEGER I, J
334
335 C-- Forcing: add AIM dq/dt tendency to gS:
336 DO J=1,sNy
337 DO I=1,sNx
338 gS(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)
339 & *( gS(i,j,kLev,bi,bj) + aim_dSdt(i,j,kLev,bi,bj) )
340 ENDDO
341 ENDDO
342
343 #endif /* ALLOW_AIM */
344
345 RETURN
346 END

  ViewVC Help
Powered by ViewVC 1.1.22