/[MITgcm]/MITgcm/pkg/kpp/kpp_calc.F
ViewVC logotype

Contents of /MITgcm/pkg/kpp/kpp_calc.F

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


Revision 1.50 - (show annotations) (download)
Tue Apr 28 18:15:33 2009 UTC (15 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61n, checkpoint61q, checkpoint61o, checkpoint61m, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p
Changes since 1.49: +2 -2 lines
change macros (EXCH & GLOBAL_SUM/MAX) sufix _R4/_R8 to _RS/_RL
 when applied to _RS/_RL variable

1 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_calc.F,v 1.49 2009/02/13 21:58:36 heimbach Exp $
2 C $Name: $
3
4 #include "KPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: KPP_CALC
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE KPP_CALC(
11 I bi, bj, myTime, myIter, myThid )
12
13 C !DESCRIPTION: \bv
14 C *==========================================================*
15 C | SUBROUTINE KPP_CALC |
16 C | o Compute all KPP fields defined in KPP.h |
17 C *==========================================================*
18 C | This subroutine serves as an interface between MITGCMUV |
19 C | code and NCOM 1-D routines in kpp_routines.F |
20 C *==========================================================*
21 IMPLICIT NONE
22
23 c=======================================================================
24 c
25 c written by : jan morzel, august 11, 1994
26 c modified by : jan morzel, january 25, 1995 : "dVsq" and 1d code
27 c detlef stammer, august, 1997 : for MIT GCM Classic
28 c d. menemenlis, july, 1998 : for MIT GCM UV
29 c
30 c compute vertical mixing coefficients based on the k-profile
31 c and oceanic planetary boundary layer scheme by large & mcwilliams.
32 c
33 c summary:
34 c - compute interior mixing everywhere:
35 c interior mixing gets computed at all interfaces due to constant
36 c internal wave background activity ("fkpm" and "fkph"), which
37 c is enhanced in places of static instability (local richardson
38 c number < 0).
39 c Additionally, mixing can be enhanced by adding contribution due
40 c to shear instability which is a function of the local richardson
41 c number
42 c - double diffusivity:
43 c interior mixing can be enhanced by double diffusion due to salt
44 c fingering and diffusive convection (ifdef "kmixdd").
45 c - kpp scheme in the boundary layer:
46 c
47 c a.boundary layer depth:
48 c at every gridpoint the depth of the oceanic boundary layer
49 c ("hbl") gets computed by evaluating bulk richardson numbers.
50 c b.boundary layer mixing:
51 c within the boundary layer, above hbl, vertical mixing is
52 c determined by turbulent surface fluxes, and interior mixing at
53 c the lower boundary, i.e. at hbl.
54 c
55 c this subroutine provides the interface between the MITGCM and
56 c the routine "kppmix", where boundary layer depth, vertical
57 c viscosity, vertical diffusivity, and counter gradient term (ghat)
58 c are computed slabwise.
59 c note: subroutine "kppmix" uses m-k-s units.
60 c
61 c time level:
62 c input tracer and velocity profiles are evaluated at time level
63 c tau, surface fluxes come from tau or tau-1.
64 c
65 c grid option:
66 c in this "1-grid" implementation, diffusivity and viscosity
67 c profiles are computed on the "t-grid" (by using velocity shear
68 c profiles averaged from the "u,v-grid" onto the "t-grid"; note, that
69 c the averaging includes zero values on coastal and seafloor grid
70 c points). viscosity on the "u,v-grid" is computed by averaging the
71 c "t-grid" viscosity values onto the "u,v-grid".
72 c
73 c vertical grid:
74 c mixing coefficients get evaluated at the bottom of the lowest
75 c layer, i.e., at depth zw(Nr). these values are only useful when
76 c the model ocean domain does not include the entire ocean down to
77 c the seafloor ("upperocean" setup) and allows flux through the
78 c bottom of the domain. for full-depth runs, these mixing
79 c coefficients are being zeroed out before leaving this subroutine.
80 c
81 c-------------------------------------------------------------------------
82
83 c global parameters updated by kpp_calc
84 c KPPviscAz - KPP eddy viscosity coefficient (m^2/s)
85 c KPPdiffKzT - KPP diffusion coefficient for temperature (m^2/s)
86 c KPPdiffKzS - KPP diffusion coefficient for salt and tracers (m^2/s)
87 c KPPghat - Nonlocal transport coefficient (s/m^2)
88 c KPPhbl - Boundary layer depth on "t-grid" (m)
89 c KPPfrac - Fraction of short-wave flux penetrating mixing layer
90 c KPPplumefrac- Fraction of saltplume (flux) penetrating mixing layer
91
92 c-- KPP_CALC computes vertical viscosity and diffusivity for region
93 c (-2:sNx+3,-2:sNy+3) as required by CALC_DIFFUSIVITY and requires
94 c values of uVel, vVel, surfaceForcingU, surfaceForcingV in the
95 c region (-2:sNx+4,-2:sNy+4).
96 c Hence overlap region needs to be set OLx=4, OLy=4.
97 c \ev
98
99 C !USES: ===============================================================
100 #include "SIZE.h"
101 #include "EEPARAMS.h"
102 #include "PARAMS.h"
103 #include "DYNVARS.h"
104 #include "KPP.h"
105 #include "KPP_PARAMS.h"
106 #include "FFIELDS.h"
107 #include "GRID.h"
108 #include "GAD.h"
109 #ifdef ALLOW_SALT_PLUME
110 # include "SALT_PLUME.h"
111 #endif /* ALLOW_SALT_PLUME */
112 #ifdef ALLOW_SHELFICE
113 # include "SHELFICE.h"
114 #endif /* ALLOW_SHELFICE */
115 #ifdef ALLOW_AUTODIFF_TAMC
116 # include "tamc.h"
117 # include "tamc_keys.h"
118 #else /* ALLOW_AUTODIFF_TAMC */
119 #endif /* ALLOW_AUTODIFF_TAMC */
120
121 EXTERNAL DIFFERENT_MULTIPLE
122 LOGICAL DIFFERENT_MULTIPLE
123
124 C !INPUT PARAMETERS: ===================================================
125 c Routine arguments
126 c bi, bj :: Current tile indices
127 c myTime :: Current time in simulation
128 c myIter :: Current iteration number in simulation
129 c myThid :: My Thread Id. number
130
131 INTEGER bi, bj
132 _RL myTime
133 INTEGER myIter
134 INTEGER myThid
135
136 #ifdef ALLOW_KPP
137
138 C !LOCAL VARIABLES: ====================================================
139 c Local constants
140 c minusone, p0, p5, p25, p125, p0625
141 c imin, imax, jmin, jmax - array computation indices
142
143 _RL minusone
144 parameter( minusone=-1.0)
145 _RL p0 , p5 , p25 , p125 , p0625
146 parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
147 integer imin ,imax ,jmin ,jmax
148 parameter(imin=2-OLx,imax=sNx+OLx-1,jmin=2-OLy,jmax=sNy+OLy-1)
149
150 c Local arrays and variables
151 c work? (nx,ny) - horizontal working arrays
152 c ustar (nx,ny) - surface friction velocity (m/s)
153 c bo (nx,ny) - surface turbulent buoyancy forcing (m^2/s^3)
154 c bosol (nx,ny) - surface radiative buoyancy forcing (m^2/s^3)
155 c boplume(nx,ny) - surface haline buoyancy forcing (m^2/s^3)
156 c shsq (nx,ny,Nr) - local velocity shear squared
157 c at interfaces for ri_iwmix (m^2/s^2)
158 c dVsq (nx,ny,Nr) - velocity shear re surface squared
159 c at grid levels for bldepth (m^2/s^2)
160 c dbloc (nx,ny,Nr) - local delta buoyancy at interfaces
161 c for ri_iwmix and bldepth (m/s^2)
162 c Ritop (nx,ny,Nr) - numerator of bulk richardson number
163 c at grid levels for bldepth
164 c vddiff (nx,ny,Nrp2,1)- vertical viscosity on "t-grid" (m^2/s)
165 c vddiff (nx,ny,Nrp2,2)- vert. diff. on next row for salt&tracers (m^2/s)
166 c vddiff (nx,ny,Nrp2,3)- vert. diff. on next row for temperature (m^2/s)
167 c ghat (nx,ny,Nr) - nonlocal transport coefficient (s/m^2)
168 c hbl (nx,ny) - mixing layer depth (m)
169 c kmtj (nx,ny) - maximum number of wet levels in each column
170 c z0 (nx,ny) - Roughness length (m)
171 c zRef (nx,ny) - Reference depth: Hmix * epsilon (m)
172 c uRef (nx,ny) - Reference zonal velocity (m/s)
173 c vRef (nx,ny) - Reference meridional velocity (m/s)
174
175 integer work1 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
176 _RL worka ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
177 _RL work2 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
178 _RL work3 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
179 _RL ustar ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
180 _RL bo ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
181 _RL bosol ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
182 #ifdef ALLOW_SALT_PLUME
183 _RL boplume ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
184 #endif /* ALLOW_SALT_PLUME */
185 _RL shsq ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
186 _RL dVsq ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
187 _RL dbloc ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
188 _RL Ritop ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
189 _RL vddiff( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, 0:Nrp1, mdiff )
190 _RL ghat ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
191 _RL hbl ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
192 cph(
193 _RL TTALPHA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
194 _RL SSBETA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
195 cph)
196 #ifdef KPP_ESTIMATE_UREF
197 _RL z0 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
198 _RL zRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
199 _RL uRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
200 _RL vRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
201 #endif /* KPP_ESTIMATE_UREF */
202
203 _RL tempvar2
204 integer i, j, k, kp1, km1, im1, ip1, jm1, jp1
205 integer ikppkey
206
207 #ifdef KPP_ESTIMATE_UREF
208 _RL tempvar1, dBdz1, dBdz2, ustarX, ustarY
209 #endif
210
211 #ifdef ALLOW_AUTODIFF_TAMC
212 act1 = bi - myBxLo(myThid)
213 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
214 act2 = bj - myByLo(myThid)
215 max2 = myByHi(myThid) - myByLo(myThid) + 1
216 act3 = myThid - 1
217 max3 = nTx*nTy
218 act4 = ikey_dynamics - 1
219 ikppkey = (act1 + 1) + act2*max1
220 & + act3*max1*max2
221 & + act4*max1*max2*max3
222 #endif /* ALLOW_AUTODIFF_TAMC */
223 CEOP
224
225 c Check to see if new vertical mixing coefficient should be computed now?
226 IF ( DIFFERENT_MULTIPLE(kpp_freq,myTime,deltaTClock)
227 1 .OR. myTime .EQ. startTime ) THEN
228
229 c-----------------------------------------------------------------------
230 c prepare input arrays for subroutine "kppmix" to compute
231 c viscosity and diffusivity and ghat.
232 c All input arrays need to be in m-k-s units.
233 c
234 c note: for the computation of the bulk richardson number in the
235 c "bldepth" subroutine, gradients of velocity and buoyancy are
236 c required at every depth. in the case of very fine vertical grids
237 c (thickness of top layer < 2m), the surface reference depth must
238 c be set to zref=epsilon/2*zgrid(k), and the reference value
239 c of velocity and buoyancy must be computed as vertical average
240 c between the surface and 2*zref. in the case of coarse vertical
241 c grids zref is zgrid(1)/2., and the surface reference value is
242 c simply the surface value at zgrid(1).
243 c-----------------------------------------------------------------------
244
245 c------------------------------------------------------------------------
246 c density related quantities
247 c --------------------------
248 c
249 c work2 - density of surface layer (kg/m^3)
250 c dbloc - local buoyancy gradient at Nr interfaces
251 c g/rho{k+1,k+1} * [ drho{k,k+1}-drho{k+1,k+1} ] (m/s^2)
252 c dbsfc (stored in Ritop to conserve stack memory)
253 c - buoyancy difference with respect to the surface
254 c g * [ drho{1,k}/rho{1,k} - drho{k,k}/rho{k,k} ] (m/s^2)
255 c ttalpha (stored in vddiff(:,:,:,1) to conserve stack memory)
256 c - thermal expansion coefficient without 1/rho factor
257 c d(rho{k,k})/d(T(k)) (kg/m^3/C)
258 c ssbeta (stored in vddiff(:,:,:,2) to conserve stack memory)
259 c - salt expansion coefficient without 1/rho factor
260 c d(rho{k,k})/d(S(k)) (kg/m^3/PSU)
261 c------------------------------------------------------------------------
262
263 CALL STATEKPP(
264 O work2, dbloc, Ritop,
265 O TTALPHA, SSBETA,
266 I ikppkey, bi, bj, myThid )
267
268 DO k = 1, Nr
269 DO j = 1-OLy, sNy+OLy
270 DO i = 1-OLx, sNx+OLx
271 ghat(i,j,k) = dbloc(i,j,k)
272 ENDDO
273 ENDDO
274 ENDDO
275
276 #ifdef KPP_SMOOTH_DBLOC
277 c horizontally smooth dbloc with a 121 filter
278 c smooth dbloc stored in ghat to save space
279 c dbloc(k) is buoyancy gradientnote between k and k+1
280 c levels therefore k+1 mask must be used
281
282 DO k = 1, Nr-1
283 CALL SMOOTH_HORIZ (
284 I k+1, bi, bj,
285 U ghat (1-OLx,1-OLy,k),
286 I myThid )
287 ENDDO
288
289 #endif /* KPP_SMOOTH_DBLOC */
290
291 #ifdef KPP_SMOOTH_DENS
292 c horizontally smooth density related quantities with 121 filters
293 CALL SMOOTH_HORIZ (
294 I 1, bi, bj,
295 U work2,
296 I myThid )
297 DO k = 1, Nr
298 CALL SMOOTH_HORIZ (
299 I k+1, bi, bj,
300 U dbloc (1-OLx,1-OLy,k),
301 I myThid )
302 CALL SMOOTH_HORIZ (
303 I k, bi, bj,
304 U Ritop (1-OLx,1-OLy,k),
305 I myThid )
306 CALL SMOOTH_HORIZ (
307 I k, bi, bj,
308 U TTALPHA(1-OLx,1-OLy,k),
309 I myThid )
310 CALL SMOOTH_HORIZ (
311 I k, bi, bj,
312 U SSBETA(1-OLx,1-OLy,k),
313 I myThid )
314 ENDDO
315 #endif /* KPP_SMOOTH_DENS */
316
317 DO k = 1, Nr
318 km1 = max(1,k-1)
319 DO j = 1-OLy, sNy+OLy
320 DO i = 1-OLx, sNx+OLx
321
322 c zero out dbloc over land points (so that the convective
323 c part of the interior mixing can be diagnosed)
324 dbloc(i,j,k) = dbloc(i,j,k) * maskC(i,j,k,bi,bj)
325 & * maskC(i,j,km1,bi,bj)
326 ghat(i,j,k) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
327 & * maskC(i,j,km1,bi,bj)
328 Ritop(i,j,k) = Ritop(i,j,k) * maskC(i,j,k,bi,bj)
329 & * maskC(i,j,km1,bi,bj)
330 if(k.eq.nzmax(i,j,bi,bj)) then
331 dbloc(i,j,k) = p0
332 ghat(i,j,k) = p0
333 Ritop(i,j,k) = p0
334 endif
335
336 c numerator of bulk richardson number on grid levels
337 c note: land and ocean bottom values need to be set to zero
338 c so that the subroutine "bldepth" works correctly
339 Ritop(i,j,k) = (zgrid(1)-zgrid(k)) * Ritop(i,j,k)
340
341 ENDDO
342 ENDDO
343 ENDDO
344
345 cph(
346 cph this avoids a single or double recomp./call of statekpp
347 CADJ store work2 = comlev1_kpp, key = ikppkey
348 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
349 CADJ store dbloc, Ritop, ghat = comlev1_kpp, key = ikppkey
350 CADJ store vddiff = comlev1_kpp, key = ikppkey
351 CADJ store TTALPHA, SSBETA = comlev1_kpp, key = ikppkey
352 #endif
353 cph)
354
355 CML#ifdef ALLOW_SHELFICE
356 CMLC For the pbl parameterisation to work underneath the ice shelves
357 CMLC it needs to know the surface (ice-ocean) fluxes. However, masking
358 CMLC and indexing problems make this part of the code not work
359 CMLC underneath the ice shelves and the following lines are only here
360 CMLC to remind me that this still needs to be sorted out.
361 CML shelfIceFac = 0. _d 0
362 CML IF ( useShelfIce ) selfIceFac = 1. _d 0
363 CML DO j = jmin, jmax
364 CML DO i = imin, imax
365 CML surfForcT = surfaceForcingT(i,j,bi,bj)
366 CML & + shelficeForcingT(i,j,bi,bj) * shelfIceFac
367 CML surfForcS = surfaceForcingS(i,j,bi,bj)
368 CML & + shelficeForcingS(i,j,bi,bj) * shelfIceFac
369 CML ENDDO
370 CML ENDDO
371 CML#endif /* ALLOW_SHELFICE */
372
373 c------------------------------------------------------------------------
374 c friction velocity, turbulent and radiative surface buoyancy forcing
375 c -------------------------------------------------------------------
376 c taux / rho = surfaceForcingU (N/m^2)
377 c tauy / rho = surfaceForcingV (N/m^2)
378 c ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho ) (m/s)
379 c bo = - g * ( alpha*surfaceForcingT +
380 c beta *surfaceForcingS ) / rho (m^2/s^3)
381 c bosol = - g * alpha * Qsw * drF(1) / rho (m^2/s^3)
382 c boplume = g * (beta * saltPlumeFlux/rhoConst ) /rho (m^2/s^3)
383 c------------------------------------------------------------------------
384 c velocity shear
385 c --------------
386 c Get velocity shear squared, averaged from "u,v-grid"
387 c onto "t-grid" (in (m/s)**2):
388 c dVsq(k)=(Uref-U(k))**2+(Vref-V(k))**2 at grid levels
389 c shsq(k)=(U(k)-U(k+1))**2+(V(k)-V(k+1))**2 at interfaces
390 c
391 c note: Vref can depend on the surface fluxes that is why we compute
392 c dVsq in the subroutine that does the surface related stuff
393 c (admittedly this is a bit messy)
394 c------------------------------------------------------------------------
395
396 CALL KPP_FORCING_SURF(
397 I work2, surfaceForcingU, surfaceForcingV,
398 I surfaceForcingT, surfaceForcingS, surfaceForcingTice,
399 I Qsw,
400 #ifdef ALLOW_SALT_PLUME
401 I saltPlumeFlux,
402 #endif /* ALLOW_SALT_PLUME */
403 I ttalpha, ssbeta,
404 O ustar, bo, bosol,
405 #ifdef ALLOW_SALT_PLUME
406 O boplume,
407 #endif /* ALLOW_SALT_PLUME */
408 O dVsq,
409 I ikppkey, iMin, iMax, jMin, jMax, bi, bj, myTime, myThid )
410
411 CMLcph(
412 CMLCADJ store ustar = comlev1_kpp, key = ikppkey
413 CMLcph)
414
415 c initialize arrays to zero
416 DO k = 1, Nr
417 DO j = 1-OLy, sNy+OLy
418 DO i = 1-OLx, sNx+OLx
419 shsq(i,j,k) = p0
420 ENDDO
421 ENDDO
422 ENDDO
423
424 c shsq computation
425 DO k = 1, Nrm1
426 kp1 = k + 1
427 DO j = jmin, jmax
428 jm1 = j - 1
429 jp1 = j + 1
430 DO i = imin, imax
431 im1 = i - 1
432 ip1 = i + 1
433 shsq(i,j,k) = p5 * (
434 & (uVel(i, j, k,bi,bj)-uVel(i, j, kp1,bi,bj)) *
435 & (uVel(i, j, k,bi,bj)-uVel(i, j, kp1,bi,bj)) +
436 & (uVel(ip1,j, k,bi,bj)-uVel(ip1,j, kp1,bi,bj)) *
437 & (uVel(ip1,j, k,bi,bj)-uVel(ip1,j, kp1,bi,bj)) +
438 & (vVel(i, j, k,bi,bj)-vVel(i, j, kp1,bi,bj)) *
439 & (vVel(i, j, k,bi,bj)-vVel(i, j, kp1,bi,bj)) +
440 & (vVel(i, jp1,k,bi,bj)-vVel(i, jp1,kp1,bi,bj)) *
441 & (vVel(i, jp1,k,bi,bj)-vVel(i, jp1,kp1,bi,bj)) )
442 #ifdef KPP_SMOOTH_SHSQ
443 shsq(i,j,k) = p5 * shsq(i,j,k) + p125 * (
444 & (uVel(i, jm1,k,bi,bj)-uVel(i, jm1,kp1,bi,bj)) *
445 & (uVel(i, jm1,k,bi,bj)-uVel(i, jm1,kp1,bi,bj)) +
446 & (uVel(ip1,jm1,k,bi,bj)-uVel(ip1,jm1,kp1,bi,bj)) *
447 & (uVel(ip1,jm1,k,bi,bj)-uVel(ip1,jm1,kp1,bi,bj)) +
448 & (uVel(i, jp1,k,bi,bj)-uVel(i, jp1,kp1,bi,bj)) *
449 & (uVel(i, jp1,k,bi,bj)-uVel(i, jp1,kp1,bi,bj)) +
450 & (uVel(ip1,jp1,k,bi,bj)-uVel(ip1,jp1,kp1,bi,bj)) *
451 & (uVel(ip1,jp1,k,bi,bj)-uVel(ip1,jp1,kp1,bi,bj)) +
452 & (vVel(im1,j, k,bi,bj)-vVel(im1,j, kp1,bi,bj)) *
453 & (vVel(im1,j, k,bi,bj)-vVel(im1,j, kp1,bi,bj)) +
454 & (vVel(im1,jp1,k,bi,bj)-vVel(im1,jp1,kp1,bi,bj)) *
455 & (vVel(im1,jp1,k,bi,bj)-vVel(im1,jp1,kp1,bi,bj)) +
456 & (vVel(ip1,j, k,bi,bj)-vVel(ip1,j, kp1,bi,bj)) *
457 & (vVel(ip1,j, k,bi,bj)-vVel(ip1,j, kp1,bi,bj)) +
458 & (vVel(ip1,jp1,k,bi,bj)-vVel(ip1,jp1,kp1,bi,bj)) *
459 & (vVel(ip1,jp1,k,bi,bj)-vVel(ip1,jp1,kp1,bi,bj)) )
460 #endif
461 ENDDO
462 ENDDO
463 ENDDO
464
465 cph(
466 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
467 CADJ store dvsq, shsq = comlev1_kpp, key = ikppkey
468 #endif
469 cph)
470
471 c-----------------------------------------------------------------------
472 c solve for viscosity, diffusivity, ghat, and hbl on "t-grid"
473 c-----------------------------------------------------------------------
474
475 c precompute background vertical diffusivities, which are needed for
476 c matching diffusivities at bottom of KPP PBL
477 CALL CALC_3D_DIFFUSIVITY(
478 I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
479 I GAD_SALINITY, .FALSE., .FALSE.,
480 O KPPdiffKzS(1-Olx,1-Oly,1,bi,bj),
481 I myThid)
482 CALL CALC_3D_DIFFUSIVITY(
483 I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
484 I GAD_TEMPERATURE, .FALSE., .FALSE.,
485 O KPPdiffKzT(1-Olx,1-Oly,1,bi,bj),
486 I myThid)
487
488 DO j = 1-OLy, sNy+OLy
489 DO i = 1-OLx, sNx+OLx
490 work1(i,j) = nzmax(i,j,bi,bj)
491 work2(i,j) = Fcori(i,j,bi,bj)
492 ENDDO
493 ENDDO
494 CALL KPPMIX (
495 I work1, shsq, dVsq, ustar
496 I , maskC(1-Olx,1-Oly,1,bi,bj)
497 I , bo, bosol
498 #ifdef ALLOW_SALT_PLUME
499 I , boplume, SaltPlumeDepth(1-Olx,1-Oly,bi,bj)
500 #endif /* ALLOW_SALT_PLUME */
501 I , dbloc, Ritop, work2
502 I , KPPdiffKzS(1-Olx,1-Oly,1,bi,bj)
503 I , KPPdiffKzT(1-Olx,1-Oly,1,bi,bj)
504 I , ikppkey
505 O , vddiff
506 U , ghat
507 O , hbl
508 I , mytime, myIter, mythid )
509
510 c-----------------------------------------------------------------------
511 c zero out land values and transfer to global variables
512 c-----------------------------------------------------------------------
513
514 DO j = jmin, jmax
515 DO i = imin, imax
516 DO k = 1, Nr
517 km1 = max(1,k-1)
518 KPPviscAz(i,j,k,bi,bj) = vddiff(i,j,k-1,1) * maskC(i,j,k,bi,bj)
519 & * maskC(i,j,km1,bi,bj)
520 KPPdiffKzS(i,j,k,bi,bj)= vddiff(i,j,k-1,2) * maskC(i,j,k,bi,bj)
521 & * maskC(i,j,km1,bi,bj)
522 KPPdiffKzT(i,j,k,bi,bj)= vddiff(i,j,k-1,3) * maskC(i,j,k,bi,bj)
523 & * maskC(i,j,km1,bi,bj)
524 KPPghat(i,j,k,bi,bj) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
525 & * maskC(i,j,km1,bi,bj)
526 ENDDO
527 k = 1
528 #ifdef ALLOW_SHELFICE
529 if ( useShelfIce ) k = kTopC(i,j,bi,bj)
530 #endif /* ALLOW_SHELFICE */
531 KPPhbl(i,j,bi,bj) = hbl(i,j) * maskC(i,j,k,bi,bj)
532
533 ENDDO
534 ENDDO
535
536 #ifdef KPP_SMOOTH_VISC
537 c horizontal smoothing of vertical viscosity
538 DO k = 1, Nr
539 CALL SMOOTH_HORIZ (
540 I k, bi, bj,
541 U KPPviscAz(1-OLx,1-OLy,k,bi,bj),
542 I myThid )
543 ENDDO
544 C jmc: No EXCH inside bi,bj loop !!!
545 c _EXCH_XYZ_RL(KPPviscAz , myThid )
546 #endif /* KPP_SMOOTH_VISC */
547
548 #ifdef KPP_SMOOTH_DIFF
549 c horizontal smoothing of vertical diffusivity
550 DO k = 1, Nr
551 CALL SMOOTH_HORIZ (
552 I k, bi, bj,
553 U KPPdiffKzS(1-OLx,1-OLy,k,bi,bj),
554 I myThid )
555 CALL SMOOTH_HORIZ (
556 I k, bi, bj,
557 U KPPdiffKzT(1-OLx,1-OLy,k,bi,bj),
558 I myThid )
559 ENDDO
560 #endif /* KPP_SMOOTH_DIFF */
561
562 cph(
563 cph crucial: this avoids full recomp./call of kppmix
564 CADJ store KPPhbl = comlev1_kpp, key = ikppkey
565 cph)
566
567 C Compute fraction of solar short-wave flux penetrating to
568 C the bottom of the mixing layer.
569 DO j=1-OLy,sNy+OLy
570 DO i=1-OLx,sNx+OLx
571 worka(i,j) = KPPhbl(i,j,bi,bj)
572 ENDDO
573 ENDDO
574 CALL SWFRAC(
575 I (sNx+2*OLx)*(sNy+2*OLy), minusone,
576 U worka,
577 I myTime, myIter, myThid )
578 DO j=1-OLy,sNy+OLy
579 DO i=1-OLx,sNx+OLx
580 KPPfrac(i,j,bi,bj) = worka(i,j)
581 ENDDO
582 ENDDO
583
584 #ifdef ALLOW_SALT_PLUME
585 C Compute fraction of saltplume (flux) penetrating to
586 C the bottom of the mixing layer.
587 IF ( useSALT_PLUME ) THEN
588 DO j=1-OLy,sNy+OLy
589 DO i=1-OLx,sNx+OLx
590 work2(i,j) = SaltPlumeDepth(i,j,bi,bj)
591 worka(i,j) = KPPhbl(i,j,bi,bj)
592 ENDDO
593 ENDDO
594 CALL SALT_PLUME_FRAC(
595 I (sNx+2*OLx)*(sNy+2*OLy), minusone, work2,
596 U worka,
597 I myTime, myIter, myThid )
598 DO j=1-OLy,sNy+OLy
599 DO i=1-OLx,sNx+OLx
600 KPPplumefrac(i,j,bi,bj) = worka(i,j)
601 ENDDO
602 ENDDO
603 ENDIF
604 #endif /* ALLOW_SALT_PLUME */
605
606 ENDIF
607
608 #endif /* ALLOW_KPP */
609
610 RETURN
611 END
612
613 SUBROUTINE KPP_CALC_DUMMY(
614 I bi, bj, myTime, myIter, myThid )
615 C *==========================================================*
616 C | SUBROUTINE KPP_CALC_DUMMY |
617 C | o Compute all KPP fields defined in KPP.h |
618 C | o Dummy routine for TAMC
619 C *==========================================================*
620 C | This subroutine serves as an interface between MITGCMUV |
621 C | code and NCOM 1-D routines in kpp_routines.F |
622 C *==========================================================*
623 IMPLICIT NONE
624
625 #include "SIZE.h"
626 #include "EEPARAMS.h"
627 #include "PARAMS.h"
628 #include "KPP.h"
629 #include "KPP_PARAMS.h"
630 #include "GRID.h"
631 #include "GAD.h"
632
633 c Routine arguments
634 c bi, bj :: Current tile indices
635 c myTime :: Current time in simulation
636 c myIter :: Current iteration number in simulation
637 c myThid :: My Thread Id. number
638
639 INTEGER bi, bj
640 _RL myTime
641 INTEGER myIter
642 INTEGER myThid
643
644 #ifdef ALLOW_KPP
645
646 c Local constants
647 integer i, j, k
648
649 DO j=1-OLy,sNy+OLy
650 DO i=1-OLx,sNx+OLx
651 KPPhbl (i,j,bi,bj) = 1.0
652 KPPfrac(i,j,bi,bj) = 0.0
653 #ifdef ALLOW_SALT_PLUME
654 KPPplumefrac(i,j,bi,bj) = 0.0
655 #endif /* ALLOW_SALT_PLUME */
656 DO k = 1,Nr
657 KPPghat (i,j,k,bi,bj) = 0.0
658 KPPviscAz (i,j,k,bi,bj) = viscAr
659 ENDDO
660 ENDDO
661 ENDDO
662
663 CALL CALC_3D_DIFFUSIVITY(
664 I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
665 I GAD_SALINITY, .FALSE., .FALSE.,
666 O KPPdiffKzS(1-Olx,1-Oly,1,bi,bj),
667 I myThid)
668 CALL CALC_3D_DIFFUSIVITY(
669 I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
670 I GAD_TEMPERATURE, .FALSE., .FALSE.,
671 O KPPdiffKzT(1-Olx,1-Oly,1,bi,bj),
672 I myThid)
673
674 #endif
675 RETURN
676 END

  ViewVC Help
Powered by ViewVC 1.1.22