Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OMEGAlpes
OMEGAlpes
Commits
92fd8726
Commit
92fd8726
authored
Sep 13, 2019
by
pajotca
Committed by
Camille Pajot
Sep 13, 2019
Browse files
Update
parent
fc2bbbf0
Changes
1
Hide whitespace changes
Inline
Side-by-side
omegalpes/energy/buildings/thermal.py
View file @
92fd8726
...
...
@@ -27,7 +27,7 @@ from pulp import LpContinuous, LpBinary
from
...energy.units.consumption_units
import
VariableConsumptionUnit
from
...general.optimisation.elements
import
Quantity
,
Constraint
,
\
DynamicConstraint
,
Objective
DynamicConstraint
,
Objective
,
ExtDynConstraint
from
...general.optimisation.core
import
OptObject
from
...general.utils
import
def_abs_value
...
...
@@ -107,7 +107,7 @@ class RCNetwork_1(OptObject):
:param e_win: Emissivity of windows [-]
:param e_roof: Emissivity of the roof [-]
:param a_wall: Absorptivity of the walls [-]
:param a_roof:
A
Absorptivity of the roof [-]
:param a_roof: Absorptivity of the roof [-]
:param A_wall: Walls area [m2]
:param A_win: Windows area [m2]
:param A_roof: Roof area [m2]
...
...
@@ -128,15 +128,10 @@ class RCNetwork_1(OptObject):
self
.
AB_DICT
=
{
'WALL'
:
a_wall
,
'ROOF'
:
a_roof
}
# Calculation simplifications
# TODO : Check
try
:
h_1
=
1
/
(
1
/
h_ea
+
1
/
h_ac
)
except
ZeroDivisionError
:
h_1
=
0
# if h_ea == 0:
# h_1 = h_ac
# else:
# h_1 = h_ea
h_2
=
h_1
+
h_ec
h_3
=
1
/
(
1
/
h_2
+
1
/
h_mc
)
...
...
@@ -184,32 +179,30 @@ class ZEA_RCNetwork_1(RCNetwork_1):
e_win
=
0.9
,
e_roof
=
0.9
,
a_wall
=
0.6
,
a_roof
=
0.6
,
construction
=
'heavy'
,
height_bg
=
0
,
perimeter
=
0
,
f_hc_cv
=
1
,
void
=
0
,
hvac_prop
=
None
,
T_int_min
=
0
,
T_int_max
=
50
):
"""
Copyright 2015, Architecture and Building Systems - ETH Zurich
:param time:
:param name:
:param T_ext:
:param A_f:
:param A_win:
:param Aext_v:
:param A_roof:
:param footprint:
:param U_w
in:
:param U_w
all:
:param U_roof:
:param U_base:
:param floors:
:param construction:
:param height_bg:
:param perimeter:
:param f_hc_cv:
:param time:
TimeUnit defining the time dynamic of the model
:param name:
Name of the RC model
:param T_ext:
External air temperature [°C]
:param A_f:
Total heated area [m2]
:param A_win:
Windows area [m2]
:param Aext_v:
Opaque vertical external areas [m2]
:param A_roof:
Roof area [m2]
:param footprint:
Base area (footprint) [m2]
:param U_w
all: U value of walls construction [W/(K.m2)]
:param U_w
in: U value of windows construction [W/(K.m2)]
:param U_roof:
U value of roof construction [W/(K.m2)]
:param U_base:
U value of base construction [W/(K.m2)]
:param floors:
Number of floors [-]
:param construction:
Construction type [heavy/medium/light]
:param height_bg:
Height of building below ground [m]
:param perimeter:
Perimeter of the building [m]
:param f_hc_cv:
Convection factor for heating/cooling system [-]
:param void:
:param hvac_prop:
:param T_int_min:
:param T_int_max:
:param owner:
:param T_int_min: Minimal ambient air temperature [°C]
:param T_int_max: Maximal ambient air temperature [°C]
"""
# Import functions from City Energy Analyst - ETH Zurich
...
...
@@ -285,35 +278,34 @@ class ThermalZone(OptObject):
description
=
'Thermal zone with power flows'
)
self
.
time
=
rc_network
.
time
self
.
owner
=
rc_network
.
owner
self
.
prop
=
rc_network
rc_network
.
parent
=
self
# ++ Creation of energy flows ++
self
.
phi_a
=
Quantity
(
name
=
'phi_a'
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
self
.
phi_c
=
Quantity
(
name
=
'phi_c'
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
self
.
phi_m
=
Quantity
(
name
=
'phi_m'
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
self
.
phi_m_tot
=
Quantity
(
name
=
'phi_m_tot'
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
# Internal gains
self
.
phi_i_l
=
Quantity
(
name
=
'phi_i_l'
,
value
=
phi_i_l
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
parent
=
self
,
unit
=
'W'
)
self
.
phi_i_p
=
Quantity
(
name
=
'phi_i_p'
,
value
=
phi_i_p
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
parent
=
self
,
unit
=
'W'
)
self
.
phi_i_a
=
Quantity
(
name
=
'phi_i_a'
,
value
=
phi_i_a
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
parent
=
self
,
unit
=
'W'
)
# Solar gains
I_sol
=
calc_I_sol
(
I_sol_average
=
I_sol_av
,
...
...
@@ -327,7 +319,7 @@ class ThermalZone(OptObject):
self
.
I_sol
=
Quantity
(
name
=
'I_sol'
,
value
=
I_sol
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'
k
W'
)
parent
=
self
,
unit
=
'W'
)
# Re-irradiated flows
self
.
I_rad
=
Quantity
(
name
=
'I_rad'
,
vlen
=
self
.
time
.
LEN
,
...
...
@@ -552,7 +544,7 @@ class ThermalZone(OptObject):
self
.
theta_v_sys
=
Quantity
(
name
=
'theta_v_sys'
,
value
=
theta_v_sys
,
lb
=
0
,
ub
=
50
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
parent
=
self
,
unit
=
'degC'
)
self
.
calc_theta_ea
=
DynamicConstraint
(
name
=
'calc_theta_ea'
,
t_range
=
'for t in time.I[72:]'
,
...
...
@@ -577,14 +569,14 @@ class ThermalZone(OptObject):
p_max_cooling
=
10e+12
):
self
.
phi_heating
=
Quantity
(
name
=
'phi_heating'
,
lb
=
0
,
ub
=
p_max_heating
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
self
.
phi_cooling
=
Quantity
(
name
=
'phi_cooling'
,
lb
=
0
,
ub
=
p_max_cooling
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpContinuous
,
parent
=
self
)
vtype
=
LpContinuous
,
parent
=
self
,
unit
=
'W'
)
self
.
heating_on
=
Quantity
(
name
=
'heating_on'
,
vlen
=
self
.
time
.
LEN
,
vtype
=
LpBinary
,
parent
=
self
)
vtype
=
LpBinary
,
parent
=
self
,
unit
=
'W'
)
self
.
split_heat_cool
=
DynamicConstraint
(
exp_t
=
'{0}_phi_hc[t] == {0}_phi_heating[t] - {0}_phi_cooling[t]'
...
...
@@ -606,7 +598,7 @@ class HeatingLoad(VariableConsumptionUnit):
"""
def
__init__
(
self
,
time
,
name
,
tz
,
p_max
=
10e+12
,
T_set
=
19
,
temp_margin
=
1
,
no_cooling
=
True
):
no_cooling
=
True
,
operator
=
None
):
self
.
tz
=
tz
self
.
T_set
=
T_set
self
.
temp_margin
=
temp_margin
...
...
@@ -621,15 +613,15 @@ class HeatingLoad(VariableConsumptionUnit):
self
.
tz
.
prop
.
T_op
.
ub
=
T_set
+
temp_margin
if
no_cooling
:
p_max_cooling
=
1
e5
p_max_cooling
=
1
else
:
p_max_cooling
=
1e9
self
.
tz
.
split_heating_and_cooling
(
p_max_heating
=
1e9
,
# p_max
p_max_cooling
=
p_max_cooling
)
# kW
VariableConsumptionUnit
.
__init__
(
self
,
time
,
name
,
energy_type
=
'Heat'
,
operator
=
tz
.
owne
r
,
pmax
=
p_max
,
e_max
=
10e9
)
operator
=
operato
r
,
pmax
=
p_max
,
e_max
=
10e9
,
pmin
=
1
)
self
.
calc_e_tot
=
None
self
.
e_tot
=
None
...
...
@@ -652,7 +644,7 @@ class HeatingLoad(VariableConsumptionUnit):
self
.
diff_Top_opt
=
Quantity
(
name
=
'diff_Top_opt'
,
opt
=
True
,
lb
=-
self
.
temp_margin
,
ub
=
self
.
temp_margin
,
vlen
=
self
.
time
.
LEN
,
parent
=
self
)
vlen
=
self
.
time
.
LEN
,
parent
=
self
,
unit
=
'K'
)
if
isinstance
(
T_op
,
(
int
,
float
)):
self
.
def_diff_Top_opt
=
DynamicConstraint
(
...
...
@@ -674,6 +666,12 @@ class HeatingLoad(VariableConsumptionUnit):
diff
.
name
),
parent
=
self
)
def
add_max_temp_ramp_down
(
self
,
max_temp_ramp_down
):
self
.
set_max_temp_ramp_down
=
ExtDynConstraint
(
exp_t
=
'{0}_T_op[t] - {0}_T_op[t+1] <= {1}'
.
format
(
self
.
tz
.
prop
.
name
,
max_temp_ramp_down
),
t_range
=
'for t in time.I[:-1]'
,
name
=
'set_max_ramp_down'
)
def
calc_Am
(
Cm_Af
,
Af
):
# Am: Effective mass area in [m2]
...
...
@@ -788,7 +786,7 @@ def calc_I_sol(I_sol_average, Aop_sup, Aroof, Awin, a_wall, a_roof, U_wall,
:param U_wall:
:param U_roof:
:param Fsh_win: Shading factor for windows
:return: I_sol [
k
W]
:return: I_sol [W]
"""
from
cea.demand.constants
import
RSE
,
F_F
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment