diff --git a/flow360/component/simulation/translator/solver_translator.py b/flow360/component/simulation/translator/solver_translator.py index 8fc250127..9afafe1b6 100644 --- a/flow360/component/simulation/translator/solver_translator.py +++ b/flow360/component/simulation/translator/solver_translator.py @@ -958,7 +958,7 @@ def bet_disk_entity_info_serializer(volume): } -def bet_disk_translator(model: BETDisk): +def bet_disk_translator(model: BETDisk, is_unsteady: bool): """BET disk translator""" model_dict = convert_tuples_to_lists(remove_units_in_dict(dump_dict(model))) model_dict["alphas"] = [alpha.to("degree").value.item() for alpha in model.alphas] @@ -975,7 +975,6 @@ def bet_disk_translator(model: BETDisk): "omega": model_dict["omega"], "chordRef": model_dict["chordRef"], "nLoadingNodes": model_dict["nLoadingNodes"], - "bladeLineChord": model_dict["bladeLineChord"], "twists": model_dict["twists"], "chords": model_dict["chords"], "sectionalPolars": model_dict["sectionalPolars"], @@ -985,8 +984,16 @@ def bet_disk_translator(model: BETDisk): "ReynoldsNumbers": model_dict["reynoldsNumbers"], "tipGap": model_dict["tipGap"], } - if "initialBladeDirection" in model_dict: - disk_param["initialBladeDirection"] = model_dict["initialBladeDirection"] + + if is_unsteady: + # Unsteady BET Line + disk_param["bladeLineChord"] = model_dict["bladeLineChord"] + if "initialBladeDirection" in model_dict: + disk_param["initialBladeDirection"] = model_dict["initialBladeDirection"] + else: + # Steady BET Disk + disk_param["bladeLineChord"] = 0 + return disk_param @@ -1499,6 +1506,7 @@ def get_solver_json( bet_disk_translator, to_list=True, entity_injection_func=bet_disk_entity_info_serializer, + translation_func_is_unsteady=isinstance(input_params.time_stepping, Unsteady), ) if has_instance_in_list(input_params.models, ActuatorDisk): diff --git a/tests/simulation/translator/test_betdisk_translation.py b/tests/simulation/translator/test_betdisk_translation.py new file mode 100644 index 000000000..d0e035704 --- /dev/null +++ b/tests/simulation/translator/test_betdisk_translation.py @@ -0,0 +1,72 @@ +import pytest + +import flow360.component.simulation.units as u +from flow360.component.simulation.primitives import Cylinder +from flow360.component.simulation.services import clear_context +from flow360.component.simulation.translator.solver_translator import get_solver_json +from flow360.component.simulation.unit_system import imperial_unit_system +from tests.simulation.translator.utils.xv15_bet_disk_helper import ( + createBETDiskSteady, + createBETDiskUnsteady, + createSteadyTimeStepping, +) +from tests.simulation.translator.utils.xv15BETDisk_param_generator import ( + create_param_base, + createUnsteadyTimeStepping, +) + + +@pytest.fixture(autouse=True) +def reset_context(): + """Clear user variables from the context.""" + clear_context() + + +def _create_test_cylinder(): + return Cylinder( + name="bet_zone", + center=(0, 0, 0) * u.inch, + axis=[0, 0, 1], + outer_radius=150 * u.inch, + height=15 * u.inch, + ) + + +def test_betdisk_unsteady_excludes_internal_fields(): + rpm = 588.50450 + params = create_param_base() + bet_disk = createBETDiskUnsteady( + cylinder_entity=_create_test_cylinder(), pitch_in_degree=10, rpm=rpm + ) + params.models.append(bet_disk) + params.time_stepping = createUnsteadyTimeStepping(rpm) + + translated = get_solver_json(params, mesh_unit=1 * u.inch) + assert "BETDisks" in translated and len(translated["BETDisks"]) > 0 + bet_item = translated["BETDisks"][0] + + assert "initialBladeDirection" in bet_item + assert "bladeLineChord" in bet_item + + +def test_betdisk_steady_excludes_internal_fields(): + rpm = 588.50450 + params = create_param_base() + bet_disk = createBETDiskSteady( + cylinder_entity=_create_test_cylinder(), pitch_in_degree=10, rpm=rpm + ) + bet_disk = bet_disk.model_copy( + update={ + "blade_line_chord": 25 * u.inch, + "initial_blade_direction": (1, 0, 0), + } + ) + params.models.append(bet_disk) + params.time_stepping = createSteadyTimeStepping() + + translated = get_solver_json(params, mesh_unit=1 * u.inch) + assert "BETDisks" in translated and len(translated["BETDisks"]) > 0 + bet_item = translated["BETDisks"][0] + + assert "initialBladeDirection" not in bet_item + assert "bladeLineChord" in bet_item and bet_item["bladeLineChord"] == 0