diff --git a/flow360/component/simulation/validation/validation_simulation_params.py b/flow360/component/simulation/validation/validation_simulation_params.py index a8e425d62..ffb19bdc7 100644 --- a/flow360/component/simulation/validation/validation_simulation_params.py +++ b/flow360/component/simulation/validation/validation_simulation_params.py @@ -33,7 +33,7 @@ TimeAverageSurfaceOutput, VolumeOutput, ) -from flow360.component.simulation.primitives import SeedpointVolume +from flow360.component.simulation.primitives import CustomVolume, SeedpointVolume from flow360.component.simulation.time_stepping.time_stepping import Steady, Unsteady from flow360.component.simulation.utils import is_exact_instance from flow360.component.simulation.validation.validation_context import ( @@ -385,6 +385,7 @@ def _check_complete_boundary_condition_and_unknown_surface( if item.name == "symmetric" ] + snappy_multizone = False potential_zone_zone_interfaces = set() if validation_info.farfield_method == "user-defined": for zones in volume_zones: @@ -392,8 +393,12 @@ def _check_complete_boundary_condition_and_unknown_surface( if not isinstance(zones, CustomZones): continue for custom_volume in zones.entities.stored_entities: - for boundary in custom_volume.boundaries.stored_entities: - potential_zone_zone_interfaces.add(boundary.name) + if isinstance(custom_volume, CustomVolume): + for boundary in custom_volume.boundaries.stored_entities: + potential_zone_zone_interfaces.add(boundary.name) + if isinstance(custom_volume, SeedpointVolume): + ## disable missing boundaries with snappy multizone + snappy_multizone = True if asset_boundary_entities is None or asset_boundary_entities == []: raise ValueError("[Internal] Failed to retrieve asset boundaries") @@ -427,13 +432,6 @@ def _check_complete_boundary_condition_and_unknown_surface( missing_boundaries = asset_boundaries - used_boundaries - potential_zone_zone_interfaces unknown_boundaries = used_boundaries - asset_boundaries - ## disable missing boundaries with snappy multizone - snappy_multizone = False - for zone in volume_zones: - if isinstance(zone, SeedpointVolume): - snappy_multizone = True - break - if missing_boundaries and not snappy_multizone: missing_list = ", ".join(sorted(missing_boundaries)) raise ValueError( diff --git a/tests/simulation/params/test_validators_params.py b/tests/simulation/params/test_validators_params.py index 7a5113f65..f4b2346cc 100644 --- a/tests/simulation/params/test_validators_params.py +++ b/tests/simulation/params/test_validators_params.py @@ -2390,3 +2390,60 @@ def test_ghost_surface_pair_requires_quasi_3d_periodic_farfield(): # Case 4: Farfield method IS "quasi-3d-periodic" → should pass with SI_unit_system, ValidationContext(CASE, quasi_3d_periodic_farfield_context): Periodic(surface_pairs=(periodic_1, periodic_2), spec=Translational()) + + +def test_seedpoint_zone_based_params(): + from flow360.component.simulation.meshing_param.volume_params import CustomZones + + with SI_unit_system: + far_field_zone = SeedpointVolume( + point_in_mesh=[32.5231, 112.35123, 32.342] * u.mm, name="fluid" + ) + radiator_zone = SeedpointVolume( + point_in_mesh=[3.2341, -1.324535, 23.345211] * u.mm, + name="radiator", + axes=[(1, 0, 0), (0, 1, 0)], + ) + + params = SimulationParams( + meshing=ModularMeshingWorkflow( + surface_meshing=snappy.SurfaceMeshingParams( + defaults=snappy.SurfaceMeshingDefaults( + min_spacing=1 * u.mm, max_spacing=100 * u.mm, gap_resolution=0.01 * u.mm + ), + smooth_controls=snappy.SmoothControls( + lambda_factor=0.7, mu_factor=0, iterations=3 + ), + ), + volume_meshing=VolumeMeshingParams( + defaults=VolumeMeshingDefaults( + boundary_layer_growth_rate=1.2, + boundary_layer_first_layer_thickness=0.01 * u.mm, + ), + ), + zones=[CustomZones(entities=[far_field_zone, radiator_zone])], + ), + operating_condition=AerospaceCondition( + velocity_magnitude=40 * u.m / u.s, + ), + time_stepping=Steady(), + models=[Wall(surfaces=[Surface(name="face1")])], + private_attribute_asset_cache=AssetCache( + use_inhouse_mesher=True, + project_entity_info=SurfaceMeshEntityInfo( + boundaries=[ + Surface(name="face1"), + Surface(name="face2"), + ] + ), + ), + ) + + params, errors, _ = validate_model( + params_as_dict=params.model_dump(mode="json"), + validated_by=ValidationCalledBy.LOCAL, + root_item_type="Geometry", + validation_level="All", + ) + + assert errors is None