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