1 |
! |
module coefkzmin_m |
|
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/coefkzmin.F,v 1.1.1.1 2004/05/19 12:53:08 lmdzadmin Exp $ |
|
|
! |
|
|
SUBROUTINE coefkzmin(ngrid,ypaprs,ypplay,yu,yv,yt,yq,ycoefm |
|
|
. ,km,kn) |
|
|
c SUBROUTINE coefkzmin(ngrid,zlev,teta,ustar,km,kn) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
use YOMCST |
|
|
IMPLICIT NONE |
|
|
|
|
|
|
|
|
c....................................................................... |
|
|
c Entrees modifies en attendant une version ou les zlev, et zlay soient |
|
|
c disponibles. |
|
|
|
|
|
REAL ycoefm(klon,klev) |
|
|
|
|
|
REAL yu(klon,klev), yv(klon,klev) |
|
|
REAL yt(klon,klev), yq(klon,klev) |
|
|
REAL ypaprs(klon,klev+1), ypplay(klon,klev) |
|
|
REAL yustar(klon) |
|
|
real yzlay(klon,klev),yzlev(klon,klev+1),yteta(klon,klev) |
|
|
|
|
|
integer i |
|
|
|
|
|
c....................................................................... |
|
|
c |
|
|
c En entree : |
|
|
c ----------- |
|
|
c |
|
|
c zlev : altitude a chaque niveau (interface inferieure de la couche |
|
|
c de meme indice) |
|
|
c ustar : u* |
|
|
c |
|
|
c teta : temperature potentielle au centre de chaque couche |
|
|
c (en entree : la valeur au debut du pas de temps) |
|
|
c |
|
|
c en sortier : |
|
|
c ------------ |
|
|
c |
|
|
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 ustar(klon) |
|
|
real kmin,qmin,pblhmin(klon),coriol(klon) |
|
|
REAL zlev(klon,klev+1) |
|
|
REAL teta(klon,klev) |
|
|
|
|
|
REAL km(klon,klev+1) |
|
|
REAL kn(klon,klev+1) |
|
|
integer l_mix,ngrid |
|
|
|
|
|
|
|
|
integer nlay,nlev |
|
|
PARAMETER (nlay=klev) |
|
|
PARAMETER (nlev=klev+1) |
|
|
|
|
|
integer ig,k |
|
|
|
|
|
real kap |
|
|
save kap |
|
|
data kap/0.4/ |
|
|
|
|
|
real frif,falpha,fsm |
|
|
real fl,zzz,zl0,zq2,zn2 |
|
|
|
|
|
|
|
|
c....................................................................... |
|
|
c en attendant une version ou les zlev, et zlay soient |
|
|
c disponibles. |
|
|
c Debut de la partie qui doit etre unclue a terme dans clmain. |
|
|
c |
|
|
do i=1,ngrid |
|
|
yzlay(i,1)=RD*yt(i,1)/(0.5*(ypaprs(i,1)+ypplay(i,1))) |
|
|
. *(ypaprs(i,1)-ypplay(i,1))/RG |
|
|
enddo |
|
|
do k=2,klev |
|
|
do i=1,ngrid |
|
|
yzlay(i,k)=yzlay(i,k-1)+RD*0.5*(yt(i,k-1)+yt(i,k)) |
|
|
s /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG |
|
|
enddo |
|
|
enddo |
|
|
do k=1,klev |
|
|
do i=1,ngrid |
|
|
cATTENTION:on passe la temperature potentielle virt. pour le calcul de K |
|
|
yteta(i,k)=yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**rkappa |
|
|
s *(1.+0.61*yq(i,k)) |
|
|
enddo |
|
|
enddo |
|
|
do i=1,ngrid |
|
|
yzlev(i,1)=0. |
|
|
yzlev(i,klev+1)=2.*yzlay(i,klev)-yzlay(i,klev-1) |
|
|
enddo |
|
|
do k=2,klev |
|
|
do i=1,ngrid |
|
|
yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1)) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
|
|
|
cIM cf FH yustar(:) =SQRT(ycoefm(:,1)*(yu(:,1)*yu(:,1)+yv(:,1)*yv(:,1))) |
|
|
yustar(1:ngrid) =SQRT(ycoefm(1:ngrid,1)* |
|
|
$ (yu(1:ngrid,1)*yu(1:ngrid,1)+yv(1:ngrid,1)*yv(1:ngrid,1))) |
|
|
|
|
|
c Fin de la partie qui doit etre unclue a terme dans clmain. |
|
|
|
|
|
Cette routine est ecrite pour avoir en entree ustar, teta et zlev |
|
|
c Ici, on a inclut le calcul de ces trois variables dans la routine |
|
|
c coefkzmin en attendant une nouvelle version de la couche limite |
|
|
c ou ces variables seront disponibles. |
|
|
|
|
|
c Debut de la routine coefkzmin proprement dite. |
|
|
|
|
|
ustar=yustar |
|
|
teta=yteta |
|
|
zlev=yzlev |
|
|
|
|
|
do ig=1,ngrid |
|
|
coriol(ig)=1.e-4 |
|
|
pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5) |
|
|
enddo |
|
|
|
|
|
do k=2,klev |
|
|
do ig=1,ngrid |
|
|
if (teta(ig,2).gt.teta(ig,1)) then |
|
|
qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 |
|
|
kmin=kap*zlev(ig,k)*qmin |
|
|
else |
|
|
kmin=0. ! kmin n'est utilise que pour les SL stables. |
|
|
endif |
|
|
kn(ig,k)=kmin |
|
|
km(ig,k)=kmin |
|
|
enddo |
|
|
enddo |
|
2 |
|
|
3 |
|
IMPLICIT NONE |
4 |
|
|
5 |
return |
contains |
6 |
end |
|
7 |
|
SUBROUTINE coefkzmin(ypaprs, ypplay, yu, yv, yt, yq, ycoefm, kn) |
8 |
|
|
9 |
|
! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1, 2004/05/19 12:53:08 |
10 |
|
|
11 |
|
! Entrées modifiées en attendant une version où les zlev et zlay |
12 |
|
! soient disponibles. |
13 |
|
|
14 |
|
USE dimphy, ONLY: klev |
15 |
|
USE suphec_m, ONLY: rd, rg, rkappa |
16 |
|
|
17 |
|
REAL, intent(in):: ypaprs(:, :) ! (knon, klev+1) |
18 |
|
REAL, intent(in):: ypplay(:, :) ! (knon, klev) |
19 |
|
REAL, intent(in):: yu(:, :), yv(:, :) ! (knon, klev) wind, in m s-1 |
20 |
|
REAL, intent(in):: yt(:, :) ! (knon, klev) temperature, in K |
21 |
|
REAL, intent(in):: yq(:, :) ! (knon, klev) |
22 |
|
REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient |
23 |
|
|
24 |
|
REAL, intent(out):: kn(:, 2:) ! (knon, 2:klev) coefficient de |
25 |
|
! diffusion turbulente de la quantité de mouvement et des |
26 |
|
! scalaires (au bas de chaque couche) (en sortie : la valeur à la |
27 |
|
! fin du pas de temps), m2 s-1 |
28 |
|
|
29 |
|
! Local: |
30 |
|
|
31 |
|
integer knon |
32 |
|
real ustar(size(ypaprs, 1)) ! (knon) u* |
33 |
|
real zlay(size(ypaprs, 1), klev) ! (knon, klev) in m |
34 |
|
integer i, k |
35 |
|
real pblhmin(size(ypaprs, 1)) ! (knon) |
36 |
|
real, parameter:: coriol = 1e-4 |
37 |
|
|
38 |
|
REAL zlev(size(ypaprs, 1), 2: klev) ! (knon, 2: klev) |
39 |
|
! altitude at level (interface between layer with same index), in m |
40 |
|
|
41 |
|
REAL teta(size(ypaprs, 1), klev) ! (knon, klev) |
42 |
|
! température potentielle au centre de chaque couche (la valeur au |
43 |
|
! debut du pas de temps) |
44 |
|
|
45 |
|
real, PARAMETER:: kap = 0.4 |
46 |
|
|
47 |
|
!--------------------------------------------------------------------- |
48 |
|
|
49 |
|
knon = size(ypaprs, 1) |
50 |
|
|
51 |
|
! Debut de la partie qui doit etre incluse a terme dans clmain. |
52 |
|
|
53 |
|
do i = 1, knon |
54 |
|
zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) & |
55 |
|
* (ypaprs(i, 1) - ypplay(i, 1)) / RG |
56 |
|
enddo |
57 |
|
|
58 |
|
do k = 2, klev |
59 |
|
do i = 1, knon |
60 |
|
zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) & |
61 |
|
/ ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG |
62 |
|
enddo |
63 |
|
enddo |
64 |
|
|
65 |
|
do k=1, klev |
66 |
|
do i = 1, knon |
67 |
|
! Attention : on passe la temperature potentielle virtuelle |
68 |
|
! pour le calcul de K. |
69 |
|
teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa & |
70 |
|
* (1. + 0.61 * yq(i, k)) |
71 |
|
enddo |
72 |
|
enddo |
73 |
|
|
74 |
|
forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1)) |
75 |
|
ustar = SQRT(ycoefm * (yu(:, 1)**2 + yv(:, 1)**2)) |
76 |
|
|
77 |
|
! Fin de la partie qui doit être incluse à terme dans clmain |
78 |
|
|
79 |
|
! Cette routine est ecrite pour avoir en entree ustar, teta et zlev |
80 |
|
! Ici, on a inclus le calcul de ces trois variables dans la routine |
81 |
|
! coefkzmin en attendant une nouvelle version de la couche limite |
82 |
|
! ou ces variables seront disponibles. |
83 |
|
|
84 |
|
! Debut de la routine coefkzmin proprement dite |
85 |
|
|
86 |
|
pblhmin = 0.07 * ustar / coriol |
87 |
|
|
88 |
|
do k = 2, klev |
89 |
|
do i = 1, knon |
90 |
|
if (teta(i, 2) > teta(i, 1)) then |
91 |
|
kn(i, k) = kap * zlev(i, k) * ustar(i) & |
92 |
|
* (max(1. - zlev(i, k) / pblhmin(i), 0.))**2 |
93 |
|
else |
94 |
|
kn(i, k) = 0. ! min n'est utilisé que pour les SL stables |
95 |
|
endif |
96 |
|
enddo |
97 |
|
enddo |
98 |
|
|
99 |
|
end SUBROUTINE coefkzmin |
100 |
|
|
101 |
|
end module coefkzmin_m |