Skip to content

Commit 33d8dd0

Browse files
committed
Fixed bug where point parameter promotion to desvar would not remove the original parameter
1 parent ef0b07e commit 33d8dd0

File tree

4 files changed

+29
-22
lines changed

4 files changed

+29
-22
lines changed

pymead/core/geometry_collection.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import re
44
import sys
55
import typing
6+
from copy import copy
67

78
from pymead.core.airfoil import Airfoil
89
from pymead.core.bezier import Bezier
@@ -172,7 +173,8 @@ def remove_from_subcontainer(self, pymead_obj: PymeadObj):
172173
self.container()[pymead_obj.sub_container].pop(pymead_obj.name())
173174

174175
def add_param(self, value: float, name: str or None = None, lower: float or None = None,
175-
upper: float or None = None, unit_type: str or None = None, assign_unique_name: bool = True):
176+
upper: float or None = None, unit_type: str or None = None, assign_unique_name: bool = True,
177+
point: Point = None):
176178
"""
177179
Adds a parameter to the geometry collection sub-container ``"params"``, and modifies the name to make it
178180
unique if necessary.
@@ -199,7 +201,7 @@ def add_param(self, value: float, name: str or None = None, lower: float or None
199201
Param
200202
The generated parameter
201203
"""
202-
kwargs = dict(value=value, name=name, lower=lower, upper=upper, setting_from_geo_col=True)
204+
kwargs = dict(value=value, name=name, lower=lower, upper=upper, setting_from_geo_col=True, point=point)
203205
if unit_type is None:
204206
param = Param(**kwargs)
205207
elif unit_type == "length":
@@ -488,7 +490,7 @@ def add_line(self, point_sequence: PointSequence, name: str or None = None, assi
488490
return self.add_pymead_obj_by_ref(line, assign_unique_name=assign_unique_name)
489491

490492
def add_desvar(self, value: float, name: str, lower: float or None = None, upper: float or None = None,
491-
unit_type: str or None = None, assign_unique_name: bool = True):
493+
unit_type: str or None = None, assign_unique_name: bool = True, point: Point = None):
492494
"""
493495
Directly adds a design variable value to the geometry collection.
494496
@@ -516,7 +518,7 @@ def add_desvar(self, value: float, name: str, lower: float or None = None, upper
516518
DesVar
517519
The generated design variable
518520
"""
519-
kwargs = dict(value=value, name=name, lower=lower, upper=upper, setting_from_geo_col=True)
521+
kwargs = dict(value=value, name=name, lower=lower, upper=upper, setting_from_geo_col=True, point=point)
520522
if unit_type is None:
521523
desvar = DesVar(**kwargs)
522524
elif unit_type == "length":
@@ -581,7 +583,8 @@ def promote_param_to_desvar(self, param: Param or str, lower: float or None = No
581583
else:
582584
unit_type = None
583585

584-
desvar = self.add_desvar(value=param.value(), name=param.name(), lower=lower, upper=upper, unit_type=unit_type)
586+
desvar = self.add_desvar(value=param.value(), name=param.name(), lower=lower, upper=upper, unit_type=unit_type,
587+
point=copy(param.point))
585588

586589
# Replace the corresponding x() or y() in parameter with the new design variable
587590
self.replace_geo_objs(tool=param, target=desvar)
@@ -602,8 +605,7 @@ def promote_param_to_desvar(self, param: Param or str, lower: float or None = No
602605
# desvar.gcs.constraint_params[self.gcs.constraint_params.index(param)] = desvar
603606

604607
# Remove the parameter
605-
if param.point is None:
606-
self.remove_pymead_obj(param, promotion_demotion=True)
608+
self.remove_pymead_obj(param, promotion_demotion=True)
607609

608610
return desvar
609611

@@ -629,7 +631,7 @@ def demote_desvar_to_param(self, desvar: DesVar):
629631
else:
630632
unit_type = None
631633

632-
param = self.add_param(value=desvar.value(), name=desvar.name(), unit_type=unit_type)
634+
param = self.add_param(value=desvar.value(), name=desvar.name(), unit_type=unit_type, point=copy(desvar.point))
633635

634636
# Replace the corresponding x() or y() in parameter with the new parameter
635637
self.replace_geo_objs(tool=desvar, target=param)
@@ -834,12 +836,18 @@ def set_from_dict_rep(cls, d: dict, canvas=None, tree=None, gui_obj=None):
834836
geo_col = cls(gui_obj=gui_obj)
835837
geo_col.canvas = canvas
836838
geo_col.tree = tree
837-
for name, desvar_dict in d["desvar"].items():
838-
geo_col.add_desvar(**desvar_dict, name=name, assign_unique_name=False)
839-
for name, param_dict in d["params"].items():
840-
geo_col.add_param(**param_dict, name=name, assign_unique_name=False)
841839
for name, point_dict in d["points"].items():
842840
geo_col.add_point(**point_dict, name=name, assign_unique_name=False)
841+
for name, desvar_dict in d["desvar"].items():
842+
point = None
843+
if ".x" in name or ".y" in name:
844+
point = geo_col.container()["points"][name.split(".")[0]]
845+
geo_col.add_desvar(**desvar_dict, name=name, assign_unique_name=False, point=point)
846+
for name, param_dict in d["params"].items():
847+
point = None
848+
if ".x" in name or ".y" in name:
849+
point = geo_col.container()["points"][name.split(".")[0]]
850+
geo_col.add_param(**param_dict, name=name, assign_unique_name=False, point=point)
843851
for name, line_dict in d["lines"].items():
844852
geo_col.add_line(point_sequence=PointSequence(
845853
points=[geo_col.container()["points"][k] for k in line_dict["points"]]),

pymead/core/param.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,12 @@ def get_dict_rep(self):
311311
class AngleParam(Param):
312312
def __init__(self, value: float, name: str, lower: float or None = None, upper: float or None = None,
313313
sub_container: str = "params",
314-
setting_from_geo_col: bool = False):
314+
setting_from_geo_col: bool = False, point=None):
315315
self._unit = None
316316
self.set_unit(UNITS.current_angle_unit())
317317
name = "Angle-1" if name is None else name
318318
super().__init__(value=value, name=name, lower=lower, upper=upper, sub_container=sub_container,
319-
setting_from_geo_col=setting_from_geo_col)
319+
setting_from_geo_col=setting_from_geo_col, point=point)
320320

321321
def unit(self):
322322
return self._unit
@@ -432,7 +432,7 @@ class DesVar(Param):
432432
Design variable class; subclasses the base-level Param. Adds lower and upper bound default behavior.
433433
"""
434434
def __init__(self, value: float, name: str, lower: float or None = None, upper: float or None = None,
435-
sub_container: str = "desvar", setting_from_geo_col: bool = False):
435+
sub_container: str = "desvar", setting_from_geo_col: bool = False, point=None):
436436
"""
437437
Parameters
438438
==========
@@ -461,7 +461,7 @@ def __init__(self, value: float, name: str, lower: float or None = None, upper:
461461
upper = default_upper(value)
462462

463463
super().__init__(value=value, name=name, lower=lower, upper=upper, sub_container=sub_container,
464-
setting_from_geo_col=setting_from_geo_col)
464+
setting_from_geo_col=setting_from_geo_col, point=point)
465465

466466

467467
class LengthDesVar(LengthParam):
@@ -470,7 +470,7 @@ class LengthDesVar(LengthParam):
470470
default behavior.
471471
"""
472472
def __init__(self, value: float, name: str, lower: float or None = None, upper: float or None = None,
473-
setting_from_geo_col: bool = False):
473+
setting_from_geo_col: bool = False, point=None):
474474
"""
475475
Parameters
476476
==========
@@ -499,7 +499,7 @@ def __init__(self, value: float, name: str, lower: float or None = None, upper:
499499
upper = default_upper(value)
500500

501501
super().__init__(value=value, name=name, lower=lower, upper=upper, setting_from_geo_col=setting_from_geo_col,
502-
sub_container="desvar")
502+
sub_container="desvar", point=point)
503503

504504
def get_dict_rep(self):
505505
return {"value": float(self.value()), "lower": self.lower(), "upper": self.upper(),
@@ -512,7 +512,7 @@ class AngleDesVar(AngleParam):
512512
default behavior.
513513
"""
514514
def __init__(self, value: float, name: str, lower: float or None = None, upper: float or None = None,
515-
setting_from_geo_col: bool = False):
515+
setting_from_geo_col: bool = False, point=None):
516516
"""
517517
Parameters
518518
==========
@@ -541,7 +541,7 @@ def __init__(self, value: float, name: str, lower: float or None = None, upper:
541541
upper = default_upper(value)
542542

543543
super().__init__(value=value, name=name, lower=lower, upper=upper, sub_container="desvar",
544-
setting_from_geo_col=setting_from_geo_col)
544+
setting_from_geo_col=setting_from_geo_col, point=point)
545545

546546
def get_dict_rep(self):
547547
return {"value": float(self.value()), "lower": self.lower(), "upper": self.upper(),

pymead/gui/gui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ def save_geo_col(self):
602602
else:
603603
last_saved_state = self.geo_col.get_dict_rep()
604604
save_data(last_saved_state, self.current_save_name)
605-
self.last_saved_state = self.get_geo_col_state(geo_col_dict=last_saved_state)
605+
self.last_saved_state = self.get_geo_col_state()
606606
self.setWindowTitle(f"pymead - {os.path.split(self.current_save_name)[-1]}")
607607
self.save_attempts = 0
608608
return True

pymead/optimization/shape_optimization.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ def send_over_pipe(data: object):
7676
forces = []
7777
ref_dirs = get_reference_directions("energy", param_dict['n_obj'], param_dict['n_ref_dirs'],
7878
seed=param_dict['seed'])
79-
# mea_object = MEA.generate_from_param_dict(mea)
8079
geo_col = GeometryCollection.set_from_dict_rep(deepcopy(geo_col_dict))
8180
airfoil_name, mea_name = None, None
8281
if param_dict["tool"] == "XFOIL":

0 commit comments

Comments
 (0)