source: codes/icosagcm/trunk/src/initial/q_sat.f90

Last change on this file was 548, checked in by dubos, 7 years ago

trunk : reorganize source tree

File size: 2.4 KB
Line 
1MODULE qsat_mod
2
3
4
5
6CONTAINS
7
8  SUBROUTINE qsat(f_temp,f_p,f_qs)
9  USE icosa
10  IMPLICIT NONE
11    TYPE(t_field), POINTER :: f_temp(:)  ! IN    : temperature
12    TYPE(t_field), POINTER :: f_p(:)     ! IN    : pressure at mid-levels
13    TYPE(t_field), POINTER :: f_qs(:)    ! OUT   : vapeur d'eau saturante en kg/kg
14   
15    REAL(rstd),POINTER :: temp(:,:),  p(:,:), qs(:,:)
16    INTEGER :: ind
17
18    DO ind=1,ndomain
19       IF (.NOT. assigned_domain(ind)) CYCLE
20       CALL swap_dimensions(ind)
21       CALL swap_geometry(ind)
22       temp=f_temp(ind)
23       p=f_p(ind)
24       qs=f_qs(ind)
25       CALL compute_qsat(temp,p,qs)
26    END DO
27 
28  END SUBROUTINE qsat
29
30 
31  SUBROUTINE compute_qsat(temp,p,qsat)
32  USE icosa
33  USE omp_para
34  IMPLICIT NONE
35 
36!======================================================================
37! Autheur(s): Z.X. Li (LMD/CNRS)
38!  reecriture vectorisee par F. Hourdin.
39! Objet: calculer la vapeur d'eau saturante (formule Centre Euro.)
40!======================================================================
41! Arguments:
42! kelvin---input-R: temperature en Kelvin
43! millibar--input-R: pression en mb
44!
45! q_sat----output-R: vapeur d'eau saturante en kg/kg
46!======================================================================
47!
48      REAL,INTENT(IN)  :: temp(iim*jjm,llm)
49      REAL,INTENT(IN)  :: p   (iim*jjm,llm+1)
50      REAL,INTENT(OUT) :: qsat(iim*jjm,llm)
51
52      REAL, PARAMETER  ::  r2es=611.14 *18.0153/28.9644
53
54      REAL :: r3es
55      REAL, PARAMETER ::  r3les=17.269
56      REAL, PARAMETER ::  r3ies=21.875
57
58      REAL :: r4es
59      REAL, PARAMETER :: r4les=35.86
60      REAL, PARAMETER :: r4ies=7.66
61
62      REAL, PARAMETER :: rtt=273.16
63      REAL, PARAMETER :: retv=28.9644/18.0153 - 1.0
64
65      REAL :: zqsat, pmid
66      INTEGER :: l,i,j,ij
67!
68!     ------------------------------------------------------------------
69!
70!
71
72    DO l=ll_begin,ll_end
73      DO j=jj_begin,jj_end
74        DO i=ii_begin,ii_end
75          ij=(j-1)*iim+i
76
77          IF (temp(ij,l) .LE. rtt) THEN
78            r3es = r3ies
79            r4es = r4ies
80          ELSE
81            r3es = r3les
82            r4es = r4les
83          ENDIF
84          pmid=0.5*(p(ij,l)+p(ij,l+1))
85          zqsat=r2es/pmid*EXP(r3es*(temp(ij,l)-rtt)/(temp(ij,l)-r4es))
86          zqsat=MIN(0.5,zqsat)
87          zqsat=zqsat/(1.-retv *zqsat)
88
89          qsat(ij,l)= zqsat
90
91        ENDDO
92      ENDDO
93    ENDDO
94 
95 
96  END SUBROUTINE compute_qsat
97
98END MODULE qsat_mod
Note: See TracBrowser for help on using the repository browser.