SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
forcing_vert_shift.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 forcing_vert_shift(PZS_ATM,PZS_SURF,PTA_ATM,PQA_ATM,PPA_ATM, &
7  prhoa_atm,plw_atm,prain_atm,psnow_atm, &
8  pta_surf,pqa_surf,ppa_surf,prhoa_surf, &
9  plw_surf,prain_surf,psnow_surf )
10 ! #########################################
11 !
12 !
13 !!**** *FORCING_VERT_SHIFT* - routine to shift atmospheric forcing to another altitude
14 !!
15 !!
16 !! PURPOSE
17 !! -------
18 !
19 !!** METHOD
20 !! ------
21 !!
22 !! EXTERNAL
23 !! --------
24 !!
25 !! NONE
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !! AUTHOR
34 !! ------
35 !! V. Masson
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !! Original 07/2003
40 !! B. Decharme 06/2013 bug : qa_surf must be <= qsat_surf
41 !! add longwave raditions and rain snow partition
42 !! ---------------------------------------------------------------------
43 !
44 !* 0. DECLARATIONS
45 !
46 USE modd_csts, ONLY : xrd, xg, xrv, xtt
47 USE modd_atm_cst, ONLY : xclim_t_grad
48 USE modd_surf_atm, ONLY : lvshift_lw, lvshift_prcp
49 !
50 USE mode_thermos
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 IMPLICIT NONE
56 !
57 !
58 !* 0.1 declarations of arguments
59 !
60 REAL, DIMENSION(:), INTENT(IN) :: pzs_atm ! orography of atmospheric grid
61 REAL, DIMENSION(:), INTENT(IN) :: pzs_surf ! orography of surface grid
62 REAL, DIMENSION(:), INTENT(IN) :: pta_atm ! temperature at atmospheric altitude
63 REAL, DIMENSION(:), INTENT(IN) :: pqa_atm ! humidity at atmospheric altitude (kg/m3)
64 REAL, DIMENSION(:), INTENT(IN) :: ppa_atm ! pressure at atmospheric altitude
65 REAL, DIMENSION(:), INTENT(IN) :: prhoa_atm ! density at atmospheric altitude
66 REAL, DIMENSION(:), INTENT(IN) :: plw_atm ! lw rad at atmospheric altitude
67 REAL, DIMENSION(:), INTENT(IN) :: prain_atm ! rainfall at atmospheric altitude
68 REAL, DIMENSION(:), INTENT(IN) :: psnow_atm ! snowfall at atmospheric altitude
69 !
70 REAL, DIMENSION(:), INTENT(OUT) :: pta_surf ! temperature at surface altitude
71 REAL, DIMENSION(:), INTENT(OUT) :: pqa_surf ! humidity at surface altitude (kg/m3)
72 REAL, DIMENSION(:), INTENT(OUT) :: ppa_surf ! pressure at surface altitude
73 REAL, DIMENSION(:), INTENT(OUT) :: prhoa_surf ! density at surface altitude
74 REAL, DIMENSION(:), INTENT(OUT) :: plw_surf ! lw rad at surface altitude
75 REAL, DIMENSION(:), INTENT(OUT) :: prain_surf ! rainfall at surface altitude
76 REAL, DIMENSION(:), INTENT(OUT) :: psnow_surf ! snowfall at surface altitude
77 !
78 !* 0.2 declarations of local variables
79 !
80 REAL, PARAMETER :: zvapcoef = 0.622
81 REAL, PARAMETER :: zemiscoef = 1.08
82 REAL, PARAMETER :: ztempcoef = 2016.0
83 !
84 REAL, DIMENSION(SIZE(PQA_ATM )) :: zqa_atm ! air humidity (kg/kg)
85 REAL, DIMENSION(SIZE(PQA_ATM )) :: zqa_surf ! air humidity (kg/kg)
86 REAL, DIMENSION(SIZE(PQA_ATM )) :: zqsat_atm ! air humidity at saturation (kg/kg)
87 REAL, DIMENSION(SIZE(PQA_ATM )) :: zqsat_surf ! air humidity at saturation (kg/kg)
88 REAL, DIMENSION(SIZE(PRHOA_ATM)) :: zrhoa_atm ! approximated density
89 REAL, DIMENSION(SIZE(PRHOA_ATM)) :: zrhoa_surf ! approximated density
90 !
91 REAL, DIMENSION(SIZE(PLW_ATM )) :: zvap_atm ! approximated vapour pressure
92 REAL, DIMENSION(SIZE(PLW_ATM )) :: zvap_surf ! approximated vapour pressure
93 REAL, DIMENSION(SIZE(PLW_ATM )) :: zemis_atm ! approximated emissivity
94 REAL, DIMENSION(SIZE(PLW_ATM )) :: zemis_surf ! approximated emissivity
95 !
96 REAL(KIND=JPRB) :: zhook_handle
97 !
98 ! ---------------------------------------------------------------------------
99 !
100 IF (lhook) CALL dr_hook('FORCING_VERT_SHIFT',0,zhook_handle)
101 !
102 !* 1. climatological gradient for temperature
103 ! ---------------------------------------
104 !
105 pta_surf(:) = pta_atm(:) + xclim_t_grad * (pzs_surf(:) - pzs_atm(:))
106 !
107 !-------------------------------------------------------------------------------
108 !
109 !* 2. hydrostatism for pressure
110 ! -------------------------
111 !
112 zqsat_atm(:) = qsat(pta_atm(:),ppa_atm(:))
113 !
114 zqa_atm(:) = min(pqa_atm(:)/prhoa_atm(:),zqsat_atm(:))
115 !
116 ppa_surf(:) = ppa_atm(:) * exp( - xg/xrd/(0.5*(pta_atm(:)+pta_surf(:))*(1.+((xrv/xrd)-1.)*zqa_atm(:))) &
117  * (pzs_surf(:)-pzs_atm(:)) )
118 !
119 !-------------------------------------------------------------------------------
120 !
121 !* 3. conservation of relative humidity for humidity
122 ! ----------------------------------------------
123 !
124 !
125 zqsat_surf(:) = qsat(pta_surf(:),ppa_surf(:))
126 !
127 zqa_surf(:) = min(zqa_atm(:)*zqsat_surf(:)/zqsat_atm(:),zqsat_surf(:))
128 !
129 !-------------------------------------------------------------------------------
130 !
131 !* 4. estimation of air density from temperature and humidity
132 ! -------------------------------------------------------
133 !
134 zrhoa_atm(:) = ppa_atm(:) / xrd / pta_atm(:) / ( 1.+((xrv/xrd)-1.)*zqa_atm(:) )
135 zrhoa_surf(:) = ppa_surf(:) / xrd / pta_surf(:) / ( 1.+((xrv/xrd)-1.)*zqa_surf(:) )
136 !
137 prhoa_surf(:) = prhoa_atm(:) * zrhoa_surf(:) / zrhoa_atm(:)
138 !
139 !-------------------------------------------------------------------------------
140 !
141 !* 5. new humidity in kg/m3
142 ! ---------------------
143 !
144 pqa_surf(:) = zqa_surf(:) * prhoa_surf(:)
145 !
146 !-------------------------------------------------------------------------------
147 !
148 !* 6. new longwave radiations
149 ! -----------------------
150 !
151 IF(lvshift_lw)THEN
152 !
153 ! Vapour pressures and emissivities (Cosgrove et al., JGR, 2003)
154 !
155  zvap_atm(:) = zqa_atm(:) * ppa_atm(:) / zvapcoef
156  zvap_surf(:) = zqa_surf(:) * ppa_surf(:) / zvapcoef
157 !
158  zvap_atm(:) = exp(log(zvap_atm(:))*(pta_atm(:)/ztempcoef))
159  zvap_surf(:) = exp(log(zvap_surf(:))*(pta_surf(:)/ztempcoef))
160 !
161  zemis_atm(:) = (1.0-exp(zvap_atm(:)))
162  zemis_surf(:) = (1.0-exp(zvap_surf(:)))
163 !
164 ! Radiations
165 !
166  plw_surf(:) = plw_atm(:) * (zemis_surf(:)/zemis_atm(:)) * (pta_surf(:)/pta_atm(:))**4
167 !
168 ELSE
169 !
170  plw_surf(:) = plw_atm(:)
171 !
172 ENDIF
173 !
174 !-------------------------------------------------------------------------------
175 !
176 !* 7. new rain/snow partition
177 ! -----------------------
178 !
179 IF(lvshift_prcp)THEN
180 !
181  WHERE(pta_surf(:)>=xtt+1.0)
182  prain_surf(:) = prain_atm(:) + psnow_atm(:)
183  psnow_surf(:) = 0.0
184  ELSEWHERE
185  prain_surf(:) = 0.0
186  psnow_surf(:) = prain_atm(:) + psnow_atm(:)
187  ENDWHERE
188 !
189 ELSE
190 !
191  prain_surf(:) = prain_atm(:)
192  psnow_surf(:) = psnow_atm(:)
193 !
194 ENDIF
195 !
196 IF (lhook) CALL dr_hook('FORCING_VERT_SHIFT',1,zhook_handle)
197 !
198 !-------------------------------------------------------------------------------
199 !
200 END SUBROUTINE forcing_vert_shift
subroutine forcing_vert_shift(PZS_ATM, PZS_SURF, PTA_ATM, PQA_ATM, PPA_ATM, PRHOA_ATM, PLW_ATM, PRAIN_ATM, PSNOW_ATM, PTA_SURF, PQA_SURF, PPA_SURF, PRHOA_SURF, PLW_SURF, PRAIN_SURF, PSNOW_SURF)