Changeset 5791 for LMDZ6/branches/contrails/libf/phylmd/cv_routines.f90
- Timestamp:
- Jul 28, 2025, 7:23:15 PM (7 days ago)
- Location:
- LMDZ6/branches/contrails
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/contrails
- Property svn:mergeinfo changed
/LMDZ6/trunk merged: 5654-5683,5685-5690,5692-5715,5718-5721,5726-5727,5729,5744-5761,5763-5778,5780,5785-5789
- Property svn:mergeinfo changed
-
LMDZ6/branches/contrails/libf/phylmd/cv_routines.f90
r5346 r5791 1 1 2 2 ! $Id$ 3 MODULE cv_routines_mod 4 PRIVATE 5 6 PUBLIC 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 9 CONTAINS 3 10 4 11 SUBROUTINE cv_param(nd) … … 243 250 244 251 ! Compute icbmax. 245 246 icbmax = 2247 DO i = 1, len248 icbmax = max(icbmax, icb(i))249 END DO252 !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 250 257 251 258 RETURN … … 254 261 SUBROUTINE cv_undilute1(len, nd, t, q, qs, gz, p, nk, icb, icbmax, tp, tvp, & 255 262 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 257 264 258 265 IMPLICIT NONE … … 299 306 ! *** Calculate lifted parcel quantities below cloud base *** 300 307 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 302 311 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 305 316 END DO 306 317 END DO … … 352 363 tvp(i, icb(i)) = tp(i, icb(i))*(1.+rg*epsi) 353 364 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 356 369 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 358 373 END DO 359 374 END DO … … 392 407 END SUBROUTINE cv_trigger 393 408 394 SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, nk1, icb1, cbmf1, plcl1, &409 SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, compress, nk1, icb1, cbmf1, plcl1, & 395 410 tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, tv1, & 396 411 tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, q, qs, u, & … … 404 419 INTEGER len, ncum, nd, nloc 405 420 INTEGER iflag1(len), nk1(len), icb1(len) 421 LOGICAL compress 406 422 REAL cbmf1(len), plcl1(len), tnk1(len), qnk1(len), gznk1(len) 407 423 REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd) … … 424 440 CHARACTER (LEN=80) :: abort_message 425 441 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 428 473 nn = 0 429 474 DO i = 1, len 430 475 IF (iflag1(i)==0) THEN 431 476 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 471 514 472 515 DO k = 1, nl … … 712 755 ! J Teixeira fix 713 756 714 CALL zilch(byp, ncum) 757 byp(1:ncum) = 0 758 715 759 DO i = 1, ncum 716 760 lcape(i) = .TRUE. … … 745 789 746 790 ! 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 750 800 751 801 DO k = minorig + 1, nl … … 786 836 ! Compute icbmax. 787 837 ! ------------------------------------------------------------------- 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 793 844 794 845 ! ===================================================================== … … 814 865 815 866 ! 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 818 870 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 822 876 END DO 823 877 END DO … … 878 932 ! ===================================================================== 879 933 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 884 945 885 946 DO k = 1, nlp … … 900 961 ! ------------------------------------------------------------------- 901 962 902 CALL zilch(work, ncum)903 963 work(1:ncum) = 0. 964 904 965 DO j = minorig + 1, nl 905 966 DO i = 1, ncum … … 997 1058 ! ===================================================================== 998 1059 999 CALL zilch(bsum, ncum*nlp)1060 bsum(1:ncum,1:nlp) = 0. 1000 1061 DO ij = 1, ncum 1001 1062 lwork(ij) = .FALSE. … … 1007 1068 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) num1 = num1 + 1 1008 1069 END DO 1009 IF (num1<=0) GO TO 789 1070 !ym IF (num1<=0) GO TO 789 1071 IF (num1<=0) CYCLE 1010 1072 1011 1073 DO ij = 1, ncum … … 1030 1092 ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) num2 = num2 + 1 1031 1093 END DO 1032 IF (num2<=0) GO TO 783 1094 !ym IF (num2<=0) GO TO 783 1095 IF (num2<=0) CYCLE 1033 1096 1034 1097 DO ij = 1, ncum … … 1173 1236 1174 1237 1175 CALL zilch(wdtrain, ncum)1238 wdtrain(1:ncum) = 0. 1176 1239 DO i = nl + 1, 1, -1 1177 1240 … … 1180 1243 IF ((i<=inb(ij)) .AND. lwork(ij)) num1 = num1 + 1 1181 1244 END DO 1182 IF (num1<=0) GO TO 899 1245 !ym IF (num1<=0) GO TO 899 1246 IF (num1<=0) CYCLE 1183 1247 1184 1248 … … 1431 1495 IF (i<=inb(ij)) num1 = num1 + 1 1432 1496 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. 1437 1502 1438 1503 DO k = i + 1, nl + 1 … … 1486 1551 DO ij = 1, ncum 1487 1552 IF (i<=inb(ij)) THEN 1553 dpinv = 0.01/(ph(ij,i)-ph(ij,i+1)) 1488 1554 awat = elij(ij, k, i) - (1.-ep(ij,i))*clw(ij, i) 1489 1555 awat = max(awat, 0.0) … … 1503 1569 DO ij = 1, ncum 1504 1570 IF ((i<=inb(ij)) .AND. (k<=inb(ij))) THEN 1571 dpinv = 0.01/(ph(ij,i)-ph(ij,i+1)) 1505 1572 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-q(ij,i & 1506 1573 )) … … 1514 1581 DO ij = 1, ncum 1515 1582 IF (i<=inb(ij)) THEN 1583 dpinv = 0.01/(ph(ij,i)-ph(ij,i+1)) 1516 1584 fq(ij, i) = fq(ij, i) + sigd*evap(ij, i) + g*(mp(ij,i+1)*(qp(ij, & 1517 1585 i+1)-q(ij,i))-mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv … … 1662 1730 END SUBROUTINE cv_yield 1663 1731 1664 SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, i flag, precip, cbmf, ft, &1732 SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, is_convect, compress, iflag, precip, cbmf, ft, & 1665 1733 fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, ma1, & 1666 1734 qcondc1) … … 1672 1740 INTEGER len, ncum, nd, nloc 1673 1741 INTEGER idcum(nloc) 1742 LOGICAL is_convect(nloc) 1743 LOGICAL compress 1674 1744 INTEGER iflag(nloc) 1675 1745 REAL precip(nloc), cbmf(nloc) … … 1687 1757 ! local variables: 1688 1758 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 1697 1761 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 1707 1799 RETURN 1708 1800 END SUBROUTINE cv_uncompress 1709 1801 1802 END MODULE cv_routines_mod
Note: See TracChangeset
for help on using the changeset viewer.