SURFEX v8.1
General documentation of Surfex
coupling_teb_orographyn.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 coupling_teb_orography_n (DTCO, DST, SLT, TM, GDM, GRM, HPROGRAM, HCOUPLING, &
7  PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN,&
8  PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, &
9  PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, &
10  PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, &
11  PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, &
12  PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, &
13  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, &
14  HTEST )
15 ! ###############################################################################
16 !
17 !!**** *COUPLING_TEB_OROGRAPHY_n * - Modifies the input forcing if not
18 !! initially at town level
19 !!
20 !! PURPOSE
21 !! -------
22 !
23 !!** METHOD
24 !! ------
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !!
30 !! AUTHOR
31 !! ------
32 !! V. Masson
33 !!
34 !! MODIFICATIONS
35 !! -------------
36 !! Original 01/2004
37 !! B. Decharme 2008 reset the subgrid topographic effect on the forcing
38 !! J. Escobar 09/2012 SIZE(PTA) not allowed without-interface , replace by KI
39 !! B. Decharme 04/2013 new coupling variables
40 !! improve forcing vertical shift
41 !!-------------------------------------------------------------
42 !
43 !
45 USE modd_dst_n, ONLY : dst_t
46 USE modd_slt_n, ONLY : slt_t
47 USE modd_surfex_n, ONLY : teb_model_t
50 !
51 USE modd_surf_par,ONLY : xundef
52 USE modd_csts, ONLY : xcpd, xrd, xp00
53 !
54 USE modd_surf_atm, ONLY : lvertshift
55 !
56 USE modi_forcing_vert_shift
57 !
58 !
59 USE yomhook ,ONLY : lhook, dr_hook
60 USE parkind1 ,ONLY : jprb
61 !
62 USE modi_coupling_teb_n
63 !
64 IMPLICIT NONE
65 !
66 !* 0.1 declarations of arguments
67 !
68 !
69 !
70 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
71 TYPE(dst_t), INTENT(INOUT) :: DST
72 TYPE(slt_t), INTENT(INOUT) :: SLT
73 TYPE(teb_model_t), INTENT(INOUT) :: TM
74 TYPE(teb_garden_model_t), INTENT(INOUT) :: GDM
75 TYPE(teb_greenroof_model_t), INTENT(INOUT) :: GRM
76 !
77  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
78  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
79  ! 'E' : explicit
80  ! 'I' : implicit
81 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
82 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
83 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
84 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
85 INTEGER, INTENT(IN) :: KI ! number of points
86 INTEGER, INTENT(IN) :: KSV ! number of scalars
87 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
88 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
89 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
90 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
91 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
92 !
93 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
94 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
95 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
96 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
97 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
98 ! !
99  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
100 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
101 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
102 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
103 ! ! (W/m2)
104 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
105 ! ! (W/m2)
106 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
107 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle (radian from the vertical)
108 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
109 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
110 ! ! (W/m2)
111 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
112 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
113 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
114 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
115 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
116 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
117 !
118 !
119 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
120 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
121 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
122 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
123 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
124 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
125 !
126 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
127 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
128 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
129 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
130 !
131 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
132 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
133 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
134 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
135 !
136 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
137 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
138 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
139 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
140 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
141 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
142  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
143 !
144 !* 0.2 declarations of local variables
145 !
146 REAL, DIMENSION(KI) :: ZPEQ_B_COEF ! 1st explicit coefficient
147 REAL, DIMENSION(KI) :: ZPET_B_COEF ! 2nd explicit coefficient
148 !
149 REAL, DIMENSION(KI) :: ZTA ! Temperature at forcing height above surface orography
150 REAL, DIMENSION(KI) :: ZPA ! Pressure at forcing height above surface orography
151 REAL, DIMENSION(KI) :: ZPS ! Pressure at surface orography
152 REAL, DIMENSION(KI) :: ZQA ! Humidity at forcing height above surface orography
153 REAL, DIMENSION(KI) :: ZRHOA ! Density at forcing height above surface orography
154 REAL, DIMENSION(KI) :: ZLW ! LW rad at forcing height above surface orography
155 REAL, DIMENSION(KI) :: ZRAIN ! Rainfall at forcing height above surface orography
156 REAL, DIMENSION(KI) :: ZSNOW ! Snowfall at forcing height above surface orography
157 !
158 REAL(KIND=JPRB) :: ZHOOK_HANDLE
159 !-------------------------------------------------------------------------------------
160 ! Preliminaries:
161 !-------------------------------------------------------------------------------------
162 !
163 IF (lhook) CALL dr_hook('COUPLING_TEB_OROGRAPHY_N',0,zhook_handle)
164 !
165 zpeq_b_coef(:) = ppeq_b_coef(:)
166 zpet_b_coef(:) = ppet_b_coef(:)
167 !
168 IF(lvertshift)THEN
169 !
170  zta(:) = xundef
171  zqa(:) = xundef
172  zps(:) = xundef
173  zpa(:) = xundef
174  zrhoa(:) = xundef
175  zlw(:) = xundef
176  zrain(:) = xundef
177  zsnow(:) = xundef
178 !
179  CALL forcing_vert_shift(pzs, tm%TOP%XZS, pta, pqa, ppa, prhoa, plw, prain, psnow, &
180  zta, zqa, zpa, zrhoa, zlw, zrain, zsnow )
181 !
182  zps(:) = zpa(:) + (pps(:) - ppa(:))
183 !
184  IF (hcoupling=='I') THEN
185  zpeq_b_coef = ppeq_b_coef + zqa - pqa
186  zpet_b_coef = ppet_b_coef + zta/(zpa/xp00)**(xrd/xcpd) - pta/(ppa/xp00)**(xrd/xcpd)
187  ENDIF
188 !
189 ELSE
190 !
191  zta(:) = pta(:)
192  zqa(:) = pqa(:)
193  zps(:) = pps(:)
194  zpa(:) = ppa(:)
195  zrhoa(:) = prhoa(:)
196  zlw(:) = plw(:)
197  zrain(:) = prain(:)
198  zsnow(:) = psnow(:)
199 !
200 ENDIF
201 !
202  CALL coupling_teb_n(dtco, dst, slt, tm%TOP, tm%SB, tm%G, tm%CHT, tm%NT, tm%TPN, tm%TIR, tm%BOP, &
203  tm%NB, tm%TD, gdm, grm,hprogram, hcoupling, ptstep, kyear, kmonth, kday,&
204  ptime, ki, ksv, ksw, ptsun, pzenith, pazim, pzref, puref, tm%TOP%XZS, &
205  pu, pv, zqa, zta, zrhoa,psv, pco2, hsv, zrain, zsnow, zlw, pdir_sw, &
206  psca_sw, psw_bands, zps, zpa, psftq, psfth, psfts, psfco2, psfu, psfv, &
207  ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0, pz0h, pqsurf, &
208  ppew_a_coef, ppew_b_coef, ppet_a_coef, ppeq_a_coef, zpet_b_coef, &
209  zpeq_b_coef, 'OK' )
210 !
211 IF (lhook) CALL dr_hook('COUPLING_TEB_OROGRAPHY_N',1,zhook_handle)
212 !
213 !-------------------------------------------------------------------------------------
214 !
215 END SUBROUTINE coupling_teb_orography_n
real, save xcpd
Definition: modd_csts.F90:63
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
integer, parameter jprb
Definition: parkind1.F90:32
subroutine coupling_teb_n(DTCO, DST, SLT, TOP, SB, G, CHT, NT, TPN, TIR, BOP, NB, TD, GDM, GRM, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSN, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST)
logical lhook
Definition: yomhook.F90:15
logical lvertshift
subroutine coupling_teb_orography_n(DTCO, DST, SLT, TM, GDM, GRM, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST)
real, save xp00
Definition: modd_csts.F90:57
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)