SURFEX v8.1
General documentation of Surfex
coupling_tsz0n.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_tsz0_n (DTCO, UG, U, USS, IM, DTZ, NDST, SLT, HPROGRAM, HCOUPLING, &
7  PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN,&
8  PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, PU, PV, &
9  PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, &
10  PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, &
11  PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, &
12  PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, &
13  PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, &
14  PPEQ_B_COEF, HTEST )
15 ! ###############################################################################
16 !
17 !!**** *COUPLING_TSZ0_n * - Call of fluxes from vegetation scheme ISBA but
18 !! without temporal evolution of the soil/vegetation.
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 !! Modified 09/2012 : J. Escobar , SIZE(PTA) not allowed without-interface , replace by KI
38 !! B. Decharme 04/2013 new coupling variables
39 !! P. LeMoigne 12/2014 bug in "implicit" coefficients
40 !!------------------------------------------------------------------
41 !
42 USE modd_isba_n, ONLY : isba_p_t, isba_pe_t
43 USE modd_surfex_n, ONLY : isba_model_t
44 !
47 USE modd_surf_atm_n, ONLY : surf_atm_t
48 USE modd_sso_n, ONLY : sso_t
49 USE modd_data_tsz0_n, ONLY : data_tsz0_t
50 USE modd_data_isba_n, ONLY : data_isba_t
51 USE modd_dst_n, ONLY : dst_np_t
52 USE modd_slt_n, ONLY : slt_t
53 !
54 !
55 USE modd_surf_par, ONLY : xundef
56 USE modd_csts, ONLY : xp00, xrd, xcpd
57 !
58 USE modi_tsz0
59 USE modi_coupling_isba_orography_n
60 !
61 USE yomhook ,ONLY : lhook, dr_hook
62 USE parkind1 ,ONLY : jprb
63 !
64 IMPLICIT NONE
65 !
66 !* 0.1 declarations of arguments
67 !
68 TYPE(isba_model_t), INTENT(INOUT) :: IM
69 !
70 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
71 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
72 TYPE(surf_atm_t), INTENT(INOUT) :: U
73 TYPE(sso_t), INTENT(INOUT) :: USS
74 TYPE(data_tsz0_t), INTENT(INOUT) :: DTZ
75 TYPE(dst_np_t), INTENT(INOUT) :: NDST
76 TYPE(slt_t), INTENT(INOUT) :: SLT
77 !
78  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
79  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
80  ! 'E' : explicit
81  ! 'I' : implicit
82 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
83 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
84 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
85 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
86 INTEGER, INTENT(IN) :: KI ! number of points
87 INTEGER, INTENT(IN) :: KSV ! number of scalars
88 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
89 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
90 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
91 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
92 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
93 !
94 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
95 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
96 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
97 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
98 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
99 ! !
100  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
101 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
102 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
103 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
104 ! ! (W/m2)
105 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
106 ! ! (W/m2)
107 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
108 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical)
109 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1 (radian from the vertical)
110 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
111 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
112 ! ! (W/m2)
113 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
114 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
115 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
116 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
117 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
118 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
119 !
120 !
121 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
122 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
123 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
124 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
125 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
126 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
127 !
128 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
129 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
130 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
131 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
132 !
133 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
134 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
135 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
136 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
137 !
138 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
139 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
140 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
141 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
142 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
143 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
144  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
145 !
146 !* 0.2 declarations of local variables
147 !
148 !
149 TYPE(isba_p_t), POINTER :: PK
150 TYPE(isba_pe_t), POINTER :: PEK
151 !
152 REAL, DIMENSION(KI,IM%O%NGROUND_LAYER,IM%O%NPATCH) :: ZTG ! soil temperature
153 REAL, DIMENSION(KI,IM%O%NGROUND_LAYER,IM%O%NPATCH) :: ZWG ! soil water content
154 REAL, DIMENSION(KI,IM%O%NGROUND_LAYER,IM%O%NPATCH) :: ZWGI ! soil ice content
155 REAL, DIMENSION(KI,IM%O%NPATCH) :: ZWR ! interception reservoir
156 REAL, DIMENSION(KI,IM%O%NPATCH) :: ZRESA ! aerodynamical resistance
157 REAL, DIMENSION(KI,IM%NPE%AL(1)%TSNOW%NLAYER,IM%O%NPATCH) :: ZWSNOW! snow reservoir
158 REAL, DIMENSION(KI,IM%NPE%AL(1)%TSNOW%NLAYER,IM%O%NPATCH) :: ZRHOSN! snow density
159 REAL, DIMENSION(KI,IM%NPE%AL(1)%TSNOW%NLAYER,IM%O%NPATCH) :: ZHEASN! snow heat content
160 REAL, DIMENSION(KI,IM%O%NPATCH) :: ZALBSN! snow albedo
161 REAL, DIMENSION(KI,IM%O%NPATCH) :: ZEMISN! snow emissivity
162 !
163 REAL, DIMENSION(KI) :: ZPEW_A_COEF ! implicit coefficients
164 REAL, DIMENSION(KI) :: ZPEW_B_COEF ! needed if HCOUPLING='I'
165 REAL, DIMENSION(KI) :: ZPET_A_COEF
166 REAL, DIMENSION(KI) :: ZPEQ_A_COEF
167 REAL, DIMENSION(KI) :: ZPET_B_COEF
168 REAL, DIMENSION(KI) :: ZPEQ_B_COEF
169 INTEGER :: JP
170 REAL(KIND=JPRB) :: ZHOOK_HANDLE
171 !-------------------------------------------------------------------------------------
172 !
173 IF (lhook) CALL dr_hook('COUPLING_TSZ0_N',0,zhook_handle)
174 !
175 !* 1. Specified evolution of ISBA prognostic variables
176 ! ------------------------------------------------
177 !
178 DO jp = 1,im%O%NPATCH
179  CALL tsz0(dtz, ptime, ptstep, im%NK%AL(jp), im%NPE%AL(jp))
180 ENDDO
181 !
182 !
183 !* 2. Saves the prognostic variables
184 ! ------------------------------
185 !
186 DO jp = 1,im%O%NPATCH
187  pk => im%NP%AL(jp)
188  pek => im%NPE%AL(jp)
189  !
190  ztg(1:pk%NSIZE_P,:,jp) = pek%XTG (:,:)
191  zwg(1:pk%NSIZE_P,:,jp) = pek%XWG (:,:)
192  zwgi(1:pk%NSIZE_P,:,jp) = pek%XWGI (:,:)
193  zwr(1:pk%NSIZE_P,jp) = pek%XWR (:)
194  zresa(1:pk%NSIZE_P,jp) = pek%XRESA (:)
195  zwsnow(1:pk%NSIZE_P,:,jp)= pek%TSNOW%WSNOW(:,:)
196  zrhosn(1:pk%NSIZE_P,:,jp)= pek%TSNOW%RHO (:,:)
197  zalbsn(1:pk%NSIZE_P,jp) = pek%TSNOW%ALB (:)
198  IF (pek%TSNOW%SCHEME=='3-L' .OR. pek%TSNOW%SCHEME=='CRO') THEN
199  zheasn(1:pk%NSIZE_P,:,jp)= pek%TSNOW%HEAT (:,:)
200  zemisn(1:pk%NSIZE_P,jp) = pek%TSNOW%EMIS (:)
201  END IF
202 ENDDO
203 !
204 !
205 !* 3. Call to surface scheme
206 ! ----------------------
207 !
208  CALL coupling_isba_orography_n(dtco, ug, u, uss, im%SB, im%NAG, im%CHI, im%NCHI, im%DTV, im%ID, &
209  im%NGB, im%GB, im%ISS, im%NISS, im%G, im%NG, im%O, im%S, im%K, im%NK, &
210  im%NP, im%NPE, ndst, slt, hprogram, 'E', 0.001, kyear, &
211  kmonth, kday, ptime, ki, ksv, ksw, ptsun, pzenith, &
212  pzenith2, pazim, pzref, puref, pzs, pu, pv, pqa, pta, &
213  prhoa, psv, pco2, hsv, prain, psnow, plw, pdir_sw, &
214  psca_sw, psw_bands, pps, ppa, psftq, psfth, psfts, psfco2,&
215  psfu, psfv, ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0,&
216  pz0h, pqsurf, ppew_a_coef, ppew_b_coef, ppet_a_coef, &
217  ppeq_a_coef, ppet_b_coef, ppeq_b_coef, 'OK' )
218 !
219 !
220 !* 4. Removes temporal evolution of ISBA variables
221 ! --------------------------------------------
222 !
223 !
224 DO jp = 1,im%O%NPATCH
225  pk => im%NP%AL(jp)
226  pek => im%NPE%AL(jp)
227  !
228  pek%XTG (:,:) = ztg(1:pk%NSIZE_P,:,jp)
229  pek%XWG (:,:) = zwg(1:pk%NSIZE_P,:,jp)
230  pek%XWGI (:,:) = zwgi(1:pk%NSIZE_P,:,jp)
231  pek%XWR (:) = zwr(1:pk%NSIZE_P,jp)
232  pek%XRESA (:) = zresa(1:pk%NSIZE_P,jp)
233  pek%TSNOW%WSNOW(:,:) = zwsnow(1:pk%NSIZE_P,:,jp)
234  pek%TSNOW%RHO (:,:) = zrhosn(1:pk%NSIZE_P,:,jp)
235  pek%TSNOW%ALB (:) = zalbsn(1:pk%NSIZE_P,jp)
236  IF (pek%TSNOW%SCHEME=='3-L' .OR. pek%TSNOW%SCHEME=='CRO') THEN
237  pek%TSNOW%HEAT (:,:) = zheasn(1:pk%NSIZE_P,:,jp)
238  pek%TSNOW%EMIS (:) = zemisn(1:pk%NSIZE_P,jp)
239  END IF
240 ENDDO
241 !
242 IF (lhook) CALL dr_hook('COUPLING_TSZ0_N',1,zhook_handle)
243 !
244 !-------------------------------------------------------------------------------------
245 !
246 END SUBROUTINE coupling_tsz0_n
subroutine coupling_isba_orography_n(DTCO, UG, U, USS, SB, NAG, CHI, NCHI, DTV, ID, NGB, GB, ISS, NISS, IG, NIG, IO, S, K, NK, NP, NPE, NDST, SLT, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, 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 xcpd
Definition: modd_csts.F90:63
subroutine tsz0(DTZ, PTIME, PTSTEP, KK, PEK)
Definition: tsz0.F90:7
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
integer, parameter jprb
Definition: parkind1.F90:32
subroutine coupling_tsz0_n(DTCO, UG, U, USS, IM, DTZ, NDST, SLT, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, 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)
logical lhook
Definition: yomhook.F90:15
real, save xp00
Definition: modd_csts.F90:57