source: LMDZ6/trunk/libf/phylmd/lmdz_thermcell_qsat.f90 @ 5440

Last change on this file since 5440 was 5390, checked in by yann meurdesoif, 2 weeks ago
  • Remove UTF8 character that inihibit fortran parsing with GPU morphosis
  • Add missing END SUBROUTINE instead of simple END, that inhibit correct parsing with regulat expression parser (quick and dirty parsing)

YM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 2.8 KB
RevLine 
[4590]1MODULE lmdz_thermcell_qsat
2CONTAINS
3
[1338]4subroutine thermcell_qsat(klon,active,pplev,ztemp,zqta,zqsat)
[5284]5USE yoethf_mod_h
[5285]6  USE yomcst_mod_h
[1336]7implicit none
8
[5274]9
[4593]10  INCLUDE "FCTTRE.h"
[1336]11
[1338]12
[1336]13!====================================================================
14! DECLARATIONS
15!====================================================================
16
17! Arguments
18INTEGER klon
[1338]19REAL zpspsk(klon),pplev(klon)
20REAL ztemp(klon),zqta(klon),zqsat(klon)
21LOGICAL active(klon)
[1336]22
23! Variables locales
24INTEGER ig,iter
25REAL Tbef(klon),DT(klon)
[1338]26REAL tdelta,qsatbef,zcor,qlbef,zdelta,zcvm5,dqsat,num,denom,dqsat_dT
[1336]27logical Zsat
28REAL RLvCp
[3035]29
[1336]30REAL, SAVE :: DDT0=.01
[3035]31!$OMP THREADPRIVATE(DDT0)
32
[1336]33LOGICAL afaire(klon),tout_converge
34
35!====================================================================
36! INITIALISATIONS
37!====================================================================
38
39RLvCp = RLVTT/RCPD
40tout_converge=.false.
[1338]41afaire(:)=.false.
[1336]42DT(:)=0.
43
44
45!====================================================================
[1338]46! Routine a vectoriser en copiant active dans converge et en mettant
[1336]47! la boucle sur les iterations a l'exterieur est en mettant
48! converge= false des que la convergence est atteinte.
49!====================================================================
50
51do ig=1,klon
[1338]52   if (active(ig)) then
53               Tbef(ig)=ztemp(ig)
[1336]54               zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
[1338]55               qsatbef= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig)
56               qsatbef=MIN(0.5,qsatbef)
57               zcor=1./(1.-retv*qsatbef)
58               qsatbef=qsatbef*zcor
59               qlbef=max(0.,zqta(ig)-qsatbef)
[1336]60               DT(ig) = 0.5*RLvCp*qlbef
[1338]61               zqsat(ig)=qsatbef
[1336]62     endif
63enddo
64
[1338]65! Traitement du cas ou il y a condensation mais faible
66! On ne condense pas mais on dit que le qsat est le qta
67do ig=1,klon
68   if (active(ig)) then
69      if (0.<abs(DT(ig)).and.abs(DT(ig))<=DDT0) then
70         zqsat(ig)=zqta(ig)
71      endif
72   endif
73enddo
[1336]74
75do iter=1,10
[1338]76    afaire(:)=abs(DT(:)).gt.DDT0
[1336]77    do ig=1,klon
78               if (afaire(ig)) then
79                 Tbef(ig)=Tbef(ig)+DT(ig)
80                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
[1338]81                 qsatbef= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig)
82                 qsatbef=MIN(0.5,qsatbef)
83                 zcor=1./(1.-retv*qsatbef)
84                 qsatbef=qsatbef*zcor
85                 qlbef=zqta(ig)-qsatbef
[1336]86                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
87                 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
[1338]88                 zcor=1./(1.-retv*qsatbef)
89                 dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,qsatbef,zcor)
90                 num=-Tbef(ig)+ztemp(ig)+RLvCp*qlbef
[1336]91                 denom=1.+RLvCp*dqsat_dT
[1338]92                 zqsat(ig) = qsatbef
[1336]93                 DT(ig)=num/denom
94               endif
95    enddo
96enddo
97
98return
[5390]99end subroutine thermcell_qsat
[4590]100END MODULE lmdz_thermcell_qsat
Note: See TracBrowser for help on using the repository browser.