Ignore:
Timestamp:
Jul 28, 2025, 7:23:15 PM (7 days ago)
Author:
aborella
Message:

Merge with trunk r5789

Location:
LMDZ6/branches/contrails
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/contrails

  • LMDZ6/branches/contrails/libf/phylmd/cv_routines.f90

    r5346 r5791  
    11
    22! $Id$
     3MODULE cv_routines_mod
     4PRIVATE
     5
     6PUBLIC cv_param, cv_prelim, cv_feed, cv_undilute1, cv_trigger, cv_compress, cv_undilute2, &
     7       cv_closure, cv_mixing, cv_yield, cv_unsat, cv_uncompress
     8
     9CONTAINS
    310
    411SUBROUTINE cv_param(nd)
     
    243250
    244251  ! Compute icbmax.
    245 
    246   icbmax = 2
    247   DO i = 1, len
    248     icbmax = max(icbmax, icb(i))
    249   END DO
     252  !ym do not do that, independance between column
     253  !ym icbmax = 2
     254  !ym DO i = 1, len
     255  !ym  icbmax = max(icbmax, icb(i))
     256  !ym END DO
    250257
    251258  RETURN
     
    254261SUBROUTINE cv_undilute1(len, nd, t, q, qs, gz, p, nk, icb, icbmax, tp, tvp, &
    255262    clw)
    256   USE lmdz_cv_ini, ONLY : cl,clmcpv,cpd,cpv,eps,epsi,lv0,minorig,rrv,t0
     263  USE lmdz_cv_ini, ONLY : cl,clmcpv,cpd,cpv,eps,epsi,lv0,minorig,rrv,t0,nl
    257264
    258265  IMPLICIT NONE
     
    299306  ! ***   Calculate lifted parcel quantities below cloud base   ***
    300307
    301   DO k = minorig, icbmax - 1
     308  !ym bad dependance between column => icbmax computed in cv_feed
     309!ym  DO k = minorig, icbmax - 1
     310  DO k = minorig, nd
    302311    DO i = 1, len
    303       tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))/cpp(i)
    304       tvp(i, k) = tp(i, k)*(1.+qnk(i)*epsi)
     312      IF (k <= MAX(2,icb(i))-1) THEN
     313        tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))/cpp(i)
     314        tvp(i, k) = tp(i, k)*(1.+qnk(i)*epsi)
     315      ENDIF
    305316    END DO
    306317  END DO
     
    352363    tvp(i, icb(i)) = tp(i, icb(i))*(1.+rg*epsi)
    353364  END DO
    354 
    355   DO k = minorig, icbmax
     365 
     366  !ym bad dependance between column => ibmax computed in cv_feed
     367!ym  DO k = minorig, icbmax
     368  DO k = minorig, nd
    356369    DO i = 1, len
    357       tvp(i, k) = tvp(i, k) - tp(i, k)*qnk(i)
     370      IF (k <= MAX(2,icb(i))) THEN
     371        tvp(i, k) = tvp(i, k) - tp(i, k)*qnk(i)
     372      ENDIF
    358373    END DO
    359374  END DO
     
    392407END SUBROUTINE cv_trigger
    393408
    394 SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, nk1, icb1, cbmf1, plcl1, &
     409SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, compress, nk1, icb1, cbmf1, plcl1, &
    395410    tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, tv1, &
    396411    tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, q, qs, u, &
     
    404419  INTEGER len, ncum, nd, nloc
    405420  INTEGER iflag1(len), nk1(len), icb1(len)
     421  LOGICAL compress
    406422  REAL cbmf1(len), plcl1(len), tnk1(len), qnk1(len), gznk1(len)
    407423  REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd)
     
    424440  CHARACTER (LEN=80) :: abort_message
    425441
    426 
    427   DO k = 1, nl + 1
     442  IF (compress) THEN
     443    DO k = 1, nl + 1
     444      nn = 0
     445      DO i = 1, len
     446        IF (iflag1(i)==0) THEN
     447          nn = nn + 1
     448          t(nn, k) = t1(i, k)
     449          q(nn, k) = q1(i, k)
     450          qs(nn, k) = qs1(i, k)
     451          u(nn, k) = u1(i, k)
     452          v(nn, k) = v1(i, k)
     453          gz(nn, k) = gz1(i, k)
     454          h(nn, k) = h1(i, k)
     455          lv(nn, k) = lv1(i, k)
     456          cpn(nn, k) = cpn1(i, k)
     457          p(nn, k) = p1(i, k)
     458          ph(nn, k) = ph1(i, k)
     459          tv(nn, k) = tv1(i, k)
     460          tp(nn, k) = tp1(i, k)
     461          tvp(nn, k) = tvp1(i, k)
     462          clw(nn, k) = clw1(i, k)
     463        END IF
     464      END DO
     465    END DO
     466 
     467    IF (nn/=ncum) THEN
     468      WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
     469      abort_message = ''
     470      CALL abort_physic(modname, abort_message, 1)
     471    END IF
     472 
    428473    nn = 0
    429474    DO i = 1, len
    430475      IF (iflag1(i)==0) THEN
    431476        nn = nn + 1
    432         t(nn, k) = t1(i, k)
    433         q(nn, k) = q1(i, k)
    434         qs(nn, k) = qs1(i, k)
    435         u(nn, k) = u1(i, k)
    436         v(nn, k) = v1(i, k)
    437         gz(nn, k) = gz1(i, k)
    438         h(nn, k) = h1(i, k)
    439         lv(nn, k) = lv1(i, k)
    440         cpn(nn, k) = cpn1(i, k)
    441         p(nn, k) = p1(i, k)
    442         ph(nn, k) = ph1(i, k)
    443         tv(nn, k) = tv1(i, k)
    444         tp(nn, k) = tp1(i, k)
    445         tvp(nn, k) = tvp1(i, k)
    446         clw(nn, k) = clw1(i, k)
    447       END IF
    448     END DO
    449   END DO
    450 
    451   IF (nn/=ncum) THEN
    452     WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
    453     abort_message = ''
    454     CALL abort_physic(modname, abort_message, 1)
    455   END IF
    456 
    457   nn = 0
    458   DO i = 1, len
    459     IF (iflag1(i)==0) THEN
    460       nn = nn + 1
    461       cbmf(nn) = cbmf1(i)
    462       plcl(nn) = plcl1(i)
    463       tnk(nn) = tnk1(i)
    464       qnk(nn) = qnk1(i)
    465       gznk(nn) = gznk1(i)
    466       nk(nn) = nk1(i)
    467       icb(nn) = icb1(i)
    468       iflag(nn) = iflag1(i)
    469     END IF
    470   END DO
     477        cbmf(nn) = cbmf1(i)
     478        plcl(nn) = plcl1(i)
     479        tnk(nn) = tnk1(i)
     480        qnk(nn) = qnk1(i)
     481        gznk(nn) = gznk1(i)
     482        nk(nn) = nk1(i)
     483        icb(nn) = icb1(i)
     484        iflag(nn) = iflag1(i)
     485      END IF
     486    END DO
     487 
     488  ELSE  !compress
     489    t(:, 1:nl+1) = t1(:, 1:nl+1)
     490    q(:, 1:nl+1) = q1(:, 1:nl+1)
     491    qs(:, 1:nl+1) = qs1(:, 1:nl+1)
     492    u(:, 1:nl+1) = u1(:, 1:nl+1)
     493    v(:, 1:nl+1) = v1(:, 1:nl+1)
     494    gz(:, 1:nl+1) = gz1(:, 1:nl+1)
     495    h(:, 1:nl+1) = h1(:, 1:nl+1)
     496    lv(:, 1:nl+1) = lv1(:, 1:nl+1)
     497    cpn(:, 1:nl+1) = cpn1(:, 1:nl+1)
     498    p(:, 1:nl+1) = p1(:, 1:nl+1)
     499    ph(:, 1:nl+1) = ph1(:, 1:nl+1)
     500    tv(:, 1:nl+1) = tv1(:, 1:nl+1)
     501    tp(:, 1:nl+1) = tp1(:, 1:nl+1)
     502    tvp(:, 1:nl+1) = tvp1(:, 1:nl+1)
     503    clw(:, 1:nl+1) = clw1(:, 1:nl+1)
     504
     505    cbmf(:) = cbmf1(:)
     506    plcl(:) = plcl1(:)
     507    tnk(:) = tnk1(:)
     508    qnk(:) = qnk1(:)
     509    gznk(:) = gznk1(:)
     510    nk(:) = nk1(:)
     511    icb(:) = icb1(:)
     512    iflag(:) = iflag1(:)
     513  ENDIF
    471514
    472515  DO k = 1, nl
     
    712755  ! J Teixeira fix
    713756
    714   CALL zilch(byp, ncum)
     757  byp(1:ncum) = 0
     758
    715759  DO i = 1, ncum
    716760    lcape(i) = .TRUE.
     
    745789
    746790  ! initialization:
    747   DO i = 1, ncum*nlp
    748     hp(i, 1) = h(i, 1)
    749   END DO
     791!ym very bad 
     792!ym  DO i = 1, ncum*nlp
     793!ym    hp(i, 1) = h(i, 1)
     794!ym  END DO
     795  DO k=1,nlp
     796    DO i=1,ncum
     797      hp(i, k) = h(i, k)
     798    ENDDO
     799  ENDDO
    750800
    751801  DO k = minorig + 1, nl
     
    786836  ! Compute icbmax.
    787837  ! -------------------------------------------------------------------
    788 
    789   icbmax = 2
    790   DO i = 1, ncum
    791     icbmax = max(icbmax, icb(i))
    792   END DO
     838 
     839!ym independance betwwen column
     840!ym  icbmax = 2
     841!ym  DO i = 1, ncum
     842!ym    icbmax = max(icbmax, icb(i))
     843!ym  END DO
    793844
    794845  ! =====================================================================
     
    814865
    815866  ! dtpbl = average of tvp-tv in the PBL (k=nk to icb-1).
    816 
    817   DO k = minorig, icbmax
     867!ym independance betwwen column
     868!ym  DO k = minorig, icbmax
     869  DO k = minorig, nd
    818870    DO i = 1, ncum
    819       IF ((k>=nk(i)) .AND. (k<=(icb(i)-1))) THEN
    820         dtpbl(i) = dtpbl(i) + (tvp(i,k)-tv(i,k))*dph(i, k)
    821       END IF
     871      IF (k<=MAX(2,icb(i))) THEN
     872        IF ((k>=nk(i)) .AND. (k<=(icb(i)-1))) THEN
     873          dtpbl(i) = dtpbl(i) + (tvp(i,k)-tv(i,k))*dph(i, k)
     874        END IF
     875      ENDIF
    822876    END DO
    823877  END DO
     
    878932  ! =====================================================================
    879933
    880   DO i = 1, ncum*nlp
    881     nent(i, 1) = 0
    882     m(i, 1) = 0.0
    883   END DO
     934!ym very bad
     935!ym  DO i = 1, ncum*nlp
     936!ym    nent(i, 1) = 0
     937!ym    m(i, 1) = 0.0
     938!ym  END DO
     939  DO k = 1, nlp
     940    DO i = 1, ncum
     941      nent(i, k) = 0
     942      m(i, k) = 0.0
     943    ENDDO
     944  ENDDO
    884945
    885946  DO k = 1, nlp
     
    900961  ! -------------------------------------------------------------------
    901962
    902   CALL zilch(work, ncum)
    903 
     963  work(1:ncum) = 0.
     964 
    904965  DO j = minorig + 1, nl
    905966    DO i = 1, ncum
     
    9971058  ! =====================================================================
    9981059
    999   CALL zilch(bsum, ncum*nlp)
     1060  bsum(1:ncum,1:nlp) = 0.
    10001061  DO ij = 1, ncum
    10011062    lwork(ij) = .FALSE.
     
    10071068      IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) num1 = num1 + 1
    10081069    END DO
    1009     IF (num1<=0) GO TO 789
     1070!ym    IF (num1<=0) GO TO 789
     1071    IF (num1<=0) CYCLE
    10101072
    10111073    DO ij = 1, ncum
     
    10301092          ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) num2 = num2 + 1
    10311093      END DO
    1032       IF (num2<=0) GO TO 783
     1094!ym      IF (num2<=0) GO TO 783
     1095      IF (num2<=0) CYCLE
    10331096
    10341097      DO ij = 1, ncum
     
    11731236
    11741237
    1175   CALL zilch(wdtrain, ncum)
     1238  wdtrain(1:ncum) = 0.
    11761239  DO i = nl + 1, 1, -1
    11771240
     
    11801243      IF ((i<=inb(ij)) .AND. lwork(ij)) num1 = num1 + 1
    11811244    END DO
    1182     IF (num1<=0) GO TO 899
     1245!ym    IF (num1<=0) GO TO 899
     1246    IF (num1<=0) CYCLE
    11831247
    11841248
     
    14311495      IF (i<=inb(ij)) num1 = num1 + 1
    14321496    END DO
    1433     IF (num1<=0) GO TO 1500
    1434 
    1435     CALL zilch(amp1, ncum)
    1436     CALL zilch(ad, ncum)
     1497!ym    IF (num1<=0) GO TO 1500
     1498    IF (num1<=0) CYCLE
     1499
     1500    amp1(1:ncum)=0.
     1501    ad(1:ncum)=0.
    14371502
    14381503    DO k = i + 1, nl + 1
     
    14861551      DO ij = 1, ncum
    14871552        IF (i<=inb(ij)) THEN
     1553          dpinv = 0.01/(ph(ij,i)-ph(ij,i+1))
    14881554          awat = elij(ij, k, i) - (1.-ep(ij,i))*clw(ij, i)
    14891555          awat = max(awat, 0.0)
     
    15031569      DO ij = 1, ncum
    15041570        IF ((i<=inb(ij)) .AND. (k<=inb(ij))) THEN
     1571          dpinv = 0.01/(ph(ij,i)-ph(ij,i+1))
    15051572          fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-q(ij,i &
    15061573            ))
     
    15141581    DO ij = 1, ncum
    15151582      IF (i<=inb(ij)) THEN
     1583        dpinv = 0.01/(ph(ij,i)-ph(ij,i+1))
    15161584        fq(ij, i) = fq(ij, i) + sigd*evap(ij, i) + g*(mp(ij,i+1)*(qp(ij, &
    15171585          i+1)-q(ij,i))-mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv
     
    16621730END SUBROUTINE cv_yield
    16631731
    1664 SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, iflag, precip, cbmf, ft, &
     1732SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, is_convect, compress, iflag, precip, cbmf, ft, &
    16651733    fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, ma1, &
    16661734    qcondc1)
     
    16721740  INTEGER len, ncum, nd, nloc
    16731741  INTEGER idcum(nloc)
     1742  LOGICAL is_convect(nloc)
     1743  LOGICAL compress
    16741744  INTEGER iflag(nloc)
    16751745  REAL precip(nloc), cbmf(nloc)
     
    16871757  ! local variables:
    16881758  INTEGER i, k
    1689 
    1690   DO i = 1, ncum
    1691     precip1(idcum(i)) = precip(i)
    1692     cbmf1(idcum(i)) = cbmf(i)
    1693     iflag1(idcum(i)) = iflag(i)
    1694   END DO
    1695 
    1696   DO k = 1, nl
     1759 
     1760  IF (compress) THEN
    16971761    DO i = 1, ncum
    1698       ft1(idcum(i), k) = ft(i, k)
    1699       fq1(idcum(i), k) = fq(i, k)
    1700       fu1(idcum(i), k) = fu(i, k)
    1701       fv1(idcum(i), k) = fv(i, k)
    1702       ma1(idcum(i), k) = ma(i, k)
    1703       qcondc1(idcum(i), k) = qcondc(i, k)
    1704     END DO
    1705   END DO
    1706 
     1762      precip1(idcum(i)) = precip(i)
     1763      cbmf1(idcum(i)) = cbmf(i)
     1764      iflag1(idcum(i)) = iflag(i)
     1765    END DO
     1766 
     1767    DO k = 1, nl
     1768      DO i = 1, ncum
     1769        ft1(idcum(i), k) = ft(i, k)
     1770        fq1(idcum(i), k) = fq(i, k)
     1771        fu1(idcum(i), k) = fu(i, k)
     1772        fv1(idcum(i), k) = fv(i, k)
     1773        ma1(idcum(i), k) = ma(i, k)
     1774        qcondc1(idcum(i), k) = qcondc(i, k)
     1775      END DO
     1776    END DO
     1777  ELSE
     1778    DO i = 1, len
     1779      IF (is_convect(i)) THEN
     1780        precip1(i) = precip(i)
     1781        cbmf1(i) = cbmf(i)
     1782        iflag1(i) = iflag(i)
     1783      ENDIF
     1784    END DO
     1785 
     1786    DO k = 1, nl
     1787      DO i = 1, ncum
     1788        IF (is_convect(i)) THEN
     1789          ft1(i, k) = ft(i, k)
     1790          fq1(i, k) = fq(i, k)
     1791          fu1(i, k) = fu(i, k)
     1792          fv1(i, k) = fv(i, k)
     1793          ma1(i, k) = ma(i, k)
     1794          qcondc1(i, k) = qcondc(i, k)
     1795        ENDIF
     1796      END DO
     1797    END DO   
     1798  ENDIF
    17071799  RETURN
    17081800END SUBROUTINE cv_uncompress
    17091801
     1802END MODULE cv_routines_mod
Note: See TracChangeset for help on using the changeset viewer.