Submitted by Maria Luneva. Calculation of Smagronsky diffusivity and viscosity
ldftra_smag.F90 ldfdyn_smag.F90 step_oce.F90 step.F90 ldftra_oce.F90 ldftra.F90 ldfdyn_oce.F90 ldfdyn.F90 ldftra_c3d.h90 dynldf_bilap.F90 dynldf_bilapg.F90 traldf_bilap.F90 traldf_bilapg.F90
Modules added: ldftra_smag.F90 - calculates Smagorinsky diffusivity for laplacian and bilaplacian operators,
called by step.F90
ldfdyn_smag.F90 - calculates Smagorinsky viscosity for laplacian and bilaplacian operators
called by step.F90
(Griffies and Hallberg, 2000)
laplacian case:
aht=(rn_chsmag*delta/pi)2*D (1)
(or rn_cmsmag for viscousity)
where D2=Dt2 + Ds2, Dt is horisontal tension and Ds is the horizontal shearing strain
delta=1/(1/e12+1/e22)0,5
in bilaplacian case diffusivity(viscousity) bht=aht*delta2/8
Stability criteria is twice stronger then in (Griffies and Hallberg, 2000)in assumption of positiveness of the solution
Aht<delta2/(16 rdt)
rn_aht_0 - background diffusivity (either laplacian or bilaplacian)
rn_ahm_0_lap, rn_ahm_0_blp background viscosity in laplacian and bilaplacian case
Keys added : key_traldf_smag ( should be set with key_traldf_c3d)
key_dynldf_smag ( should be set with key_dynldf_c3d)
Modules changed:
step_oce.F90 : added:
USE ldftra_smag ! smagorinsky diffusivity . (ldf_tra_smag routine)
USE ldfdyn_smag ! smagorinsky viscosity (ldf_dyn_smag routine)
step.F90
added calculation of smagorinsky diffusivity/viscousity:
#if defined key_traldf_c3d && key_traldf_smag
CALL ldf_tra_smag( kstp ) ! Smagorinsky diffusivity
# endif
#if defined key_dynldf_c3d && key_dynldf_smag
CALL ldf_dyn_smag( kstp ) ! Smagorinsky viscosity
# endif
LDF:
ldftra_oce.F90
added : definition of new scalar constants
- REAL(wp), PUBLIC
- rn_chsmag = 1._wp !: constant in Smagorinsky diffusivity
- INTEGER , PUBLIC
- nkaht_smag =0 !: switch of diffusivity in bilaplacian Smagorinsky
nkaht_smag =1 in smagorinsky case andchanges the order of multiplication by diffusivity in bilaplacian case (and makes in unconservative!!!) as in usual case nkaht_smag =0 operator absolutely unstable (but conservative)
Bilaplacian Smagorinsky operator is not recommended
ldfdyn_oce.F90
added :definition of new constants
- REAL(wp), PUBLIC
- rn_cmsmag_1 = 3._wp !: constant in laplacian Smagorinsky viscosity
- REAL(wp), PUBLIC
- rn_cmsmag_2 = 3._wp !: constant in bilaplacian Smagorinsky viscosity
- INTEGER , PUBLIC
- nkahm_smag = 0
ldftra.F90
added : new scalar to namelist namtra_ldf:
NAMELIST/namtra_ldf/ ln_traldf_lap , ln_traldf_bilap, &
....
& rn_slpmax , rn_chsmag
check and warnings:
#if defined key_traldf_smag && ! defined key_traldf_c3d
CALL ctl_stop( 'key_traldf_smag can only be used with key_traldf_c3d' )
#endif
nkaht_smag=0
# if defined key_traldf_smag
nkaht_smag=1
IF(lwp.and.ln_traldf_bilap) WRITE(numout,*)' SMAGORINSKY + BILAPLACIAN - UNSTABLE OR NON_CONSERVATIVE'
# endif
ldfdyn.F90
added: to NAMELIST/namdyn_ldf/ new variable and assignment to nkahm_smag
NAMELIST/namdyn_ldf/ ln_dynldf_lap , ln_dynldf_bilap, &
...
& rn_cmsmag_1 ,rn_cmsmag_2
nkahm_smag = 0
#if defined key_dynldf_smag
nkahm_smag = 1
#endif
ldftra_c3d.h90:
corrected small bug for key_traldf_c3d and not key_traldf_eiv
TRA:
traldf_bilap.F90
All lines containing nkaht:
zlt(ji,jj) = ((1-nkaht_smag)*fsahtt(ji,jj,jk)+nkaht_smag) * zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) &
pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra*(nkaht_smag*fsahtt(ji,jj,jk)+1-nkaht_smag
etc.
DYN : modified lines contain nkahm in modules
dynldf_bilap.F90
namelist: added to the corresponding namelists:
namtra_ldf:
rn_chsmag=1 (corresponding to for typical horcon values for POM)
namdyn_ldf: (as recommended by (Griffies and Hallberg, 2000) )
rn_cmsmag_1=3 (laplacian)
rn_cmsmag_2=3 (bilaplacian)
TESTS: GYRE 0.2 and 0.1 km resolution with very low backgrouns viscosity/diffusivity (5/1 m2/s for laplacian and -1-3e7m4/s for bilaplacian