/[MITgcm]/MITgcm/model/src/external_forcing.F
ViewVC logotype

Contents of /MITgcm/model/src/external_forcing.F

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


Revision 1.36 - (show annotations) (download)
Mon Jan 2 21:17:02 2006 UTC (18 years, 5 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint58
Changes since 1.35: +1 -30 lines
o Fix I/O inconsistency in pkg/rbcs: replace precFloat32 by readBinaryPrec
o Remove 3-dim. relaxation code from pkg/exf (now use only pkg/rbcs)
o Thanks to Tom Haine for testing!

1 C $Header: /u/gcmpack/MITgcm/model/src/external_forcing.F,v 1.35 2005/12/19 19:09:35 stephd Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: EXTERNAL_FORCING_U
9 C !INTERFACE:
10 SUBROUTINE EXTERNAL_FORCING_U(
11 I iMin,iMax, jMin,jMax, bi,bj, kLev,
12 I myTime, myThid )
13 C !DESCRIPTION: \bv
14 C *==========================================================*
15 C | S/R EXTERNAL_FORCING_U
16 C | o Contains problem specific forcing for zonal velocity.
17 C *==========================================================*
18 C | Adds terms to gU for forcing by external sources
19 C | e.g. wind stress, bottom friction etc ...
20 C *==========================================================*
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25 C == Global data ==
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29 #include "GRID.h"
30 #include "DYNVARS.h"
31 #include "FFIELDS.h"
32
33 C !INPUT/OUTPUT PARAMETERS:
34 C == Routine arguments ==
35 C iMin,iMax :: Working range of x-index for applying forcing.
36 C jMin,jMax :: Working range of y-index for applying forcing.
37 C bi,bj :: Current tile indices
38 C kLev :: Current vertical level index
39 C myTime :: Current time in simulation
40 C myThid :: Thread Id number
41 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
42 _RL myTime
43 INTEGER myThid
44
45 C !LOCAL VARIABLES:
46 C == Local variables ==
47 C i,j :: Loop counters
48 C kSurface :: index of surface layer
49 INTEGER i, j
50 INTEGER kSurface
51 CEOP
52
53 IF ( fluidIsAir ) THEN
54 kSurface = 0
55 ELSEIF ( usingPCoords ) THEN
56 kSurface = Nr
57 ELSE
58 kSurface = 1
59 ENDIF
60
61 C-- Forcing term
62 #ifdef ALLOW_AIM
63 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_U(
64 & iMin,iMax, jMin,jMax, bi,bj, kLev,
65 & myTime, myThid )
66 #endif /* ALLOW_AIM */
67
68 #ifdef ALLOW_FIZHI
69 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_U(
70 & iMin,iMax, jMin,jMax, bi,bj, kLev,
71 & myTime, myThid )
72 #endif /* ALLOW_FIZHI */
73
74 C Add windstress momentum impulse into the top-layer
75 IF ( kLev .EQ. kSurface ) THEN
76 c DO j=1,sNy
77 C-jmc: Without CD-scheme, this is OK ; but with CD-scheme, needs to cover [0:sNy+1]
78 DO j=0,sNy+1
79 DO i=1,sNx+1
80 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
81 & +foFacMom*surfaceForcingU(i,j,bi,bj)
82 & *recip_drF(kLev)*recip_hFacW(i,j,kLev,bi,bj)
83 ENDDO
84 ENDDO
85 ENDIF
86
87 #if (defined (ALLOW_TAU_EDDY))
88 CALL TAUEDDY_EXTERNAL_FORCING_U(
89 I iMin,iMax, jMin,jMax, bi,bj, kLev,
90 I myTime, myThid )
91 #endif
92
93 #ifdef ALLOW_OBCS
94 IF (useOBCS) THEN
95 CALL OBCS_SPONGE_U(
96 I iMin,iMax, jMin,jMax, bi,bj, kLev,
97 I myTime, myThid )
98 ENDIF
99 #endif
100
101 RETURN
102 END
103
104 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
105 CBOP
106 C !ROUTINE: EXTERNAL_FORCING_V
107 C !INTERFACE:
108 SUBROUTINE EXTERNAL_FORCING_V(
109 I iMin,iMax, jMin,jMax, bi,bj, kLev,
110 I myTime, myThid )
111 C !DESCRIPTION: \bv
112 C *==========================================================*
113 C | S/R EXTERNAL_FORCING_V
114 C | o Contains problem specific forcing for merid velocity.
115 C *==========================================================*
116 C | Adds terms to gV for forcing by external sources
117 C | e.g. wind stress, bottom friction etc ...
118 C *==========================================================*
119 C \ev
120
121 C !USES:
122 IMPLICIT NONE
123 C == Global data ==
124 #include "SIZE.h"
125 #include "EEPARAMS.h"
126 #include "PARAMS.h"
127 #include "GRID.h"
128 #include "DYNVARS.h"
129 #include "FFIELDS.h"
130
131 C !INPUT/OUTPUT PARAMETERS:
132 C == Routine arguments ==
133 C iMin,iMax :: Working range of x-index for applying forcing.
134 C jMin,jMax :: Working range of y-index for applying forcing.
135 C bi,bj :: Current tile indices
136 C kLev :: Current vertical level index
137 C myTime :: Current time in simulation
138 C myThid :: Thread Id number
139 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
140 _RL myTime
141 INTEGER myThid
142
143 C !LOCAL VARIABLES:
144 C == Local variables ==
145 C i,j :: Loop counters
146 C kSurface :: index of surface layer
147 INTEGER i, j
148 INTEGER kSurface
149 CEOP
150
151 IF ( fluidIsAir ) THEN
152 kSurface = 0
153 ELSEIF ( usingPCoords ) THEN
154 kSurface = Nr
155 ELSE
156 kSurface = 1
157 ENDIF
158
159 C-- Forcing term
160 #ifdef ALLOW_AIM
161 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_V(
162 & iMin,iMax, jMin,jMax, bi,bj, kLev,
163 & myTime, myThid )
164 #endif /* ALLOW_AIM */
165
166 #ifdef ALLOW_FIZHI
167 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_V(
168 & iMin,iMax, jMin,jMax, bi,bj, kLev,
169 & myTime, myThid )
170 #endif /* ALLOW_FIZHI */
171
172 C Add windstress momentum impulse into the top-layer
173 IF ( kLev .EQ. kSurface ) THEN
174 DO j=1,sNy+1
175 c DO i=1,sNx
176 C-jmc: Without CD-scheme, this is OK ; but with CD-scheme, needs to cover [0:sNx+1]
177 DO i=0,sNx+1
178 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
179 & +foFacMom*surfaceForcingV(i,j,bi,bj)
180 & *recip_drF(kLev)*recip_hFacS(i,j,kLev,bi,bj)
181 ENDDO
182 ENDDO
183 ENDIF
184
185 #if (defined (ALLOW_TAU_EDDY))
186 CALL TAUEDDY_EXTERNAL_FORCING_V(
187 I iMin,iMax, jMin,jMax, bi,bj, kLev,
188 I myTime, myThid )
189 #endif
190
191 #ifdef ALLOW_OBCS
192 IF (useOBCS) THEN
193 CALL OBCS_SPONGE_V(
194 I iMin,iMax, jMin,jMax, bi,bj, kLev,
195 I myTime, myThid )
196 ENDIF
197 #endif
198
199 RETURN
200 END
201
202 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
203 CBOP
204 C !ROUTINE: EXTERNAL_FORCING_T
205 C !INTERFACE:
206 SUBROUTINE EXTERNAL_FORCING_T(
207 I iMin,iMax, jMin,jMax, bi,bj, kLev,
208 I myTime, myThid )
209 C !DESCRIPTION: \bv
210 C *==========================================================*
211 C | S/R EXTERNAL_FORCING_T
212 C | o Contains problem specific forcing for temperature.
213 C *==========================================================*
214 C | Adds terms to gT for forcing by external sources
215 C | e.g. heat flux, climatalogical relaxation, etc ...
216 C *==========================================================*
217 C \ev
218
219 C !USES:
220 IMPLICIT NONE
221 C == Global data ==
222 #include "SIZE.h"
223 #include "EEPARAMS.h"
224 #include "PARAMS.h"
225 #include "GRID.h"
226 #include "DYNVARS.h"
227 #include "FFIELDS.h"
228
229 C !INPUT/OUTPUT PARAMETERS:
230 C == Routine arguments ==
231 C iMin,iMax :: Working range of x-index for applying forcing.
232 C jMin,jMax :: Working range of y-index for applying forcing.
233 C bi,bj :: Current tile indices
234 C kLev :: Current vertical level index
235 C myTime :: Current time in simulation
236 C myThid :: Thread Id number
237 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
238 _RL myTime
239 INTEGER myThid
240
241 C !LOCAL VARIABLES:
242 C == Local variables ==
243 C i,j :: Loop counters
244 C kSurface :: index of surface layer
245 INTEGER i, j
246 INTEGER kSurface
247 CEOP
248 #ifdef SHORTWAVE_HEATING
249 integer two
250 _RL minusone
251 parameter (two=2,minusone=-1.)
252 _RL swfracb(two)
253 INTEGER kp1
254 #endif
255
256 IF ( fluidIsAir ) THEN
257 kSurface = 0
258 ELSEIF ( usingPCoords ) THEN
259 kSurface = Nr
260 ELSE
261 kSurface = 1
262 ENDIF
263
264 C-- Forcing term
265 #ifdef ALLOW_AIM
266 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_T(
267 & iMin,iMax, jMin,jMax, bi,bj, kLev,
268 & myTime, myThid )
269 #endif /* ALLOW_AIM */
270
271 #ifdef ALLOW_FIZHI
272 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_T(
273 & iMin,iMax, jMin,jMax, bi,bj, kLev,
274 & myTime, myThid )
275 #endif /* ALLOW_FIZHI */
276
277 C Add heat in top-layer
278 IF ( kLev .EQ. kSurface ) THEN
279 DO j=1,sNy
280 DO i=1,sNx
281 gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
282 & +surfaceForcingT(i,j,bi,bj)
283 & *recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
284 ENDDO
285 ENDDO
286 ENDIF
287
288 #ifdef SHORTWAVE_HEATING
289 C Penetrating SW radiation
290 c IF ( usePenetratingSW ) THEN
291 swfracb(1)=abs(rF(klev))
292 swfracb(2)=abs(rF(klev+1))
293 CALL SWFRAC(
294 I two,minusone,
295 I myTime,myThid,
296 U swfracb)
297 kp1 = klev+1
298 IF (klev.EQ.Nr) THEN
299 kp1 = klev
300 swfracb(2)=0. _d 0
301 ENDIF
302 DO j=1,sNy
303 DO i=1,sNx
304 gT(i,j,klev,bi,bj) = gT(i,j,klev,bi,bj)
305 & -Qsw(i,j,bi,bj)*(swfracb(1)*maskC(i,j,klev,bi,bj)
306 & -swfracb(2)*maskC(i,j,kp1, bi,bj))
307 & *recip_Cp*recip_rhoConst
308 & *recip_drF(klev)*recip_hFacC(i,j,kLev,bi,bj)
309 ENDDO
310 ENDDO
311 c ENDIF
312 #endif
313
314 #ifdef ALLOW_RBCS
315 if (useRBCS) then
316 call RBCS_ADD_TENDENCY(bi,bj,klev, 1,
317 & myTime, myThid )
318 endif
319 #endif
320
321 #ifdef ALLOW_OBCS
322 IF (useOBCS) THEN
323 CALL OBCS_SPONGE_T(
324 I iMin,iMax, jMin,jMax, bi,bj, kLev,
325 I myTime, myThid )
326 ENDIF
327 #endif
328
329 RETURN
330 END
331
332 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
333 CBOP
334 C !ROUTINE: EXTERNAL_FORCING_S
335 C !INTERFACE:
336 SUBROUTINE EXTERNAL_FORCING_S(
337 I iMin,iMax, jMin,jMax, bi,bj, kLev,
338 I myTime, myThid )
339
340 C !DESCRIPTION: \bv
341 C *==========================================================*
342 C | S/R EXTERNAL_FORCING_S
343 C | o Contains problem specific forcing for merid velocity.
344 C *==========================================================*
345 C | Adds terms to gS for forcing by external sources
346 C | e.g. fresh-water flux, climatalogical relaxation, etc ...
347 C *==========================================================*
348 C \ev
349
350 C !USES:
351 IMPLICIT NONE
352 C == Global data ==
353 #include "SIZE.h"
354 #include "EEPARAMS.h"
355 #include "PARAMS.h"
356 #include "GRID.h"
357 #include "DYNVARS.h"
358 #include "FFIELDS.h"
359
360 C !INPUT/OUTPUT PARAMETERS:
361 C == Routine arguments ==
362 C iMin,iMax :: Working range of x-index for applying forcing.
363 C jMin,jMax :: Working range of y-index for applying forcing.
364 C bi,bj :: Current tile indices
365 C kLev :: Current vertical level index
366 C myTime :: Current time in simulation
367 C myThid :: Thread Id number
368 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
369 _RL myTime
370 INTEGER myThid
371
372 C !LOCAL VARIABLES:
373 C == Local variables ==
374 C i,j :: Loop counters
375 C kSurface :: index of surface layer
376 INTEGER i, j
377 INTEGER kSurface
378 CEOP
379
380 IF ( fluidIsAir ) THEN
381 kSurface = 0
382 ELSEIF ( usingPCoords ) THEN
383 kSurface = Nr
384 ELSE
385 kSurface = 1
386 ENDIF
387
388 C-- Forcing term
389 #ifdef ALLOW_AIM
390 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_S(
391 & iMin,iMax, jMin,jMax, bi,bj, kLev,
392 & myTime, myThid )
393 #endif /* ALLOW_AIM */
394
395 #ifdef ALLOW_FIZHI
396 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_S(
397 & iMin,iMax, jMin,jMax, bi,bj, kLev,
398 & myTime, myThid )
399 #endif /* ALLOW_FIZHI */
400
401 C Add fresh-water in top-layer
402 IF ( kLev .EQ. kSurface ) THEN
403 DO j=1,sNy
404 DO i=1,sNx
405 gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
406 & +surfaceForcingS(i,j,bi,bj)
407 & *recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
408 ENDDO
409 ENDDO
410 ENDIF
411
412 #ifdef ALLOW_RBCS
413 if (useRBCS) then
414 call RBCS_ADD_TENDENCY(bi,bj,klev, 2,
415 & myTime, myThid )
416 endif
417 #endif
418
419 #ifdef ALLOW_OBCS
420 IF (useOBCS) THEN
421 CALL OBCS_SPONGE_S(
422 I iMin,iMax, jMin,jMax, bi,bj, kLev,
423 I myTime, myThid )
424 ENDIF
425 #endif
426
427 RETURN
428 END

  ViewVC Help
Powered by ViewVC 1.1.22