source: LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_qsat.F90 @ 5225

Last change on this file since 5225 was 5158, checked in by abarral, 3 months ago

Add missing klon on strataer_emiss_mod.F90
Correct various missing explicit declarations
Replace tabs by spaces (tabs are not part of the fortran charset)
Continue cleaning modules
Removed unused arguments and variables

  • 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.9 KB
Line 
1MODULE lmdz_thermcell_qsat
2CONTAINS
3
4  SUBROUTINE thermcell_qsat(klon, active, pplev, ztemp, zqta, zqsat)
5    USE lmdz_yoethf
6
7    USE lmdz_yomcst
8
9    IMPLICIT NONE
10 INCLUDE "FCTTRE.h"
11
12    !====================================================================
13    ! DECLARATIONS
14    !====================================================================
15
16    ! Arguments
17    INTEGER klon
18    REAL zpspsk(klon), pplev(klon)
19    REAL ztemp(klon), zqta(klon), zqsat(klon)
20    LOGICAL active(klon)
21
22    ! Variables locales
23    INTEGER ig, iter
24    REAL Tbef(klon), DT(klon)
25    REAL tdelta, qsatbef, zcor, qlbef, zdelta, zcvm5, dqsat, num, denom, dqsat_dT
26    LOGICAL Zsat
27    REAL RLvCp
28
29    REAL, SAVE :: DDT0 = .01
30    !$OMP THREADPRIVATE(DDT0)
31
32    LOGICAL afaire(klon), tout_converge
33
34    !====================================================================
35    ! INITIALISATIONS
36    !====================================================================
37
38    RLvCp = RLVTT / RCPD
39    tout_converge = .FALSE.
40    afaire(:) = .FALSE.
41    DT(:) = 0.
42
43
44    !====================================================================
45    ! Routine a vectoriser en copiant active dans converge et en mettant
46    ! la boucle sur les iterations a l'exterieur est en mettant
47    ! converge= false des que la convergence est atteinte.
48    !====================================================================
49
50    DO ig = 1, klon
51      IF (active(ig)) THEN
52        Tbef(ig) = ztemp(ig)
53        zdelta = MAX(0., SIGN(1., RTT - Tbef(ig)))
54        qsatbef = R2ES * FOEEW(Tbef(ig), zdelta) / pplev(ig)
55        qsatbef = MIN(0.5, qsatbef)
56        zcor = 1. / (1. - retv * qsatbef)
57        qsatbef = qsatbef * zcor
58        qlbef = max(0., zqta(ig) - qsatbef)
59        DT(ig) = 0.5 * RLvCp * qlbef
60        zqsat(ig) = qsatbef
61      endif
62    END DO
63
64    ! Traitement du cas ou il y a condensation mais faible
65    ! On ne condense pas mais on dit que le qsat est le qta
66    DO ig = 1, klon
67      IF (active(ig)) THEN
68        IF (0.<abs(DT(ig)).AND.abs(DT(ig))<=DDT0) THEN
69          zqsat(ig) = zqta(ig)
70        endif
71      endif
72    END DO
73
74    DO iter = 1, 10
75      afaire(:) = abs(DT(:))>DDT0
76      DO ig = 1, klon
77        IF (afaire(ig)) THEN
78          Tbef(ig) = Tbef(ig) + DT(ig)
79          zdelta = MAX(0., SIGN(1., RTT - Tbef(ig)))
80          qsatbef = R2ES * FOEEW(Tbef(ig), zdelta) / pplev(ig)
81          qsatbef = MIN(0.5, qsatbef)
82          zcor = 1. / (1. - retv * qsatbef)
83          qsatbef = qsatbef * zcor
84          qlbef = zqta(ig) - qsatbef
85          zdelta = MAX(0., SIGN(1., RTT - Tbef(ig)))
86          zcvm5 = R5LES * (1. - zdelta) + R5IES * zdelta
87          zcor = 1. / (1. - retv * qsatbef)
88          dqsat_dT = FOEDE(Tbef(ig), zdelta, zcvm5, qsatbef, zcor)
89          num = -Tbef(ig) + ztemp(ig) + RLvCp * qlbef
90          denom = 1. + RLvCp * dqsat_dT
91          zqsat(ig) = qsatbef
92          DT(ig) = num / denom
93        endif
94      enddo
95    END DO
96
97    RETURN
98  END
99END MODULE lmdz_thermcell_qsat
Note: See TracBrowser for help on using the repository browser.