Skip to content

Commit 39a78ef

Browse files
committed
Also serialize the starting values and reapply them on restore
1 parent 91278da commit 39a78ef

2 files changed

Lines changed: 51 additions & 25 deletions

File tree

src/tespy/connections/connection.py

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -541,23 +541,38 @@ def _deserialize(self, data, all_connections):
541541
def _save_specifications(self):
542542
specs = {}
543543
for key, container in self.property_data.items():
544-
if not container.is_set:
545-
continue
546-
if isinstance(container, dc_ref):
547-
specs[key] = container._serialize()
548-
elif isinstance(container, dc_flu):
549-
specs[key] = {
550-
"val": {f: container.val[f] for f in container.is_set},
551-
"is_set": list(container.is_set)
552-
}
553-
elif isinstance(container, dc_prop):
554-
specs[key] = {
555-
"val": container.val,
556-
"unit": container.unit,
557-
"is_set": True
544+
data = {}
545+
if container.is_set:
546+
if isinstance(container, dc_ref):
547+
data = container._serialize()
548+
elif isinstance(container, dc_flu):
549+
data = {
550+
"val": {f: container.val[f] for f in container.is_set},
551+
"is_set": list(container.is_set)
552+
}
553+
elif isinstance(container, dc_prop):
554+
data = {
555+
"val": container.val,
556+
"unit": container.unit,
557+
"is_set": True
558+
}
559+
else:
560+
data = {"val": container.val, "is_set": True}
561+
if (
562+
isinstance(container, dc_prop)
563+
and container._val0_is_quantity
564+
and not np.isnan(container.val0.magnitude)
565+
):
566+
data["val0"] = float(container.val0.magnitude)
567+
data["val0_unit"] = str(container.val0.units)
568+
elif isinstance(container, dc_flu) and container.val0:
569+
data["val0"] = {
570+
f: float(x) for f, x in container.val0.items()
558571
}
559-
else:
560-
specs[key] = {"val": container.val, "is_set": True}
572+
if data:
573+
specs[key] = data
574+
if specs and self.good_starting_values:
575+
specs["good_starting_values"] = True
561576
return specs
562577

563578
def _clear_specifications(self):
@@ -567,7 +582,8 @@ def _clear_specifications(self):
567582
else:
568583
container.is_set = False
569584

570-
def _restore_specifications(self, data, all_connections):
585+
def _restore_specifications(self, data, all_connections, units):
586+
self.good_starting_values = data.pop("good_starting_values", False)
571587
for key, param_data in data.items():
572588
container = self.get_attr(key)
573589
if isinstance(container, dc_ref):
@@ -580,10 +596,18 @@ def _restore_specifications(self, data, all_connections):
580596
ref=ref, is_set=True, unit=param_data["unit"]
581597
)
582598
elif isinstance(container, dc_flu):
583-
container.val.update(param_data["val"])
584-
container.is_set = set(param_data["is_set"])
599+
if "val" in param_data:
600+
container.val.update(param_data["val"])
601+
container.is_set = set(param_data["is_set"])
602+
if "val0" in param_data:
603+
container.val0.update(param_data["val0"])
585604
else:
586-
container.set_attr(**param_data)
605+
val0 = param_data.pop("val0", None)
606+
val0_unit = param_data.pop("val0_unit", None)
607+
if param_data:
608+
container.set_attr(**param_data)
609+
if val0 is not None:
610+
container.val0 = units.ureg.Quantity(val0, val0_unit)
587611

588612

589613
@connection_registry

src/tespy/networks/network.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3306,15 +3306,17 @@ def _attach_default_units_to_specifications(self):
33063306
# units". The unit is only attached to the containers when the
33073307
# network is transformed to SI for solving: serializing before that
33083308
# would attach the global default units, misinterpreting the values
3309-
# when reapplied
3310-
containers = [
3309+
# when reapplied. The same applies to plain numeric starting values
3310+
# of connections, which are serialized alongside the specifications
3311+
conn_containers = [
33113312
c.get_attr(key)
33123313
for c in self.conns["object"] for key in c.property_data
3313-
] + [
3314+
]
3315+
comp_containers = [
33143316
cp.get_attr(key)
33153317
for cp in self.comps["object"] for key in cp.parameters
33163318
]
3317-
for container in containers:
3319+
for container in conn_containers + comp_containers:
33183320
if not isinstance(container, dc_prop) or not container.is_set:
33193321
continue
33203322
if container._val_is_quantity or container.quantity is None:
@@ -3449,7 +3451,7 @@ def restore_specifications(self, data):
34493451
all_connections = {c.label: c for c in self.conns["object"]}
34503452
for label, specs in data.get("Connection", {}).items():
34513453
all_connections[label]._restore_specifications(
3452-
specs, all_connections
3454+
specs, all_connections, self.units
34533455
)
34543456
for label, specs in data.get("Component", {}).items():
34553457
self.get_comp(label)._restore_specifications(specs)

0 commit comments

Comments
 (0)