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

Last change on this file since 5512 was 5512, checked in by yann meurdesoif, 2 days ago

Implement GPU automatic port for :

  • Thermics
  • acama_gwd_rando
  • flott_gwd_rando

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