SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
coupling_seaflux_orogn.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_seaflux_orog_n (SM, DST, SLT, &
7  hprogram, hcoupling, ptimec, &
8  ptstep, kyear, kmonth, kday, ptime, ki, ksv, ksw, ptsun, pzenith, pzenith2, &
9  pazim, pzref, puref, pzs, pu, pv, pqa, pta, prhoa, psv, pco2, hsv, &
10  prain, psnow, plw, pdir_sw, psca_sw, psw_bands, pps, ppa, &
11  psftq, psfth, psfts, psfco2, psfu, psfv, &
12  ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0, pz0h, pqsurf, &
13  ppew_a_coef, ppew_b_coef, &
14  ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
15  htest )
16 ! ###############################################################################
17 !
18 !!**** *COUPLING_SEAFLUX_OROG_n * - Modifies the input forcing if not
19 !! initially at sea level
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 !!** METHOD
25 !! ------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! V. Masson
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 01/2004
38 !! B. Decharme 2008 reset the subgrid topographic effect on the forcing
39 !! J. Escobar 09/2012 SIZE(PTA) not allowed without-interface , replace by KI
40 !! B. Decharme 04/2013 new coupling variables
41 !! improve forcing vertical shift
42 !!-------------------------------------------------------------
43 !
44 !
46 !
47 USE modd_dst_n, ONLY : dst_t
48 USE modd_slt_n, ONLY : slt_t
49 !
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 USE yomhook ,ONLY : lhook, dr_hook
59 USE parkind1 ,ONLY : jprb
60 !
61 USE modi_coupling_seawat_sbl_n
62 !
63 IMPLICIT NONE
64 !
65 !* 0.1 declarations of arguments
66 !
67 !
68 TYPE(seaflux_model_t), INTENT(INOUT) :: sm
69 TYPE(dst_t), INTENT(INOUT) :: dst
70 TYPE(slt_t), INTENT(INOUT) :: slt
71 !
72  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
73  CHARACTER(LEN=1), INTENT(IN) :: hcoupling ! type of coupling
74  ! 'E' : explicit
75  ! 'I' : implicit
76 REAL, INTENT(IN) :: ptimec ! current duration since start of the run (s)
77 INTEGER, INTENT(IN) :: kyear ! current year (UTC)
78 INTEGER, INTENT(IN) :: kmonth ! current month (UTC)
79 INTEGER, INTENT(IN) :: kday ! current day (UTC)
80 REAL, INTENT(IN) :: ptime ! current time since midnight (UTC, s)
81 INTEGER, INTENT(IN) :: ki ! number of points
82 INTEGER, INTENT(IN) :: ksv ! number of scalars
83 INTEGER, INTENT(IN) :: ksw ! number of short-wave spectral bands
84 REAL, DIMENSION(KI), INTENT(IN) :: ptsun ! solar time (s from midnight)
85 REAL, INTENT(IN) :: ptstep ! atmospheric time-step (s)
86 REAL, DIMENSION(KI), INTENT(IN) :: pzref ! height of T,q forcing (m)
87 REAL, DIMENSION(KI), INTENT(IN) :: puref ! height of wind forcing (m)
88 !
89 REAL, DIMENSION(KI), INTENT(IN) :: pta ! air temperature forcing (K)
90 REAL, DIMENSION(KI), INTENT(IN) :: pqa ! air humidity forcing (kg/m3)
91 REAL, DIMENSION(KI), INTENT(IN) :: prhoa ! air density (kg/m3)
92 REAL, DIMENSION(KI,KSV),INTENT(IN) :: psv ! scalar variables
93 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
94 ! !
95  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: hsv ! name of all scalar variables
96 REAL, DIMENSION(KI), INTENT(IN) :: pu ! zonal wind (m/s)
97 REAL, DIMENSION(KI), INTENT(IN) :: pv ! meridian wind (m/s)
98 REAL, DIMENSION(KI,KSW),INTENT(IN) :: pdir_sw ! direct solar radiation (on horizontal surf.)
99 ! ! (W/m2)
100 REAL, DIMENSION(KI,KSW),INTENT(IN) :: psca_sw ! diffuse solar radiation (on horizontal surf.)
101 ! ! (W/m2)
102 REAL, DIMENSION(KSW),INTENT(IN) :: psw_bands ! mean wavelength of each shortwave band (m)
103 REAL, DIMENSION(KI), INTENT(IN) :: pzenith ! zenithal angle at t (radian from the vertical)
104 REAL, DIMENSION(KI), INTENT(IN) :: pzenith2 ! zenithal angle at t+1(radian from the vertical)
105 REAL, DIMENSION(KI), INTENT(IN) :: pazim ! azimuthal angle (radian from North, clockwise)
106 REAL, DIMENSION(KI), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
107 ! ! (W/m2)
108 REAL, DIMENSION(KI), INTENT(IN) :: pps ! pressure at atmospheric model surface (Pa)
109 REAL, DIMENSION(KI), INTENT(IN) :: ppa ! pressure at forcing level (Pa)
110 REAL, DIMENSION(KI), INTENT(IN) :: pzs ! atmospheric model orography (m)
111 REAL, DIMENSION(KI), INTENT(IN) :: pco2 ! CO2 concentration in the air (kg/m3)
112 REAL, DIMENSION(KI), INTENT(IN) :: psnow ! snow precipitation (kg/m2/s)
113 REAL, DIMENSION(KI), INTENT(IN) :: prain ! liquid precipitation (kg/m2/s)
114 !
115 !
116 REAL, DIMENSION(KI), INTENT(OUT) :: psfth ! flux of heat (W/m2)
117 REAL, DIMENSION(KI), INTENT(OUT) :: psftq ! flux of water vapor (kg/m2/s)
118 REAL, DIMENSION(KI), INTENT(OUT) :: psfu ! zonal momentum flux (Pa)
119 REAL, DIMENSION(KI), INTENT(OUT) :: psfv ! meridian momentum flux (Pa)
120 REAL, DIMENSION(KI), INTENT(OUT) :: psfco2 ! flux of CO2 (m/s*kg_CO2/kg_air)
121 REAL, DIMENSION(KI,KSV),INTENT(OUT):: psfts ! flux of scalar var. (kg/m2/s)
122 !
123 REAL, DIMENSION(KI), INTENT(OUT) :: ptrad ! radiative temperature (K)
124 REAL, DIMENSION(KI,KSW),INTENT(OUT):: pdir_alb! direct albedo for each spectral band (-)
125 REAL, DIMENSION(KI,KSW),INTENT(OUT):: psca_alb! diffuse albedo for each spectral band (-)
126 REAL, DIMENSION(KI), INTENT(OUT) :: pemis ! emissivity (-)
127 !
128 REAL, DIMENSION(KI), INTENT(OUT) :: ptsurf ! surface effective temperature (K)
129 REAL, DIMENSION(KI), INTENT(OUT) :: pz0 ! roughness length for momentum (m)
130 REAL, DIMENSION(KI), INTENT(OUT) :: pz0h ! roughness length for heat (m)
131 REAL, DIMENSION(KI), INTENT(OUT) :: pqsurf ! specific humidity at surface (kg/kg)
132 !
133 REAL, DIMENSION(KI), INTENT(IN) :: ppew_a_coef! implicit coefficients
134 REAL, DIMENSION(KI), INTENT(IN) :: ppew_b_coef! needed if HCOUPLING='I'
135 REAL, DIMENSION(KI), INTENT(IN) :: ppet_a_coef
136 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_a_coef
137 REAL, DIMENSION(KI), INTENT(IN) :: ppet_b_coef
138 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_b_coef
139  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
140 !
141 !* 0.2 declarations of local variables
142 !
143 REAL, DIMENSION(KI) :: zpeq_b_coef ! 1st explicit coefficient
144 REAL, DIMENSION(KI) :: zpet_b_coef ! 2nd explicit coefficient
145 !
146 REAL, DIMENSION(KI) :: zta ! Temperature at forcing height above surface orography
147 REAL, DIMENSION(KI) :: zpa ! Pressure at forcing height above surface orography
148 REAL, DIMENSION(KI) :: zps ! Pressure at surface orography
149 REAL, DIMENSION(KI) :: zqa ! Humidity at forcing height above surface orography
150 REAL, DIMENSION(KI) :: zrhoa ! Density at forcing height above surface orography
151 REAL, DIMENSION(KI) :: zlw ! LW rad at forcing height above surface orography
152 REAL, DIMENSION(KI) :: zrain ! Rainfall at forcing height above surface orography
153 REAL, DIMENSION(KI) :: zsnow ! Snowfall at forcing height above surface orography
154 !
155 REAL(KIND=JPRB) :: zhook_handle
156 !-------------------------------------------------------------------------------------
157 ! Preliminaries:
158 !-------------------------------------------------------------------------------------
159 !
160 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_OROG_N',0,zhook_handle)
161 !
162 zpeq_b_coef(:) = ppeq_b_coef(:)
163 zpet_b_coef(:) = ppet_b_coef(:)
164 !
165 IF(lvertshift)THEN
166 !
167  zta(:) = xundef
168  zqa(:) = xundef
169  zps(:) = xundef
170  zpa(:) = xundef
171  zrhoa(:) = xundef
172  zlw(:) = xundef
173  zrain(:) = xundef
174  zsnow(:) = xundef
175 !
176  CALL forcing_vert_shift(pzs,sm%S%XZS,pta,pqa,ppa,prhoa,plw,prain,psnow,&
177  zta,zqa,zpa,zrhoa,zlw,zrain,zsnow )
178 !
179  zps(:) = zpa(:) + (pps(:) - ppa(:))
180 !
181  IF (hcoupling=='I') THEN
182  zpeq_b_coef = ppeq_b_coef + zqa - pqa
183  zpet_b_coef = ppet_b_coef + zta/(zpa/xp00)**(xrd/xcpd) - pta/(ppa/xp00)**(xrd/xcpd)
184  ENDIF
185 !
186 ELSE
187 !
188  zta(:) = pta(:)
189  zqa(:) = pqa(:)
190  zps(:) = pps(:)
191  zpa(:) = ppa(:)
192  zrhoa(:) = prhoa(:)
193  zlw(:) = plw(:)
194  zrain(:) = prain(:)
195  zsnow(:) = psnow(:)
196 !
197 ENDIF
198 !
199  CALL coupling_seaflux_sbl_n(sm, dst, slt, &
200  hprogram, hcoupling, ptimec, ptstep, &
201  kyear, kmonth, kday, ptime, ki, ksv, ksw, &
202  ptsun, pzenith, pzenith2, pazim, pzref, puref, pu, pv, &
203  zqa, zta, zrhoa, psv, pco2, hsv, zrain, zsnow, zlw, &
204  pdir_sw, psca_sw, psw_bands, zps, zpa, psftq, psfth, &
205  psfts, psfco2, psfu, psfv, ptrad, pdir_alb, psca_alb, &
206  pemis, ptsurf, pz0, pz0h, pqsurf, ppew_a_coef, &
207  ppew_b_coef, ppet_a_coef, ppeq_a_coef, zpet_b_coef, &
208  zpeq_b_coef, htest )
209 !
210 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_OROG_N',1,zhook_handle)
211 !-------------------------------------------------------------------------------------
212 !
213 END SUBROUTINE coupling_seaflux_orog_n
subroutine coupling_seaflux_orog_n(SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, 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)
subroutine coupling_seaflux_sbl_n(SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, 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)
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)