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

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

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


Revision 1.50 - (hide annotations) (download)
Tue Apr 28 18:15:33 2009 UTC (16 years, 2 months 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 jmc 1.50 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_calc.F,v 1.49 2009/02/13 21:58:36 heimbach Exp $
2 adcroft 1.9 C $Name: $
3 adcroft 1.1
4     #include "KPP_OPTIONS.h"
5    
6 dimitri 1.25 CBOP
7     C !ROUTINE: KPP_CALC
8    
9     C !INTERFACE: ==========================================================
10 jmc 1.42 SUBROUTINE KPP_CALC(
11     I bi, bj, myTime, myIter, myThid )
12 dimitri 1.25
13     C !DESCRIPTION: \bv
14 jmc 1.42 C *==========================================================*
15 adcroft 1.1 C | SUBROUTINE KPP_CALC |
16     C | o Compute all KPP fields defined in KPP.h |
17 jmc 1.42 C *==========================================================*
18 adcroft 1.1 C | This subroutine serves as an interface between MITGCMUV |
19     C | code and NCOM 1-D routines in kpp_routines.F |
20 jmc 1.42 C *==========================================================*
21 adcroft 1.1 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 jmc 1.42 c this subroutine provides the interface between the MITGCM and
56     c the routine "kppmix", where boundary layer depth, vertical
57 adcroft 1.1 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 dimitri 1.44 c KPPplumefrac- Fraction of saltplume (flux) penetrating mixing layer
91 adcroft 1.1
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 jmc 1.28 c values of uVel, vVel, surfaceForcingU, surfaceForcingV in the
95 heimbach 1.2 c region (-2:sNx+4,-2:sNy+4).
96 adcroft 1.1 c Hence overlap region needs to be set OLx=4, OLy=4.
97 dimitri 1.25 c \ev
98 adcroft 1.1
99 dimitri 1.25 C !USES: ===============================================================
100 adcroft 1.1 #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 dimitri 1.36 #include "GAD.h"
109 dimitri 1.45 #ifdef ALLOW_SALT_PLUME
110     # include "SALT_PLUME.h"
111     #endif /* ALLOW_SALT_PLUME */
112 mlosch 1.35 #ifdef ALLOW_SHELFICE
113     # include "SHELFICE.h"
114     #endif /* ALLOW_SHELFICE */
115 adcroft 1.1 #ifdef ALLOW_AUTODIFF_TAMC
116 dimitri 1.45 # include "tamc.h"
117     # include "tamc_keys.h"
118 adcroft 1.1 #else /* ALLOW_AUTODIFF_TAMC */
119     #endif /* ALLOW_AUTODIFF_TAMC */
120    
121 jmc 1.32 EXTERNAL DIFFERENT_MULTIPLE
122     LOGICAL DIFFERENT_MULTIPLE
123 adcroft 1.1
124 dimitri 1.25 C !INPUT PARAMETERS: ===================================================
125 adcroft 1.1 c Routine arguments
126 jmc 1.42 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 adcroft 1.1
131     INTEGER bi, bj
132 jmc 1.42 _RL myTime
133     INTEGER myIter
134 adcroft 1.1 INTEGER myThid
135    
136     #ifdef ALLOW_KPP
137    
138 dimitri 1.25 C !LOCAL VARIABLES: ====================================================
139 heimbach 1.4 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 dimitri 1.37 _RL p0 , p5 , p25 , p125 , p0625
146 heimbach 1.4 parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
147 dimitri 1.17 integer imin ,imax ,jmin ,jmax
148 heimbach 1.15 parameter(imin=2-OLx,imax=sNx+OLx-1,jmin=2-OLy,jmax=sNy+OLy-1)
149 heimbach 1.4
150 adcroft 1.1 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 dimitri 1.44 c boplume(nx,ny) - surface haline buoyancy forcing (m^2/s^3)
156 adcroft 1.1 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 dimitri 1.24 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 adcroft 1.1 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 dimitri 1.37 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 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
183     _RL boplume ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
184     #endif /* ALLOW_SALT_PLUME */
185 dimitri 1.37 _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 heimbach 1.33 cph(
193 dimitri 1.37 _RL TTALPHA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
194     _RL SSBETA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
195 heimbach 1.33 cph)
196 adcroft 1.1 #ifdef KPP_ESTIMATE_UREF
197 dimitri 1.37 _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 adcroft 1.1 #endif /* KPP_ESTIMATE_UREF */
202 jmc 1.42
203 dimitri 1.37 _RL tempvar2
204 mlosch 1.35 integer i, j, k, kp1, km1, im1, ip1, jm1, jp1
205 heimbach 1.49 integer ikppkey
206 adcroft 1.1
207     #ifdef KPP_ESTIMATE_UREF
208 dimitri 1.37 _RL tempvar1, dBdz1, dBdz2, ustarX, ustarY
209 adcroft 1.1 #endif
210    
211 heimbach 1.16 #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 dimitri 1.25 CEOP
224 heimbach 1.16
225 adcroft 1.1 c Check to see if new vertical mixing coefficient should be computed now?
226 jmc 1.32 IF ( DIFFERENT_MULTIPLE(kpp_freq,myTime,deltaTClock)
227 jmc 1.31 1 .OR. myTime .EQ. startTime ) THEN
228 jmc 1.42
229 adcroft 1.1 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 mlosch 1.40 O work2, dbloc, Ritop,
265     O TTALPHA, SSBETA,
266     I ikppkey, bi, bj, myThid )
267 adcroft 1.1
268     DO k = 1, Nr
269 dimitri 1.34 DO j = 1-OLy, sNy+OLy
270     DO i = 1-OLx, sNx+OLx
271 adcroft 1.1 ghat(i,j,k) = dbloc(i,j,k)
272     ENDDO
273     ENDDO
274     ENDDO
275    
276 heimbach 1.4 #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 dimitri 1.37 CALL SMOOTH_HORIZ (
284 heimbach 1.4 I k+1, bi, bj,
285 jmc 1.42 U ghat (1-OLx,1-OLy,k),
286 mlosch 1.40 I myThid )
287 heimbach 1.4 ENDDO
288    
289 adcroft 1.1 #endif /* KPP_SMOOTH_DBLOC */
290    
291     #ifdef KPP_SMOOTH_DENS
292     c horizontally smooth density related quantities with 121 filters
293 dimitri 1.37 CALL SMOOTH_HORIZ (
294 heimbach 1.4 I 1, bi, bj,
295 jmc 1.42 U work2,
296 mlosch 1.40 I myThid )
297 adcroft 1.1 DO k = 1, Nr
298 dimitri 1.37 CALL SMOOTH_HORIZ (
299 heimbach 1.4 I k+1, bi, bj,
300 jmc 1.42 U dbloc (1-OLx,1-OLy,k),
301 mlosch 1.40 I myThid )
302 dimitri 1.37 CALL SMOOTH_HORIZ (
303 adcroft 1.1 I k, bi, bj,
304 jmc 1.42 U Ritop (1-OLx,1-OLy,k),
305 mlosch 1.40 I myThid )
306 dimitri 1.37 CALL SMOOTH_HORIZ (
307 adcroft 1.1 I k, bi, bj,
308 jmc 1.42 U TTALPHA(1-OLx,1-OLy,k),
309 mlosch 1.40 I myThid )
310 dimitri 1.37 CALL SMOOTH_HORIZ (
311 adcroft 1.1 I k, bi, bj,
312 jmc 1.42 U SSBETA(1-OLx,1-OLy,k),
313 mlosch 1.40 I myThid )
314 adcroft 1.1 ENDDO
315     #endif /* KPP_SMOOTH_DENS */
316    
317     DO k = 1, Nr
318 mlosch 1.35 km1 = max(1,k-1)
319 dimitri 1.34 DO j = 1-OLy, sNy+OLy
320     DO i = 1-OLx, sNx+OLx
321 adcroft 1.1
322     c zero out dbloc over land points (so that the convective
323     c part of the interior mixing can be diagnosed)
324 jmc 1.28 dbloc(i,j,k) = dbloc(i,j,k) * maskC(i,j,k,bi,bj)
325 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
326 jmc 1.28 ghat(i,j,k) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
327 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
328 jmc 1.28 Ritop(i,j,k) = Ritop(i,j,k) * maskC(i,j,k,bi,bj)
329 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
330 adcroft 1.1 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 jmc 1.42 ENDDO
342     ENDDO
343     ENDDO
344 adcroft 1.1
345 heimbach 1.11 cph(
346     cph this avoids a single or double recomp./call of statekpp
347 heimbach 1.16 CADJ store work2 = comlev1_kpp, key = ikppkey
348 heimbach 1.27 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
349 heimbach 1.16 CADJ store dbloc, Ritop, ghat = comlev1_kpp, key = ikppkey
350     CADJ store vddiff = comlev1_kpp, key = ikppkey
351 heimbach 1.33 CADJ store TTALPHA, SSBETA = comlev1_kpp, key = ikppkey
352 heimbach 1.11 #endif
353     cph)
354    
355 mlosch 1.35 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 mlosch 1.41 CML shelfIceFac = 0. _d 0
362     CML IF ( useShelfIce ) selfIceFac = 1. _d 0
363 mlosch 1.35 CML DO j = jmin, jmax
364     CML DO i = imin, imax
365 mlosch 1.41 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 jmc 1.42 CML ENDDO
370     CML ENDDO
371 mlosch 1.35 CML#endif /* ALLOW_SHELFICE */
372 heimbach 1.11
373 mlosch 1.41 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 dimitri 1.44 c boplume = g * (beta * saltPlumeFlux/rhoConst ) /rho (m^2/s^3)
383 adcroft 1.1 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 mlosch 1.41 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 adcroft 1.1 c------------------------------------------------------------------------
395 jmc 1.42
396 mlosch 1.41 CALL KPP_FORCING_SURF(
397     I work2, surfaceForcingU, surfaceForcingV,
398 jmc 1.42 I surfaceForcingT, surfaceForcingS, surfaceForcingTice,
399 dimitri 1.44 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 mlosch 1.41 I ikppkey, iMin, iMax, jMin, jMax, bi, bj, myTime, myThid )
410    
411     CMLcph(
412     CMLCADJ store ustar = comlev1_kpp, key = ikppkey
413     CMLcph)
414 adcroft 1.1
415 heimbach 1.4 c initialize arrays to zero
416     DO k = 1, Nr
417 mlosch 1.41 DO j = 1-OLy, sNy+OLy
418     DO i = 1-OLx, sNx+OLx
419     shsq(i,j,k) = p0
420 jmc 1.42 ENDDO
421     ENDDO
422     ENDDO
423 adcroft 1.1
424     c shsq computation
425     DO k = 1, Nrm1
426 mlosch 1.41 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 jmc 1.42 & (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 adcroft 1.1 #ifdef KPP_SMOOTH_SHSQ
443 mlosch 1.41 shsq(i,j,k) = p5 * shsq(i,j,k) + p125 * (
444 jmc 1.42 & (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 adcroft 1.1 #endif
461 jmc 1.42 ENDDO
462     ENDDO
463     ENDDO
464 adcroft 1.1
465 heimbach 1.11 cph(
466 heimbach 1.27 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
467 heimbach 1.16 CADJ store dvsq, shsq = comlev1_kpp, key = ikppkey
468 heimbach 1.11 #endif
469     cph)
470    
471 adcroft 1.1 c-----------------------------------------------------------------------
472     c solve for viscosity, diffusivity, ghat, and hbl on "t-grid"
473     c-----------------------------------------------------------------------
474    
475 dimitri 1.36 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 dimitri 1.34 DO j = 1-OLy, sNy+OLy
489     DO i = 1-OLx, sNx+OLx
490 adcroft 1.1 work1(i,j) = nzmax(i,j,bi,bj)
491     work2(i,j) = Fcori(i,j,bi,bj)
492 jmc 1.42 ENDDO
493     ENDDO
494 adcroft 1.1 CALL KPPMIX (
495 mlosch 1.40 I work1, shsq, dVsq, ustar
496     I , maskC(1-Olx,1-Oly,1,bi,bj)
497 dimitri 1.44 I , bo, bosol
498     #ifdef ALLOW_SALT_PLUME
499 dimitri 1.47 I , boplume, SaltPlumeDepth(1-Olx,1-Oly,bi,bj)
500 dimitri 1.44 #endif /* ALLOW_SALT_PLUME */
501     I , dbloc, Ritop, work2
502 dimitri 1.36 I , KPPdiffKzS(1-Olx,1-Oly,1,bi,bj)
503     I , KPPdiffKzT(1-Olx,1-Oly,1,bi,bj)
504 heimbach 1.16 I , ikppkey
505 adcroft 1.1 O , vddiff
506     U , ghat
507 mlosch 1.40 O , hbl
508 heimbach 1.43 I , mytime, myIter, mythid )
509 adcroft 1.1
510     c-----------------------------------------------------------------------
511 heimbach 1.4 c zero out land values and transfer to global variables
512 adcroft 1.1 c-----------------------------------------------------------------------
513    
514     DO j = jmin, jmax
515 heimbach 1.4 DO i = imin, imax
516     DO k = 1, Nr
517 mlosch 1.35 km1 = max(1,k-1)
518 jmc 1.28 KPPviscAz(i,j,k,bi,bj) = vddiff(i,j,k-1,1) * maskC(i,j,k,bi,bj)
519 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
520 jmc 1.28 KPPdiffKzS(i,j,k,bi,bj)= vddiff(i,j,k-1,2) * maskC(i,j,k,bi,bj)
521 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
522 jmc 1.28 KPPdiffKzT(i,j,k,bi,bj)= vddiff(i,j,k-1,3) * maskC(i,j,k,bi,bj)
523 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
524 jmc 1.28 KPPghat(i,j,k,bi,bj) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
525 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
526 jmc 1.42 ENDDO
527 mlosch 1.35 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 jmc 1.42 ENDDO
534     ENDDO
535 adcroft 1.1
536     #ifdef KPP_SMOOTH_VISC
537     c horizontal smoothing of vertical viscosity
538     DO k = 1, Nr
539 heimbach 1.4 CALL SMOOTH_HORIZ (
540 adcroft 1.1 I k, bi, bj,
541 jmc 1.42 U KPPviscAz(1-OLx,1-OLy,k,bi,bj),
542 mlosch 1.40 I myThid )
543 jmc 1.42 ENDDO
544     C jmc: No EXCH inside bi,bj loop !!!
545 jmc 1.50 c _EXCH_XYZ_RL(KPPviscAz , myThid )
546 adcroft 1.1 #endif /* KPP_SMOOTH_VISC */
547    
548     #ifdef KPP_SMOOTH_DIFF
549     c horizontal smoothing of vertical diffusivity
550     DO k = 1, Nr
551 heimbach 1.4 CALL SMOOTH_HORIZ (
552 adcroft 1.1 I k, bi, bj,
553 jmc 1.42 U KPPdiffKzS(1-OLx,1-OLy,k,bi,bj),
554 mlosch 1.40 I myThid )
555 heimbach 1.4 CALL SMOOTH_HORIZ (
556 adcroft 1.1 I k, bi, bj,
557 jmc 1.42 U KPPdiffKzT(1-OLx,1-OLy,k,bi,bj),
558 mlosch 1.40 I myThid )
559 jmc 1.42 ENDDO
560 adcroft 1.1 #endif /* KPP_SMOOTH_DIFF */
561 heimbach 1.11
562     cph(
563     cph crucial: this avoids full recomp./call of kppmix
564 heimbach 1.16 CADJ store KPPhbl = comlev1_kpp, key = ikppkey
565 heimbach 1.11 cph)
566 adcroft 1.1
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 heimbach 1.4 I (sNx+2*OLx)*(sNy+2*OLy), minusone,
576 jmc 1.42 U worka,
577     I myTime, myIter, myThid )
578 adcroft 1.1 DO j=1-OLy,sNy+OLy
579     DO i=1-OLx,sNx+OLx
580 heimbach 1.4 KPPfrac(i,j,bi,bj) = worka(i,j)
581 adcroft 1.1 ENDDO
582     ENDDO
583    
584 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
585     C Compute fraction of saltplume (flux) penetrating to
586     C the bottom of the mixing layer.
587 atn 1.46 IF ( useSALT_PLUME ) THEN
588     DO j=1-OLy,sNy+OLy
589     DO i=1-OLx,sNx+OLx
590 dimitri 1.47 work2(i,j) = SaltPlumeDepth(i,j,bi,bj)
591 atn 1.46 worka(i,j) = KPPhbl(i,j,bi,bj)
592     ENDDO
593     ENDDO
594     CALL SALT_PLUME_FRAC(
595 dimitri 1.47 I (sNx+2*OLx)*(sNy+2*OLy), minusone, work2,
596 atn 1.46 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 dimitri 1.44 #endif /* ALLOW_SALT_PLUME */
605    
606 adcroft 1.1 ENDIF
607    
608 adcroft 1.9 #endif /* ALLOW_KPP */
609 adcroft 1.1
610 heimbach 1.8 RETURN
611     END
612    
613 jmc 1.42 SUBROUTINE KPP_CALC_DUMMY(
614     I bi, bj, myTime, myIter, myThid )
615     C *==========================================================*
616 heimbach 1.8 C | SUBROUTINE KPP_CALC_DUMMY |
617     C | o Compute all KPP fields defined in KPP.h |
618     C | o Dummy routine for TAMC
619 jmc 1.42 C *==========================================================*
620 heimbach 1.8 C | This subroutine serves as an interface between MITGCMUV |
621     C | code and NCOM 1-D routines in kpp_routines.F |
622 jmc 1.42 C *==========================================================*
623 heimbach 1.8 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 dimitri 1.36 #include "GAD.h"
632 heimbach 1.8
633     c Routine arguments
634 jmc 1.42 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 heimbach 1.8
639     INTEGER bi, bj
640 jmc 1.42 _RL myTime
641     INTEGER myIter
642 heimbach 1.8 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 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
654     KPPplumefrac(i,j,bi,bj) = 0.0
655     #endif /* ALLOW_SALT_PLUME */
656 heimbach 1.8 DO k = 1,Nr
657     KPPghat (i,j,k,bi,bj) = 0.0
658 jmc 1.21 KPPviscAz (i,j,k,bi,bj) = viscAr
659 heimbach 1.8 ENDDO
660     ENDDO
661     ENDDO
662 dimitri 1.36
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 heimbach 1.8 #endif
675 adcroft 1.1 RETURN
676     END

  ViewVC Help
Powered by ViewVC 1.1.22