12SUBROUTINE ohm(qn1, qn_av_prev, dqndt_prev, qn_av_next, dqndt_next, &
13 qn1_S, qn_s_av_prev, dqnsdt_prev, qn_s_av_next, dqnsdt_next, &
14 tstep, dt_since_start, &
18 OHM_threshSW, OHM_threshWD, &
19 soilstore_id, SoilStoreCap, state_id, &
20 BldgSurf, WaterSurf, &
23 a1, a2, a3, qs, deltaQi)
49 INTEGER,
INTENT(in) :: tstep
50 INTEGER,
INTENT(in) :: dt_since_start
52 REAL(KIND(1D0)),
INTENT(in) :: qn1
53 REAL(KIND(1D0)),
INTENT(in) :: qn1_S
54 REAL(KIND(1D0)),
INTENT(in) :: sfr_surf(nsurf)
55 REAL(KIND(1D0)),
INTENT(in) :: SnowFrac(nsurf)
56 REAL(KIND(1D0)),
INTENT(in) :: Tair_mav_5d
57 REAL(KIND(1D0)),
INTENT(in) :: OHM_coef(nsurf + 1, 4, 3)
58 REAL(KIND(1D0)),
INTENT(in) :: OHM_threshSW(nsurf + 1), OHM_threshWD(nsurf + 1)
59 REAL(KIND(1D0)),
INTENT(in) :: soilstore_id(nsurf)
60 REAL(KIND(1D0)),
INTENT(in) :: SoilStoreCap(nsurf)
61 REAL(KIND(1D0)),
INTENT(in) :: state_id(nsurf)
63 INTEGER,
INTENT(in) :: nsurf
67 INTEGER,
INTENT(in) :: BldgSurf
68 INTEGER,
INTENT(in) :: WaterSurf
69 INTEGER,
INTENT(in) :: SnowUse
70 INTEGER,
INTENT(in) :: DiagQS
72 REAL(KIND(1D0)),
INTENT(in) :: qn_av_prev
73 REAL(KIND(1D0)),
INTENT(out) :: qn_av_next
74 REAL(KIND(1D0)),
INTENT(in) :: dqndt_prev
75 REAL(KIND(1D0)),
INTENT(out) :: dqndt_next
76 REAL(KIND(1D0)),
INTENT(in) :: qn_s_av_prev
77 REAL(KIND(1D0)),
INTENT(out) :: qn_s_av_next
78 REAL(KIND(1D0)),
INTENT(in) :: dqnsdt_prev
79 REAL(KIND(1D0)),
INTENT(out) :: dqnsdt_next
81 REAL(KIND(1D0)),
INTENT(out) :: qs
83 REAL(KIND(1D0)),
INTENT(out) :: deltaQi(nsurf)
85 REAL(KIND(1D0)),
INTENT(out) :: a1, a2, a3
92 REAL(KIND(1D0)) :: deltaQi0
102 tair_mav_5d, ohm_coef, ohm_threshsw, ohm_threshwd, &
103 soilstore_id, soilstorecap, state_id, &
104 bldgsurf, watersurf, &
139 CALL ohm_dqndt_cal_x(tstep, dt_since_start, qn_av_prev, qn1, dqndt_prev, &
140 qn_av_next, dqndt_next)
144 CALL ohm_qs_cal(qn1, dqndt_next, a1, a2, a3, qs)
145 IF (diagqs == 1)
WRITE (*, *)
'qs: ', qs,
'qn1:', qn1,
'dqndt: ', dqndt_next
148 CALL errorhint(21,
'In SUEWS_OHM.f95: bad value for qn1 found during qs calculation.', qn1, -55.55d0, -55)
156 IF (snowuse == 1)
THEN
158 IF (qn1_s > -999)
THEN
173 CALL ohm_dqndt_cal_x(tstep, dt_since_start, qn_s_av_prev, qn1_s, dqnsdt_prev, &
174 qn_s_av_next, dqnsdt_next)
178 ohm_coef(nsurf + 1, 3, 1), ohm_coef(nsurf + 1, 3, 2), ohm_coef(nsurf + 1, 3, 3), &
183 CALL errorhint(21,
'In SUEWS_OHM.f95: bad value for qn1(snow) found during qs calculation.', qn1_s, -55.55d0, -55)
193 Tair_mav_5d, OHM_coef, OHM_threshSW, OHM_threshWD, &
194 soilstore_id, SoilStoreCap, state_id, &
195 BldgSurf, WaterSurf, &
199 INTEGER,
INTENT(in) :: &
203 REAL(KIND(1D0)),
INTENT(in) :: &
207 OHM_coef(nsurf + 1, 4, 3), &
208 OHM_threshSW(nsurf + 1), OHM_threshWD(nsurf + 1), &
209 soilstore_id(nsurf), &
210 SoilStoreCap(nsurf), &
212 REAL(KIND(1D0)),
INTENT(out) :: a1, a2, a3
214 REAL(KIND(1D0)) :: surfrac
226 surfrac = sfr_surf(is)
229 IF (tair_mav_5d >= ohm_threshsw(is))
THEN
235 IF (state_id(is) > 0)
THEN
240 IF (is > bldgsurf .AND. is /= watersurf)
THEN
241 IF (soilstore_id(is)/soilstorecap(is) > ohm_threshwd(is))
THEN
248 IF (snowuse == 1 .AND. is /= bldgsurf .AND. is /= watersurf)
THEN
249 surfrac = surfrac*(1 - snowfrac(is))
253 a1 = a1 + surfrac*ohm_coef(is, i, 1)
254 a2 = a2 + surfrac*ohm_coef(is, i, 2)
255 a3 = a3 + surfrac*ohm_coef(is, i, 3)
261SUBROUTINE ohm_dqndt_cal_x(dt, dt_since_start, qn1_av_prev, qn1, dqndt_prev, qn1_av_next, dqndt_next)
263 INTEGER,
INTENT(in) :: dt
264 INTEGER,
INTENT(in) :: dt_since_start
265 REAL(KIND(1D0)),
INTENT(in) :: qn1
266 REAL(KIND(1D0)),
INTENT(in) :: qn1_av_prev
267 REAL(KIND(1D0)),
INTENT(in) :: dqndt_prev
268 REAL(KIND(1D0)),
INTENT(out) :: qn1_av_next
269 REAL(KIND(1D0)),
INTENT(out) :: dqndt_next
270 REAL(KIND(1D0)),
PARAMETER :: dt0_thresh = 3600
271 REAL(KIND(1D0)),
PARAMETER :: window_hr = 2
275 REAL(KIND(1D0)) :: qn1_av_0
278 IF (dt_since_start < dt0_thresh)
THEN
279 dt0 = dt_since_start + dt
286 qn1_av_0 = qn1_av_prev - dqndt_prev*(window_hr - dt/3600.)
289 qn1_av_next = (qn1_av_prev*(dt0 - dt) + qn1*dt)/(dt0)
293 dqndt_next = (qn1_av_next - qn1_av_0)/window_hr
300 INTEGER,
INTENT(in) :: nsh
301 REAL(KIND(1D0)),
INTENT(in) :: qn
302 REAL(KIND(1D0)),
INTENT(inout) :: qn_store_grid(nsh)
303 REAL(KIND(1D0)),
INTENT(inout) :: qn_av_store_grid(2*nsh + 1)
304 REAL(KIND(1D0)),
INTENT(out) :: dqndt
306 REAL(KIND(1D0)) :: qn_av
313 qn_store_grid = cshift(qn_store_grid, 1)
314 qn_store_grid(nsh) = qn
315 nsh_nna = count(qn_store_grid /= -999, dim=1)
316 qn_av = sum(qn_store_grid, mask=qn_store_grid /= -999)/nsh_nna
317 ELSEIF (nsh == 1)
THEN
318 qn_store_grid(:) = qn
323 qn_av_store_grid = cshift(qn_av_store_grid, 1)
324 qn_av_store_grid(2*nsh + 1) = qn_av
325 ELSEIF (nsh == 1)
THEN
326 qn_av_store_grid(:) = qn_av
329 IF (any(qn_av_store_grid == -999))
THEN
332 dqndt = 0.5*(qn_av_store_grid((2*nsh + 1)) - qn_av_store_grid(1))
339 REAL(KIND(1D0)),
INTENT(in) :: qn1, dqndt, a1, a2, a3
340 REAL(KIND(1D0)),
INTENT(out) :: qs
342 qs = qn1*a1 + dqndt*a2 + a3
subroutine ohm(qn1, qn_av_prev, dqndt_prev, qn_av_next, dqndt_next, qn1_s, qn_s_av_prev, dqnsdt_prev, qn_s_av_next, dqnsdt_next, tstep, dt_since_start, sfr_surf, nsurf, tair_mav_5d, ohm_coef, ohm_threshsw, ohm_threshwd, soilstore_id, soilstorecap, state_id, bldgsurf, watersurf, snowuse, snowfrac, diagqs, a1, a2, a3, qs, deltaqi)
subroutine ohm_coef_cal(sfr_surf, nsurf, tair_mav_5d, ohm_coef, ohm_threshsw, ohm_threshwd, soilstore_id, soilstorecap, state_id, bldgsurf, watersurf, snowuse, snowfrac, a1, a2, a3)
subroutine ohm_dqndt_cal_x(dt, dt_since_start, qn1_av_prev, qn1, dqndt_prev, qn1_av_next, dqndt_next)