Ignore:
Timestamp:
Apr 20, 2012, 12:11:47 PM (13 years ago)
Author:
acolaitis
Message:

Correction to advection problems in thermals + made the thermals model faster by limiting the vertical extension of loops with the height reached by thermals.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/libf/phymars/thermcell_main_mars.F90

    r624 r628  
    9999      REAL f(ngridmx)
    100100
     101      REAL detrmod(ngridmx,nlayermx)
     102
    101103      REAL teta_th_int(ngridmx,nlayermx)
    102104      REAL teta_env_int(ngridmx,nlayermx)
    103105      REAL teta_down_int(ngridmx,nlayermx)
    104106
    105       CHARACTER (LEN=20) :: modname
    106107      CHARACTER (LEN=80) :: abort_message
     108      INTEGER ndt
    107109
    108110! ============= PLUME VARIABLES ============
     
    123125      REAL denom(ngridmx)
    124126      REAL zlevinter(ngridmx)
     127      INTEGER zlmax
    125128
    126129! =========================================
     
    186189      detr(:,:)=0.
    187190      fm(:,:)=0.
    188       zu(:,:)=pu(:,:)
    189       zv(:,:)=pv(:,:)
     191!      zu(:,:)=pu(:,:)
     192!      zv(:,:)=pv(:,:)
    190193      zhc(:,:)=pt(:,:)/zpopsk(:,:)
     194      ndt=1
    191195
    192196! **********************************************************************
     
    888892! ===========================================================================
    889893
     894      zlmax=MAXVAL(lmax(:))+2
     895      if (zlmax .ge. nlayermx) then
     896        print*,'thermals have reached last layer of the model'
     897        print*,'this is not good !'
     898      endif
     899
    890900! Choix de la fonction d'alimentation utilisee pour la fermeture.
    891901
     
    968978!-------------------------------------------------------------------------
    969979
    970       do l=1,nlayermx
     980      do l=1,zlmax
    971981         entr(:,l)=f(:)*(entr_star(:,l)+alim_star(:,l))
    972982         detr(:,l)=f(:)*detr_star(:,l)
    973983      enddo
    974984
    975       do l=1,nlayermx
     985      do l=1,zlmax
    976986         do ig=1,ngridmx
    977987            if (l.lt.lmax(ig)) then
     
    10071017!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    10081018
    1009       do l=1,nlayermx
     1019      do l=1,zlmax
    10101020
    10111021         do ig=1,ngridmx
     
    11561166!-----------------------------------------------------------------------
    11571167
    1158       do l=1,nlayermx-1
     1168      do l=1,zlmax
    11591169         do ig=1,ngridmx
    11601170            eee0=entr(ig,l)
     
    13471357! Calcul de la fraction de l'ascendance
    13481358!------------------------------------------------------------------
    1349       do ig=1,ngridmx
    1350          fraca(ig,1)=0.
    1351          fraca(ig,nlayermx+1)=0.
    1352       enddo
    1353       do l=2,nlayermx
     1359      fraca(:,:)=0.
     1360      do l=2,zlmax
    13541361         do ig=1,ngridmx
    13551362            if (zw2(ig,l).gt.1.e-10) then
     
    15201527
    15211528      else
    1522 
    1523       call thermcell_dqup(ngridmx,nlayermx,ptimestep                &
    1524      &      ,fm,entr,  &
    1525      &     masse,zu,pduadj)
    1526 
    1527       call thermcell_dqup(ngridmx,nlayermx,ptimestep    &
    1528      &       ,fm,entr,  &
    1529      &     masse,zv,pdvadj)
     1529!      detrmod(:,:)=0.
     1530!      do k=1,zlmax
     1531!         do ig=1,ngridmx
     1532!            detrmod(ig,k)=fm(ig,k)-fm(ig,k+1) &
     1533!     &      +entr(ig,k)
     1534!            if (detrmod(ig,k).lt.0.) then
     1535!               entr(ig,k)=entr(ig,k)-detrmod(ig,k)
     1536!               detrmod(ig,k)=0.
     1537!            endif
     1538!         enddo
     1539!      enddo
     1540!
     1541!
     1542!      call thermcell_dqup(ngridmx,nlayermx,ptimestep                &
     1543!     &      ,fm,entr,detrmod,  &
     1544!     &     masse,zu,pduadj,ndt,zlmax)
     1545!
     1546!      call thermcell_dqup(ngridmx,nlayermx,ptimestep    &
     1547!     &       ,fm,entr,detrmod,  &
     1548!     &     masse,zv,pdvadj,ndt,zlmax)
    15301549
    15311550      endif
     
    15381557! The rest is transported outside the sub-timestep loop
    15391558
     1559      ratiom(:,:)=1.
     1560
    15401561      if (ico2.ne.0) then
    1541 !      if (nqmx .ne. 0.) then
     1562      detrmod(:,:)=0.
     1563      do k=1,zlmax
     1564         do ig=1,ngridmx
     1565            detrmod(ig,k)=fm(ig,k)-fm(ig,k+1) &
     1566     &      +entr(ig,k)
     1567            if (detrmod(ig,k).lt.0.) then
     1568               entr(ig,k)=entr(ig,k)-detrmod(ig,k)
     1569               detrmod(ig,k)=0.
     1570            endif
     1571         enddo
     1572      enddo
     1573
    15421574      call thermcell_dqup(ngridmx,nlayermx,ptimestep     &
    1543      &     ,fm,entr,  &
    1544      &    masse,pq(:,:,ico2),pdqadj(:,:,ico2))
    1545 !      endif
     1575     &     ,fm,entr,detrmod,  &
     1576     &    masse,pq(:,:,ico2),pdqadj(:,:,ico2),ndt,zlmax)
    15461577
    15471578! Compute the ratio between theta and theta_m
    15481579     
    1549        do l=1,nlayermx
     1580       do l=1,zlmax
    15501581          do ig=1,ngridmx
    15511582             ratiom(ig,l)=1./(A*(pq(ig,l,ico2)+pdqadj(ig,l,ico2)*ptimestep)+B)
    15521583          enddo
    15531584       enddo
    1554        else
    1555           ratiom(:,:)=1.
     1585
    15561586       endif
    1557 
    15581587
    15591588!------------------------------------------------------------------
     
    15611590!------------------------------------------------------------------
    15621591
    1563       do l=1,nlayermx
     1592      pdtadj(:,:)=0.
     1593      do l=1,zlmax
    15641594         do ig=1,ngridmx
    15651595         pdtadj(ig,l)=(zdthladj(ig,l)+zdthladj_down(ig,l))*zpopsk(ig,l)*ratiom(ig,l)
     
    16011631       teta_down_int(ig,nlayermx)=teta_down_int(ig,nlayermx-1)
    16021632      enddo
    1603       do l=1,nlayermx
     1633        heatFlux(:,:)=0.
     1634        buoyancyOut(:,:)=0.
     1635        buoyancyEst(:,:)=0.
     1636        heatFlux_down(:,:)=0.
     1637      do l=1,zlmax
    16041638       do ig=1,ngridmx
    16051639        heatFlux(ig,l)=fm(ig,l)*(teta_th_int(ig,l)-teta_env_int(ig,l))/(rhobarz(ig,l))
Note: See TracChangeset for help on using the changeset viewer.