Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

base_demand, demand_pattern and demand_category at junctions go to/from gis #447

Merged
merged 13 commits into from
Nov 13, 2024
Merged
2 changes: 1 addition & 1 deletion wntr/network/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def to_dict(self):
d['node_type'] = self.node_type
for k in dir(self):
if not k.startswith('_') and \
k not in ['demand', 'base_demand', 'head', 'leak_area', 'leak_demand',
k not in ['demand', 'head', 'leak_area', 'leak_demand',
'leak_discharge_coeff', 'leak_status', 'level', 'pressure', 'quality', 'vol_curve', 'head_timeseries']:
try:
val = getattr(self, k)
Expand Down
31 changes: 30 additions & 1 deletion wntr/network/elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,10 @@ class Junction(Node):
_base_attributes = ["name",
"elevation",
"coordinates"]
_optional_attributes = ["emitter_coefficient",
_optional_attributes = ["base_demand",
"demand_pattern",
"demand_category",
"emitter_coefficient",
"initial_quality",
"minimum_pressure",
"required_pressure",
Expand Down Expand Up @@ -216,6 +219,32 @@ def base_demand(self):
def base_demand(self, value):
raise RuntimeWarning('The base_demand property is read-only. Please modify using demand_timeseries_list[0].base_value.')

@property
def demand_pattern(self):
"""Get the pattern_name of the first demand in the demand_timeseries_list.

This is a read-only property.
"""
if len(self.demand_timeseries_list) > 0:
return self.demand_timeseries_list[0].pattern_name
return 0.0
@demand_pattern.setter
def demand_pattern(self, value):
raise RuntimeWarning('The demand_pattern property is read-only. Please modify using demand_timeseries_list[0].pattern_name')

@property
def demand_category(self):
"""Get the category of the first demand in the demand_timeseries_list.

This is a read-only property.
"""
if len(self.demand_timeseries_list) > 0:
return self.demand_timeseries_list[0].category
return 0.0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am wondering what makes the most sense for the default return values. I need to check what the simulators default to when the demand_timeseries_list is empty.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The add_junction function uses None as the default for demand_pattern and demand_category, so we should follow that here.

@demand_category.setter
def demand_category(self, value):
raise RuntimeWarning('The demand_category property is read-only. Please modify using demand_timeseries_list[0].category.')

def add_leak(self, wn, area, discharge_coeff=0.75, start_time=None, end_time=None):
"""
Add a leak control to the water network model
Expand Down
10 changes: 5 additions & 5 deletions wntr/network/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,18 +117,18 @@ def from_dict(d: dict, append=None):
if dl is not None and len(dl) > 0:
base_demand = dl[0].setdefault("base_val", 0.0)
pattern_name = dl[0].setdefault("pattern_name")
category = dl[0].setdefault("category")
demand_category = dl[0].setdefault("category")
else:
base_demand = 0.0
pattern_name = None
category = None
base_demand = node.setdefault('base_demand',0.0)
pattern_name = node.setdefault('pattern_name')
demand_category = node.setdefault('demand_category')
wn.add_junction(
name=name,
base_demand=base_demand,
demand_pattern=pattern_name,
elevation=node.setdefault("elevation"),
coordinates=node.setdefault("coordinates", list()),
demand_category=category,
demand_category=demand_category,
)
j = wn.get_node(name)
j.emitter_coefficient = node.setdefault("emitter_coefficient")
Expand Down
3 changes: 3 additions & 0 deletions wntr/tests/test_gis.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ def test_wn_to_gis(self):
assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.pipes.columns)
assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.pumps.columns)
#assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.valves.columns) # Net1 has no valves

#check base_demand and demand_pattern attrivutes
assert set(['base_demand','demand_pattern']).issubset(self.gis_data.junctions.columns)

def test_gis_to_wn(self):

Expand Down
Loading