3 SUBROUTINE cv3p2_closure(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, tv, &
4 tvp, buoy, supmax, ok_inhib, ale, alp, omega,sig, w0, ptop2, cape, cin, m, &
5 iflag, coef, plim1, plim2, asupmax, supmax0, asupmaxmin, cbmflast, plfc, &
30 INTEGER,
INTENT (IN) :: ncum, nd, nloc
31 INTEGER,
DIMENSION (nloc),
INTENT (IN) :: icb, inb
32 REAL,
DIMENSION (nloc),
INTENT (IN) :: pbase, plcl
33 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: p
34 REAL,
DIMENSION (nloc, nd+1),
INTENT (IN) :: ph
35 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: tv, tvp, buoy
36 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: supmax
37 LOGICAL,
INTENT (IN) :: ok_inhib
38 REAL,
DIMENSION (nloc),
INTENT (IN) :: ale, alp
39 REAL,
DIMENSION (nloc, nd),
INTENT (IN) :: omega
42 REAL,
DIMENSION (nloc, nd),
INTENT (INOUT) :: sig, w0
43 REAL,
DIMENSION (nloc),
INTENT (INOUT) :: ptop2
46 REAL,
DIMENSION (nloc),
INTENT (OUT) :: cape, cin
47 REAL,
DIMENSION (nloc, nd),
INTENT (OUT) :: m
48 REAL,
DIMENSION (nloc),
INTENT (OUT) :: plim1, plim2
49 REAL,
DIMENSION (nloc, nd),
INTENT (OUT) :: asupmax
50 REAL,
DIMENSION (nloc),
INTENT (OUT) :: supmax0
51 REAL,
DIMENSION (nloc),
INTENT (OUT) :: asupmaxmin
52 REAL,
DIMENSION (nloc),
INTENT (OUT) :: cbmflast, plfc
53 REAL,
DIMENSION (nloc),
INTENT (OUT) :: wbeff
54 INTEGER,
DIMENSION (nloc),
INTENT (OUT) :: iflag
57 INTEGER :: il, i, j, k, icbmax
58 INTEGER,
DIMENSION (nloc) :: i0, klfc
59 REAL :: deltap, fac, w, amu
60 REAL,
DIMENSION (nloc, nd) :: rhodp
62 REAL,
DIMENSION (nloc, nd) :: dtmin, sigold
63 REAL,
DIMENSION (nloc, nd) :: coefmix
64 REAL,
DIMENSION (nloc) :: pzero, ptop2old
65 REAL,
DIMENSION (nloc) :: cina, cinb
66 INTEGER,
DIMENSION (nloc) :: ibeg
67 INTEGER,
DIMENSION (nloc) :: nsupmax
69 REAL,
DIMENSION (nloc, nd) :: temp
70 REAL,
DIMENSION (nloc) :: p1, pmin
71 REAL,
DIMENSION (nloc) :: asupmax0
72 LOGICAL,
DIMENSION (nloc) :: ok
73 REAL,
DIMENSION (nloc, nd) :: siglim, wlim, mlim
74 REAL,
DIMENSION (nloc) :: wb2
75 REAL,
DIMENSION (nloc) :: cbmf0
76 REAL,
DIMENSION (nloc) :: cbmflim
77 REAL,
DIMENSION (nloc) :: cbmfalp
78 REAL,
DIMENSION (nloc) :: cbmfalpb
79 REAL,
DIMENSION (nloc) :: cbmfmax
80 REAL,
DIMENSION (nloc) :: coef
81 REAL,
DIMENSION (nloc) :: xp, xq, xr, discr, b3, b4
82 REAL,
DIMENSION (nloc) :: theta, bb
83 REAL :: term1, term2, term3
84 REAL,
DIMENSION (nloc) :: alp2
90 CHARACTER (LEN=20) :: modname =
'cv3p2_closure'
91 CHARACTER (LEN=80) :: abort_message
93 INTEGER,
SAVE :: igout=1
96 IF (
prt_level>=20) print *,
' -> cv3p2_closure, Ale ',ale(igout)
105 alp2(il) = max(alp(il), 1.e-5)
107 alp2(il) = max(alp(il), 1.e-12)
113 IF (
prt_level>=20) print *,
'cv3p2_closure nloc ncum nd icb inb nl', nloc, &
114 ncum, nd, icb(nloc), inb(nloc),
nl
118 rhodp(il,k) = 0.007*p(il, k)*(ph(il,k)-ph(il,k+1))/tv(il, k)
130 IF ((inb(il)<(
nl-1)) .AND. (k>=(inb(il)+1)))
THEN
131 sig(il, k) =
beta*sig(il, k) + 2.*
alpha*buoy(il, inb(il))*abs(buoy(il,inb(il)))
132 sig(il, k) = amax1(sig(il,k), 0.0)
133 w0(il, k) =
beta*w0(il, k)
143 icbmax = max(icbmax, icb(il))
152 sig(il, k) =
beta*sig(il, k) - 2.*
alpha*buoy(il, icb(il))*buoy(il,icb(il))
153 sig(il, k) = amax1(sig(il,k), 0.0)
154 w0(il, k) =
beta*w0(il, k)
158 IF (
prt_level>=20) print *,
'cv3p2_closure apres 300'
167 IF (sig(il,nd)<1.5 .OR. sig(il,nd)>12.0)
THEN
173 IF (
prt_level>=20) print *,
'cv3p2_closure apres 400'
184 IF (k>=icb(il) .AND. k<=inb(il) &
185 .AND. icb(il)+1<=inb(il))
THEN
186 cbmf0(il) = cbmf0(il) + sig(il, k)*w0(il,k)*rhodp(il,k)
199 pzero(il) = plcl(il) -
pbcrit
204 pzero(il) = pzero(il) - pbmxup
207 ptop2old(il) = ptop2(il)
212 p1(il) = pzero(il) - 300.
219 nsupmax(il) = inb(il)
224 IF (i>icb(il) .AND. i<=inb(il))
THEN
225 IF (p(il,i)<=pzero(il) .AND. supmax(il,i)<0 .AND. ok(il))
THEN
233 IF (
prt_level>=20) print *,
'cv3p2_closure apres 2.'
236 asupmax(il, i) = abs(supmax(il,i))
257 IF (i>icb(il) .AND. i<=inb(il))
THEN
258 IF (p(il,i)<=pzero(il) .AND. p(il,i)>=p1(il))
THEN
259 IF (pzero(il)>p(il,i) .AND. pzero(il)<p(il,i-1))
THEN
266 IF (
prt_level>=20) print *,
'cv3p2_closure apres 3.'
272 IF (i>icb(il) .AND. i<=inb(il))
THEN
273 IF (p(il,i)<=pzero(il) .AND. p(il,i)>=p1(il))
THEN
274 asupmax0(il) = ((pzero(il)-p(il,i0(il)-1))*asupmax(il,i0(il))- &
275 (pzero(il)-p(il,i0(il)))*asupmax(il,i0(il)-1))/(p(il,i0(il))-p(il,i0(il)-1))
284 IF (p(il,i)==pzero(il))
THEN
285 asupmax(i, il) = asupmax0(il)
289 IF (
prt_level>=20) print *,
'cv3p2_closure apres 4.'
295 IF (i>icb(il) .AND. i<=inb(il))
THEN
296 IF (p(il,i)<=pzero(il) .AND. p(il,i)>=p1(il))
THEN
297 IF (asupmax(il,i)<asupmaxmin(il))
THEN
298 asupmaxmin(il) = asupmax(il, i)
309 print *,
'cv3p2_closure il asupmax0 asupmaxmin', il, asupmax0(il), &
310 asupmaxmin(il), pzero(il), pmin(il)
312 IF (asupmax0(il)<asupmaxmin(il))
THEN
313 asupmaxmin(il) = asupmax0(il)
317 IF (
prt_level>=20) print *,
'cv3p2_closure apres 5.'
324 IF (i>icb(il) .AND. i<=inb(il))
THEN
325 IF (p(il,i)<=pzero(il))
THEN
326 supmax0(il) = ((p(il,i)-pzero(il))*asupmax(il,i-1)- &
327 (p(il,i-1)-pzero(il))*asupmax(il,i))/(p(il,i)-p(il,i-1))
335 IF (
prt_level>=20) print *,
'cv3p2_closure apres 425.'
340 IF (asupmaxmin(il)<supcrit1)
THEN
344 IF (asupmaxmin(il)>supcrit1 .AND. asupmaxmin(il)<supcrit2)
THEN
345 ptop2(il) = ptop2old(il)
348 IF (asupmaxmin(il)>supcrit2)
THEN
349 ptop2(il) = ph(il, inb(il))
353 IF (
prt_level>=20) print *,
'cv3p2_closure apres 6.'
363 coefmix(il, i) = (min(ptop2(il),ph(il,i))-ph(il,i))/(ph(il,i+1)-ph(il,i))
364 coefmix(il, i) = min(coefmix(il,i), 1.)
383 IF (
prt_level>=20) print *,
'cv3p2_closure apres 7.'
405 CALL cv3_cine(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, tv, tvp, cina, &
409 cin(il) = cina(il) + cinb(il)
411 IF (
prt_level>=20) print *,
'cv3p2_closure after cv3_cine: cina, cinb, cin ', &
412 cina(igout), cinb(igout), cin(igout)
417 CALL cv3_buoy(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, ale, cin, tv, &
419 IF (
prt_level>=20) print *,
'cv3p2_closure after cv3_buoy'
442 IF ((k>=(icb(il)+1)) .AND. (k<=inb(il)) .AND. (j>=icb(il)) &
443 .AND. (j<=(k-1)))
THEN
444 dtmin(il, k) = amin1(dtmin(il,k), buoy(il,j))
451 print *,
'cv3p2_closure: dtmin ', (k, dtmin(igout,k), k=1,
nl)
459 IF ((k>=(icb(il)+1)) .AND. (k<=inb(il)))
THEN
461 deltap = min(pbase(il), ph(il,k-1)) - min(pbase(il), ph(il,k))
462 cape(il) = cape(il) +
rrd*buoy(il, k-1)*deltap/p(il, k-1)
463 cape(il) = amax1(0.0, cape(il))
464 sigold(il, k) = sig(il, k)
470 siglim(il, k) = coefmix(il, k)*
alpha1*dtmin(il, k)*abs(dtmin(il,k))
471 siglim(il, k) = amax1(siglim(il,k), 0.0)
472 siglim(il, k) = amin1(siglim(il,k), 0.01)
475 wlim(il, k) = fac*sqrt(cape(il))
476 amu = siglim(il, k)*wlim(il, k)
478 mlim(il, k) = amu*rhodp(il,k)
484 IF (
prt_level>=20) print *,
'cv3p2_closure apres 600'
489 print *,
'cv3p2_closure il icb mlim ph ph+1 ph+2', il, icb(il), &
490 mlim(il, icb(il)+1), ph(il, icb(il)), ph(il, icb(il)+1), &
494 IF (icb(il)+1<=inb(il))
THEN
496 mlim(il, icb(il)) = 0.5*mlim(il,icb(il)+1)*(ph(il,icb(il))-ph(il,icb(il)+1))/ &
497 (ph(il,icb(il)+1)-ph(il,icb(il)+2))
502 IF (
prt_level>=20) print *,
'cv3p2_closure apres 700'
525 IF (k>=icb(il) .AND. k<=inb(il) &
526 .AND. icb(il)+1<=inb(il))
THEN
527 cbmflim(il) = cbmflim(il) + mlim(il, k)
531 IF (
prt_level>=20) print *,
'cv3p2_closure after cbmflim: cbmflim ', cbmflim(igout)
539 wb2(il) = sqrt(2.*max(ale(il)+cin(il),0.))
543 IF (plfc(il)<100.)
THEN
550 ELSE IF (flag_wb==1)
THEN
551 wbeff(il) = wbmax/(1.+500./(ph(il,1)-plfc(il)))
552 ELSE IF (flag_wb==2)
THEN
553 wbeff(il) = wbmax*(0.01*(ph(il,1)-plfc(il)))**2
564 if ((plfc(il).lt.ph(il,k)).and.(plfc(il).ge.ph(il,k+1)))
then
574 cbmfalp(il) = alp2(il)/(2.*wbeff(il)*wbeff(il)-cin(il))
577 if ((coef_clos_ls.gt.0.).and.(plfc(il).gt.0.))
then
578 cbmfalp(il) = cbmfalp(il) - coef_clos_ls*min(0.,1./
rg*omega(il,klfc(il)))
581 IF (cbmfalp(il)==0 .AND. alp2(il)/=0.)
THEN
582 WRITE (
lunout, *)
'cv3p2_closure cbmfalp=0 and alp NE 0 il alp2 alp cin ' , &
583 il, alp2(il), alp(il), cin(il)
587 cbmfmax(il) = sigmax*wb2(il)*100.*p(il, icb(il))/(
rrd*tv(il,icb(il)))
591 IF (cbmflim(il)>1.e-6)
THEN
594 cbmfalpb(il) = min(cbmfalp(il), cbmfmax(il))
601 IF (
prt_level>=20) print *,
'cv3p2_closure apres cbmfalpb: cbmfalpb ',cbmfalpb(igout)
606 coef(il) = (cbmfalpb(il)+1.e-10)/(cbmflim(il)+1.e-10)
608 IF (
prt_level>=20) print *,
'cv3p2_closure apres coef_plantePLUS'
612 IF (k>=icb(il)+1 .AND. k<=inb(il))
THEN
613 amu =
beta*sig(il, k)*w0(il, k) + (1.-
beta)*coef(il)*siglim(il, k)*wlim(il, k)
614 w0(il, k) = wlim(il, k)
615 w0(il, k) = max(w0(il,k), 1.e-10)
616 sig(il, k) = amu/w0(il, k)
617 sig(il, k) = min(sig(il,k), 1.)
620 m(il, k) = amu*rhodp(il,k)
626 w0(il, icb(il)) = 0.5*w0(il, icb(il)+1)
627 m(il, icb(il)) = 0.5*m(il, icb(il)+1)*(ph(il,icb(il))-ph(il,icb(il)+1))/ &
628 (ph(il,icb(il)+1)-ph(il,icb(il)+2))
629 sig(il, icb(il)) = sig(il, icb(il)+1)
630 sig(il, icb(il)-1) = sig(il, icb(il))
632 IF (
prt_level>=20) print *,
'cv3p2_closure apres w0_sig_M: w0, sig ', &
633 (k,w0(igout,k),sig(igout,k), k=icb(igout),inb(igout))
646 IF (k>=icb(il) .AND. k<=inb(il))
THEN
648 cbmflast(il) = cbmflast(il) + m(il, k)
652 IF (
prt_level>=20) print *,
'cv3p2_closure apres cbmflast: cbmflast ',cbmflast(igout)
655 IF (cbmflast(il)<1.e-6 .AND. cbmflast(il)>=cbmfalpb(il))
THEN
662 IF (iflag(il)>=3)
THEN
671 print *,
'cv3p2_closure: iflag ',iflag(igout)
683 coef(il) = 5.*coef(il)
691 coef(1:ncum) = min(2.*coef(1:ncum), 5.)
692 coef(1:ncum) = max(2.*coef(1:ncum), 0.2)
696 IF (
prt_level>=20) print *,
'cv3p2_closure FIN'
!$Id!Parameters for minorig
subroutine cv3_cine(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, tv, tvp, cina, cinb, plfc)
!$Id!Parameters for nlm real spfac!IM cf epmax real ptcrit real omtrain real dttrig real beta
!$Header!CDK comgeom COMMON comgeom && alpha1
!$Id!Thermodynamical constants for rrd
!$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
subroutine cv3_buoy(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, ale, cin, tv, tvp, buoy)
!$Id!Parameters for nlm real spfac!IM cf epmax real pbcrit
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$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 ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
!$Id!Parameters for nlm real spfac!IM cf epmax real ptcrit real omtrain real dttrig real alpha real delta real betad COMMON cv30param nlm spfac &!IM cf ptcrit omtrain dttrig alpha
subroutine cv3p2_closure(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, tv, tvp, buoy, supmax, ok_inhib, ale, alp, omega, sig, w0, ptop2, cape, cin, m, iflag, coef, plim1, plim2, asupmax, supmax0, asupmaxmin, cbmflast, plfc, wbeff)
subroutine abort_physic(modname, message, ierr)
!$Id sig2feed!common comconema2 iflag_cvl_sigd common comconema1 cvl_sig2feed common comconema2 iflag_cvl_sigd
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout