1 | SUBROUTINE cv3_vertmix(len,nd,iflag,plim1,plim2,p,ph,t,q,u,v |
---|
2 | : ,w,wi,nk,tmix,thmix,qmix,qsmix |
---|
3 | : ,umix,vmix,plcl) |
---|
4 | *************************************************************** |
---|
5 | * * |
---|
6 | * CV3_VERTMIX Brassage adiabatique d'une couche d'epaisseur * |
---|
7 | * arbitraire. * |
---|
8 | * * |
---|
9 | * written by : Grandpeix Jean-Yves, 28/12/2001, 13.14.24 * |
---|
10 | * modified by : Filiberti M-A 06/2005 vectorisation * |
---|
11 | *************************************************************** |
---|
12 | * |
---|
13 | implicit none |
---|
14 | C============================================================== |
---|
15 | C |
---|
16 | C vertmix : determine theta et r du melange obtenu en brassant |
---|
17 | C adiabatiquement entre plim1 et plim2, avec une ponderation w. |
---|
18 | C |
---|
19 | C=============================================================== |
---|
20 | |
---|
21 | include "cvthermo.h" |
---|
22 | include "YOETHF.h" |
---|
23 | include "YOMCST.h" |
---|
24 | include "FCTTRE.h" |
---|
25 | c input : |
---|
26 | integer nd,len |
---|
27 | integer nk(len),iflag(len) |
---|
28 | real t(len,nd),q(len,nd),w(nd) |
---|
29 | real u(len,nd),v(len,nd) |
---|
30 | real p(len,nd),ph(len,nd+1) |
---|
31 | real plim1(len),plim2(len) |
---|
32 | c output : |
---|
33 | real tmix(len),thmix(len),qmix(len),wi(len,nd) |
---|
34 | real umix(len),vmix(len) |
---|
35 | real qsmix(len) |
---|
36 | real plcl(len) |
---|
37 | c internal variables : |
---|
38 | integer j1(len),j2(len),niflag7 |
---|
39 | real A,B |
---|
40 | real ahm(len),dpw(len),coef(len) |
---|
41 | real p1(len,nd),p2(len,nd) |
---|
42 | real rdcp(len),a2(len),b2(len),pnk(len) |
---|
43 | real rh(len),chi(len) |
---|
44 | real cpn |
---|
45 | real x,y,p0,p0m1,zdelta,zcor |
---|
46 | |
---|
47 | integer i,j |
---|
48 | |
---|
49 | do j = 1,nd |
---|
50 | do i=1,len |
---|
51 | if (plim1(i).le.ph(i,j)) j1(i) = j |
---|
52 | if (plim2(i).ge.ph(i,j+1).and.plim2(i).lt.ph(i,j)) j2(i) = j |
---|
53 | enddo |
---|
54 | enddo |
---|
55 | c |
---|
56 | do j=1,nd |
---|
57 | do i = 1,len |
---|
58 | wi(i,j) = 0. |
---|
59 | enddo |
---|
60 | enddo |
---|
61 | do i = 1,len |
---|
62 | ahm(i)=0. |
---|
63 | qmix(i)=0. |
---|
64 | umix(i)=0. |
---|
65 | vmix(i)=0. |
---|
66 | dpw(i) =0. |
---|
67 | a2(i)=0.0 |
---|
68 | b2(i) = 0. |
---|
69 | pnk(i) = p(i,nk(i)) |
---|
70 | enddo |
---|
71 | c |
---|
72 | p0 = 1000. |
---|
73 | p0m1 = 1./p0 |
---|
74 | c |
---|
75 | do i=1,len |
---|
76 | coef(i) = 1./(plim1(i)-plim2(i)) |
---|
77 | end do |
---|
78 | c |
---|
79 | do j=1,nd |
---|
80 | do i=1,len |
---|
81 | if (j.ge.j1(i).and.j.le.j2(i)) then |
---|
82 | p1(i,j) = min(ph(i,j),plim1(i)) |
---|
83 | p2(i,j) = max(ph(i,j+1),plim2(i)) |
---|
84 | cCRtest:couplage thermiques: deja normalise |
---|
85 | c wi(i,j) = w(j) |
---|
86 | c print*,'wi',wi(i,j) |
---|
87 | wi(i,j) = w(j)*(p1(i,j)-p2(i,j))*coef(i) |
---|
88 | dpw(i) = dpw(i)+wi(i,j) |
---|
89 | endif |
---|
90 | end do |
---|
91 | end do |
---|
92 | cCR:print |
---|
93 | c do i=1,len |
---|
94 | c print*,'plim',plim1(i),plim2(i) |
---|
95 | c enddo |
---|
96 | do j=1,nd |
---|
97 | do i=1,len |
---|
98 | if (j.ge.j1(i).and.j.le.j2(i)) then |
---|
99 | wi(i,j)=wi(i,j)/dpw(i) |
---|
100 | ahm(i)=ahm(i)+(cpd*(1.-q(i,j))+q(i,j)*cpv)*t(i,j)*wi(i,j) |
---|
101 | qmix(i)=qmix(i)+q(i,j)*wi(i,j) |
---|
102 | umix(i)=umix(i)+u(i,j)*wi(i,j) |
---|
103 | vmix(i)=vmix(i)+v(i,j)*wi(i,j) |
---|
104 | endif |
---|
105 | end do |
---|
106 | end do |
---|
107 | c |
---|
108 | do i=1,len |
---|
109 | rdcp(i)=(rrd*(1.-qmix(i))+qmix(i)*rrv)/ |
---|
110 | : (cpd*(1.-qmix(i))+qmix(i)*cpv) |
---|
111 | end do |
---|
112 | c |
---|
113 | |
---|
114 | c |
---|
115 | do 20 j=1,nd |
---|
116 | do 18 i=1,len |
---|
117 | if (j.ge.j1(i).and.j.le.j2(i)) then |
---|
118 | cc x=(.5*(p1(i,j)+p2(i,j))*p0m1)**rdcp(i) |
---|
119 | y=(.5*(p1(i,j)+p2(i,j))/pnk(i))**rdcp(i) |
---|
120 | cc a2(i)=a2(i)+(cpd*(1.-qmix(i))+qmix(i)*cpv)*x*wi(i,j) |
---|
121 | b2(i)=b2(i)+(cpd*(1.-qmix(i))+qmix(i)*cpv)*y*wi(i,j) |
---|
122 | endif |
---|
123 | 18 continue |
---|
124 | 20 continue |
---|
125 | c |
---|
126 | do i=1,len |
---|
127 | tmix(i) = ahm(i)/b2(i) |
---|
128 | thmix(i) =tmix(i)*(p0/pnk(i))**rdcp(i) |
---|
129 | c print*,'thmix ahm',ahm(i),b2(i) |
---|
130 | c print*,'thmix t',tmix(i),p0 |
---|
131 | c print*,'thmix p',pnk(i),rdcp(i) |
---|
132 | c print*,'thmix',thmix(i) |
---|
133 | cc thmix(i) = ahm(i)/a2(i) |
---|
134 | cc tmix(i)= thmix(i)*(pnk(i)*p0m1)**rdcp(i) |
---|
135 | zdelta=max(0.,sign(1.,rtt-tmix(i))) |
---|
136 | qsmix(i)= r2es*FOEEW(tmix(i),zdelta)/(pnk(i)*100.) |
---|
137 | qsmix(i)=min(0.5,qsmix(i)) |
---|
138 | zcor=1./(1.-retv*qsmix(i)) |
---|
139 | qsmix(i)=qsmix(i)*zcor |
---|
140 | end do |
---|
141 | c |
---|
142 | !------------------------------------------------------------------- |
---|
143 | ! --- Calculate lifted condensation level of air at parcel origin level |
---|
144 | ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980) |
---|
145 | !------------------------------------------------------------------- |
---|
146 | |
---|
147 | A = 1669.0 ! convect3 |
---|
148 | B = 122.0 ! convect3 |
---|
149 | |
---|
150 | |
---|
151 | niflag7=0 |
---|
152 | do 260 i=1,len |
---|
153 | |
---|
154 | if (iflag(i).ne.7) then ! modif sb Jun7th 2002 |
---|
155 | c |
---|
156 | rh(i)=qmix(i)/qsmix(i) |
---|
157 | chi(i)=tmix(i)/(A-B*rh(i)-tmix(i)) ! convect3 |
---|
158 | c ATTENTION, la LIGNE DESSOUS A ETE RAJOUTEE ARBITRAIREMENT ET |
---|
159 | c MASQUE UN PB POTENTIEL |
---|
160 | chi(i)=max(chi(i),0.) |
---|
161 | rh(i)=max(rh(i),0.) |
---|
162 | plcl(i)=pnk(i)*(rh(i)**chi(i)) |
---|
163 | if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0)) |
---|
164 | & .and.(iflag(i).eq.0))iflag(i)=8 |
---|
165 | |
---|
166 | else |
---|
167 | |
---|
168 | niflag7=niflag7+1 |
---|
169 | plcl(i)=plim2(i) |
---|
170 | c |
---|
171 | endif ! iflag=7 |
---|
172 | |
---|
173 | c print*,'NIFLAG7 =',niflag7 |
---|
174 | |
---|
175 | 260 continue |
---|
176 | |
---|
177 | return |
---|
178 | end |
---|
179 | |
---|