Directory: | ./ |
---|---|
File: | phys/calcratqs.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 17 | 66 | 25.8% |
Branches: | 17 | 102 | 16.7% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | 480 | SUBROUTINE calcratqs(klon,klev,prt_level,lunout, & | |
2 | iflag_ratqs,iflag_con,iflag_cld_th,pdtphys, & | ||
3 | ratqsbas,ratqshaut,ratqsp0,ratqsdp, & | ||
4 | tau_ratqs,fact_cldcon,wake_s, wake_deltaq, & | ||
5 | 480 | ptconv,ptconvth,clwcon0th, rnebcon0th, & | |
6 | paprs,pplay,q_seri,zqsat,fm_therm, & | ||
7 | 480 | ratqs,ratqsc,ratqs_inter) | |
8 | |||
9 | implicit none | ||
10 | |||
11 | !======================================================================== | ||
12 | ! Computation of ratqs, the width of the subrid scale water distribution | ||
13 | ! (normalized by the mean value) | ||
14 | ! Various options controled by flags iflag_con and iflag_ratqs | ||
15 | ! F Hourdin 2012/12/06 | ||
16 | !======================================================================== | ||
17 | |||
18 | ! Declarations | ||
19 | |||
20 | ! Input | ||
21 | integer,intent(in) :: klon,klev,prt_level,lunout | ||
22 | integer,intent(in) :: iflag_con,iflag_cld_th,iflag_ratqs | ||
23 | real,intent(in) :: pdtphys,ratqsbas,ratqshaut,fact_cldcon,tau_ratqs | ||
24 | real,intent(in) :: ratqsp0, ratqsdp | ||
25 | real, dimension(klon,klev+1),intent(in) :: paprs | ||
26 | real, dimension(klon,klev),intent(in) :: pplay,q_seri,zqsat,fm_therm | ||
27 | logical, dimension(klon,klev),intent(in) :: ptconv | ||
28 | real, dimension(klon,klev),intent(in) :: rnebcon0th,clwcon0th | ||
29 | real, dimension(klon,klev),intent(in) :: wake_deltaq,wake_s | ||
30 | ! Output | ||
31 | real, dimension(klon,klev),intent(inout) :: ratqs,ratqsc,ratqs_inter | ||
32 | logical, dimension(klon,klev),intent(inout) :: ptconvth | ||
33 | |||
34 | ! local | ||
35 | integer i,k | ||
36 | 960 | real, dimension(klon,klev) :: ratqss | |
37 | real facteur,zfratqs1,zfratqs2 | ||
38 | |||
39 | !------------------------------------------------------------------------- | ||
40 | ! Caclul des ratqs | ||
41 | !------------------------------------------------------------------------- | ||
42 | |||
43 | ! print*,'calcul des ratqs' | ||
44 | ! ratqs convectifs a l'ancienne en fonction de q(z=0)-q / q | ||
45 | ! ---------------- | ||
46 | ! on ecrase le tableau ratqsc calcule par clouds_gno | ||
47 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | if (iflag_cld_th.eq.1) then |
48 | ✗ | do k=1,klev | |
49 | ✗ | do i=1,klon | |
50 | ✗ | if(ptconv(i,k)) then | |
51 | ratqsc(i,k)=ratqsbas & | ||
52 | ✗ | +fact_cldcon*(q_seri(i,1)-q_seri(i,k))/q_seri(i,k) | |
53 | else | ||
54 | ✗ | ratqsc(i,k)=0. | |
55 | endif | ||
56 | enddo | ||
57 | enddo | ||
58 | |||
59 | !----------------------------------------------------------------------- | ||
60 | ! par nversion de la fonction log normale | ||
61 | !----------------------------------------------------------------------- | ||
62 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | else if (iflag_cld_th.eq.4) then |
63 | ✗ | ptconvth(:,:)=.false. | |
64 | ✗ | ratqsc(:,:)=0. | |
65 | ✗ | if(prt_level.ge.9) print*,'avant clouds_gno thermique' | |
66 | call clouds_gno & | ||
67 | ✗ | (klon,klev,q_seri,zqsat,clwcon0th,ptconvth,ratqsc,rnebcon0th) | |
68 | ✗ | if(prt_level.ge.9) print*,' CLOUDS_GNO OK' | |
69 | |||
70 | endif | ||
71 | |||
72 | ! ratqs stables | ||
73 | ! ------------- | ||
74 | |||
75 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | if (iflag_ratqs.eq.0) then |
76 | |||
77 | ! Le cas iflag_ratqs=0 correspond a la version IPCC 2005 du modele. | ||
78 | ✗ | do k=1,klev | |
79 | ✗ | do i=1, klon | |
80 | ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)* & | ||
81 | ✗ | min((paprs(i,1)-pplay(i,k))/(paprs(i,1)-30000.),1.) | |
82 | enddo | ||
83 | enddo | ||
84 | |||
85 | ! Pour iflag_ratqs=1 ou 2, le ratqs est constant au dessus de | ||
86 | ! 300 hPa (ratqshaut), varie lineariement en fonction de la pression | ||
87 | ! entre 600 et 300 hPa et est soit constant (ratqsbas) pour iflag_ratqs=1 | ||
88 | ! soit lineaire (entre 0 a la surface et ratqsbas) pour iflag_ratqs=2 | ||
89 | ! Il s'agit de differents tests dans la phase de reglage du modele | ||
90 | ! avec thermiques. | ||
91 | |||
92 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | else if (iflag_ratqs.eq.1) then |
93 | |||
94 | ✗ | do k=1,klev | |
95 | ✗ | do i=1, klon | |
96 | ✗ | if (pplay(i,k).ge.60000.) then | |
97 | ✗ | ratqss(i,k)=ratqsbas | |
98 | ✗ | else if ((pplay(i,k).ge.30000.).and.(pplay(i,k).lt.60000.)) then | |
99 | ✗ | ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*(60000.-pplay(i,k))/(60000.-30000.) | |
100 | else | ||
101 | ✗ | ratqss(i,k)=ratqshaut | |
102 | endif | ||
103 | enddo | ||
104 | enddo | ||
105 | |||
106 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | else if (iflag_ratqs.eq.2) then |
107 | |||
108 | ✗ | do k=1,klev | |
109 | ✗ | do i=1, klon | |
110 | ✗ | if (pplay(i,k).ge.60000.) then | |
111 | ✗ | ratqss(i,k)=ratqsbas*(paprs(i,1)-pplay(i,k))/(paprs(i,1)-60000.) | |
112 | ✗ | else if ((pplay(i,k).ge.30000.).and.(pplay(i,k).lt.60000.)) then | |
113 | ✗ | ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*(60000.-pplay(i,k))/(60000.-30000.) | |
114 | else | ||
115 | ✗ | ratqss(i,k)=ratqshaut | |
116 | endif | ||
117 | enddo | ||
118 | enddo | ||
119 | |||
120 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | else if (iflag_ratqs==3) then |
121 | ✗ | do k=1,klev | |
122 | ratqss(:,k)=ratqsbas+(ratqshaut-ratqsbas) & | ||
123 | ✗ | *min( ((paprs(:,1)-pplay(:,k))/70000.)**2 , 1. ) | |
124 | enddo | ||
125 | |||
126 |
1/2✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
|
480 | else if (iflag_ratqs==4) then |
127 |
2/2✓ Branch 0 taken 480 times.
✓ Branch 1 taken 18720 times.
|
19200 | do k=1,klev |
128 | ratqss(:,k)=ratqsbas+0.5*(ratqshaut-ratqsbas) & | ||
129 | ! *( tanh( (50000.-pplay(:,k))/20000.) + 1.) | ||
130 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | *( tanh( (ratqsp0-pplay(:,k))/ratqsdp) + 1.) |
131 | enddo | ||
132 | |||
133 | ✗ | else if (iflag_ratqs==10) then ! ratqs interactif dépendant de la présence de poches froides | |
134 | ✗ | call calcratqs_inter(klon,klev,pdtphys,ratqsbas,wake_deltaq,wake_s,q_seri,ratqs_inter) | |
135 | ✗ | do k=1,klev | |
136 | ✗ | do i=1, klon | |
137 | ratqss(i,k)=ratqs_inter(i,k)+0.5*(ratqshaut-ratqs_inter(i,k)) & | ||
138 | ✗ | *( tanh( (ratqsp0-pplay(i,k))/ratqsdp) + 1.) | |
139 | enddo | ||
140 | enddo | ||
141 | |||
142 | endif | ||
143 | |||
144 | |||
145 | ! ratqs final | ||
146 | ! ----------- | ||
147 | |||
148 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | if (iflag_cld_th.eq.1 .or.iflag_cld_th.eq.2.or.iflag_cld_th.eq.4) then |
149 | |||
150 | ! On ajoute une constante au ratqsc*2 pour tenir compte de | ||
151 | ! fluctuations turbulentes de petite echelle | ||
152 | |||
153 | ✗ | do k=1,klev | |
154 | ✗ | do i=1,klon | |
155 | ✗ | if ((fm_therm(i,k).gt.1.e-10)) then | |
156 | ✗ | ratqsc(i,k)=sqrt(ratqsc(i,k)**2+0.05**2) | |
157 | endif | ||
158 | enddo | ||
159 | enddo | ||
160 | |||
161 | ! les ratqs sont une combinaison de ratqss et ratqsc | ||
162 | ✗ | if(prt_level.ge.9) write(lunout,*)'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs | |
163 | |||
164 | ✗ | if (tau_ratqs>1.e-10) then | |
165 | ✗ | facteur=exp(-pdtphys/tau_ratqs) | |
166 | else | ||
167 | facteur=0. | ||
168 | endif | ||
169 | ✗ | ratqs(:,:)=ratqsc(:,:)*(1.-facteur)+ratqs(:,:)*facteur | |
170 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
171 | ! FH 22/09/2009 | ||
172 | ! La ligne ci-dessous faisait osciller le modele et donnait une solution | ||
173 | ! assymptotique bidon et dépendant fortement du pas de temps. | ||
174 | ! ratqs(:,:)=sqrt(ratqs(:,:)**2+ratqss(:,:)**2) | ||
175 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
176 | ✗ | ratqs(:,:)=max(ratqs(:,:),ratqss(:,:)) | |
177 |
1/2✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
|
480 | else if (iflag_cld_th<=6) then |
178 | ! on ne prend que le ratqs stable pour fisrtilp | ||
179 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | ratqs(:,:)=ratqss(:,:) |
180 | else | ||
181 | ✗ | zfratqs1=exp(-pdtphys/10800.) | |
182 | zfratqs2=exp(-pdtphys/10800.) | ||
183 | ✗ | do k=1,klev | |
184 | ✗ | do i=1,klon | |
185 | ✗ | if (ratqsc(i,k).gt.1.e-10) then | |
186 | ✗ | ratqs(i,k)=ratqs(i,k)*zfratqs2+(iflag_cld_th/100.)*ratqsc(i,k)*(1.-zfratqs2) | |
187 | endif | ||
188 | ✗ | ratqs(i,k)=min(ratqs(i,k)*zfratqs1+ratqss(i,k)*(1.-zfratqs1),0.5) | |
189 | enddo | ||
190 | enddo | ||
191 | endif | ||
192 | |||
193 | |||
194 | 480 | return | |
195 | end | ||
196 |