12 SUBROUTINE ohm(qn1, qn1_av_prev, dqndt_prev, qn1_av_next, dqndt_next, &
13 qn1_S, qn1_s_av_prev, dqnsdt_prev, qn1_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(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)::qn1_av_prev
73 REAL(KIND(1d0)),
INTENT(out)::qn1_av_next
74 REAL(KIND(1d0)),
INTENT(in)::dqndt_prev
75 REAL(KIND(1d0)),
INTENT(out)::dqndt_next
76 REAL(KIND(1d0)),
INTENT(in)::qn1_s_av_prev
77 REAL(KIND(1d0)),
INTENT(out)::qn1_s_av_next
78 REAL(KIND(1d0)),
INTENT(in)::dqnsdt_prev
79 REAL(KIND(1d0)),
INTENT(out)::dqnsdt_next
90 REAL(KIND(1d0)),
INTENT(out):: qs
92 REAL(KIND(1d0)),
INTENT(out)::deltaQi(nsurf)
94 REAL(KIND(1d0)),
INTENT(out):: a1, a2, a3
102 REAL(KIND(1d0)):: deltaQi0
112 tair_mav_5d, ohm_coef, ohm_threshsw, ohm_threshwd, &
113 soilstore_id, soilstorecap, state_id, &
114 bldgsurf, watersurf, &
149 CALL ohm_dqndt_cal_x(tstep, dt_since_start, qn1_av_prev, qn1, dqndt_prev, &
150 qn1_av_next, dqndt_next)
154 CALL ohm_qs_cal(qn1, dqndt_next, a1, a2, a3, qs)
155 IF (diagqs == 1)
WRITE (*, *)
'qs: ', qs,
'qn1:', qn1,
'dqndt: ', dqndt_next
158 CALL errorhint(21,
'In SUEWS_OHM.f95: bad value for qn1 found during qs calculation.', qn1, -55.55d0, -55)
166 IF (snowuse == 1)
THEN 168 IF (qn1_s > -999)
THEN 183 CALL ohm_dqndt_cal_x(tstep, dt_since_start, qn1_s_av_prev, qn1_s, dqnsdt_prev, &
184 qn1_s_av_next, dqnsdt_next)
188 ohm_coef(nsurf + 1, 3, 1), ohm_coef(nsurf + 1, 3, 2), ohm_coef(nsurf + 1, 3, 3), &
193 CALL errorhint(21,
'In SUEWS_OHM.f95: bad value for qn1(snow) found during qs calculation.', qn1_s, -55.55d0, -55)
203 Tair_mav_5d, OHM_coef, OHM_threshSW, OHM_threshWD, &
204 soilstore_id, SoilStoreCap, state_id, &
205 BldgSurf, WaterSurf, &
209 INTEGER,
INTENT(in) :: &
213 REAL(KIND(1d0)),
INTENT(in) :: &
217 OHM_coef(nsurf + 1, 4, 3), &
218 OHM_threshSW(nsurf + 1), OHM_threshWD(nsurf + 1), &
219 soilstore_id(nsurf), &
220 SoilStoreCap(nsurf), &
222 REAL(KIND(1d0)),
INTENT(out):: a1, a2, a3
224 REAL(KIND(1d0)) :: surfrac
239 IF (tair_mav_5d >= ohm_threshsw(is))
THEN 245 IF (state_id(is) > 0)
THEN 250 IF (is > bldgsurf .AND. is /= watersurf)
THEN 251 IF (soilstore_id(is)/soilstorecap(is) > ohm_threshwd(is))
THEN 258 IF (snowuse == 1 .AND. is /= bldgsurf .AND. is /= watersurf)
THEN 259 surfrac = surfrac*(1 - snowfrac(is))
263 a1 = a1 + surfrac*ohm_coef(is, i, 1)
264 a2 = a2 + surfrac*ohm_coef(is, i, 2)
265 a3 = a3 + surfrac*ohm_coef(is, i, 3)
271 SUBROUTINE ohm_dqndt_cal_x(dt, dt_since_start, qn1_av_prev, qn1, dqndt_prev, qn1_av_next, dqndt_next)
273 INTEGER,
INTENT(in) :: dt
274 INTEGER,
INTENT(in) :: dt_since_start
275 REAL(KIND(1d0)),
INTENT(in) :: qn1
276 REAL(KIND(1d0)),
INTENT(in) :: qn1_av_prev
277 REAL(KIND(1d0)),
INTENT(in) :: dqndt_prev
278 REAL(KIND(1d0)),
INTENT(out) :: qn1_av_next
279 REAL(KIND(1d0)),
INTENT(out) :: dqndt_next
280 REAL(KIND(1d0)),
PARAMETER :: dt0_thresh = 3600
281 REAL(KIND(1d0)),
PARAMETER :: window_hr = 2
285 REAL(KIND(1d0)) :: qn1_av_0
288 IF (dt_since_start < dt0_thresh)
THEN 289 dt0 = dt_since_start + dt
296 qn1_av_0 = qn1_av_prev - dqndt_prev*(window_hr - dt/3600.)
299 qn1_av_next = (qn1_av_prev*(dt0 - dt) + qn1*dt)/(dt0)
303 dqndt_next = (qn1_av_next - qn1_av_0)/window_hr
308 SUBROUTINE ohm_dqndt_cal(nsh, qn1, qn1_store_grid, qn1_av_store_grid, dqndt)
310 INTEGER,
INTENT(in) :: nsh
311 REAL(KIND(1d0)),
INTENT(in) :: qn1
312 REAL(KIND(1d0)),
INTENT(inout) :: qn1_store_grid(nsh)
313 REAL(KIND(1d0)),
INTENT(inout) :: qn1_av_store_grid(2*nsh + 1)
314 REAL(KIND(1d0)),
INTENT(out) :: dqndt
316 REAL(KIND(1d0)) :: qn1_av
323 qn1_store_grid = cshift(qn1_store_grid, 1)
324 qn1_store_grid(nsh) = qn1
325 nsh_nna = count(qn1_store_grid /= -999, dim=1)
326 qn1_av = sum(qn1_store_grid, mask=qn1_store_grid /= -999)/nsh_nna
327 ELSEIF (nsh == 1)
THEN 328 qn1_store_grid(:) = qn1
333 qn1_av_store_grid = cshift(qn1_av_store_grid, 1)
334 qn1_av_store_grid(2*nsh + 1) = qn1_av
335 ELSEIF (nsh == 1)
THEN 336 qn1_av_store_grid(:) = qn1_av
339 IF (any(qn1_av_store_grid == -999))
THEN 342 dqndt = 0.5*(qn1_av_store_grid((2*nsh + 1)) - qn1_av_store_grid(1))
347 SUBROUTINE ohm_qs_cal(qn1, dqndt, a1, a2, a3, qs)
349 REAL(KIND(1d0)),
INTENT(in) :: qn1, dqndt, a1, a2, a3
350 REAL(KIND(1d0)),
INTENT(out):: qs
352 qs = qn1*a1 + dqndt*a2 + a3
subroutine ohm(qn1, qn1_av_prev, dqndt_prev, qn1_av_next, dqndt_next, qn1_S, qn1_s_av_prev, dqnsdt_prev, qn1_s_av_next, dqnsdt_next, tstep, dt_since_start, sfr, 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_dqndt_cal(nsh, qn1, qn1_store_grid, qn1_av_store_grid, dqndt)
subroutine ohm_dqndt_cal_x(dt, dt_since_start, qn1_av_prev, qn1, dqndt_prev, qn1_av_next, dqndt_next)
subroutine errorhint(errh, ProblemFile, VALUE, value2, valueI)
subroutine ohm_coef_cal(sfr, nsurf, Tair_mav_5d, OHM_coef, OHM_threshSW, OHM_threshWD, soilstore_id, SoilStoreCap, state_id, BldgSurf, WaterSurf, SnowUse, SnowFrac, a1, a2, a3)
subroutine ohm_qs_cal(qn1, dqndt, a1, a2, a3, qs)