SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
cls_tq.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE cls_tq( PTA, PQA, PPA, PPS, PHT, &
7  pcd, pch, pri, &
8  pts, phu, pz0h, ph, &
9  ptnm, pqnm, phunm )
10 ! #####################################################################
11 !
12 !!**** *PARAMCLS*
13 !!
14 !! PURPOSE
15 !! -------
16 !
17 !
18 !
19 !!** METHOD
20 !! ------
21 !
22 !! EXTERNAL
23 !! --------
24 !!
25 !! none
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !! USE MODD_CST
31 !! USE MODD_GROUND_PAR
32 !!
33 !!
34 !! REFERENCE
35 !! ---------
36 !!
37 !!
38 !! AUTHOR
39 !! ------
40 !!
41 !!
42 !! MODIFICATIONS
43 !! -------------
44 !!
45 !! Original 26/10/98
46 !! S. Riette 06/2009 CLS_2M becomes CLS_TQ, height now is an argument
47 !-------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
52 USE modd_csts, ONLY : xg, xcpd, xkarman
53 USE modd_surf_par, ONLY : xundef
54 !
55 USE mode_thermos
56 !
57 !
58 USE yomhook ,ONLY : lhook, dr_hook
59 USE parkind1 ,ONLY : jprb
60 !
61 IMPLICIT NONE
62 !
63 !* 0.1 declarations of arguments
64 !
65 !
66 !
67 REAL, DIMENSION(:), INTENT(IN) :: pta ! atmospheric temperature
68 REAL, DIMENSION(:), INTENT(IN) :: pqa ! atmospheric humidity (kg/kg)
69 REAL, DIMENSION(:), INTENT(IN) :: ppa ! atmospheric level pressure
70 REAL, DIMENSION(:), INTENT(IN) :: pps ! surface pressure
71 REAL, DIMENSION(:), INTENT(IN) :: pht ! atmospheric level height (temp)
72 REAL, DIMENSION(:), INTENT(IN) :: pcd ! drag coefficient for momentum
73 REAL, DIMENSION(:), INTENT(IN) :: pch ! drag coefficient for heat
74 REAL, DIMENSION(:), INTENT(IN) :: pri ! Richardson number
75 REAL, DIMENSION(:), INTENT(IN) :: pts ! surface temperature
76 REAL, DIMENSION(:), INTENT(IN) :: phu ! near-surface humidity (%)
77 REAL, DIMENSION(:), INTENT(IN) :: pz0h ! roughness length for heat
78 REAL, DIMENSION(:), INTENT(IN) :: ph ! height of diagnostic
79 !
80 REAL, DIMENSION(:), INTENT(OUT) :: ptnm ! temperature at n meters
81 REAL, DIMENSION(:), INTENT(OUT) :: pqnm ! specific humidity at n meters
82 REAL, DIMENSION(:), INTENT(OUT) :: phunm ! relative humidity at n meters
83 !
84 !* 0.2 declarations of local variables
85 !
86 REAL, DIMENSION(SIZE(PTA)) :: zbnh,zbh,zrs
87 REAL, DIMENSION(SIZE(PTA)) :: zlogs,zcors,ziv
88 REAL, DIMENSION(SIZE(PTA)) :: zqsata, zhua
89 REAL, DIMENSION(SIZE(PTA)) :: zqsatnm, zpnm, zqs, zqsats
90  CHARACTER(LEN=2) :: yhumidity
91 REAL(KIND=JPRB) :: zhook_handle
92 !
93 !-------------------------------------------------------------------------------
94 !
95 IF (lhook) CALL dr_hook('CLS_TQ',0,zhook_handle)
96 ptnm(:) = xundef
97 pqnm(:) = xundef
98 phunm(:) = xundef
99 !
100 zbnh(:) = 0.
101 zbh(:) = 0.
102 zrs(:) = 0.
103 zlogs(:) = 0.
104 zcors(:) = 0.
105 ziv(:) = 0.
106 zqsata(:) = 0.
107 zhua(:) = 0.
108 zqsats(:) = 0.
109 zpnm(:) = 0.
110 zqsatnm(:) = 0.
111 zqs(:) = 0.
112 !
113 !* 1. preparatory calculations
114 ! ------------------------
115 !
116 zbnh(:)=log( pht(:)/pz0h(:))
117 !
118 zbh(:)=xkarman*sqrt( pcd(:) )/pch(:)
119 !
120 zrs(:)=min(ph/pht(:),1.)
121 !
122 zlogs(:)=log(1.+zrs(:)*(exp(zbnh(:)) -1.))
123 !
124 !* 2. Stability effects
125 ! -----------------
126 !
127 WHERE (pri(:)>=0.)
128  zcors(:)=zrs(:)*(zbnh(:)-zbh(:))
129 END WHERE
130 !
131 WHERE (pri(:)< 0.)
132  zcors(:)=log(1.+zrs(:)*(exp(max(0.,zbnh(:)-zbh(:)))-1.))
133 END WHERE
134 !
135 !* 3. Interpolation of thermodynamical variables
136 ! ------------------------------------------
137 !
138 ziv=max(0.,min(1.,(zlogs(:)-zcors(:))/zbh(:)))
139 ptnm(:)=pts(:)+ziv(:)*(pta(:)-pts(:))
140 !
141 !* 4. Interpolation of relative humidity
142 ! ----------------------------------
143 !
144 !* choice of interpolated variable
145 !
146 yhumidity='Q '
147 !
148 zpnm(:) = pps(:) + ph/pht(:) * (ppa(:)-pps(:))
149 zqsatnm(:) = qsat(ptnm(:),zpnm(:))
150 !
151 IF (yhumidity=='Q ') THEN
152 !
153  zqsats(:) = qsat(pts(:),pps(:))
154  zqs(:) = phu(:)*zqsats(:)
155  pqnm(:) = zqs(:)+ziv(:)*(pqa(:)-zqs(:))
156  pqnm(:) = min(zqsatnm(:),pqnm(:)) !must be below saturation
157  phunm(:) = pqnm(:) / zqsatnm(:)
158 !
159 ELSE IF (yhumidity=='HU') THEN
160 !
161  zqsata(:) = qsat(pta(:),ppa(:))
162  zhua(:) = pqa(:) / zqsata(:)
163  phunm(:) = phu(:)+ziv(:)*(zhua(:)-phu(:))
164  pqnm(:) = phunm(:) * zqsatnm(:)
165 !
166 END IF
167 IF (lhook) CALL dr_hook('CLS_TQ',1,zhook_handle)
168 !
169 !-------------------------------------------------------------------------------
170 !
171 END SUBROUTINE cls_tq
subroutine cls_tq(PTA, PQA, PPA, PPS, PHT, PCD, PCH, PRI, PTS, PHU, PZ0H, PH, PTNM, PQNM, PHUNM)
Definition: cls_tq.F90:6