1 SUBROUTINE cv3p_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, &
2 ph, t,
rr, rs,
u, v, tra, h, lv, qnk, &
3 unk, vnk, hp, tv, tvp, ep, clw, sig, &
4 ment, qent, hent, uent, vent, nent, &
5 sigij, elij, supmax, ments, qents, traent)
24 INTEGER,
INTENT (IN) :: ncum, nd, na
25 INTEGER,
INTENT (IN) :: ntra, nloc
26 INTEGER,
DIMENSION (nloc),
INTENT (IN) :: icb, inb, nk
27 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: sig
28 REAL,
DIMENSION (nloc),
INTENT (IN) :: qnk, unk, vnk
29 REAL,
DIMENSION (nloc, nd+1),
INTENT (IN) :: ph
30 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: t, rr, rs
31 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: u, v
32 REAL,
DIMENSION (nloc, nd, ntra),
INTENT (IN) :: tra
33 REAL,
DIMENSION (nloc, na),
INTENT (IN) :: lv
34 REAL,
DIMENSION (nloc, na),
INTENT (IN) :: h
35 REAL,
DIMENSION (nloc, na),
INTENT (IN) :: hp
36 REAL,
DIMENSION (nloc, na),
INTENT (IN) :: tv, tvp
37 REAL,
DIMENSION (nloc, na),
INTENT (IN) :: ep, clw
40 REAL,
DIMENSION (nloc, na, na),
INTENT (OUT) :: Ment, Qent
41 REAL,
DIMENSION (nloc, na, na),
INTENT (OUT) :: uent, vent
42 REAL,
DIMENSION (nloc, na, na),
INTENT (OUT) :: Sigij, elij
43 REAL,
DIMENSION (nloc, na),
INTENT (OUT) :: supmax
45 REAL,
DIMENSION (nloc, nd, nd, ntra),
INTENT (OUT) :: traent
46 REAL,
DIMENSION (nloc, nd, nd),
INTENT (OUT) :: Ments, Qents
47 REAL,
DIMENSION (nloc, nd, nd),
INTENT (OUT) :: hent
48 INTEGER,
DIMENSION (nloc, nd),
INTENT (OUT) :: nent
51 INTEGER i, j, k, il, im, jm
53 REAL :: rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
54 REAL :: alt, delp, delm
55 REAL,
DIMENSION (nloc) :: Qmixmax, Rmixmax, sqmrmax
56 REAL,
DIMENSION (nloc) :: Qmixmin, Rmixmin, sqmrmin
57 REAL,
DIMENSION (nloc) :: signhpmh
58 REAL,
DIMENSION (nloc) :: Sx
60 REAL,
DIMENSION (nloc) :: Smid, Sjmin, Sjmax
61 REAL,
DIMENSION (nloc) :: Sbef, sup, smin
63 REAL,
DIMENSION (nloc) :: ASij, ASij_inv, smax, Scrit
64 REAL,
DIMENSION (nloc, nd, nd) :: Sij
65 REAL,
DIMENSION (nloc, nd) :: csum
67 LOGICAL,
DIMENSION (nloc) :: lwork
69 REAL amxupcrit, df, ff
72 INTEGER,
SAVE :: igout=1
77 REAL Qcoef1, Qcoef2, QFF, QFFF, Qmix, Rmix, Qmix1, Rmix1, Qmix2, Rmix2, F
81 qff(f) = max(min(f,1.), 0.)
82 qfff(f) = min(qff(f),
scut)
83 qmix1(f) = (tanh((qff(f)-fmax)/
gammas)+qcoef1max)/qcoef2max
84 rmix1(f) = (
gammas*log(cosh((qff(f)-fmax)/
gammas))+qff(f)*qcoef1max)/qcoef2max
85 qmix2(f) = -log(1.-qfff(f))/
scut
86 rmix2(f) = (qfff(f)+(1.-qff(f))*log(1.-qfff(f)))/
scut
87 qmix(f) =
qqa1*qmix1(f) +
qqa2*qmix2(f)
88 rmix(f) =
qqa1*rmix1(f) +
qqa2*rmix2(f)
90 INTEGER,
SAVE :: ifrst
102 qcoef1max = qcoef1(fmax)
103 qcoef2max = qcoef2(fmax)
105 print*,
'fmax, gammas, qqa1, qqa2, Qcoef1max, Qcoef2max ', &
126 qent(i, k, j) = rr(i, j)
127 uent(i, k, j) = u(i, j)
128 vent(i, k, j) = v(i, j)
138 ment(1:ncum, 1:nd, 1:nd) = 0.0
139 sij(1:ncum, 1:nd, 1:nd) = 0.0
162 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) &
163 .AND. (j<=inb(il)))
THEN
165 rti = qnk(il) - ep(il, i)*clw(il, i)
166 bf2 = 1. + lv(il, j)*lv(il, j)*rs(il, j)/(
rrv*t(il,j)*t(il,j)*
cpd)
167 anum = h(il, j) - hp(il, i) + (
cpv-
cpd)*t(il, j)*(rti-rr(il,j))
168 denom = h(il, i) - hp(il, i) + (
cpd-
cpv)*(rr(il,i)-rti)*t(il, j)
170 IF (abs(dei)<0.01) dei = 0.01
171 sij(il, i, j) = anum/dei
173 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
175 cwat = clw(il, j)*(1.-ep(il,j))
176 stemp = sij(il, i, j)
177 IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i)
THEN
178 anum = anum - lv(il, j)*(rti-rs(il,j)-cwat*bf2)
179 denom = denom + lv(il, j)*(rr(il,i)-rti)
180 IF (abs(denom)<0.01) denom = 0.01
181 sij(il, i, j) = anum/denom
182 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
183 altem = altem - (bf2-1.)*cwat
185 IF (sij(il,i,j)>0.0)
THEN
188 elij(il, i, j) = altem
189 elij(il, i, j) = amax1(0.0, elij(il,i,j))
190 nent(il, i) = nent(il, i) + 1
193 sij(il, i, j) = amax1(0.0, sij(il,i,j))
194 sij(il, i, j) = amin1(1.0, sij(il,i,j))
201 print *,
'cv3p_mixing i, nent(i), icb, inb ',i, nent(igout,i), icb(igout), inb(igout)
202 IF (nent(igout,i) .gt. 0)
THEN
203 print *,
'i,(j,Sij(i,j),j=icb-1,inb) ',i,(j,sij(igout,i,j),j=icb(igout)-1,inb(igout))
215 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0))
THEN
219 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
220 uent(il, i, i) = unk(il)
221 vent(il, i, i) = vnk(il)
222 elij(il, i, i) = clw(il, i)*(1.-ep(il,i))
241 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. &
242 (i>=icb(il)) .AND. (i<=inb(il)))
THEN
243 sigij(il, i, j) = sij(il, i, j)
257 CALL zilch(csum, nloc*nd)
269 IF (i>=icb(il) .AND. i<=inb(il)) num1 = num1 + 1
271 IF (num1<=0)
GO TO 789
279 IF (i>=icb(il) .AND. i<=inb(il))
THEN
280 signhpmh(il) = sign(1., hp(il,i)-h(il,i))
281 sbef(il) = max(0., signhpmh(il))
287 IF (i>=icb(il) .AND. i<=inb(il) .AND. j<=inb(il))
THEN
288 IF (sbef(il)<sij(il,i,j))
THEN
289 sx(il) = max(sij(il,i,j), sx(il))
291 sbef(il) = sij(il, i, j)
298 IF (i>=icb(il) .AND. i<=inb(il))
THEN
299 lwork(il) = (nent(il,i)/=0)
300 rti = qnk(il) - ep(il, i)*clw(il, i)
301 anum = h(il, i) - hp(il, i) - lv(il, i)*(rti-rs(il,i)) + &
302 (
cpv-
cpd)*t(il, i)*(rti-rr(il,i))
303 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-rti) + &
304 (
cpd-
cpv)*t(il, i)*(rr(il,i)-rti)
305 IF (abs(denom)<0.01) denom = 0.01
306 scrit(il) = min(anum/denom, 1.)
307 alt = rti - rs(il, i) + scrit(il)*(rr(il,i)-rti)
313 scrit2 = min(scrit(il), sx(il))*max(0., -signhpmh(il)) + &
314 scrit(il)*max(0., signhpmh(il))
320 IF (scrit(il)<=0.0) scrit(il) = 0.0
321 IF (alt<=0.0) scrit(il) = 1.0
335 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
336 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
337 lwork(il)) num2 = num2 + 1
339 IF (num2<=0)
GO TO 175
345 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
346 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
348 IF (sij(il,i,j)>0.0)
THEN
349 smid(il) = min(sij(il,i,j), scrit(il))
352 IF (smid(il)<smin(il) .AND. sij(il,i,j+1)<smid(il))
THEN
354 sjmax(il) = min((sij(il,i,j+1)+sij(il,i,j))/2., sij(il,i,j), scrit(il))
355 sjmin(il) = max((sbef(il)+sij(il,i,j))/2., sij(il,i,j))
356 sjmin(il) = min(sjmin(il), scrit(il))
357 sbef(il) = sij(il, i, j)
366 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
367 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
369 IF (sij(il,i,j)>0.0)
THEN
371 sjmin(il) = max((sij(il,i,j-1)+smid(il))/2., scrit(il))*max(0., -signhpmh(il)) + &
372 min((sij(il,i,j+1)+smid(il))/2., scrit(il))*max(0., signhpmh(il))
373 sjmin(il) = max(sjmin(il), sup(il))
377 scrit(il) = min(sjmin(il), sjmax(il), scrit(il))
380 sbef(il) = max(0., signhpmh(il))
381 supmax(il, i) = sign(scrit(il), -signhpmh(il))
389 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
390 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
392 IF (sij(il,i,j)>0.0)
THEN
393 smid(il) = max(sij(il,i,j), scrit(il))
396 IF (smid(il)>smax(il) .AND. sij(il,i,j+1)>smid(il))
THEN
398 sjmax(il) = max((sij(il,i,j+1)+sij(il,i,j))/2., sij(il,i,j))
399 sjmax(il) = max(sjmax(il), scrit(il))
400 sjmin(il) = min((sbef(il)+sij(il,i,j))/2., sij(il,i,j))
401 sjmin(il) = max(sjmin(il), scrit(il))
402 sbef(il) = sij(il, i, j)
404 IF (abs(sjmin(il)-sjmax(il))>1.e-10) &
405 sup(il) = max(sjmin(il), sjmax(il), sup(il))
415 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
416 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
418 IF (sij(il,i,j)>0.0)
THEN
419 rti = qnk(il) - ep(il, i)*clw(il, i)
420 qmixmax(il) = qmix(sjmax(il))
421 qmixmin(il) = qmix(sjmin(il))
422 rmixmax(il) = rmix(sjmax(il))
423 rmixmin(il) = rmix(sjmin(il))
424 sqmrmax(il) = sjmax(il)*qmix(sjmax(il)) - rmix(sjmax(il))
425 sqmrmin(il) = sjmin(il)*qmix(sjmin(il)) - rmix(sjmin(il))
427 ment(il, i, j) = abs(qmixmax(il)-qmixmin(il))*ment(il, i, j)
430 IF (abs(qmixmax(il)-qmixmin(il))>1.e-10)
THEN
431 sigij(il, i, j) = (sqmrmax(il)-sqmrmin(il))/(qmixmax(il)-qmixmin(il))
437 qent(il, i, j) = (1.-sigij(il,i,j))*rti + sigij(il, i, j)*rr(il, i)
438 uent(il, i, j) = (1.-sigij(il,i,j))*unk(il) + sigij(il, i, j)*u(il, i)
439 vent(il, i, j) = (1.-sigij(il,i,j))*vnk(il) + sigij(il, i, j)*v(il, i)
452 hent(il, i, j) = (1.-sigij(il,i,j))*hp(il, i) + sigij(il, i, j)*h(il, i)
454 elij(il, i, j) = qent(il, i, j) - rs(il, j)
455 elij(il, i, j) = elij(il, i, j) + &
456 ((h(il,j)-hent(il,i,j))*rs(il,j)*lv(il,j) / &
457 ((
cpd*(1.-qent(il,i,j))+qent(il,i,j)*
cpv)*
rrv*t(il,j)*t(il,j)))
458 elij(il, i, j) = elij(il, i, j) / &
459 (1.+lv(il,j)*lv(il,j)*rs(il,j) / &
460 ((
cpd*(1.-qent(il,i,j))+qent(il,i,j)*
cpv)*
rrv*t(il,j)*t(il,j)))
462 elij(il, i, j) = max(elij(il,i,j), 0.)
464 elij(il, i, j) = min(elij(il,i,j), qent(il,i,j))
467 awat = elij(il, i, j) - (1.-ep(il,j))*clw(il, j)
468 awat = amax1(awat, 0.0)
476 hent(il, i, j) = hent(il, i, j) + (lv(il,j)+(
cpd-
cpv)*t(il,j))*awat
483 asij(il) = asij(il) + abs(qmixmax(il)*(1.-sjmax(il))+rmixmax(il) - &
484 qmixmin(il)*(1.-sjmin(il))-rmixmin(il))
506 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
507 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
509 IF (sij(il,i,j)>0.0)
THEN
510 rti = qnk(il) - ep(il, i)*clw(il, i)
512 ment(il, i, i) = abs(qmixmax(il)*(1.-sjmax(il))+rmixmax(il) - &
513 qmixmin(il)*(1.-sjmin(il))-rmixmin(il))
515 uent(il, i, i) = unk(il)
516 vent(il, i, i) = vnk(il)
517 hent(il, i, i) = hp(il, i)
518 elij(il, i, i) = clw(il, i)*(1.-ep(il,i))
542 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il))
THEN
543 asij(il) = amax1(1.0e-16, asij(il))
546 asij_inv(il) = 1.0/asij(il)
548 IF (asij_inv(il) > 100.) asij_inv(il) = 0.
556 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
557 j>=(icb(il)-1) .AND. j<=inb(il))
THEN
559 ment(il, i, j) = ment(il, i, j)*asij_inv(il)
566 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
567 j>=(icb(il)-1) .AND. j<=inb(il))
THEN
568 csum(il, i) = csum(il, i) + ment(il, i, j)
574 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. csum(il,i)<1.)
THEN
579 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
580 uent(il, i, i) = unk(il)
581 vent(il, i, i) = vnk(il)
582 elij(il, i, i) = clw(il, i)*(1.-ep(il,i))
!$Id!Thermodynamical constants for cpv
!$Id!Parameters for minorig
INTEGER iflag_mix REAL scut REAL Supcrit2 REAL coef_clos_ls!COMMON YOMCST2 scut
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm u(l)
subroutine cv3p_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, ph, t, rr, rs, u, v, tra, h, lv, qnk, unk, vnk, hp, tv, tvp, ep, clw, sig, Ment, Qent, hent, uent, vent, nent, Sigij, elij, supmax, Ments, Qents, traent)
!$Id!Thermodynamical constants for t0 real clmci real epsim1 real hrd real grav COMMON cvthermo cpd
!$Id!Thermodynamical constants for rrv
INTEGER iflag_mix REAL qqa1
INTEGER iflag_mix REAL gammas
INTEGER iflag_mix REAL qqa2
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout