1 |
! |
module vdif_kcay_m |
|
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/vdif_kcay.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $ |
|
|
! |
|
|
SUBROUTINE vdif_kcay(ngrid,dt,g,rconst,plev,temp |
|
|
s ,zlev,zlay,u,v,teta,cd,q2,q2diag,km,kn,ustar |
|
|
s ,l_mix) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
IMPLICIT NONE |
|
|
c....................................................................... |
|
|
c....................................................................... |
|
|
c |
|
|
c dt : pas de temps |
|
|
c g : g |
|
|
c zlev : altitude a chaque niveau (interface inferieure de la couche |
|
|
c de meme indice) |
|
|
c zlay : altitude au centre de chaque couche |
|
|
c u,v : vitesse au centre de chaque couche |
|
|
c (en entree : la valeur au debut du pas de temps) |
|
|
c teta : temperature potentielle au centre de chaque couche |
|
|
c (en entree : la valeur au debut du pas de temps) |
|
|
c cd : cdrag |
|
|
c (en entree : la valeur au debut du pas de temps) |
|
|
c q2 : $q^2$ au bas de chaque couche |
|
|
c (en entree : la valeur au debut du pas de temps) |
|
|
c (en sortie : la valeur a la fin du pas de temps) |
|
|
c km : diffusivite turbulente de quantite de mouvement (au bas de chaque |
|
|
c couche) |
|
|
c (en sortie : la valeur a la fin du pas de temps) |
|
|
c kn : diffusivite turbulente des scalaires (au bas de chaque couche) |
|
|
c (en sortie : la valeur a la fin du pas de temps) |
|
|
c |
|
|
c....................................................................... |
|
|
REAL dt,g,rconst |
|
|
real plev(klon,klev+1),temp(klon,klev) |
|
|
real ustar(klon),snstable |
|
|
REAL zlev(klon,klev+1) |
|
|
REAL zlay(klon,klev) |
|
|
REAL u(klon,klev) |
|
|
REAL v(klon,klev) |
|
|
REAL teta(klon,klev) |
|
|
REAL cd(klon) |
|
|
REAL q2(klon,klev+1),q2s(klon,klev+1) |
|
|
REAL q2diag(klon,klev+1) |
|
|
REAL km(klon,klev+1) |
|
|
REAL kn(klon,klev+1) |
|
|
real sq(klon),sqz(klon),zz(klon,klev+1),zq,long0(klon) |
|
|
|
|
|
integer l_mix,iii |
|
|
c....................................................................... |
|
|
c |
|
|
c nlay : nombre de couches |
|
|
c nlev : nombre de niveaux |
|
|
c ngrid : nombre de points de grille |
|
|
c unsdz : 1 sur l'epaisseur de couche |
|
|
c unsdzdec : 1 sur la distance entre le centre de la couche et le |
|
|
c centre de la couche inferieure |
|
|
c q : echelle de vitesse au bas de chaque couche |
|
|
c (valeur a la fin du pas de temps) |
|
|
c |
|
|
c....................................................................... |
|
|
INTEGER nlay,nlev,ngrid |
|
|
REAL unsdz(klon,klev) |
|
|
REAL unsdzdec(klon,klev+1) |
|
|
REAL q(klon,klev+1) |
|
|
|
|
|
c....................................................................... |
|
|
c |
|
|
c kmpre : km au debut du pas de temps |
|
|
c qcstat : q : solution stationnaire du probleme couple |
|
|
c (valeur a la fin du pas de temps) |
|
|
c q2cstat : q2 : solution stationnaire du probleme couple |
|
|
c (valeur a la fin du pas de temps) |
|
|
c |
|
|
c....................................................................... |
|
|
REAL kmpre(klon,klev+1) |
|
|
REAL qcstat |
|
|
REAL q2cstat |
|
|
real sss,sssq |
|
|
c....................................................................... |
|
|
c |
|
|
c long : longueur de melange calculee selon Blackadar |
|
|
c |
|
|
c....................................................................... |
|
|
REAL long(klon,klev+1) |
|
|
c....................................................................... |
|
|
c |
|
|
c kmq3 : terme en q^3 dans le developpement de km |
|
|
c (valeur au debut du pas de temps) |
|
|
c kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz} |
|
|
c (valeur a la fin du pas de temps) |
|
|
c knq3 : terme en q^3 dans le developpement de kn |
|
|
c mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz} |
|
|
c (valeur a la fin du pas de temps) |
|
|
c m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz} |
|
|
c (valeur a la fin du pas de temps) |
|
|
c m : valeur a la fin du pas de temps |
|
|
c mpre : valeur au debut du pas de temps |
|
|
c m2 : valeur a la fin du pas de temps |
|
|
c n2 : valeur a la fin du pas de temps |
|
|
c |
|
|
c....................................................................... |
|
|
REAL kmq3 |
|
|
REAL kmcstat |
|
|
REAL knq3 |
|
|
REAL mcstat |
|
|
REAL m2cstat |
|
|
REAL m(klon,klev+1) |
|
|
REAL mpre(klon,klev+1) |
|
|
REAL m2(klon,klev+1) |
|
|
REAL n2(klon,klev+1) |
|
|
c....................................................................... |
|
|
c |
|
|
c gn : intermediaire pour les coefficients de stabilite |
|
|
c gnmin : borne inferieure de gn (-0.23 ou -0.28) |
|
|
c gnmax : borne superieure de gn (0.0233) |
|
|
c gninf : vrai si gn est en dessous de sa borne inferieure |
|
|
c gnsup : vrai si gn est en dessus de sa borne superieure |
|
|
c gm : drole d'objet bien utile |
|
|
c ri : nombre de Richardson |
|
|
c sn : coefficient de stabilite pour n |
|
|
c snq2 : premier terme du developement limite de sn en q2 |
|
|
c sm : coefficient de stabilite pour m |
|
|
c smq2 : premier terme du developement limite de sm en q2 |
|
|
c |
|
|
c....................................................................... |
|
|
REAL gn |
|
|
REAL gnmin |
|
|
REAL gnmax |
|
|
LOGICAL gninf |
|
|
LOGICAL gnsup |
|
|
REAL gm |
|
|
c REAL ri(klon,klev+1) |
|
|
REAL sn(klon,klev+1) |
|
|
REAL snq2(klon,klev+1) |
|
|
REAL sm(klon,klev+1) |
|
|
REAL smq2(klon,klev+1) |
|
|
c....................................................................... |
|
|
c |
|
|
c kappa : consatnte de Von Karman (0.4) |
|
|
c long00 : longueur de reference pour le calcul de long (160) |
|
|
c a1,a2,b1,b2,c1 : constantes d'origine pour les coefficients |
|
|
c de stabilite (0.92/0.74/16.6/10.1/0.08) |
|
|
c cn1,cn2 : constantes pour sn |
|
|
c cm1,cm2,cm3,cm4 : constantes pour sm |
|
|
c |
|
|
c....................................................................... |
|
|
REAL kappa |
|
|
REAL long00 |
|
|
REAL a1,a2,b1,b2,c1 |
|
|
REAL cn1,cn2 |
|
|
REAL cm1,cm2,cm3,cm4 |
|
|
c....................................................................... |
|
|
c |
|
|
c termq : termes en $q$ dans l'equation de q2 |
|
|
c termq3 : termes en $q^3$ dans l'equation de q2 |
|
|
c termqm2 : termes en $q*m^2$ dans l'equation de q2 |
|
|
c termq3m2 : termes en $q^3*m^2$ dans l'equation de q2 |
|
|
c |
|
|
c....................................................................... |
|
|
REAL termq |
|
|
REAL termq3 |
|
|
REAL termqm2 |
|
|
REAL termq3m2 |
|
|
c....................................................................... |
|
|
c |
|
|
c q2min : borne inferieure de q2 |
|
|
c q2max : borne superieure de q2 |
|
|
c |
|
|
c....................................................................... |
|
|
REAL q2min |
|
|
REAL q2max |
|
|
c....................................................................... |
|
|
c knmin : borne inferieure de kn |
|
|
c kmmin : borne inferieure de km |
|
|
c....................................................................... |
|
|
REAL knmin |
|
|
REAL kmmin |
|
|
c....................................................................... |
|
|
INTEGER ilay,ilev,igrid |
|
|
REAL tmp1,tmp2 |
|
|
c....................................................................... |
|
|
PARAMETER (kappa=0.4E+0) |
|
|
PARAMETER (long00=160.E+0) |
|
|
c PARAMETER (gnmin=-10.E+0) |
|
|
PARAMETER (gnmin=-0.28) |
|
|
PARAMETER (gnmax=0.0233E+0) |
|
|
PARAMETER (a1=0.92E+0) |
|
|
PARAMETER (a2=0.74E+0) |
|
|
PARAMETER (b1=16.6E+0) |
|
|
PARAMETER (b2=10.1E+0) |
|
|
PARAMETER (c1=0.08E+0) |
|
|
PARAMETER (knmin=1.E-5) |
|
|
PARAMETER (kmmin=1.E-5) |
|
|
PARAMETER (q2min=1.e-5) |
|
|
PARAMETER (q2max=1.E+2) |
|
|
PARAMETER (nlay=klev) |
|
|
PARAMETER (nlev=klev+1) |
|
|
c |
|
|
PARAMETER ( |
|
|
& cn1=a2*(1.E+0 -6.E+0 *a1/b1) |
|
|
& ) |
|
|
PARAMETER ( |
|
|
& cn2=-3.E+0 *a2*(6.E+0 *a1+b2) |
|
|
& ) |
|
|
PARAMETER ( |
|
|
& cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1) |
|
|
& ) |
|
|
PARAMETER ( |
|
|
& cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) |
|
|
& -3.E+0 *c1*(b2+6.E+0 *a1))) |
|
|
& ) |
|
|
PARAMETER ( |
|
|
& cm3=-3.E+0 *a2*(6.E+0 *a1+b2) |
|
|
& ) |
|
|
PARAMETER ( |
|
|
& cm4=-9.E+0 *a1*a2 |
|
|
& ) |
|
|
|
|
|
logical first |
|
|
save first |
|
|
data first/.true./ |
|
|
c....................................................................... |
|
|
c traitment des valeur de q2 en entree |
|
|
c....................................................................... |
|
|
c |
|
|
c Initialisation de q2 |
|
|
|
|
|
call yamada(ngrid,dt,g,rconst,plev,temp |
|
|
s ,zlev,zlay,u,v,teta,cd,q2diag,km,kn,ustar |
|
|
s ,l_mix) |
|
|
if (first.and.1.eq.1) then |
|
|
first=.false. |
|
|
q2=q2diag |
|
|
endif |
|
|
|
|
|
DO ilev=1,nlev |
|
|
DO igrid=1,ngrid |
|
|
q2(igrid,ilev)=amax1(q2(igrid,ilev),q2min) |
|
|
q(igrid,ilev)=sqrt(q2(igrid,ilev)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
tmp1=cd(igrid)*(u(igrid,1)**2+v(igrid,1)**2) |
|
|
q2(igrid,1)=b1**(2.E+0/3.E+0)*tmp1 |
|
|
q2(igrid,1)=amax1(q2(igrid,1),q2min) |
|
|
q(igrid,1)=sqrt(q2(igrid,1)) |
|
|
ENDDO |
|
|
c |
|
|
c....................................................................... |
|
|
c les increments verticaux |
|
|
c....................................................................... |
|
|
c |
|
|
c!!!!! allerte !!!!!c |
|
|
c!!!!! zlev n'est pas declare a nlev !!!!!c |
|
|
c!!!!! ----> |
|
|
DO igrid=1,ngrid |
|
|
zlev(igrid,nlev)=zlay(igrid,nlay) |
|
|
& +( zlay(igrid,nlay) - zlev(igrid,nlev-1) ) |
|
|
ENDDO |
|
|
c!!!!! <---- |
|
|
c!!!!! allerte !!!!!c |
|
|
c |
|
|
DO ilay=1,nlay |
|
|
DO igrid=1,ngrid |
|
|
unsdz(igrid,ilay)=1.E+0/(zlev(igrid,ilay+1)-zlev(igrid,ilay)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
DO igrid=1,ngrid |
|
|
unsdzdec(igrid,1)=1.E+0/(zlay(igrid,1)-zlev(igrid,1)) |
|
|
ENDDO |
|
|
DO ilay=2,nlay |
|
|
DO igrid=1,ngrid |
|
|
unsdzdec(igrid,ilay)=1.E+0/(zlay(igrid,ilay)-zlay(igrid,ilay-1)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
DO igrid=1,ngrid |
|
|
unsdzdec(igrid,nlay+1)=1.E+0/(zlev(igrid,nlay+1)-zlay(igrid,nlay)) |
|
|
ENDDO |
|
|
c |
|
|
c....................................................................... |
|
|
c le cisaillement et le gradient de temperature |
|
|
c....................................................................... |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
m2(igrid,1)=(unsdzdec(igrid,1) |
|
|
& *u(igrid,1))**2 |
|
|
& +(unsdzdec(igrid,1) |
|
|
& *v(igrid,1))**2 |
|
|
m(igrid,1)=sqrt(m2(igrid,1)) |
|
|
mpre(igrid,1)=m(igrid,1) |
|
|
ENDDO |
|
|
c |
|
|
c----------------------------------------------------------------------- |
|
|
DO ilev=2,nlev-1 |
|
|
DO igrid=1,ngrid |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
n2(igrid,ilev)=g*unsdzdec(igrid,ilev) |
|
|
& *(teta(igrid,ilev)-teta(igrid,ilev-1)) |
|
|
& /(teta(igrid,ilev)+teta(igrid,ilev-1)) *2.E+0 |
|
|
c n2(igrid,ilev)=0. |
|
|
c |
|
|
c ---> |
|
|
c on ne sais traiter que les cas stratifies. et l'ajustement |
|
|
c convectif est cense faire en sorte que seul des configurations |
|
|
c stratifiees soient rencontrees en entree de cette routine. |
|
|
c mais, bon ... on sait jamais (meme on sait que n2 prends |
|
|
c quelques valeurs negatives ... parfois) alors : |
|
|
c<--- |
|
|
c |
|
|
IF (n2(igrid,ilev).lt.0.E+0) THEN |
|
|
n2(igrid,ilev)=0.E+0 |
|
|
ENDIF |
|
|
c |
|
|
m2(igrid,ilev)=(unsdzdec(igrid,ilev) |
|
|
& *(u(igrid,ilev)-u(igrid,ilev-1)))**2 |
|
|
& +(unsdzdec(igrid,ilev) |
|
|
& *(v(igrid,ilev)-v(igrid,ilev-1)))**2 |
|
|
m(igrid,ilev)=sqrt(m2(igrid,ilev)) |
|
|
mpre(igrid,ilev)=m(igrid,ilev) |
|
|
c |
|
|
c----------------------------------------------------------------------- |
|
|
ENDDO |
|
|
ENDDO |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
m2(igrid,nlev)=m2(igrid,nlev-1) |
|
|
m(igrid,nlev)=m(igrid,nlev-1) |
|
|
mpre(igrid,nlev)=m(igrid,nlev) |
|
|
ENDDO |
|
|
c |
|
|
c....................................................................... |
|
|
c calcul des fonctions de stabilite |
|
|
c....................................................................... |
|
|
c |
|
|
if (l_mix.eq.4) then |
|
|
DO igrid=1,ngrid |
|
|
sqz(igrid)=1.e-10 |
|
|
sq(igrid)=1.e-10 |
|
|
ENDDO |
|
|
do ilev=2,nlev-1 |
|
|
DO igrid=1,ngrid |
|
|
zq=sqrt(q2(igrid,ilev)) |
|
|
sqz(igrid) |
|
|
. =sqz(igrid)+zq*zlev(igrid,ilev) |
|
|
. *(zlay(igrid,ilev)-zlay(igrid,ilev-1)) |
|
|
sq(igrid)=sq(igrid)+zq*(zlay(igrid,ilev)-zlay(igrid,ilev-1)) |
|
|
ENDDO |
|
|
enddo |
|
|
DO igrid=1,ngrid |
|
|
long0(igrid)=0.2*sqz(igrid)/sq(igrid) |
|
|
ENDDO |
|
|
else if (l_mix.eq.3) then |
|
|
long0(igrid)=long00 |
|
|
endif |
|
|
|
|
|
c (abd 5 2) print*,'LONG0=',long0 |
|
|
|
|
|
c----------------------------------------------------------------------- |
|
|
DO ilev=2,nlev-1 |
|
|
DO igrid=1,ngrid |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
tmp1=kappa*(zlev(igrid,ilev)-zlev(igrid,1)) |
|
|
if (l_mix.ge.10) then |
|
|
long(igrid,ilev)=l_mix |
|
|
else |
|
|
long(igrid,ilev)=tmp1/(1.E+0 + tmp1/long0(igrid)) |
|
|
endif |
|
|
long(igrid,ilev)=max(min(long(igrid,ilev) |
|
|
s ,0.5*sqrt(q2(igrid,ilev))/sqrt(max(n2(igrid,ilev),1.e-10))) |
|
|
s ,5.) |
|
|
|
|
|
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
|
|
& * n2(igrid,ilev) |
|
|
gm=long(igrid,ilev)**2 / q2(igrid,ilev) |
|
|
& * m2(igrid,ilev) |
|
|
c |
|
|
gninf=.false. |
|
|
gnsup=.false. |
|
|
long(igrid,ilev)=long(igrid,ilev) |
|
|
long(igrid,ilev)=long(igrid,ilev) |
|
|
c |
|
|
IF (gn.lt.gnmin) THEN |
|
|
gninf=.true. |
|
|
gn=gnmin |
|
|
ENDIF |
|
|
c |
|
|
IF (gn.gt.gnmax) THEN |
|
|
gnsup=.true. |
|
|
gn=gnmax |
|
|
ENDIF |
|
|
c |
|
|
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
|
|
sm(igrid,ilev)= |
|
|
& (cm1+cm2*gn) |
|
|
& /( (1.E+0 +cm3*gn) |
|
|
& *(1.E+0 +cm4*gn) ) |
|
|
c |
|
|
IF ((gninf).or.(gnsup)) THEN |
|
|
snq2(igrid,ilev)=0.E+0 |
|
|
smq2(igrid,ilev)=0.E+0 |
|
|
ELSE |
|
|
snq2(igrid,ilev)= |
|
|
& -gn |
|
|
& *(-cn1*cn2/(1.E+0 +cn2*gn)**2 ) |
|
|
smq2(igrid,ilev)= |
|
|
& -gn |
|
|
& *( cm2*(1.E+0 +cm3*gn) |
|
|
& *(1.E+0 +cm4*gn) |
|
|
& -( cm3*(1.E+0 +cm4*gn) |
|
|
& +cm4*(1.E+0 +cm3*gn) ) |
|
|
& *(cm1+cm2*gn) ) |
|
|
& /( (1.E+0 +cm3*gn) |
|
|
& *(1.E+0 +cm4*gn) )**2 |
|
|
ENDIF |
|
|
c |
|
|
c abd |
|
|
c if(ilev.le.57.and.ilev.ge.37) then |
|
|
c print*,'L=',ilev,' GN=',gn,' SM=',sm(igrid,ilev) |
|
|
c endif |
|
|
c ---> |
|
|
c la decomposition de Taylor en q2 n'a de sens que |
|
|
c dans les cas stratifies ou sn et sm sont quasi |
|
|
c proportionnels a q2. ailleurs on laisse le meme |
|
|
c algorithme car l'ajustement convectif fait le travail. |
|
|
c mais c'est delirant quand sn et snq2 n'ont pas le meme |
|
|
c signe : dans ces cas, on ne fait pas la decomposition. |
|
|
c<--- |
|
|
c |
|
|
IF (snq2(igrid,ilev)*sn(igrid,ilev).le.0.E+0) |
|
|
& snq2(igrid,ilev)=0.E+0 |
|
|
IF (smq2(igrid,ilev)*sm(igrid,ilev).le.0.E+0) |
|
|
& smq2(igrid,ilev)=0.E+0 |
|
|
c |
|
|
C Correction pour les couches stables. |
|
|
C Schema repris de JHoltzlag Boville, lui meme venant de... |
|
|
|
|
|
if (1.eq.1) then |
|
|
snstable=1.-zlev(igrid,ilev) |
|
|
s /(700.*max(ustar(igrid),0.0001)) |
|
|
snstable=1.-zlev(igrid,ilev)/400. |
|
|
snstable=max(snstable,0.) |
|
|
snstable=snstable*snstable |
|
|
|
|
|
c abde print*,'SN ',ilev,sn(1,ilev),snstable |
|
|
if (sn(igrid,ilev).lt.snstable) then |
|
|
sn(igrid,ilev)=snstable |
|
|
snq2(igrid,ilev)=0. |
|
|
endif |
|
|
|
|
|
if (sm(igrid,ilev).lt.snstable) then |
|
|
sm(igrid,ilev)=snstable |
|
|
smq2(igrid,ilev)=0. |
|
|
endif |
|
|
|
|
|
endif |
|
|
|
|
|
c sn : coefficient de stabilite pour n |
|
|
c snq2 : premier terme du developement limite de sn en q2 |
|
|
c----------------------------------------------------------------------- |
|
|
ENDDO |
|
|
ENDDO |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
c....................................................................... |
|
|
c calcul de km et kn au debut du pas de temps |
|
|
c....................................................................... |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
kn(igrid,1)=knmin |
|
|
km(igrid,1)=kmmin |
|
|
kmpre(igrid,1)=km(igrid,1) |
|
|
ENDDO |
|
|
c |
|
|
c----------------------------------------------------------------------- |
|
|
DO ilev=2,nlev-1 |
|
|
DO igrid=1,ngrid |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
& *sn(igrid,ilev) |
|
|
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
& *sm(igrid,ilev) |
|
|
kmpre(igrid,ilev)=km(igrid,ilev) |
|
|
c |
|
|
c----------------------------------------------------------------------- |
|
|
ENDDO |
|
|
ENDDO |
|
|
c----------------------------------------------------------------------- |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
kn(igrid,nlev)=kn(igrid,nlev-1) |
|
|
km(igrid,nlev)=km(igrid,nlev-1) |
|
|
kmpre(igrid,nlev)=km(igrid,nlev) |
|
|
ENDDO |
|
|
c |
|
|
c....................................................................... |
|
|
c boucle sur les niveaux 2 a nlev-1 |
|
|
c....................................................................... |
|
|
c |
|
|
c----> |
|
|
DO 10001 ilev=2,nlev-1 |
|
|
c----> |
|
|
DO 10002 igrid=1,ngrid |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
c calcul des termes sources et puits de l'equation de q2 |
|
|
c ------------------------------------------------------ |
|
|
c |
|
|
knq3=kn(igrid,ilev)*snq2(igrid,ilev) |
|
|
& /sn(igrid,ilev) |
|
|
kmq3=km(igrid,ilev)*smq2(igrid,ilev) |
|
|
& /sm(igrid,ilev) |
|
|
c |
|
|
termq=0.E+0 |
|
|
termq3=0.E+0 |
|
|
termqm2=0.E+0 |
|
|
termq3m2=0.E+0 |
|
|
c |
|
|
tmp1=dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev) |
|
|
tmp2=dt*2.E+0 *kmq3*m2(igrid,ilev) |
|
|
termqm2=termqm2 |
|
|
& +dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev) |
|
|
& -dt*2.E+0 *kmq3*m2(igrid,ilev) |
|
|
termq3m2=termq3m2 |
|
|
& +dt*2.E+0 *kmq3*m2(igrid,ilev) |
|
|
c |
|
|
termq=termq |
|
|
& -dt*2.E+0 *kn(igrid,ilev)*n2(igrid,ilev) |
|
|
& +dt*2.E+0 *knq3*n2(igrid,ilev) |
|
|
termq3=termq3 |
|
|
& -dt*2.E+0 *knq3*n2(igrid,ilev) |
|
|
c |
|
|
termq3=termq3 |
|
|
& -dt*2.E+0 *q(igrid,ilev)**3 / (b1*long(igrid,ilev)) |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
c resolution stationnaire couplee avec le gradient de vitesse local |
|
|
c ----------------------------------------------------------------- |
|
|
c |
|
|
c -----{on cherche le cisaillement qui annule l'equation de q^2 |
|
|
c supposee en q3} |
|
|
c |
|
|
tmp1=termq+termq3 |
|
|
tmp2=termqm2+termq3m2 |
|
|
m2cstat=m2(igrid,ilev) |
|
|
& -(tmp1+tmp2)/(dt*2.E+0*km(igrid,ilev)) |
|
|
mcstat=sqrt(m2cstat) |
|
|
|
|
|
c abde print*,'M2 L=',ilev,mpre(igrid,ilev),mcstat |
|
|
c |
|
|
c -----{puis on ecrit la valeur de q qui annule l'equation de m |
|
|
c supposee en q3} |
|
|
c |
|
|
IF (ilev.eq.2) THEN |
|
|
kmcstat=1.E+0 / mcstat |
|
|
& *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1) |
|
|
& *mpre(igrid,ilev+1) |
|
|
& +unsdz(igrid,ilev-1) |
|
|
& *cd(igrid) |
|
|
& *( sqrt(u(igrid,3)**2+v(igrid,3)**2) |
|
|
& -mcstat/unsdzdec(igrid,ilev) |
|
|
& -mpre(igrid,ilev+1)/unsdzdec(igrid,ilev+1) )**2) |
|
|
& /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) ) |
|
|
ELSE |
|
|
kmcstat=1.E+0 / mcstat |
|
|
& *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1) |
|
|
& *mpre(igrid,ilev+1) |
|
|
& +unsdz(igrid,ilev-1)*kmpre(igrid,ilev-1) |
|
|
& *mpre(igrid,ilev-1) ) |
|
|
& /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) ) |
|
|
ENDIF |
|
|
tmp2=kmcstat |
|
|
& /( sm(igrid,ilev)/q2(igrid,ilev) ) |
|
|
& /long(igrid,ilev) |
|
|
qcstat=tmp2**(1.E+0/3.E+0) |
|
|
q2cstat=qcstat**2 |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
c choix de la solution finale |
|
|
c --------------------------- |
|
|
c |
|
|
q(igrid,ilev)=qcstat |
|
|
q2(igrid,ilev)=q2cstat |
|
|
m(igrid,ilev)=mcstat |
|
|
c abd if(ilev.le.57.and.ilev.ge.37) then |
|
|
c print*,'L=',ilev,' M2=',m2(igrid,ilev),m2cstat, |
|
|
c s 'N2=',n2(igrid,ilev) |
|
|
c abd endif |
|
|
m2(igrid,ilev)=m2cstat |
|
|
c |
|
|
c ---> |
|
|
c pour des raisons simples q2 est minore |
|
|
c<--- |
|
|
c |
|
|
IF (q2(igrid,ilev).lt.q2min) THEN |
|
|
q2(igrid,ilev)=q2min |
|
|
q(igrid,ilev)=sqrt(q2min) |
|
|
ENDIF |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
c calcul final de kn et km |
|
|
c ------------------------ |
|
|
c |
|
|
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
|
|
& * n2(igrid,ilev) |
|
|
IF (gn.lt.gnmin) gn=gnmin |
|
|
IF (gn.gt.gnmax) gn=gnmax |
|
|
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
|
|
sm(igrid,ilev)= |
|
|
& (cm1+cm2*gn) |
|
|
& /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
|
|
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
& *sn(igrid,ilev) |
|
|
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
& *sm(igrid,ilev) |
|
|
c abd |
|
|
c if(ilev.le.57.and.ilev.ge.37) then |
|
|
c print*,'L=',ilev,' GN=',gn,' SM=',sm(igrid,ilev) |
|
|
c endif |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
10002 CONTINUE |
|
|
c |
|
|
10001 CONTINUE |
|
|
c |
|
|
c....................................................................... |
|
|
c |
|
|
c |
|
|
DO igrid=1,ngrid |
|
|
kn(igrid,1)=knmin |
|
|
km(igrid,1)=kmmin |
|
|
c kn(igrid,1)=cd(igrid) |
|
|
c km(igrid,1)=cd(igrid) |
|
|
q2(igrid,nlev)=q2(igrid,nlev-1) |
|
|
q(igrid,nlev)=q(igrid,nlev-1) |
|
|
kn(igrid,nlev)=kn(igrid,nlev-1) |
|
|
km(igrid,nlev)=km(igrid,nlev-1) |
|
|
ENDDO |
|
|
c |
|
|
c CALCUL DE LA DIFFUSION VERTICALE DE Q2 |
|
|
if (1.eq.1) then |
|
|
|
|
|
do ilev=2,klev-1 |
|
|
sss=sss+plev(1,ilev-1)-plev(1,ilev+1) |
|
|
sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev) |
|
|
enddo |
|
|
c print*,'Q2moy avant',sssq/sss |
|
|
c print*,'Q2q20 ',(q2(1,ilev),ilev=1,10) |
|
|
c print*,'Q2km0 ',(km(1,ilev),ilev=1,10) |
|
|
c ! C'est quoi ca qu'etait dans l'original??? |
|
|
c do igrid=1,ngrid |
|
|
c q2(igrid,1)=10. |
|
|
c enddo |
|
|
c q2s=q2 |
|
|
c do iii=1,10 |
|
|
c call vdif_q2(dt,g,rconst,plev,temp,km,q2) |
|
|
c do ilev=1,klev+1 |
|
|
c write(iii+49,*) q2(1,ilev),zlev(1,ilev) |
|
|
c enddo |
|
|
c enddo |
|
|
c stop |
|
|
c do ilev=1,klev |
|
|
c print*,zlev(1,ilev),q2s(1,ilev),q2(1,ilev) |
|
|
c enddo |
|
|
c q2s=q2-q2s |
|
|
c do ilev=1,klev |
|
|
c print*,q2s(1,ilev),zlev(1,ilev) |
|
|
c enddo |
|
|
do ilev=2,klev-1 |
|
|
sss=sss+plev(1,ilev-1)-plev(1,ilev+1) |
|
|
sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev) |
|
|
enddo |
|
|
print*,'Q2moy apres',sssq/sss |
|
|
c |
|
|
c |
|
|
do ilev=1,nlev |
|
|
do igrid=1,ngrid |
|
|
q2(igrid,ilev)=max(q2(igrid,ilev),q2min) |
|
|
q(igrid,ilev)=sqrt(q2(igrid,ilev)) |
|
|
|
|
|
c....................................................................... |
|
|
c |
|
|
c calcul final de kn et km |
|
|
c ------------------------ |
|
|
c |
|
|
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
|
|
& * n2(igrid,ilev) |
|
|
IF (gn.lt.gnmin) gn=gnmin |
|
|
IF (gn.gt.gnmax) gn=gnmax |
|
|
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
|
|
sm(igrid,ilev)= |
|
|
& (cm1+cm2*gn) |
|
|
& /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
|
|
C Correction pour les couches stables. |
|
|
C Schema repris de JHoltzlag Boville, lui meme venant de... |
|
|
|
|
|
if (1.eq.1) then |
|
|
snstable=1.-zlev(igrid,ilev) |
|
|
s /(700.*max(ustar(igrid),0.0001)) |
|
|
snstable=1.-zlev(igrid,ilev)/400. |
|
|
snstable=max(snstable,0.) |
|
|
snstable=snstable*snstable |
|
|
|
|
|
c abde print*,'SN ',ilev,sn(1,ilev),snstable |
|
|
if (sn(igrid,ilev).lt.snstable) then |
|
|
sn(igrid,ilev)=snstable |
|
|
snq2(igrid,ilev)=0. |
|
|
endif |
|
|
|
|
|
if (sm(igrid,ilev).lt.snstable) then |
|
|
sm(igrid,ilev)=snstable |
|
|
smq2(igrid,ilev)=0. |
|
|
endif |
|
|
|
|
|
endif |
|
|
|
|
|
c sn : coefficient de stabilite pour n |
|
|
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
& *sn(igrid,ilev) |
|
|
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
|
|
c |
|
|
enddo |
|
|
enddo |
|
|
c print*,'Q2km1 ',(km(1,ilev),ilev=1,10) |
|
2 |
|
|
3 |
endif |
IMPLICIT NONE |
4 |
|
|
5 |
RETURN |
contains |
6 |
END |
|
7 |
|
SUBROUTINE vdif_kcay(ngrid, dt, g, plev, zlev, zlay, u, v, teta, cd, q2, & |
8 |
|
q2diag, km, kn, ustar, l_mix) |
9 |
|
|
10 |
|
! From LMDZ4/libf/phylmd/vdif_kcay.F, version 1.1 2004/06/22 11:45:36 |
11 |
|
|
12 |
|
USE dimphy, ONLY: klev, klon |
13 |
|
use yamada_m, only: yamada |
14 |
|
|
15 |
|
INTEGER ngrid |
16 |
|
! dt : pas de temps |
17 |
|
! g : g |
18 |
|
! zlev : altitude a chaque niveau (interface inferieure de la couche |
19 |
|
! de meme indice) |
20 |
|
! zlay : altitude au centre de chaque couche |
21 |
|
! u, v : vitesse au centre de chaque couche |
22 |
|
! (en entree : la valeur au debut du pas de temps) |
23 |
|
! teta : temperature potentielle au centre de chaque couche |
24 |
|
! (en entree : la valeur au debut du pas de temps) |
25 |
|
! q2 : $q^2$ au bas de chaque couche |
26 |
|
! (en entree : la valeur au debut du pas de temps) |
27 |
|
! (en sortie : la valeur a la fin du pas de temps) |
28 |
|
! km : diffusivite turbulente de quantite de mouvement (au bas de chaque |
29 |
|
! couche) |
30 |
|
! (en sortie : la valeur a la fin du pas de temps) |
31 |
|
! kn : diffusivite turbulente des scalaires (au bas de chaque couche) |
32 |
|
! (en sortie : la valeur a la fin du pas de temps) |
33 |
|
|
34 |
|
REAL, intent(in):: dt |
35 |
|
real, intent(in):: g |
36 |
|
real plev(klon, klev+1) |
37 |
|
real ustar(klon), snstable |
38 |
|
REAL zlev(klon, klev+1) |
39 |
|
REAL zlay(klon, klev) |
40 |
|
REAL u(klon, klev) |
41 |
|
REAL v(klon, klev) |
42 |
|
REAL teta(klon, klev) |
43 |
|
REAL, intent(in):: cd (:) ! (ngrid) cdrag, valeur au debut du pas de temps |
44 |
|
REAL q2(klon, klev+1) |
45 |
|
REAL q2diag(klon, klev+1) |
46 |
|
REAL km(klon, klev+1) |
47 |
|
REAL kn(klon, klev+1) |
48 |
|
real sq(klon), sqz(klon), zq, long0(klon) |
49 |
|
|
50 |
|
integer l_mix |
51 |
|
|
52 |
|
! nlay : nombre de couches |
53 |
|
! nlev : nombre de niveaux |
54 |
|
! ngrid : nombre de points de grille |
55 |
|
! unsdz : 1 sur l'epaisseur de couche |
56 |
|
! unsdzdec : 1 sur la distance entre le centre de la couche et le |
57 |
|
! centre de la couche inferieure |
58 |
|
! q : echelle de vitesse au bas de chaque couche |
59 |
|
! (valeur a la fin du pas de temps) |
60 |
|
|
61 |
|
INTEGER nlay, nlev |
62 |
|
REAL unsdz(klon, klev) |
63 |
|
REAL unsdzdec(klon, klev+1) |
64 |
|
REAL q(klon, klev+1) |
65 |
|
|
66 |
|
! kmpre : km au debut du pas de temps |
67 |
|
! qcstat : q : solution stationnaire du probleme couple |
68 |
|
! (valeur a la fin du pas de temps) |
69 |
|
! q2cstat : q2 : solution stationnaire du probleme couple |
70 |
|
! (valeur a la fin du pas de temps) |
71 |
|
|
72 |
|
REAL kmpre(klon, klev+1) |
73 |
|
REAL qcstat |
74 |
|
REAL q2cstat |
75 |
|
real sss, sssq |
76 |
|
|
77 |
|
! long : longueur de melange calculee selon Blackadar |
78 |
|
|
79 |
|
REAL long(klon, klev+1) |
80 |
|
|
81 |
|
! kmq3 : terme en q^3 dans le developpement de km |
82 |
|
! (valeur au debut du pas de temps) |
83 |
|
! kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz} |
84 |
|
! (valeur a la fin du pas de temps) |
85 |
|
! knq3 : terme en q^3 dans le developpement de kn |
86 |
|
! mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz} |
87 |
|
! (valeur a la fin du pas de temps) |
88 |
|
! m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz} |
89 |
|
! (valeur a la fin du pas de temps) |
90 |
|
! m : valeur a la fin du pas de temps |
91 |
|
! mpre : valeur au debut du pas de temps |
92 |
|
! m2 : valeur a la fin du pas de temps |
93 |
|
! n2 : valeur a la fin du pas de temps |
94 |
|
|
95 |
|
REAL kmq3 |
96 |
|
REAL kmcstat |
97 |
|
REAL knq3 |
98 |
|
REAL mcstat |
99 |
|
REAL m2cstat |
100 |
|
REAL m(klon, klev+1) |
101 |
|
REAL mpre(klon, klev+1) |
102 |
|
REAL m2(klon, klev+1) |
103 |
|
REAL n2(klon, klev+1) |
104 |
|
|
105 |
|
! gn : intermediaire pour les coefficients de stabilite |
106 |
|
! gnmin : borne inferieure de gn (-0.23 ou -0.28) |
107 |
|
! gnmax : borne superieure de gn (0.0233) |
108 |
|
! gninf : vrai si gn est en dessous de sa borne inferieure |
109 |
|
! gnsup : vrai si gn est en dessus de sa borne superieure |
110 |
|
! gm : drole d'objet bien utile |
111 |
|
! ri : nombre de Richardson |
112 |
|
! sn : coefficient de stabilite pour n |
113 |
|
! snq2 : premier terme du developement limite de sn en q2 |
114 |
|
! sm : coefficient de stabilite pour m |
115 |
|
! smq2 : premier terme du developement limite de sm en q2 |
116 |
|
|
117 |
|
REAL gn |
118 |
|
REAL gnmin |
119 |
|
REAL gnmax |
120 |
|
LOGICAL gninf |
121 |
|
LOGICAL gnsup |
122 |
|
REAL gm |
123 |
|
! REAL ri(klon, klev+1) |
124 |
|
REAL sn(klon, klev+1) |
125 |
|
REAL snq2(klon, klev+1) |
126 |
|
REAL sm(klon, klev+1) |
127 |
|
REAL smq2(klon, klev+1) |
128 |
|
|
129 |
|
! kappa : consatnte de Von Karman (0.4) |
130 |
|
! long00 : longueur de reference pour le calcul de long (160) |
131 |
|
! a1, a2, b1, b2, c1 : constantes d'origine pour les coefficients |
132 |
|
! de stabilite (0.92/0.74/16.6/10.1/0.08) |
133 |
|
! cn1, cn2 : constantes pour sn |
134 |
|
! cm1, cm2, cm3, cm4 : constantes pour sm |
135 |
|
|
136 |
|
REAL kappa |
137 |
|
REAL long00 |
138 |
|
REAL a1, a2, b1, b2, c1 |
139 |
|
REAL cn1, cn2 |
140 |
|
REAL cm1, cm2, cm3, cm4 |
141 |
|
|
142 |
|
! termq : termes en $q$ dans l'equation de q2 |
143 |
|
! termq3 : termes en $q^3$ dans l'equation de q2 |
144 |
|
! termqm2 : termes en $q*m^2$ dans l'equation de q2 |
145 |
|
! termq3m2 : termes en $q^3*m^2$ dans l'equation de q2 |
146 |
|
|
147 |
|
REAL termq |
148 |
|
REAL termq3 |
149 |
|
REAL termqm2 |
150 |
|
REAL termq3m2 |
151 |
|
|
152 |
|
! q2min : borne inferieure de q2 |
153 |
|
! q2max : borne superieure de q2 |
154 |
|
|
155 |
|
REAL q2min |
156 |
|
REAL q2max |
157 |
|
|
158 |
|
! knmin : borne inferieure de kn |
159 |
|
! kmmin : borne inferieure de km |
160 |
|
|
161 |
|
REAL knmin |
162 |
|
REAL kmmin |
163 |
|
|
164 |
|
INTEGER ilay, ilev, igrid |
165 |
|
REAL tmp1, tmp2 |
166 |
|
|
167 |
|
PARAMETER (kappa=0.4E+0) |
168 |
|
PARAMETER (long00=160.E+0) |
169 |
|
! PARAMETER (gnmin=-10.E+0) |
170 |
|
PARAMETER (gnmin=-0.28) |
171 |
|
PARAMETER (gnmax=0.0233E+0) |
172 |
|
PARAMETER (a1=0.92E+0) |
173 |
|
PARAMETER (a2=0.74E+0) |
174 |
|
PARAMETER (b1=16.6E+0) |
175 |
|
PARAMETER (b2=10.1E+0) |
176 |
|
PARAMETER (c1=0.08E+0) |
177 |
|
PARAMETER (knmin=1.E-5) |
178 |
|
PARAMETER (kmmin=1.E-5) |
179 |
|
PARAMETER (q2min=1.e-5) |
180 |
|
PARAMETER (q2max=1.E+2) |
181 |
|
PARAMETER (nlay=klev) |
182 |
|
PARAMETER (nlev=klev+1) |
183 |
|
|
184 |
|
PARAMETER (cn1=a2*(1.E+0 -6.E+0 *a1/b1)) |
185 |
|
PARAMETER (cn2=-3.E+0 *a2*(6.E+0 *a1+b2)) |
186 |
|
PARAMETER (cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1)) |
187 |
|
PARAMETER (cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) & |
188 |
|
-3.E+0 *c1*(b2+6.E+0 *a1)))) |
189 |
|
PARAMETER (cm3=-3.E+0 *a2*(6.E+0 *a1+b2)) |
190 |
|
PARAMETER (cm4=-9.E+0 *a1*a2) |
191 |
|
|
192 |
|
logical:: first = .true. |
193 |
|
|
194 |
|
!------------------------------------------------------------ |
195 |
|
|
196 |
|
! traitment des valeur de q2 en entree |
197 |
|
|
198 |
|
! Initialisation de q2 |
199 |
|
|
200 |
|
call yamada(ngrid, g, zlev, zlay, u, v, teta, q2diag, km, kn) |
201 |
|
if (first.and.1.eq.1) then |
202 |
|
first=.false. |
203 |
|
q2=q2diag |
204 |
|
endif |
205 |
|
|
206 |
|
DO ilev=1, nlev |
207 |
|
DO igrid=1, ngrid |
208 |
|
q2(igrid, ilev)=amax1(q2(igrid, ilev), q2min) |
209 |
|
q(igrid, ilev)=sqrt(q2(igrid, ilev)) |
210 |
|
ENDDO |
211 |
|
ENDDO |
212 |
|
|
213 |
|
DO igrid=1, ngrid |
214 |
|
tmp1=cd(igrid)*(u(igrid, 1)**2+v(igrid, 1)**2) |
215 |
|
q2(igrid, 1)=b1**(2.E+0/3.E+0)*tmp1 |
216 |
|
q2(igrid, 1)=amax1(q2(igrid, 1), q2min) |
217 |
|
q(igrid, 1)=sqrt(q2(igrid, 1)) |
218 |
|
ENDDO |
219 |
|
|
220 |
|
! les increments verticaux |
221 |
|
|
222 |
|
! allerte !c |
223 |
|
! zlev n'est pas declare a nlev !c |
224 |
|
DO igrid=1, ngrid |
225 |
|
zlev(igrid, nlev)=zlay(igrid, nlay) & |
226 |
|
+( zlay(igrid, nlay) - zlev(igrid, nlev-1) ) |
227 |
|
ENDDO |
228 |
|
! allerte !c |
229 |
|
|
230 |
|
DO ilay=1, nlay |
231 |
|
DO igrid=1, ngrid |
232 |
|
unsdz(igrid, ilay)=1.E+0/(zlev(igrid, ilay+1)-zlev(igrid, ilay)) |
233 |
|
ENDDO |
234 |
|
ENDDO |
235 |
|
DO igrid=1, ngrid |
236 |
|
unsdzdec(igrid, 1)=1.E+0/(zlay(igrid, 1)-zlev(igrid, 1)) |
237 |
|
ENDDO |
238 |
|
DO ilay=2, nlay |
239 |
|
DO igrid=1, ngrid |
240 |
|
unsdzdec(igrid, ilay)=1.E+0/(zlay(igrid, ilay)-zlay(igrid, ilay-1)) |
241 |
|
ENDDO |
242 |
|
ENDDO |
243 |
|
DO igrid=1, ngrid |
244 |
|
unsdzdec(igrid, nlay+1)=1.E+0/(zlev(igrid, nlay+1)-zlay(igrid, nlay)) |
245 |
|
ENDDO |
246 |
|
|
247 |
|
! le cisaillement et le gradient de temperature |
248 |
|
|
249 |
|
DO igrid=1, ngrid |
250 |
|
m2(igrid, 1)=(unsdzdec(igrid, 1) & |
251 |
|
*u(igrid, 1))**2 & |
252 |
|
+(unsdzdec(igrid, 1) & |
253 |
|
*v(igrid, 1))**2 |
254 |
|
m(igrid, 1)=sqrt(m2(igrid, 1)) |
255 |
|
mpre(igrid, 1)=m(igrid, 1) |
256 |
|
ENDDO |
257 |
|
|
258 |
|
DO ilev=2, nlev-1 |
259 |
|
DO igrid=1, ngrid |
260 |
|
|
261 |
|
n2(igrid, ilev)=g*unsdzdec(igrid, ilev) & |
262 |
|
*(teta(igrid, ilev)-teta(igrid, ilev-1)) & |
263 |
|
/(teta(igrid, ilev)+teta(igrid, ilev-1)) *2.E+0 |
264 |
|
|
265 |
|
! on ne sais traiter que les cas stratifies. et l'ajustement |
266 |
|
! convectif est cense faire en sorte que seul des |
267 |
|
! configurations stratifiees soient rencontrees en entree de |
268 |
|
! cette routine. mais, bon ... on sait jamais (meme on sait |
269 |
|
! que n2 prends quelques valeurs negatives ... parfois) |
270 |
|
! alors : |
271 |
|
|
272 |
|
IF (n2(igrid, ilev).lt.0.E+0) THEN |
273 |
|
n2(igrid, ilev)=0.E+0 |
274 |
|
ENDIF |
275 |
|
|
276 |
|
m2(igrid, ilev)=(unsdzdec(igrid, ilev) & |
277 |
|
*(u(igrid, ilev)-u(igrid, ilev-1)))**2 & |
278 |
|
+(unsdzdec(igrid, ilev) & |
279 |
|
*(v(igrid, ilev)-v(igrid, ilev-1)))**2 |
280 |
|
m(igrid, ilev)=sqrt(m2(igrid, ilev)) |
281 |
|
mpre(igrid, ilev)=m(igrid, ilev) |
282 |
|
|
283 |
|
ENDDO |
284 |
|
ENDDO |
285 |
|
|
286 |
|
DO igrid=1, ngrid |
287 |
|
m2(igrid, nlev)=m2(igrid, nlev-1) |
288 |
|
m(igrid, nlev)=m(igrid, nlev-1) |
289 |
|
mpre(igrid, nlev)=m(igrid, nlev) |
290 |
|
ENDDO |
291 |
|
|
292 |
|
! calcul des fonctions de stabilite |
293 |
|
|
294 |
|
if (l_mix.eq.4) then |
295 |
|
DO igrid=1, ngrid |
296 |
|
sqz(igrid)=1.e-10 |
297 |
|
sq(igrid)=1.e-10 |
298 |
|
ENDDO |
299 |
|
do ilev=2, nlev-1 |
300 |
|
DO igrid=1, ngrid |
301 |
|
zq=sqrt(q2(igrid, ilev)) |
302 |
|
sqz(igrid) & |
303 |
|
=sqz(igrid)+zq*zlev(igrid, ilev) & |
304 |
|
*(zlay(igrid, ilev)-zlay(igrid, ilev-1)) |
305 |
|
sq(igrid)=sq(igrid)+zq*(zlay(igrid, ilev)-zlay(igrid, ilev-1)) |
306 |
|
ENDDO |
307 |
|
enddo |
308 |
|
DO igrid=1, ngrid |
309 |
|
long0(igrid)=0.2*sqz(igrid)/sq(igrid) |
310 |
|
ENDDO |
311 |
|
else if (l_mix.eq.3) then |
312 |
|
long0(igrid)=long00 |
313 |
|
endif |
314 |
|
|
315 |
|
DO ilev=2, nlev-1 |
316 |
|
DO igrid=1, ngrid |
317 |
|
tmp1=kappa*(zlev(igrid, ilev)-zlev(igrid, 1)) |
318 |
|
if (l_mix.ge.10) then |
319 |
|
long(igrid, ilev)=l_mix |
320 |
|
else |
321 |
|
long(igrid, ilev)=tmp1/(1.E+0 + tmp1/long0(igrid)) |
322 |
|
endif |
323 |
|
long(igrid, ilev)=max(min(long(igrid, ilev) & |
324 |
|
, 0.5*sqrt(q2(igrid, ilev))/sqrt(max(n2(igrid, ilev), 1.e-10))) & |
325 |
|
, 5.) |
326 |
|
|
327 |
|
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
328 |
|
* n2(igrid, ilev) |
329 |
|
gm=long(igrid, ilev)**2 / q2(igrid, ilev) & |
330 |
|
* m2(igrid, ilev) |
331 |
|
|
332 |
|
gninf=.false. |
333 |
|
gnsup=.false. |
334 |
|
long(igrid, ilev)=long(igrid, ilev) |
335 |
|
long(igrid, ilev)=long(igrid, ilev) |
336 |
|
|
337 |
|
IF (gn.lt.gnmin) THEN |
338 |
|
gninf=.true. |
339 |
|
gn=gnmin |
340 |
|
ENDIF |
341 |
|
|
342 |
|
IF (gn.gt.gnmax) THEN |
343 |
|
gnsup=.true. |
344 |
|
gn=gnmax |
345 |
|
ENDIF |
346 |
|
|
347 |
|
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
348 |
|
sm(igrid, ilev)= & |
349 |
|
(cm1+cm2*gn) & |
350 |
|
/( (1.E+0 +cm3*gn) & |
351 |
|
*(1.E+0 +cm4*gn) ) |
352 |
|
|
353 |
|
IF ((gninf).or.(gnsup)) THEN |
354 |
|
snq2(igrid, ilev)=0.E+0 |
355 |
|
smq2(igrid, ilev)=0.E+0 |
356 |
|
ELSE |
357 |
|
snq2(igrid, ilev)= & |
358 |
|
-gn & |
359 |
|
*(-cn1*cn2/(1.E+0 +cn2*gn)**2 ) |
360 |
|
smq2(igrid, ilev)= & |
361 |
|
-gn & |
362 |
|
*( cm2*(1.E+0 +cm3*gn) & |
363 |
|
*(1.E+0 +cm4*gn) & |
364 |
|
-( cm3*(1.E+0 +cm4*gn) & |
365 |
|
+cm4*(1.E+0 +cm3*gn) ) & |
366 |
|
*(cm1+cm2*gn) ) & |
367 |
|
/( (1.E+0 +cm3*gn) & |
368 |
|
*(1.E+0 +cm4*gn) )**2 |
369 |
|
ENDIF |
370 |
|
! la decomposition de Taylor en q2 n'a de sens que dans les |
371 |
|
! cas stratifies ou sn et sm sont quasi proportionnels a |
372 |
|
! q2. ailleurs on laisse le meme algorithme car l'ajustement |
373 |
|
! convectif fait le travail. mais c'est delirant quand sn |
374 |
|
! et snq2 n'ont pas le meme signe : dans ces cas, on ne fait |
375 |
|
! pas la decomposition. |
376 |
|
|
377 |
|
IF (snq2(igrid, ilev)*sn(igrid, ilev).le.0.E+0) & |
378 |
|
snq2(igrid, ilev)=0.E+0 |
379 |
|
IF (smq2(igrid, ilev)*sm(igrid, ilev).le.0.E+0) & |
380 |
|
smq2(igrid, ilev)=0.E+0 |
381 |
|
|
382 |
|
! Correction pour les couches stables. |
383 |
|
! Schema repris de JHoltzlag Boville, lui meme venant de... |
384 |
|
|
385 |
|
if (1.eq.1) then |
386 |
|
snstable=1.-zlev(igrid, ilev) & |
387 |
|
/(700.*max(ustar(igrid), 0.0001)) |
388 |
|
snstable=1.-zlev(igrid, ilev)/400. |
389 |
|
snstable=max(snstable, 0.) |
390 |
|
snstable=snstable*snstable |
391 |
|
|
392 |
|
if (sn(igrid, ilev).lt.snstable) then |
393 |
|
sn(igrid, ilev)=snstable |
394 |
|
snq2(igrid, ilev)=0. |
395 |
|
endif |
396 |
|
|
397 |
|
if (sm(igrid, ilev).lt.snstable) then |
398 |
|
sm(igrid, ilev)=snstable |
399 |
|
smq2(igrid, ilev)=0. |
400 |
|
endif |
401 |
|
endif |
402 |
|
|
403 |
|
! sn : coefficient de stabilite pour n |
404 |
|
! snq2 : premier terme du developement limite de sn en q2 |
405 |
|
ENDDO |
406 |
|
ENDDO |
407 |
|
|
408 |
|
! calcul de km et kn au debut du pas de temps |
409 |
|
|
410 |
|
DO igrid=1, ngrid |
411 |
|
kn(igrid, 1)=knmin |
412 |
|
km(igrid, 1)=kmmin |
413 |
|
kmpre(igrid, 1)=km(igrid, 1) |
414 |
|
ENDDO |
415 |
|
|
416 |
|
DO ilev=2, nlev-1 |
417 |
|
DO igrid=1, ngrid |
418 |
|
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
419 |
|
*sn(igrid, ilev) |
420 |
|
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
421 |
|
*sm(igrid, ilev) |
422 |
|
kmpre(igrid, ilev)=km(igrid, ilev) |
423 |
|
ENDDO |
424 |
|
ENDDO |
425 |
|
|
426 |
|
DO igrid=1, ngrid |
427 |
|
kn(igrid, nlev)=kn(igrid, nlev-1) |
428 |
|
km(igrid, nlev)=km(igrid, nlev-1) |
429 |
|
kmpre(igrid, nlev)=km(igrid, nlev) |
430 |
|
ENDDO |
431 |
|
|
432 |
|
! boucle sur les niveaux 2 a nlev-1 |
433 |
|
|
434 |
|
DO ilev=2, nlev-1 |
435 |
|
DO igrid=1, ngrid |
436 |
|
! calcul des termes sources et puits de l'equation de q2 |
437 |
|
|
438 |
|
knq3=kn(igrid, ilev)*snq2(igrid, ilev) & |
439 |
|
/sn(igrid, ilev) |
440 |
|
kmq3=km(igrid, ilev)*smq2(igrid, ilev) & |
441 |
|
/sm(igrid, ilev) |
442 |
|
|
443 |
|
termq=0.E+0 |
444 |
|
termq3=0.E+0 |
445 |
|
termqm2=0.E+0 |
446 |
|
termq3m2=0.E+0 |
447 |
|
|
448 |
|
tmp1=dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) |
449 |
|
tmp2=dt*2.E+0 *kmq3*m2(igrid, ilev) |
450 |
|
termqm2=termqm2 & |
451 |
|
+dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) & |
452 |
|
-dt*2.E+0 *kmq3*m2(igrid, ilev) |
453 |
|
termq3m2=termq3m2 & |
454 |
|
+dt*2.E+0 *kmq3*m2(igrid, ilev) |
455 |
|
|
456 |
|
termq=termq & |
457 |
|
-dt*2.E+0 *kn(igrid, ilev)*n2(igrid, ilev) & |
458 |
|
+dt*2.E+0 *knq3*n2(igrid, ilev) |
459 |
|
termq3=termq3 & |
460 |
|
-dt*2.E+0 *knq3*n2(igrid, ilev) |
461 |
|
|
462 |
|
termq3=termq3 & |
463 |
|
-dt*2.E+0 *q(igrid, ilev)**3 / (b1*long(igrid, ilev)) |
464 |
|
|
465 |
|
! resolution stationnaire couplee avec le gradient de vitesse local |
466 |
|
|
467 |
|
! on cherche le cisaillement qui annule l'equation de q^2 |
468 |
|
! supposee en q3 |
469 |
|
|
470 |
|
tmp1=termq+termq3 |
471 |
|
tmp2=termqm2+termq3m2 |
472 |
|
m2cstat=m2(igrid, ilev) & |
473 |
|
-(tmp1+tmp2)/(dt*2.E+0*km(igrid, ilev)) |
474 |
|
mcstat=sqrt(m2cstat) |
475 |
|
|
476 |
|
! puis on ecrit la valeur de q qui annule l'equation de m |
477 |
|
! supposee en q3 |
478 |
|
|
479 |
|
IF (ilev.eq.2) THEN |
480 |
|
kmcstat=1.E+0 / mcstat & |
481 |
|
*( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) & |
482 |
|
*mpre(igrid, ilev+1) & |
483 |
|
+unsdz(igrid, ilev-1) & |
484 |
|
*cd(igrid) & |
485 |
|
*( sqrt(u(igrid, 3)**2+v(igrid, 3)**2) & |
486 |
|
-mcstat/unsdzdec(igrid, ilev) & |
487 |
|
-mpre(igrid, ilev+1)/unsdzdec(igrid, ilev+1) )**2) & |
488 |
|
/( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) ) |
489 |
|
ELSE |
490 |
|
kmcstat=1.E+0 / mcstat & |
491 |
|
*( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) & |
492 |
|
*mpre(igrid, ilev+1) & |
493 |
|
+unsdz(igrid, ilev-1)*kmpre(igrid, ilev-1) & |
494 |
|
*mpre(igrid, ilev-1) ) & |
495 |
|
/( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) ) |
496 |
|
ENDIF |
497 |
|
tmp2=kmcstat & |
498 |
|
/( sm(igrid, ilev)/q2(igrid, ilev) ) & |
499 |
|
/long(igrid, ilev) |
500 |
|
qcstat=tmp2**(1.E+0/3.E+0) |
501 |
|
q2cstat=qcstat**2 |
502 |
|
|
503 |
|
! choix de la solution finale |
504 |
|
|
505 |
|
q(igrid, ilev)=qcstat |
506 |
|
q2(igrid, ilev)=q2cstat |
507 |
|
m(igrid, ilev)=mcstat |
508 |
|
m2(igrid, ilev)=m2cstat |
509 |
|
|
510 |
|
! pour des raisons simples q2 est minore |
511 |
|
|
512 |
|
IF (q2(igrid, ilev).lt.q2min) THEN |
513 |
|
q2(igrid, ilev)=q2min |
514 |
|
q(igrid, ilev)=sqrt(q2min) |
515 |
|
ENDIF |
516 |
|
|
517 |
|
! calcul final de kn et km |
518 |
|
|
519 |
|
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
520 |
|
* n2(igrid, ilev) |
521 |
|
IF (gn.lt.gnmin) gn=gnmin |
522 |
|
IF (gn.gt.gnmax) gn=gnmax |
523 |
|
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
524 |
|
sm(igrid, ilev)= & |
525 |
|
(cm1+cm2*gn) & |
526 |
|
/( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
527 |
|
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
528 |
|
*sn(igrid, ilev) |
529 |
|
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
530 |
|
*sm(igrid, ilev) |
531 |
|
end DO |
532 |
|
end DO |
533 |
|
|
534 |
|
DO igrid=1, ngrid |
535 |
|
kn(igrid, 1)=knmin |
536 |
|
km(igrid, 1)=kmmin |
537 |
|
q2(igrid, nlev)=q2(igrid, nlev-1) |
538 |
|
q(igrid, nlev)=q(igrid, nlev-1) |
539 |
|
kn(igrid, nlev)=kn(igrid, nlev-1) |
540 |
|
km(igrid, nlev)=km(igrid, nlev-1) |
541 |
|
ENDDO |
542 |
|
|
543 |
|
! CALCUL DE LA DIFFUSION VERTICALE DE Q2 |
544 |
|
if (1.eq.1) then |
545 |
|
do ilev=2, klev-1 |
546 |
|
sss=sss+plev(1, ilev-1)-plev(1, ilev+1) |
547 |
|
sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev) |
548 |
|
enddo |
549 |
|
do ilev=2, klev-1 |
550 |
|
sss=sss+plev(1, ilev-1)-plev(1, ilev+1) |
551 |
|
sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev) |
552 |
|
enddo |
553 |
|
print*, 'Q2moy apres', sssq/sss |
554 |
|
|
555 |
|
do ilev=1, nlev |
556 |
|
do igrid=1, ngrid |
557 |
|
q2(igrid, ilev)=max(q2(igrid, ilev), q2min) |
558 |
|
q(igrid, ilev)=sqrt(q2(igrid, ilev)) |
559 |
|
|
560 |
|
! calcul final de kn et km |
561 |
|
|
562 |
|
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
563 |
|
* n2(igrid, ilev) |
564 |
|
IF (gn.lt.gnmin) gn=gnmin |
565 |
|
IF (gn.gt.gnmax) gn=gnmax |
566 |
|
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
567 |
|
sm(igrid, ilev)= & |
568 |
|
(cm1+cm2*gn) & |
569 |
|
/( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
570 |
|
! Correction pour les couches stables. |
571 |
|
! Schema repris de JHoltzlag Boville, lui meme venant de... |
572 |
|
|
573 |
|
if (1.eq.1) then |
574 |
|
snstable=1.-zlev(igrid, ilev) & |
575 |
|
/(700.*max(ustar(igrid), 0.0001)) |
576 |
|
snstable=1.-zlev(igrid, ilev)/400. |
577 |
|
snstable=max(snstable, 0.) |
578 |
|
snstable=snstable*snstable |
579 |
|
|
580 |
|
if (sn(igrid, ilev).lt.snstable) then |
581 |
|
sn(igrid, ilev)=snstable |
582 |
|
snq2(igrid, ilev)=0. |
583 |
|
endif |
584 |
|
|
585 |
|
if (sm(igrid, ilev).lt.snstable) then |
586 |
|
sm(igrid, ilev)=snstable |
587 |
|
smq2(igrid, ilev)=0. |
588 |
|
endif |
589 |
|
endif |
590 |
|
|
591 |
|
! sn : coefficient de stabilite pour n |
592 |
|
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
593 |
|
*sn(igrid, ilev) |
594 |
|
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) |
595 |
|
enddo |
596 |
|
enddo |
597 |
|
endif |
598 |
|
|
599 |
|
END SUBROUTINE vdif_kcay |
600 |
|
|
601 |
|
end module vdif_kcay_m |