LMDZ
thermcell_dtke.F90
Go to the documentation of this file.
1  subroutine thermcell_dtke(ngrid,nlay,nsrf,ptimestep,fm0,entr0, &
2  & rg,pplev,tke)
4  implicit none
5 
6 !=======================================================================
7 !
8 ! Calcul du transport verticale dans la couche limite en presence
9 ! de "thermiques" explicitement representes
10 ! calcul du dq/dt une fois qu'on connait les ascendances
11 !
12 !=======================================================================
13 
14  integer ngrid,nlay,nsrf
15 
16  real ptimestep
17  real masse0(ngrid,nlay),fm0(ngrid,nlay+1),pplev(ngrid,nlay+1)
18  real entr0(ngrid,nlay),rg
19  real tke(ngrid,nlay,nsrf)
20  real detr0(ngrid,nlay)
21 
22 
23  real masse(ngrid,nlay),fm(ngrid,nlay+1)
24  real entr(ngrid,nlay)
25  real q(ngrid,nlay)
26  integer lev_out ! niveau pour les print
27 
28  real qa(ngrid,nlay),detr(ngrid,nlay),wqd(ngrid,nlay+1)
29 
30  real zzm
31 
32  integer ig,k
33  integer isrf
34 
35 
36  lev_out=0
37 
38 
39  if (prt_level.ge.1) print*,'Q2 THERMCEL_DQ 0'
40 
41 ! calcul du detrainement
42  do k=1,nlay
43  detr0(:,k)=fm0(:,k)-fm0(:,k+1)+entr0(:,k)
44  masse0(:,k)=(pplev(:,k)-pplev(:,k+1))/rg
45  enddo
46 
47 
48 ! Decalage vertical des entrainements et detrainements.
49  masse(:,1)=0.5*masse0(:,1)
50  entr(:,1)=0.5*entr0(:,1)
51  detr(:,1)=0.5*detr0(:,1)
52  fm(:,1)=0.
53  do k=1,nlay-1
54  masse(:,k+1)=0.5*(masse0(:,k)+masse0(:,k+1))
55  entr(:,k+1)=0.5*(entr0(:,k)+entr0(:,k+1))
56  detr(:,k+1)=0.5*(detr0(:,k)+detr0(:,k+1))
57  fm(:,k+1)=fm(:,k)+entr(:,k)-detr(:,k)
58  enddo
59  fm(:,nlay+1)=0.
60 
61 ! calcul de la valeur dans les ascendances
62  do ig=1,ngrid
63  qa(ig,1)=q(ig,1)
64  enddo
65 
66 
67 
68 do isrf=1,nsrf
69 
70  q(:,:)=tke(:,:,isrf)
71 
72  if (1==1) then
73  do k=2,nlay
74  do ig=1,ngrid
75  if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. &
76  & 1.e-5*masse(ig,k)) then
77  qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) &
78  & /(fm(ig,k+1)+detr(ig,k))
79  else
80  qa(ig,k)=q(ig,k)
81  endif
82  if (qa(ig,k).lt.0.) then
83 ! print*,'qa<0!!!'
84  endif
85  if (q(ig,k).lt.0.) then
86 ! print*,'q<0!!!'
87  endif
88  enddo
89  enddo
90 
91 ! Calcul du flux subsident
92 
93  do k=2,nlay
94  do ig=1,ngrid
95  wqd(ig,k)=fm(ig,k)*q(ig,k)
96  if (wqd(ig,k).lt.0.) then
97 ! print*,'wqd<0!!!'
98  endif
99  enddo
100  enddo
101  do ig=1,ngrid
102  wqd(ig,1)=0.
103  wqd(ig,nlay+1)=0.
104  enddo
105 
106 
107 ! Calcul des tendances
108  do k=1,nlay
109  do ig=1,ngrid
110  q(ig,k)=q(ig,k)+(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) &
111  & -wqd(ig,k)+wqd(ig,k+1)) &
112  & *ptimestep/masse(ig,k)
113  enddo
114  enddo
115 
116  endif
117 
118  tke(:,:,isrf)=q(:,:)
119 
120 enddo
121 
122  return
123  end
subroutine thermcell_dtke(ngrid, nlay, nsrf, ptimestep, fm0, entr0, rg, pplev, tke)
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
real rg
Definition: comcstphy.h:1