Ignore:
Timestamp:
Jun 16, 2025, 7:12:42 PM (3 weeks ago)
Author:
yann meurdesoif
Message:

Convection GPU porting : Compression of active convection point is now optional (default remain to true). For GPU runs, convection is not compressed and is computed on each column. The update is done only for column where convection is active

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/cv_routines.f90

    r5711 r5712  
    407407END SUBROUTINE cv_trigger
    408408
    409 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, &
    410410    tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, tv1, &
    411411    tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, q, qs, u, &
     
    419419  INTEGER len, ncum, nd, nloc
    420420  INTEGER iflag1(len), nk1(len), icb1(len)
     421  LOGICAL compress
    421422  REAL cbmf1(len), plcl1(len), tnk1(len), qnk1(len), gznk1(len)
    422423  REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd)
     
    439440  CHARACTER (LEN=80) :: abort_message
    440441
    441 
    442   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 
    443473    nn = 0
    444474    DO i = 1, len
    445475      IF (iflag1(i)==0) THEN
    446476        nn = nn + 1
    447         t(nn, k) = t1(i, k)
    448         q(nn, k) = q1(i, k)
    449         qs(nn, k) = qs1(i, k)
    450         u(nn, k) = u1(i, k)
    451         v(nn, k) = v1(i, k)
    452         gz(nn, k) = gz1(i, k)
    453         h(nn, k) = h1(i, k)
    454         lv(nn, k) = lv1(i, k)
    455         cpn(nn, k) = cpn1(i, k)
    456         p(nn, k) = p1(i, k)
    457         ph(nn, k) = ph1(i, k)
    458         tv(nn, k) = tv1(i, k)
    459         tp(nn, k) = tp1(i, k)
    460         tvp(nn, k) = tvp1(i, k)
    461         clw(nn, k) = clw1(i, k)
    462       END IF
    463     END DO
    464   END DO
    465 
    466   IF (nn/=ncum) THEN
    467     WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
    468     abort_message = ''
    469     CALL abort_physic(modname, abort_message, 1)
    470   END IF
    471 
    472   nn = 0
    473   DO i = 1, len
    474     IF (iflag1(i)==0) THEN
    475       nn = nn + 1
    476       cbmf(nn) = cbmf1(i)
    477       plcl(nn) = plcl1(i)
    478       tnk(nn) = tnk1(i)
    479       qnk(nn) = qnk1(i)
    480       gznk(nn) = gznk1(i)
    481       nk(nn) = nk1(i)
    482       icb(nn) = icb1(i)
    483       iflag(nn) = iflag1(i)
    484     END IF
    485   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
    486514
    487515  DO k = 1, nl
     
    17021730END SUBROUTINE cv_yield
    17031731
    1704 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, &
    17051733    fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, ma1, &
    17061734    qcondc1)
     
    17121740  INTEGER len, ncum, nd, nloc
    17131741  INTEGER idcum(nloc)
     1742  LOGICAL is_convect(nloc)
     1743  LOGICAL compress
    17141744  INTEGER iflag(nloc)
    17151745  REAL precip(nloc), cbmf(nloc)
     
    17271757  ! local variables:
    17281758  INTEGER i, k
    1729 
    1730   DO i = 1, ncum
    1731     precip1(idcum(i)) = precip(i)
    1732     cbmf1(idcum(i)) = cbmf(i)
    1733     iflag1(idcum(i)) = iflag(i)
    1734   END DO
    1735 
    1736   DO k = 1, nl
     1759 
     1760  IF (compress) THEN
    17371761    DO i = 1, ncum
    1738       ft1(idcum(i), k) = ft(i, k)
    1739       fq1(idcum(i), k) = fq(i, k)
    1740       fu1(idcum(i), k) = fu(i, k)
    1741       fv1(idcum(i), k) = fv(i, k)
    1742       ma1(idcum(i), k) = ma(i, k)
    1743       qcondc1(idcum(i), k) = qcondc(i, k)
    1744     END DO
    1745   END DO
    1746 
     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
    17471799  RETURN
    17481800END SUBROUTINE cv_uncompress
Note: See TracChangeset for help on using the changeset viewer.