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

Fix/issue 104 - Points snapshot generation #106

Merged
merged 9 commits into from
Aug 10, 2023
10 changes: 6 additions & 4 deletions examples/evaluate/06-TBROM_input_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,12 +194,14 @@ def norm_vector_field(field: list):
for item in output_name_without_mcs:
outputs.append(twin_model.outputs[item])
outfield = twin_model.generate_snapshot(romname, False) # generating the field output on the entire domain
outfieldns = twin_model.generate_snapshot(romname, False, ns) # generating the field output on "Group_2"
twin_model.generate_points(ns, romname, True) # generating the points file on "Group_2"
twin_model.generate_snapshot(romname, True, ns) # generating the field snapshot on "Group_2"
outputs.append(max(norm_vector_field(outfield)))
outfieldns = twin_model.generate_snapshot(
romname, False, ns
) # generating the field output on "Group_2" outputs.append(max(norm_vector_field(outfield)))
outputs.append(max(norm_vector_field(outfieldns)))
results.append(outputs)
points_path = twin_model.generate_points(romname, True) # generating the points file on whole domain
pointsns_path = twin_model.generate_points(romname, True, ns) # generating the points file on "Group_2""


sim_results = pd.DataFrame(
results, columns=[input_name] + output_name_without_mcs + ["MaxDefSnapshot", "MaxDefSnapshotNs"], dtype=float
Expand Down
2 changes: 1 addition & 1 deletion src/ansys/pytwin/evaluate/tbrom.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def __init__(self, tbrom_name: str, tbrom_path: str):
self._outunit = unit
self._outputfilespath = None

def generate_points(self, named_selection: str, on_disk: bool, output_file_path: str):
def generate_points(self, on_disk: bool, output_file_path: str, named_selection: str = None):
"""
Generate a point file for the full field or a specific part.

Expand Down
20 changes: 16 additions & 4 deletions src/ansys/pytwin/evaluate/twin_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,18 @@ def _snapshot_filename(self, rom_name: str, named_selection: str = None):
filename += ".bin"
return filename

def _points_filename(self, rom_name: str, named_selection: str = None):
if named_selection is not None:
filename = self._tbroms[rom_name].field_output_name
filename += "_"
filename += named_selection
filename += "_points.bin"
return filename

filename = self._tbroms[rom_name].field_output_name
filename += "_points.bin"
return filename

def _tbrom_init(self, tbrom: TbRom):
"""
Initialize the tbrom attributes and connect with the Twin inputs/outputs.
Expand Down Expand Up @@ -1596,7 +1608,7 @@ def generate_snapshot_batch(
msg += f"\n{str(e)}."
self._raise_error(msg)

def generate_points(self, named_selection: str, rom_name: str, on_disk: bool = True):
def generate_points(self, rom_name: str, on_disk: bool = True, named_selection: str = None):
lboucin marked this conversation as resolved.
Show resolved Hide resolved
"""
Generate a points file either in memory or on disk, for the full domain or a specific part. It returns the
points data as an array if in memory, or the path of the points file written on disk.
Expand Down Expand Up @@ -1630,7 +1642,7 @@ def generate_points(self, named_selection: str, rom_name: str, on_disk: bool = T
>>> model1.initialize_evaluation()
>>> romname = model1.tbrom_names[0]
>>> nslist = model1.get_named_selections(romname)
>>> points = model1.generate_points(nslist[0], romname, False)
>>> points = model1.generate_points(romname, False, nslist[0])
"""
self._log_key = "GeneratePoints"

Expand All @@ -1640,9 +1652,9 @@ def generate_points(self, named_selection: str, rom_name: str, on_disk: bool = T

try:
if self._check_tbrom_points_generation_args(rom_name, named_selection):
output_file = self._tbroms[rom_name].field_output_name + "_" + named_selection + "_points.bin"
output_file = self._points_filename(rom_name, named_selection)
output_file_path = os.path.join(self._tbroms[rom_name]._outputfilespath, output_file)
return self._tbroms[rom_name].generate_points(named_selection, on_disk, output_file_path)
return self._tbroms[rom_name].generate_points(on_disk, output_file_path, named_selection)

except Exception as e:
msg = f"Something went wrong while generating the points file:"
Expand Down
Binary file not shown.
67 changes: 58 additions & 9 deletions tests/evaluate/test_tbrom.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,14 @@ def reinit_settings():
"""
TEST_TB_ROM11 = os.path.join(os.path.dirname(__file__), "data", "twin_no_ns.twin")

"""
TEST_TB_ROM12
Twin with 1 TBROM with two named selections in settings
-> nbTBROM = 1, NbInputField = 1, hasInputField = True, hasOutputField = True,
named_selections = ['Group_1', 'Group_2']
"""
TEST_TB_ROM12 = os.path.join(os.path.dirname(__file__), "data", "ThermalTBROM_FieldInput_23R1.twin")

INPUT_SNAPSHOT = os.path.join(os.path.dirname(__file__), "data", "input_snapshot.bin")
INPUT_SNAPSHOT_WRONG = os.path.join(os.path.dirname(__file__), "data", "input_snapshot_wrong.bin")

Expand Down Expand Up @@ -286,6 +294,21 @@ def test_instantiate_evaluation_tbrom11(self):
assert tbrom1._hasoutmcs is True
assert twinmodel.get_named_selections(twinmodel.tbrom_names[0]) == []

def test_instantiate_evaluation_tbrom12(self):
"""
TEST_TB_ROM12
Twin with 1 TBROM with two named selections in settings
-> nbTBROM = 1, NbInputField = 1, hasInputField = True, hasOutputField = True, named_selections = ['Group_1', 'Group_2']
"""
model_filepath = TEST_TB_ROM12
twinmodel = TwinModel(model_filepath=model_filepath)
assert twinmodel.tbrom_count is 1
tbrom1 = twinmodel._tbroms[twinmodel.tbrom_names[0]]
assert tbrom1.field_input_count is 1
assert tbrom1._hasoutmcs is True
assert tbrom1._hasinfmcs["inputTemperature"] is True
assert twinmodel.get_named_selections(twinmodel.tbrom_names[0]) == ["Group_1", "Group_2"]

def test_initialize_evaluation_with_input_field_is_ok(self):
model_filepath = TEST_TB_ROM3
twinmodel = TwinModel(model_filepath=model_filepath)
Expand Down Expand Up @@ -600,6 +623,19 @@ def test_generate_snapshot_with_tbrom_is_ok(self):
assert np.isclose(snp_vec_ns[0], 1.7188266861184398e-05)
assert np.isclose(snp_vec_ns[-1], -1.3100502753567515e-05)

def test_generate_snapshot_on_named_selection_with_tbrom_is_ok(self):
model_filepath = TEST_TB_ROM12
twinmodel = TwinModel(model_filepath=model_filepath)
twinmodel.initialize_evaluation()
romname = twinmodel.tbrom_names[0]

# Generate snapshot on named selection
ns = twinmodel.get_named_selections(romname)
snp_vec_ns = twinmodel.generate_snapshot(romname, False, named_selection=ns[0])
assert len(snp_vec_ns) == 78594
assert np.isclose(snp_vec_ns[0], 1.7188266859172047e-05)
assert np.isclose(snp_vec_ns[-1], -1.5316792773713332e-05)

def test_generate_snapshot_with_tbrom_exceptions(self):
model_filepath = TEST_TB_ROM9
twinmodel = TwinModel(model_filepath=model_filepath)
Expand Down Expand Up @@ -666,49 +702,62 @@ def test_generate_snapshot_batch_with_tbrom_is_ok(self):
assert np.isclose(max_snp2, batch_results["MaxDef"][2])

def test_generate_points_with_tbrom_is_ok(self):
# TODO LUCAS - Use another twin model with named selection smaller than whole model
lboucin marked this conversation as resolved.
Show resolved Hide resolved
model_filepath = TEST_TB_ROM9
model_filepath = TEST_TB_ROM12
twinmodel = TwinModel(model_filepath=model_filepath)
twinmodel.initialize_evaluation()
romname = twinmodel.tbrom_names[1]
romname = twinmodel.tbrom_names[0]
nslist = twinmodel.get_named_selections(romname)

# Generate points on disk
points_filepath = twinmodel.generate_points(nslist[0], romname, True)
points_filepath = twinmodel.generate_points(romname, True)
points_vec = TbRom._read_binary(points_filepath)
assert len(points_vec) == 313266
assert np.isclose(points_vec[0], 0.0)
assert np.isclose(points_vec[-1], 38.919245779058635)

# Generate points in memory
points_vec2 = twinmodel.generate_points(nslist[0], romname, False)
points_vec2 = twinmodel.generate_points(romname, False)
assert len(points_vec) == len(points_vec2)
assert np.isclose(points_vec[0], points_vec2[0])
assert np.isclose(points_vec[-1], points_vec2[-1])

# Generate points on named selection on disk
ns = twinmodel.get_named_selections(romname)
points_filepath_ns = twinmodel.generate_points(romname, True, named_selection=ns[0])
points_vec_ns = TbRom._read_binary(points_filepath_ns)
assert len(points_vec_ns) == 78594
assert np.isclose(points_vec_ns[0], 0.0)
assert np.isclose(points_vec_ns[-1], 68.18921187292435)

# Generate points on named selection in memory
points_vec_ns2 = twinmodel.generate_points(romname, False, named_selection=ns[0])
assert len(points_vec_ns) == len(points_vec_ns2)
assert np.isclose(points_vec_ns[0], points_vec_ns2[0])
assert np.isclose(points_vec_ns[-1], points_vec_ns2[-1])

def test_generate_points_with_tbrom_exceptions(self):
model_filepath = TEST_TB_ROM9
twinmodel = TwinModel(model_filepath=model_filepath)
romname = "unknown"

# Raise an exception if twin model not initialized
try:
twinmodel.generate_points("unknown", romname, False)
twinmodel.generate_points(romname, False, "unknown")
except TwinModelError as e:
assert "[Initialization]" in str(e)

twinmodel.initialize_evaluation()

# Raise an exception if unknown rom name is given
try:
twinmodel.generate_points("unknown", romname, False)
twinmodel.generate_points(romname, False, "unknown")
except TwinModelError as e:
assert "[RomName]" in str(e)

# Raise an exception if unknown named selection is given
romname = twinmodel.tbrom_names[0]
try:
twinmodel.generate_points("unknown", romname, False)
twinmodel.generate_points(romname, False, "unknown")
except TwinModelError as e:
assert "[NamedSelection]" in str(e)

Expand All @@ -719,7 +768,7 @@ def test_generate_points_with_tbrom_exceptions(self):
romname = twinmodel.tbrom_names[0]
nslist = twinmodel.get_named_selections(romname)
try:
twinmodel.generate_points(nslist[0], romname, False)
twinmodel.generate_points(romname, False, nslist[0])
except TwinModelError as e:
assert "[GeometryFile]" in str(e)

Expand Down
Loading