Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -385,15 +385,20 @@ 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:
# Support new CustomZones container
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")
Expand Down Expand Up @@ -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(
Expand Down
57 changes: 57 additions & 0 deletions tests/simulation/params/test_validators_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading