/[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.46 - (hide annotations) (download)
Fri Dec 21 02:54:34 2007 UTC (16 years, 5 months ago) by atn
Branch: MAIN
Changes since 1.45: +17 -15 lines
o pkg/kpp: added saltplume diagnostics

1 atn 1.46 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_calc.F,v 1.45 2007/12/18 09:05:59 dimitri 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 heimbach 1.16 integer ikppkey
120 adcroft 1.1 #endif /* ALLOW_AUTODIFF_TAMC */
121    
122 jmc 1.32 EXTERNAL DIFFERENT_MULTIPLE
123     LOGICAL DIFFERENT_MULTIPLE
124 adcroft 1.1
125 dimitri 1.25 C !INPUT PARAMETERS: ===================================================
126 adcroft 1.1 c Routine arguments
127 jmc 1.42 c bi, bj :: Current tile indices
128     c myTime :: Current time in simulation
129     c myIter :: Current iteration number in simulation
130     c myThid :: My Thread Id. number
131 adcroft 1.1
132     INTEGER bi, bj
133 jmc 1.42 _RL myTime
134     INTEGER myIter
135 adcroft 1.1 INTEGER myThid
136    
137     #ifdef ALLOW_KPP
138    
139 dimitri 1.25 C !LOCAL VARIABLES: ====================================================
140 heimbach 1.4 c Local constants
141     c minusone, p0, p5, p25, p125, p0625
142     c imin, imax, jmin, jmax - array computation indices
143    
144     _RL minusone
145     parameter( minusone=-1.0)
146 dimitri 1.37 _RL p0 , p5 , p25 , p125 , p0625
147 heimbach 1.4 parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
148 dimitri 1.17 integer imin ,imax ,jmin ,jmax
149 heimbach 1.15 parameter(imin=2-OLx,imax=sNx+OLx-1,jmin=2-OLy,jmax=sNy+OLy-1)
150 heimbach 1.4
151 adcroft 1.1 c Local arrays and variables
152     c work? (nx,ny) - horizontal working arrays
153     c ustar (nx,ny) - surface friction velocity (m/s)
154     c bo (nx,ny) - surface turbulent buoyancy forcing (m^2/s^3)
155     c bosol (nx,ny) - surface radiative buoyancy forcing (m^2/s^3)
156 dimitri 1.44 c boplume(nx,ny) - surface haline buoyancy forcing (m^2/s^3)
157 adcroft 1.1 c shsq (nx,ny,Nr) - local velocity shear squared
158     c at interfaces for ri_iwmix (m^2/s^2)
159     c dVsq (nx,ny,Nr) - velocity shear re surface squared
160     c at grid levels for bldepth (m^2/s^2)
161     c dbloc (nx,ny,Nr) - local delta buoyancy at interfaces
162     c for ri_iwmix and bldepth (m/s^2)
163     c Ritop (nx,ny,Nr) - numerator of bulk richardson number
164     c at grid levels for bldepth
165     c vddiff (nx,ny,Nrp2,1)- vertical viscosity on "t-grid" (m^2/s)
166 dimitri 1.24 c vddiff (nx,ny,Nrp2,2)- vert. diff. on next row for salt&tracers (m^2/s)
167     c vddiff (nx,ny,Nrp2,3)- vert. diff. on next row for temperature (m^2/s)
168 adcroft 1.1 c ghat (nx,ny,Nr) - nonlocal transport coefficient (s/m^2)
169     c hbl (nx,ny) - mixing layer depth (m)
170     c kmtj (nx,ny) - maximum number of wet levels in each column
171     c z0 (nx,ny) - Roughness length (m)
172     c zRef (nx,ny) - Reference depth: Hmix * epsilon (m)
173     c uRef (nx,ny) - Reference zonal velocity (m/s)
174     c vRef (nx,ny) - Reference meridional velocity (m/s)
175    
176 dimitri 1.37 integer work1 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
177     _RL worka ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
178     _RL work2 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
179     _RL work3 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
180     _RL ustar ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
181     _RL bo ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
182     _RL bosol ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
183 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
184     _RL boplume ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
185     #endif /* ALLOW_SALT_PLUME */
186 dimitri 1.37 _RL shsq ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
187     _RL dVsq ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
188     _RL dbloc ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
189     _RL Ritop ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
190     _RL vddiff( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, 0:Nrp1, mdiff )
191     _RL ghat ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
192     _RL hbl ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
193 heimbach 1.33 cph(
194 dimitri 1.37 _RL TTALPHA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
195     _RL SSBETA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
196 heimbach 1.33 cph)
197 adcroft 1.1 #ifdef KPP_ESTIMATE_UREF
198 dimitri 1.37 _RL z0 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
199     _RL zRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
200     _RL uRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
201     _RL vRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
202 adcroft 1.1 #endif /* KPP_ESTIMATE_UREF */
203 jmc 1.42
204 dimitri 1.37 _RL tempvar2
205 mlosch 1.35 integer i, j, k, kp1, km1, im1, ip1, jm1, jp1
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 TIMER_START('STATEKPP [KPP_CALC]', myThid)
264     CALL STATEKPP(
265 mlosch 1.40 O work2, dbloc, Ritop,
266     O TTALPHA, SSBETA,
267     I ikppkey, bi, bj, myThid )
268 adcroft 1.1 CALL TIMER_STOP ('STATEKPP [KPP_CALC]', myThid)
269    
270     DO k = 1, Nr
271 dimitri 1.34 DO j = 1-OLy, sNy+OLy
272     DO i = 1-OLx, sNx+OLx
273 adcroft 1.1 ghat(i,j,k) = dbloc(i,j,k)
274     ENDDO
275     ENDDO
276     ENDDO
277    
278 heimbach 1.4 #ifdef KPP_SMOOTH_DBLOC
279     c horizontally smooth dbloc with a 121 filter
280     c smooth dbloc stored in ghat to save space
281     c dbloc(k) is buoyancy gradientnote between k and k+1
282     c levels therefore k+1 mask must be used
283    
284     DO k = 1, Nr-1
285 dimitri 1.37 CALL SMOOTH_HORIZ (
286 heimbach 1.4 I k+1, bi, bj,
287 jmc 1.42 U ghat (1-OLx,1-OLy,k),
288 mlosch 1.40 I myThid )
289 heimbach 1.4 ENDDO
290    
291 adcroft 1.1 #endif /* KPP_SMOOTH_DBLOC */
292    
293     #ifdef KPP_SMOOTH_DENS
294     c horizontally smooth density related quantities with 121 filters
295 dimitri 1.37 CALL SMOOTH_HORIZ (
296 heimbach 1.4 I 1, bi, bj,
297 jmc 1.42 U work2,
298 mlosch 1.40 I myThid )
299 adcroft 1.1 DO k = 1, Nr
300 dimitri 1.37 CALL SMOOTH_HORIZ (
301 heimbach 1.4 I k+1, bi, bj,
302 jmc 1.42 U dbloc (1-OLx,1-OLy,k),
303 mlosch 1.40 I myThid )
304 dimitri 1.37 CALL SMOOTH_HORIZ (
305 adcroft 1.1 I k, bi, bj,
306 jmc 1.42 U Ritop (1-OLx,1-OLy,k),
307 mlosch 1.40 I myThid )
308 dimitri 1.37 CALL SMOOTH_HORIZ (
309 adcroft 1.1 I k, bi, bj,
310 jmc 1.42 U TTALPHA(1-OLx,1-OLy,k),
311 mlosch 1.40 I myThid )
312 dimitri 1.37 CALL SMOOTH_HORIZ (
313 adcroft 1.1 I k, bi, bj,
314 jmc 1.42 U SSBETA(1-OLx,1-OLy,k),
315 mlosch 1.40 I myThid )
316 adcroft 1.1 ENDDO
317     #endif /* KPP_SMOOTH_DENS */
318    
319     DO k = 1, Nr
320 mlosch 1.35 km1 = max(1,k-1)
321 dimitri 1.34 DO j = 1-OLy, sNy+OLy
322     DO i = 1-OLx, sNx+OLx
323 adcroft 1.1
324     c zero out dbloc over land points (so that the convective
325     c part of the interior mixing can be diagnosed)
326 jmc 1.28 dbloc(i,j,k) = dbloc(i,j,k) * maskC(i,j,k,bi,bj)
327 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
328 jmc 1.28 ghat(i,j,k) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
329 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
330 jmc 1.28 Ritop(i,j,k) = Ritop(i,j,k) * maskC(i,j,k,bi,bj)
331 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
332 adcroft 1.1 if(k.eq.nzmax(i,j,bi,bj)) then
333     dbloc(i,j,k) = p0
334     ghat(i,j,k) = p0
335     Ritop(i,j,k) = p0
336     endif
337    
338     c numerator of bulk richardson number on grid levels
339     c note: land and ocean bottom values need to be set to zero
340     c so that the subroutine "bldepth" works correctly
341     Ritop(i,j,k) = (zgrid(1)-zgrid(k)) * Ritop(i,j,k)
342    
343 jmc 1.42 ENDDO
344     ENDDO
345     ENDDO
346 adcroft 1.1
347 heimbach 1.11 cph(
348     cph this avoids a single or double recomp./call of statekpp
349 heimbach 1.16 CADJ store work2 = comlev1_kpp, key = ikppkey
350 heimbach 1.27 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
351 heimbach 1.16 CADJ store dbloc, Ritop, ghat = comlev1_kpp, key = ikppkey
352     CADJ store vddiff = comlev1_kpp, key = ikppkey
353 heimbach 1.33 CADJ store TTALPHA, SSBETA = comlev1_kpp, key = ikppkey
354 heimbach 1.11 #endif
355     cph)
356    
357 mlosch 1.35 CML#ifdef ALLOW_SHELFICE
358     CMLC For the pbl parameterisation to work underneath the ice shelves
359     CMLC it needs to know the surface (ice-ocean) fluxes. However, masking
360     CMLC and indexing problems make this part of the code not work
361     CMLC underneath the ice shelves and the following lines are only here
362     CMLC to remind me that this still needs to be sorted out.
363 mlosch 1.41 CML shelfIceFac = 0. _d 0
364     CML IF ( useShelfIce ) selfIceFac = 1. _d 0
365 mlosch 1.35 CML DO j = jmin, jmax
366     CML DO i = imin, imax
367 mlosch 1.41 CML surfForcT = surfaceForcingT(i,j,bi,bj)
368     CML & + shelficeForcingT(i,j,bi,bj) * shelfIceFac
369     CML surfForcS = surfaceForcingS(i,j,bi,bj)
370     CML & + shelficeForcingS(i,j,bi,bj) * shelfIceFac
371 jmc 1.42 CML ENDDO
372     CML ENDDO
373 mlosch 1.35 CML#endif /* ALLOW_SHELFICE */
374 heimbach 1.11
375 mlosch 1.41 c------------------------------------------------------------------------
376     c friction velocity, turbulent and radiative surface buoyancy forcing
377     c -------------------------------------------------------------------
378     c taux / rho = surfaceForcingU (N/m^2)
379     c tauy / rho = surfaceForcingV (N/m^2)
380     c ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho ) (m/s)
381     c bo = - g * ( alpha*surfaceForcingT +
382     c beta *surfaceForcingS ) / rho (m^2/s^3)
383     c bosol = - g * alpha * Qsw * drF(1) / rho (m^2/s^3)
384 dimitri 1.44 c boplume = g * (beta * saltPlumeFlux/rhoConst ) /rho (m^2/s^3)
385 adcroft 1.1 c------------------------------------------------------------------------
386     c velocity shear
387     c --------------
388     c Get velocity shear squared, averaged from "u,v-grid"
389     c onto "t-grid" (in (m/s)**2):
390     c dVsq(k)=(Uref-U(k))**2+(Vref-V(k))**2 at grid levels
391     c shsq(k)=(U(k)-U(k+1))**2+(V(k)-V(k+1))**2 at interfaces
392 mlosch 1.41 c
393     c note: Vref can depend on the surface fluxes that is why we compute
394     c dVsq in the subroutine that does the surface related stuff
395     c (admittedly this is a bit messy)
396 adcroft 1.1 c------------------------------------------------------------------------
397 jmc 1.42
398 mlosch 1.41 CALL KPP_FORCING_SURF(
399     I work2, surfaceForcingU, surfaceForcingV,
400 jmc 1.42 I surfaceForcingT, surfaceForcingS, surfaceForcingTice,
401 dimitri 1.44 I Qsw,
402     #ifdef ALLOW_SALT_PLUME
403     I saltPlumeFlux,
404     #endif /* ALLOW_SALT_PLUME */
405     I ttalpha, ssbeta,
406     O ustar, bo, bosol,
407     #ifdef ALLOW_SALT_PLUME
408     O boplume,
409     #endif /* ALLOW_SALT_PLUME */
410     O dVsq,
411 mlosch 1.41 I ikppkey, iMin, iMax, jMin, jMax, bi, bj, myTime, myThid )
412    
413     CMLcph(
414     CMLCADJ store ustar = comlev1_kpp, key = ikppkey
415     CMLcph)
416 adcroft 1.1
417 heimbach 1.4 c initialize arrays to zero
418     DO k = 1, Nr
419 mlosch 1.41 DO j = 1-OLy, sNy+OLy
420     DO i = 1-OLx, sNx+OLx
421     shsq(i,j,k) = p0
422 jmc 1.42 ENDDO
423     ENDDO
424     ENDDO
425 adcroft 1.1
426     c shsq computation
427     DO k = 1, Nrm1
428 mlosch 1.41 kp1 = k + 1
429     DO j = jmin, jmax
430     jm1 = j - 1
431     jp1 = j + 1
432     DO i = imin, imax
433     im1 = i - 1
434     ip1 = i + 1
435     shsq(i,j,k) = p5 * (
436 jmc 1.42 & (uVel(i, j, k,bi,bj)-uVel(i, j, kp1,bi,bj)) *
437     & (uVel(i, j, k,bi,bj)-uVel(i, j, kp1,bi,bj)) +
438     & (uVel(ip1,j, k,bi,bj)-uVel(ip1,j, kp1,bi,bj)) *
439     & (uVel(ip1,j, k,bi,bj)-uVel(ip1,j, kp1,bi,bj)) +
440     & (vVel(i, j, k,bi,bj)-vVel(i, j, kp1,bi,bj)) *
441     & (vVel(i, j, k,bi,bj)-vVel(i, j, kp1,bi,bj)) +
442     & (vVel(i, jp1,k,bi,bj)-vVel(i, jp1,kp1,bi,bj)) *
443     & (vVel(i, jp1,k,bi,bj)-vVel(i, jp1,kp1,bi,bj)) )
444 adcroft 1.1 #ifdef KPP_SMOOTH_SHSQ
445 mlosch 1.41 shsq(i,j,k) = p5 * shsq(i,j,k) + p125 * (
446 jmc 1.42 & (uVel(i, jm1,k,bi,bj)-uVel(i, jm1,kp1,bi,bj)) *
447     & (uVel(i, jm1,k,bi,bj)-uVel(i, jm1,kp1,bi,bj)) +
448     & (uVel(ip1,jm1,k,bi,bj)-uVel(ip1,jm1,kp1,bi,bj)) *
449     & (uVel(ip1,jm1,k,bi,bj)-uVel(ip1,jm1,kp1,bi,bj)) +
450     & (uVel(i, jp1,k,bi,bj)-uVel(i, jp1,kp1,bi,bj)) *
451     & (uVel(i, jp1,k,bi,bj)-uVel(i, jp1,kp1,bi,bj)) +
452     & (uVel(ip1,jp1,k,bi,bj)-uVel(ip1,jp1,kp1,bi,bj)) *
453     & (uVel(ip1,jp1,k,bi,bj)-uVel(ip1,jp1,kp1,bi,bj)) +
454     & (vVel(im1,j, k,bi,bj)-vVel(im1,j, kp1,bi,bj)) *
455     & (vVel(im1,j, k,bi,bj)-vVel(im1,j, kp1,bi,bj)) +
456     & (vVel(im1,jp1,k,bi,bj)-vVel(im1,jp1,kp1,bi,bj)) *
457     & (vVel(im1,jp1,k,bi,bj)-vVel(im1,jp1,kp1,bi,bj)) +
458     & (vVel(ip1,j, k,bi,bj)-vVel(ip1,j, kp1,bi,bj)) *
459     & (vVel(ip1,j, k,bi,bj)-vVel(ip1,j, kp1,bi,bj)) +
460     & (vVel(ip1,jp1,k,bi,bj)-vVel(ip1,jp1,kp1,bi,bj)) *
461     & (vVel(ip1,jp1,k,bi,bj)-vVel(ip1,jp1,kp1,bi,bj)) )
462 adcroft 1.1 #endif
463 jmc 1.42 ENDDO
464     ENDDO
465     ENDDO
466 adcroft 1.1
467 heimbach 1.11 cph(
468 heimbach 1.27 #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
469 heimbach 1.16 CADJ store dvsq, shsq = comlev1_kpp, key = ikppkey
470 heimbach 1.11 #endif
471     cph)
472    
473 adcroft 1.1 c-----------------------------------------------------------------------
474     c solve for viscosity, diffusivity, ghat, and hbl on "t-grid"
475     c-----------------------------------------------------------------------
476    
477 dimitri 1.36 c precompute background vertical diffusivities, which are needed for
478     c matching diffusivities at bottom of KPP PBL
479     CALL CALC_3D_DIFFUSIVITY(
480     I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
481     I GAD_SALINITY, .FALSE., .FALSE.,
482     O KPPdiffKzS(1-Olx,1-Oly,1,bi,bj),
483     I myThid)
484     CALL CALC_3D_DIFFUSIVITY(
485     I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
486     I GAD_TEMPERATURE, .FALSE., .FALSE.,
487     O KPPdiffKzT(1-Olx,1-Oly,1,bi,bj),
488     I myThid)
489    
490 dimitri 1.34 DO j = 1-OLy, sNy+OLy
491     DO i = 1-OLx, sNx+OLx
492 adcroft 1.1 work1(i,j) = nzmax(i,j,bi,bj)
493     work2(i,j) = Fcori(i,j,bi,bj)
494 jmc 1.42 ENDDO
495     ENDDO
496 adcroft 1.1 CALL TIMER_START('KPPMIX [KPP_CALC]', myThid)
497     CALL KPPMIX (
498 mlosch 1.40 I work1, shsq, dVsq, ustar
499     I , maskC(1-Olx,1-Oly,1,bi,bj)
500 dimitri 1.44 I , bo, bosol
501     #ifdef ALLOW_SALT_PLUME
502     I , boplume,SaltPlumeDepth
503     #endif /* ALLOW_SALT_PLUME */
504     I , dbloc, Ritop, work2
505 dimitri 1.36 I , KPPdiffKzS(1-Olx,1-Oly,1,bi,bj)
506     I , KPPdiffKzT(1-Olx,1-Oly,1,bi,bj)
507 heimbach 1.16 I , ikppkey
508 adcroft 1.1 O , vddiff
509     U , ghat
510 mlosch 1.40 O , hbl
511 heimbach 1.43 I , mytime, myIter, mythid )
512 adcroft 1.1 CALL TIMER_STOP ('KPPMIX [KPP_CALC]', myThid)
513    
514     c-----------------------------------------------------------------------
515 heimbach 1.4 c zero out land values and transfer to global variables
516 adcroft 1.1 c-----------------------------------------------------------------------
517    
518     DO j = jmin, jmax
519 heimbach 1.4 DO i = imin, imax
520     DO k = 1, Nr
521 mlosch 1.35 km1 = max(1,k-1)
522 jmc 1.28 KPPviscAz(i,j,k,bi,bj) = vddiff(i,j,k-1,1) * maskC(i,j,k,bi,bj)
523 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
524 jmc 1.28 KPPdiffKzS(i,j,k,bi,bj)= vddiff(i,j,k-1,2) * maskC(i,j,k,bi,bj)
525 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
526 jmc 1.28 KPPdiffKzT(i,j,k,bi,bj)= vddiff(i,j,k-1,3) * maskC(i,j,k,bi,bj)
527 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
528 jmc 1.28 KPPghat(i,j,k,bi,bj) = ghat(i,j,k) * maskC(i,j,k,bi,bj)
529 mlosch 1.35 & * maskC(i,j,km1,bi,bj)
530 jmc 1.42 ENDDO
531 mlosch 1.35 k = 1
532     #ifdef ALLOW_SHELFICE
533     if ( useShelfIce ) k = kTopC(i,j,bi,bj)
534     #endif /* ALLOW_SHELFICE */
535     KPPhbl(i,j,bi,bj) = hbl(i,j) * maskC(i,j,k,bi,bj)
536    
537 jmc 1.42 ENDDO
538     ENDDO
539 adcroft 1.1
540     #ifdef KPP_SMOOTH_VISC
541     c horizontal smoothing of vertical viscosity
542     DO k = 1, Nr
543 heimbach 1.4 CALL SMOOTH_HORIZ (
544 adcroft 1.1 I k, bi, bj,
545 jmc 1.42 U KPPviscAz(1-OLx,1-OLy,k,bi,bj),
546 mlosch 1.40 I myThid )
547 jmc 1.42 ENDDO
548     C jmc: No EXCH inside bi,bj loop !!!
549     c _EXCH_XYZ_R8(KPPviscAz , myThid )
550 adcroft 1.1 #endif /* KPP_SMOOTH_VISC */
551    
552     #ifdef KPP_SMOOTH_DIFF
553     c horizontal smoothing of vertical diffusivity
554     DO k = 1, Nr
555 heimbach 1.4 CALL SMOOTH_HORIZ (
556 adcroft 1.1 I k, bi, bj,
557 jmc 1.42 U KPPdiffKzS(1-OLx,1-OLy,k,bi,bj),
558 mlosch 1.40 I myThid )
559 heimbach 1.4 CALL SMOOTH_HORIZ (
560 adcroft 1.1 I k, bi, bj,
561 jmc 1.42 U KPPdiffKzT(1-OLx,1-OLy,k,bi,bj),
562 mlosch 1.40 I myThid )
563 jmc 1.42 ENDDO
564 adcroft 1.1 #endif /* KPP_SMOOTH_DIFF */
565 heimbach 1.11
566     cph(
567     cph crucial: this avoids full recomp./call of kppmix
568 heimbach 1.16 CADJ store KPPhbl = comlev1_kpp, key = ikppkey
569 heimbach 1.11 cph)
570 adcroft 1.1
571     C Compute fraction of solar short-wave flux penetrating to
572     C the bottom of the mixing layer.
573     DO j=1-OLy,sNy+OLy
574     DO i=1-OLx,sNx+OLx
575     worka(i,j) = KPPhbl(i,j,bi,bj)
576     ENDDO
577     ENDDO
578     CALL SWFRAC(
579 heimbach 1.4 I (sNx+2*OLx)*(sNy+2*OLy), minusone,
580 jmc 1.42 U worka,
581     I myTime, myIter, myThid )
582 adcroft 1.1 DO j=1-OLy,sNy+OLy
583     DO i=1-OLx,sNx+OLx
584 heimbach 1.4 KPPfrac(i,j,bi,bj) = worka(i,j)
585 adcroft 1.1 ENDDO
586     ENDDO
587    
588 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
589     C Compute fraction of saltplume (flux) penetrating to
590     C the bottom of the mixing layer.
591 atn 1.46 IF ( useSALT_PLUME ) THEN
592     DO j=1-OLy,sNy+OLy
593     DO i=1-OLx,sNx+OLx
594     worka(i,j) = KPPhbl(i,j,bi,bj)
595     ENDDO
596     ENDDO
597     CALL SALT_PLUME_FRAC(
598     I (sNx+2*OLx)*(sNy+2*OLy), minusone,SaltPlumeDepth,
599     U worka,
600     I myTime, myIter, myThid )
601     DO j=1-OLy,sNy+OLy
602     DO i=1-OLx,sNx+OLx
603     KPPplumefrac(i,j,bi,bj) = worka(i,j)
604     ENDDO
605     ENDDO
606     ENDIF
607 dimitri 1.44 #endif /* ALLOW_SALT_PLUME */
608    
609 adcroft 1.1 ENDIF
610    
611 adcroft 1.9 #endif /* ALLOW_KPP */
612 adcroft 1.1
613 heimbach 1.8 RETURN
614     END
615    
616 jmc 1.42 SUBROUTINE KPP_CALC_DUMMY(
617     I bi, bj, myTime, myIter, myThid )
618     C *==========================================================*
619 heimbach 1.8 C | SUBROUTINE KPP_CALC_DUMMY |
620     C | o Compute all KPP fields defined in KPP.h |
621     C | o Dummy routine for TAMC
622 jmc 1.42 C *==========================================================*
623 heimbach 1.8 C | This subroutine serves as an interface between MITGCMUV |
624     C | code and NCOM 1-D routines in kpp_routines.F |
625 jmc 1.42 C *==========================================================*
626 heimbach 1.8 IMPLICIT NONE
627    
628     #include "SIZE.h"
629     #include "EEPARAMS.h"
630     #include "PARAMS.h"
631     #include "KPP.h"
632     #include "KPP_PARAMS.h"
633     #include "GRID.h"
634 dimitri 1.36 #include "GAD.h"
635 heimbach 1.8
636     c Routine arguments
637 jmc 1.42 c bi, bj :: Current tile indices
638     c myTime :: Current time in simulation
639     c myIter :: Current iteration number in simulation
640     c myThid :: My Thread Id. number
641 heimbach 1.8
642     INTEGER bi, bj
643 jmc 1.42 _RL myTime
644     INTEGER myIter
645 heimbach 1.8 INTEGER myThid
646    
647     #ifdef ALLOW_KPP
648    
649     c Local constants
650     integer i, j, k
651    
652     DO j=1-OLy,sNy+OLy
653     DO i=1-OLx,sNx+OLx
654     KPPhbl (i,j,bi,bj) = 1.0
655     KPPfrac(i,j,bi,bj) = 0.0
656 dimitri 1.44 #ifdef ALLOW_SALT_PLUME
657     KPPplumefrac(i,j,bi,bj) = 0.0
658     #endif /* ALLOW_SALT_PLUME */
659 heimbach 1.8 DO k = 1,Nr
660     KPPghat (i,j,k,bi,bj) = 0.0
661 jmc 1.21 KPPviscAz (i,j,k,bi,bj) = viscAr
662 heimbach 1.8 ENDDO
663     ENDDO
664     ENDDO
665 dimitri 1.36
666     CALL CALC_3D_DIFFUSIVITY(
667     I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
668     I GAD_SALINITY, .FALSE., .FALSE.,
669     O KPPdiffKzS(1-Olx,1-Oly,1,bi,bj),
670     I myThid)
671     CALL CALC_3D_DIFFUSIVITY(
672     I bi,bj,1-Olx,sNx+OLx,1-Oly,sNy+OLy,
673     I GAD_TEMPERATURE, .FALSE., .FALSE.,
674     O KPPdiffKzT(1-Olx,1-Oly,1,bi,bj),
675     I myThid)
676    
677 heimbach 1.8 #endif
678 adcroft 1.1 RETURN
679     END

  ViewVC Help
Powered by ViewVC 1.1.22