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