/[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.66 - (show annotations) (download)
Wed May 21 10:44:59 2014 UTC (11 years, 7 months ago) by heimbach
Branch: MAIN
Changes since 1.65: +15 -5 lines
An Nguyen's extensions to salt_plume package
(carry corresponding heat flux along with salt redistribution)

1 C $Header: /u/gcmpack/MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/external_forcing.F,v 1.3 2014/04/29 06:49:39 atn Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6 #ifdef ALLOW_SALT_PLUME
7 #include "SALT_PLUME_OPTIONS.h"
8 #endif
9
10 C-- File external_forcing.F:
11 C-- Contents
12 C-- o EXTERNAL_FORCING_U
13 C-- o EXTERNAL_FORCING_V
14 C-- o EXTERNAL_FORCING_T
15 C-- o EXTERNAL_FORCING_S
16
17 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
18 CBOP
19 C !ROUTINE: EXTERNAL_FORCING_U
20 C !INTERFACE:
21 SUBROUTINE EXTERNAL_FORCING_U(
22 I iMin,iMax, jMin,jMax, bi,bj, kLev,
23 I myTime, myThid )
24 C !DESCRIPTION: \bv
25 C *==========================================================*
26 C | S/R EXTERNAL_FORCING_U
27 C | o Contains problem specific forcing for zonal velocity.
28 C *==========================================================*
29 C | Adds terms to gU for forcing by external sources
30 C | e.g. wind stress, bottom friction etc ...
31 C *==========================================================*
32 C \ev
33
34 C !USES:
35 IMPLICIT NONE
36 C == Global data ==
37 #include "SIZE.h"
38 #include "EEPARAMS.h"
39 #include "PARAMS.h"
40 #include "GRID.h"
41 #include "DYNVARS.h"
42 #include "FFIELDS.h"
43
44 C !INPUT/OUTPUT PARAMETERS:
45 C == Routine arguments ==
46 C iMin,iMax :: Working range of x-index for applying forcing.
47 C jMin,jMax :: Working range of y-index for applying forcing.
48 C bi,bj :: Current tile indices
49 C kLev :: Current vertical level index
50 C myTime :: Current time in simulation
51 C myThid :: Thread Id number
52 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
53 _RL myTime
54 INTEGER myThid
55
56 C !LOCAL VARIABLES:
57 C == Local variables ==
58 C i,j :: Loop counters
59 C kSurface :: index of surface level
60 INTEGER i, j
61 INTEGER kSurface
62 CEOP
63
64 IF ( fluidIsAir ) THEN
65 kSurface = 0
66 ELSEIF ( usingPCoords ) THEN
67 kSurface = Nr
68 ELSE
69 kSurface = 1
70 ENDIF
71
72 C-- Forcing term
73 #ifdef ALLOW_AIM
74 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_U(
75 & iMin,iMax, jMin,jMax, bi,bj, kLev,
76 & myTime, myThid )
77 #endif /* ALLOW_AIM */
78
79 #ifdef ALLOW_ATM_PHYS
80 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_U(
81 & iMin,iMax, jMin,jMax, bi,bj, kLev,
82 & myTime, myThid )
83 #endif /* ALLOW_ATM_PHYS */
84
85 #ifdef ALLOW_FIZHI
86 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_U(
87 & iMin,iMax, jMin,jMax, bi,bj, kLev,
88 & myTime, myThid )
89 #endif /* ALLOW_FIZHI */
90
91 C Ocean: Add momentum surface forcing (e.g., wind-stress) in surface level
92 IF ( kLev .EQ. kSurface ) THEN
93 c DO j=1,sNy
94 C-jmc: Without CD-scheme, this is OK ; but with CD-scheme, needs to cover [0:sNy+1]
95 DO j=0,sNy+1
96 DO i=1,sNx+1
97 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
98 & +foFacMom*surfaceForcingU(i,j,bi,bj)
99 & *recip_drF(kLev)*_recip_hFacW(i,j,kLev,bi,bj)
100 ENDDO
101 ENDDO
102 ELSEIF ( kSurface.EQ.-1 ) THEN
103 DO j=0,sNy+1
104 DO i=1,sNx+1
105 IF ( kSurfW(i,j,bi,bj).EQ.kLev ) THEN
106 gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
107 & +foFacMom*surfaceForcingU(i,j,bi,bj)
108 & *recip_drF(kLev)*_recip_hFacW(i,j,kLev,bi,bj)
109 ENDIF
110 ENDDO
111 ENDDO
112 ENDIF
113
114 #ifdef ALLOW_EDDYPSI
115 CALL TAUEDDY_EXTERNAL_FORCING_U(
116 I iMin,iMax, jMin,jMax, bi,bj, kLev,
117 I myTime, myThid )
118 #endif
119
120 #ifdef ALLOW_RBCS
121 IF (useRBCS) THEN
122 CALL RBCS_ADD_TENDENCY( bi, bj, klev, -1,
123 & myTime, myThid )
124 ENDIF
125 #endif
126
127 #ifdef ALLOW_OBCS
128 IF (useOBCS) THEN
129 CALL OBCS_SPONGE_U(
130 I iMin,iMax, jMin,jMax, bi,bj, kLev,
131 I myTime, myThid )
132 ENDIF
133 #endif
134
135 #ifdef ALLOW_MYPACKAGE
136 IF ( useMYPACKAGE ) CALL MYPACKAGE_TENDENCY_APPLY_U(
137 & iMin,iMax, jMin,jMax, bi,bj, kLev,
138 & myTime, myThid )
139 #endif /* ALLOW_MYPACKAGE */
140
141 RETURN
142 END
143
144 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
145 CBOP
146 C !ROUTINE: EXTERNAL_FORCING_V
147 C !INTERFACE:
148 SUBROUTINE EXTERNAL_FORCING_V(
149 I iMin,iMax, jMin,jMax, bi,bj, kLev,
150 I myTime, myThid )
151 C !DESCRIPTION: \bv
152 C *==========================================================*
153 C | S/R EXTERNAL_FORCING_V
154 C | o Contains problem specific forcing for merid velocity.
155 C *==========================================================*
156 C | Adds terms to gV for forcing by external sources
157 C | e.g. wind stress, bottom friction etc ...
158 C *==========================================================*
159 C \ev
160
161 C !USES:
162 IMPLICIT NONE
163 C == Global data ==
164 #include "SIZE.h"
165 #include "EEPARAMS.h"
166 #include "PARAMS.h"
167 #include "GRID.h"
168 #include "DYNVARS.h"
169 #include "FFIELDS.h"
170
171 C !INPUT/OUTPUT PARAMETERS:
172 C == Routine arguments ==
173 C iMin,iMax :: Working range of x-index for applying forcing.
174 C jMin,jMax :: Working range of y-index for applying forcing.
175 C bi,bj :: Current tile indices
176 C kLev :: Current vertical level index
177 C myTime :: Current time in simulation
178 C myThid :: Thread Id number
179 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
180 _RL myTime
181 INTEGER myThid
182
183 C !LOCAL VARIABLES:
184 C == Local variables ==
185 C i,j :: Loop counters
186 C kSurface :: index of surface level
187 INTEGER i, j
188 INTEGER kSurface
189 CEOP
190
191 IF ( fluidIsAir ) THEN
192 kSurface = 0
193 ELSEIF ( usingPCoords ) THEN
194 kSurface = Nr
195 ELSE
196 kSurface = 1
197 ENDIF
198
199 C-- Forcing term
200 #ifdef ALLOW_AIM
201 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_V(
202 & iMin,iMax, jMin,jMax, bi,bj, kLev,
203 & myTime, myThid )
204 #endif /* ALLOW_AIM */
205
206 #ifdef ALLOW_ATM_PHYS
207 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_V(
208 & iMin,iMax, jMin,jMax, bi,bj, kLev,
209 & myTime, myThid )
210 #endif /* ALLOW_ATM_PHYS */
211
212 #ifdef ALLOW_FIZHI
213 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_V(
214 & iMin,iMax, jMin,jMax, bi,bj, kLev,
215 & myTime, myThid )
216 #endif /* ALLOW_FIZHI */
217
218 C Ocean: Add momentum surface forcing (e.g., wind-stress) in surface level
219 IF ( kLev .EQ. kSurface ) THEN
220 DO j=1,sNy+1
221 c DO i=1,sNx
222 C-jmc: Without CD-scheme, this is OK ; but with CD-scheme, needs to cover [0:sNx+1]
223 DO i=0,sNx+1
224 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
225 & +foFacMom*surfaceForcingV(i,j,bi,bj)
226 & *recip_drF(kLev)*_recip_hFacS(i,j,kLev,bi,bj)
227 ENDDO
228 ENDDO
229 ELSEIF ( kSurface.EQ.-1 ) THEN
230 DO j=1,sNy+1
231 DO i=0,sNx+1
232 IF ( kSurfS(i,j,bi,bj).EQ.kLev ) THEN
233 gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
234 & +foFacMom*surfaceForcingV(i,j,bi,bj)
235 & *recip_drF(kLev)*_recip_hFacS(i,j,kLev,bi,bj)
236 ENDIF
237 ENDDO
238 ENDDO
239 ENDIF
240
241 #ifdef ALLOW_EDDYPSI
242 CALL TAUEDDY_EXTERNAL_FORCING_V(
243 I iMin,iMax, jMin,jMax, bi,bj, kLev,
244 I myTime, myThid )
245 #endif
246
247 #ifdef ALLOW_RBCS
248 IF (useRBCS) THEN
249 CALL RBCS_ADD_TENDENCY( bi, bj, klev, -2,
250 & myTime, myThid )
251 ENDIF
252 #endif
253
254 #ifdef ALLOW_OBCS
255 IF (useOBCS) THEN
256 CALL OBCS_SPONGE_V(
257 I iMin,iMax, jMin,jMax, bi,bj, kLev,
258 I myTime, myThid )
259 ENDIF
260 #endif
261
262 #ifdef ALLOW_MYPACKAGE
263 IF ( useMYPACKAGE ) CALL MYPACKAGE_TENDENCY_APPLY_V(
264 & iMin,iMax, jMin,jMax, bi,bj, kLev,
265 & myTime, myThid )
266 #endif /* ALLOW_MYPACKAGE */
267
268 RETURN
269 END
270
271 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
272 CBOP
273 C !ROUTINE: EXTERNAL_FORCING_T
274 C !INTERFACE:
275 SUBROUTINE EXTERNAL_FORCING_T(
276 I iMin,iMax, jMin,jMax, bi,bj, kLev,
277 I myTime, myThid )
278 C !DESCRIPTION: \bv
279 C *==========================================================*
280 C | S/R EXTERNAL_FORCING_T
281 C | o Contains problem specific forcing for temperature.
282 C *==========================================================*
283 C | Adds terms to gT for forcing by external sources
284 C | e.g. heat flux, climatalogical relaxation, etc ...
285 C *==========================================================*
286 C \ev
287
288 C !USES:
289 IMPLICIT NONE
290 C == Global data ==
291 #include "SIZE.h"
292 #include "EEPARAMS.h"
293 #include "PARAMS.h"
294 #include "GRID.h"
295 #include "DYNVARS.h"
296 #include "FFIELDS.h"
297 #include "SURFACE.h"
298
299 C !INPUT/OUTPUT PARAMETERS:
300 C == Routine arguments ==
301 C iMin,iMax :: Working range of x-index for applying forcing.
302 C jMin,jMax :: Working range of y-index for applying forcing.
303 C bi,bj :: Current tile indices
304 C kLev :: Current vertical level index
305 C myTime :: Current time in simulation
306 C myThid :: Thread Id number
307 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
308 _RL myTime
309 INTEGER myThid
310
311 C !LOCAL VARIABLES:
312 C == Local variables ==
313 C i,j :: Loop counters
314 C kSurface :: index of surface level
315 INTEGER i, j
316 INTEGER kSurface
317 INTEGER km, kc, kp
318 _RL tmpVar(1:sNx,1:sNy)
319 _RL tmpFac, delPI
320 CEOP
321 c#ifdef ALLOW_FRICTION_HEATING
322 c _RL tmpFac
323 c#endif
324 #ifdef SHORTWAVE_HEATING
325 _RL minusone
326 PARAMETER (minusOne=-1.)
327 _RL swfracb(2)
328 INTEGER kp1
329 #endif
330
331 IF ( fluidIsAir ) THEN
332 kSurface = 0
333 ELSEIF ( usingZCoords .AND. useShelfIce ) THEN
334 kSurface = -1
335 ELSEIF ( usingPCoords ) THEN
336 kSurface = Nr
337 ELSE
338 kSurface = 1
339 ENDIF
340
341 C-- Forcing term
342 #ifdef ALLOW_AIM
343 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_T(
344 & iMin,iMax, jMin,jMax, bi,bj, kLev,
345 & myTime, myThid )
346 #endif /* ALLOW_AIM */
347
348 #ifdef ALLOW_ATM_PHYS
349 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_T(
350 & iMin,iMax, jMin,jMax, bi,bj, kLev,
351 & myTime, myThid )
352 #endif /* ALLOW_ATM_PHYS */
353
354 #ifdef ALLOW_FIZHI
355 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_T(
356 & iMin,iMax, jMin,jMax, bi,bj, kLev,
357 & myTime, myThid )
358 #endif /* ALLOW_FIZHI */
359
360 #ifdef ALLOW_ADDFLUID
361 IF ( selectAddFluid.NE.0 .AND. temp_addMass.NE.UNSET_RL ) THEN
362 IF ( ( selectAddFluid.GE.1 .AND. nonlinFreeSurf.GT.0 )
363 & .OR. convertFW2Salt.EQ.-1. _d 0 ) THEN
364 DO j=1,sNy
365 DO i=1,sNx
366 gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj)
367 & + addMass(i,j,kLev,bi,bj)*mass2rUnit
368 & *( temp_addMass - theta(i,j,kLev,bi,bj) )
369 & *recip_rA(i,j,bi,bj)
370 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
371 C & *recip_deepFac2C(kLev)*recip_rhoFacC(kLev)
372 ENDDO
373 ENDDO
374 ELSE
375 DO j=1,sNy
376 DO i=1,sNx
377 gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj)
378 & + addMass(i,j,kLev,bi,bj)*mass2rUnit
379 & *( temp_addMass - tRef(kLev) )
380 & *recip_rA(i,j,bi,bj)
381 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
382 C & *recip_deepFac2C(kLev)*recip_rhoFacC(kLev)
383 ENDDO
384 ENDDO
385 ENDIF
386 ENDIF
387 #endif /* ALLOW_ADDFLUID */
388
389 #ifdef ALLOW_FRICTION_HEATING
390 IF ( addFrictionHeating ) THEN
391 IF ( fluidIsAir ) THEN
392 C conversion from in-situ Temp to Pot.Temp
393 tmpFac = (atm_Po/rC(kLev))**atm_kappa
394 C conversion from W/m^2/r_unit to K/s
395 tmpFac = (tmpFac/atm_Cp) * mass2rUnit
396 ELSE
397 C conversion from W/m^2/r_unit to K/s
398 tmpFac = mass2rUnit/HeatCapacity_Cp
399 ENDIF
400 DO j=1,sNy
401 DO i=1,sNx
402 gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj)
403 & + frictionHeating(i,j,kLev,bi,bj)
404 & *tmpFac*recip_rA(i,j,bi,bj)
405 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
406 ENDDO
407 ENDDO
408 ENDIF
409 #endif /* ALLOW_FRICTION_HEATING */
410
411 IF ( fluidIsAir .AND. atm_Rq.NE.zeroRL .AND. Nr.NE.1 ) THEN
412 C-- Compressible fluid: account for difference between moist and dry air
413 C specific volume in Enthalpy equation (+ V.dP term), since only the
414 C dry air part is accounted for in the (dry) Pot.Temp formulation.
415 C Used centered averaging from interface to center (consistent with
416 C conversion term in KE eq) and same discretisation ( [T*Q]_bar_k )
417 C as for Theta_v in CALC_PHI_HYD
418
419 C conversion from in-situ Temp to Pot.Temp
420 tmpFac = (atm_Po/rC(kLev))**atm_kappa
421 C conversion from W/kg to K/s
422 tmpFac = tmpFac/atm_Cp
423 km = kLev-1
424 kc = kLev
425 kp = kLev+1
426 IF ( kLev.EQ.1 ) THEN
427 DO j=1,sNy
428 DO i=1,sNx
429 tmpVar(i,j) = 0.
430 ENDDO
431 ENDDO
432 ELSE
433 delPI = atm_Cp*( (rC(km)/atm_Po)**atm_kappa
434 & - (rC(kc)/atm_Po)**atm_kappa )
435 DO j=1,sNy
436 DO i=1,sNx
437 tmpVar(i,j) = wVel(i,j,kc,bi,bj)*delPI*atm_Rq
438 & *( theta(i,j,km,bi,bj)*salt(i,j,km,bi,bj)
439 & + theta(i,j,kc,bi,bj)*salt(i,j,kc,bi,bj)
440 & )*maskC(i,j,km,bi,bj)*0.25 _d 0
441 ENDDO
442 ENDDO
443 ENDIF
444 IF ( kLev.LT.Nr ) THEN
445 delPI = atm_Cp*( (rC(kc)/atm_Po)**atm_kappa
446 & - (rC(kp)/atm_Po)**atm_kappa )
447 DO j=1,sNy
448 DO i=1,sNx
449 tmpVar(i,j) = tmpVar(i,j)
450 & + wVel(i,j,kp,bi,bj)*delPI*atm_Rq
451 & *( theta(i,j,kc,bi,bj)*salt(i,j,kc,bi,bj)
452 & + theta(i,j,kp,bi,bj)*salt(i,j,kp,bi,bj)
453 & )*maskC(i,j,kp,bi,bj)*0.25 _d 0
454 ENDDO
455 ENDDO
456 ENDIF
457 DO j=1,sNy
458 DO i=1,sNx
459 gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj)
460 & + tmpVar(i,j)*tmpFac
461 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
462 ENDDO
463 ENDDO
464 #ifdef ALLOW_DIAGNOSTICS
465 IF ( useDiagnostics ) THEN
466 C conversion to W/m^2
467 tmpFac = rUnit2mass
468 CALL DIAGNOSTICS_SCALE_FILL( tmpVar, tmpFac, 1,
469 & 'MoistCor', kc, 1, 3, bi,bj,myThid )
470 ENDIF
471 #endif /* ALLOW_DIAGNOSTICS */
472 ENDIF
473
474 C Ocean: Add temperature surface forcing (e.g., heat-flux) in surface level
475 IF ( kLev .EQ. kSurface ) THEN
476 DO j=1,sNy
477 DO i=1,sNx
478 gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
479 & +surfaceForcingT(i,j,bi,bj)
480 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
481 ENDDO
482 ENDDO
483 ELSEIF ( kSurface.EQ.-1 ) THEN
484 DO j=1,sNy
485 DO i=1,sNx
486 IF ( kSurfC(i,j,bi,bj).EQ.kLev ) THEN
487 gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
488 & +surfaceForcingT(i,j,bi,bj)
489 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
490 ENDIF
491 ENDDO
492 ENDDO
493 ENDIF
494
495 IF (linFSConserveTr) THEN
496 DO j=1,sNy
497 DO i=1,sNx
498 IF (kLev .EQ. kSurfC(i,j,bi,bj)) THEN
499 gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
500 & +TsurfCor*recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
501 ENDIF
502 ENDDO
503 ENDDO
504 ENDIF
505
506 #ifdef ALLOW_FRAZIL
507 IF ( useFRAZIL )
508 & CALL FRAZIL_TENDENCY_APPLY_T(
509 I iMin,iMax, jMin,jMax, bi,bj, kLev,
510 I myTime, myThid )
511 #endif /* ALLOW_FRAZIL */
512
513 #ifdef ALLOW_SHELFICE
514 IF ( useShelfIce )
515 & CALL SHELFICE_FORCING_T(
516 I iMin,iMax, jMin,jMax, bi,bj, kLev,
517 I myTime, myThid )
518 #endif /* ALLOW_SHELFICE */
519
520 #ifdef ALLOW_ICEFRONT
521 IF ( useICEFRONT )
522 & CALL ICEFRONT_TENDENCY_APPLY_T(
523 & bi,bj, kLev, myTime, myThid )
524 #endif /* ALLOW_ICEFRONT */
525
526 #ifdef SHORTWAVE_HEATING
527 C Penetrating SW radiation
528 c IF ( usePenetratingSW ) THEN
529 swfracb(1)=abs(rF(klev))
530 swfracb(2)=abs(rF(klev+1))
531 CALL SWFRAC(
532 I 2, minusOne,
533 U swfracb,
534 I myTime, 1, myThid )
535 kp1 = klev+1
536 IF (klev.EQ.Nr) THEN
537 kp1 = klev
538 swfracb(2)=0. _d 0
539 ENDIF
540 DO j=1,sNy
541 DO i=1,sNx
542 gT(i,j,klev,bi,bj) = gT(i,j,klev,bi,bj)
543 & -Qsw(i,j,bi,bj)*(swfracb(1)*maskC(i,j,klev,bi,bj)
544 & -swfracb(2)*maskC(i,j,kp1, bi,bj))
545 & *mass2rUnit/HeatCapacity_Cp
546 & *recip_drF(klev)*_recip_hFacC(i,j,kLev,bi,bj)
547 ENDDO
548 ENDDO
549 c ENDIF
550 #endif
551
552 #ifdef ALLOW_RBCS
553 IF (useRBCS) THEN
554 CALL RBCS_ADD_TENDENCY(bi,bj,klev, 1,
555 & myTime, myThid )
556 ENDIF
557 #endif
558
559 #ifdef ALLOW_OBCS
560 IF (useOBCS) THEN
561 CALL OBCS_SPONGE_T(
562 I iMin,iMax, jMin,jMax, bi,bj, kLev,
563 I myTime, myThid )
564 ENDIF
565 #endif
566
567 #ifdef ALLOW_BBL
568 IF ( useBBL ) CALL BBL_TENDENCY_APPLY_T(
569 & iMin,iMax, jMin,jMax, bi,bj, kLev,
570 & myTime, myThid )
571 #endif /* ALLOW_BBL */
572
573 #ifdef ALLOW_MYPACKAGE
574 IF ( useMYPACKAGE ) CALL MYPACKAGE_TENDENCY_APPLY_T(
575 & iMin,iMax, jMin,jMax, bi,bj, kLev,
576 & myTime, myThid )
577 #endif /* ALLOW_MYPACKAGE */
578
579 RETURN
580 END
581
582 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
583 CBOP
584 C !ROUTINE: EXTERNAL_FORCING_S
585 C !INTERFACE:
586 SUBROUTINE EXTERNAL_FORCING_S(
587 I iMin,iMax, jMin,jMax, bi,bj, kLev,
588 I myTime, myThid )
589
590 C !DESCRIPTION: \bv
591 C *==========================================================*
592 C | S/R EXTERNAL_FORCING_S
593 C | o Contains problem specific forcing for merid velocity.
594 C *==========================================================*
595 C | Adds terms to gS for forcing by external sources
596 C | e.g. fresh-water flux, climatalogical relaxation, etc ...
597 C *==========================================================*
598 C \ev
599
600 C !USES:
601 IMPLICIT NONE
602 C == Global data ==
603 #include "SIZE.h"
604 #include "EEPARAMS.h"
605 #include "PARAMS.h"
606 #include "GRID.h"
607 #include "DYNVARS.h"
608 #include "FFIELDS.h"
609 #include "SURFACE.h"
610
611 C !INPUT/OUTPUT PARAMETERS:
612 C == Routine arguments ==
613 C iMin,iMax :: Working range of x-index for applying forcing.
614 C jMin,jMax :: Working range of y-index for applying forcing.
615 C bi,bj :: Current tile indices
616 C kLev :: Current vertical level index
617 C myTime :: Current time in simulation
618 C myThid :: Thread Id number
619 INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
620 _RL myTime
621 INTEGER myThid
622
623 C !LOCAL VARIABLES:
624 C == Local variables ==
625 C i,j :: Loop counters
626 C kSurface :: index of surface level
627 INTEGER i, j
628 INTEGER kSurface
629 CEOP
630
631 IF ( fluidIsAir ) THEN
632 kSurface = 0
633 ELSEIF ( usingZCoords .AND. useShelfIce ) THEN
634 kSurface = -1
635 ELSEIF ( usingPCoords ) THEN
636 kSurface = Nr
637 ELSE
638 kSurface = 1
639 ENDIF
640
641 C-- Forcing term
642 #ifdef ALLOW_AIM
643 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_S(
644 & iMin,iMax, jMin,jMax, bi,bj, kLev,
645 & myTime, myThid )
646 #endif /* ALLOW_AIM */
647
648 #ifdef ALLOW_ATM_PHYS
649 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_S(
650 & iMin,iMax, jMin,jMax, bi,bj, kLev,
651 & myTime, myThid )
652 #endif /* ALLOW_ATM_PHYS */
653
654 #ifdef ALLOW_FIZHI
655 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_S(
656 & iMin,iMax, jMin,jMax, bi,bj, kLev,
657 & myTime, myThid )
658 #endif /* ALLOW_FIZHI */
659
660 #ifdef ALLOW_ADDFLUID
661 IF ( selectAddFluid.NE.0 .AND. salt_addMass.NE.UNSET_RL ) THEN
662 IF ( ( selectAddFluid.GE.1 .AND. nonlinFreeSurf.GT.0 )
663 & .OR. convertFW2Salt.EQ.-1. _d 0 ) THEN
664 DO j=1,sNy
665 DO i=1,sNx
666 gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj)
667 & + addMass(i,j,kLev,bi,bj)*mass2rUnit
668 & *( salt_addMass - salt(i,j,kLev,bi,bj) )
669 & *recip_rA(i,j,bi,bj)
670 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
671 C & *recip_deepFac2C(kLev)*recip_rhoFacC(kLev)
672 ENDDO
673 ENDDO
674 ELSE
675 DO j=1,sNy
676 DO i=1,sNx
677 gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj)
678 & + addMass(i,j,kLev,bi,bj)*mass2rUnit
679 & *( salt_addMass - sRef(kLev) )
680 & *recip_rA(i,j,bi,bj)
681 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
682 C & *recip_deepFac2C(kLev)*recip_rhoFacC(kLev)
683 ENDDO
684 ENDDO
685 ENDIF
686 ENDIF
687 #endif /* ALLOW_ADDFLUID */
688
689 C Ocean: Add salinity surface forcing (e.g., fresh-water) in surface level
690 IF ( kLev .EQ. kSurface ) THEN
691 DO j=1,sNy
692 DO i=1,sNx
693 gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
694 & +surfaceForcingS(i,j,bi,bj)
695 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
696 ENDDO
697 ENDDO
698 ELSEIF ( kSurface.EQ.-1 ) THEN
699 DO j=1,sNy
700 DO i=1,sNx
701 IF ( kSurfC(i,j,bi,bj).EQ.kLev ) THEN
702 gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
703 & +surfaceForcingS(i,j,bi,bj)
704 & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
705 ENDIF
706 ENDDO
707 ENDDO
708 ENDIF
709
710 IF (linFSConserveTr) THEN
711 DO j=1,sNy
712 DO i=1,sNx
713 IF (kLev .EQ. kSurfC(i,j,bi,bj)) THEN
714 gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
715 & +SsurfCor*recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
716 ENDIF
717 ENDDO
718 ENDDO
719 ENDIF
720
721 #ifdef ALLOW_SHELFICE
722 IF ( useShelfIce )
723 & CALL SHELFICE_FORCING_S(
724 I iMin,iMax, jMin,jMax, bi,bj, kLev,
725 I myTime, myThid )
726 #endif /* ALLOW_SHELFICE */
727
728 #ifdef ALLOW_ICEFRONT
729 IF ( useICEFRONT )
730 & CALL ICEFRONT_TENDENCY_APPLY_S(
731 & bi,bj, kLev, myTime, myThid )
732 #endif /* ALLOW_ICEFRONT */
733
734 Catn: org. version of SP: do within k-loop
735 Catn new version: outside k-loop; called from [temp,salt]_integrate.F
736 #ifdef ALLOW_SALT_PLUME
737 CC#ifndef SALT_PLUME_VOLUME
738 IF ( useSALT_PLUME )
739 & CALL SALT_PLUME_TENDENCY_APPLY_S(
740 I iMin,iMax, jMin,jMax, bi,bj, kLev,
741 I myTime, myThid )
742 #ifdef SALT_PLUME_VOLUME
743 IF ( useSALT_PLUME )
744 & CALL SALT_PLUME_TENDENCY_APPLY_T(
745 I iMin,iMax, jMin,jMax, bi,bj, kLev,
746 I myTime, myThid )
747 #endif /* ndef SALT_PLUME_VOLUME */
748 #endif /* ALLOW_SALT_PLUME */
749
750 #ifdef ALLOW_RBCS
751 IF (useRBCS) THEN
752 CALL RBCS_ADD_TENDENCY(bi,bj,klev, 2,
753 & myTime, myThid )
754 ENDIF
755 #endif /* ALLOW_RBCS */
756
757 #ifdef ALLOW_OBCS
758 IF (useOBCS) THEN
759 CALL OBCS_SPONGE_S(
760 I iMin,iMax, jMin,jMax, bi,bj, kLev,
761 I myTime, myThid )
762 ENDIF
763 #endif /* ALLOW_OBCS */
764
765 #ifdef ALLOW_BBL
766 IF ( useBBL ) CALL BBL_TENDENCY_APPLY_S(
767 & iMin,iMax, jMin,jMax, bi,bj, kLev,
768 & myTime, myThid )
769 #endif /* ALLOW_BBL */
770
771 #ifdef ALLOW_MYPACKAGE
772 IF ( useMYPACKAGE ) CALL MYPACKAGE_TENDENCY_APPLY_S(
773 & iMin,iMax, jMin,jMax, bi,bj, kLev,
774 & myTime, myThid )
775 #endif /* ALLOW_MYPACKAGE */
776
777 RETURN
778 END

  ViewVC Help
Powered by ViewVC 1.1.22