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