Skip to content

Commit ea2a430

Browse files
angranl-flexbenflexcompute
authored andcommitted
[FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587)
* Add validation for transition model solver * Add validation for output frequency settings * Add updater for two new validations * bump version to 25.7.7 --------- Co-authored-by: Ben <106089368+benflexcompute@users.noreply.github.com>
1 parent a6405aa commit ea2a430

File tree

22 files changed

+576
-2
lines changed

22 files changed

+576
-2
lines changed

flow360/component/simulation/framework/updater.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,68 @@ def _to_25_7_6(params_as_dict):
373373
return remove_entity_bucket_field(params_as_dict=params_as_dict)
374374

375375

376+
def _to_25_7_7(params_as_dict):
377+
"""
378+
1. Reset frequency and frequency_offset to defaults for steady simulations
379+
2. Remove invalid output fields based on transition model
380+
"""
381+
382+
# 1. Handle frequency settings in steady simulations
383+
if params_as_dict.get("time_stepping", {}).get("type_name") == "Steady":
384+
outputs = params_as_dict.get("outputs") or []
385+
for output in outputs:
386+
# Output types that have frequency/frequency_offset settings
387+
if output.get("output_type") in [
388+
"VolumeOutput",
389+
"TimeAverageVolumeOutput",
390+
"SurfaceOutput",
391+
"TimeAverageSurfaceOutput",
392+
"SliceOutput",
393+
"TimeAverageSliceOutput",
394+
"IsosurfaceOutput",
395+
"TimeAverageIsosurfaceOutput",
396+
"SurfaceSliceOutput",
397+
]:
398+
# Reset to defaults: frequency=-1, frequency_offset=0
399+
if "frequency" in output:
400+
output["frequency"] = -1
401+
if "frequency_offset" in output:
402+
output["frequency_offset"] = 0
403+
404+
# 2. Remove invalid output fields based on transition model
405+
# Get transition model type from models
406+
transition_model_type = "None"
407+
models = params_as_dict.get("models") or []
408+
for model in models:
409+
if model.get("type") == "Fluid":
410+
transition_solver = model.get("transition_model_solver") or {}
411+
transition_model_type = transition_solver.get("type_name")
412+
break
413+
414+
# If transition model is None or not found, remove transition-specific fields
415+
if transition_model_type == "None":
416+
transition_output_fields = [
417+
"residualTransition",
418+
"solutionTransition",
419+
"linearResidualTransition",
420+
]
421+
422+
outputs = params_as_dict.get("outputs") or []
423+
for output in outputs:
424+
if output.get("output_type") in ["AeroAcousticOutput", "StreamlineOutput"]:
425+
continue
426+
if "output_fields" in output:
427+
output_fields = output["output_fields"]
428+
if isinstance(output_fields, dict) and "items" in output_fields:
429+
items = output_fields["items"]
430+
# Remove invalid fields
431+
output_fields["items"] = [
432+
field for field in items if field not in transition_output_fields
433+
]
434+
435+
return params_as_dict
436+
437+
376438
VERSION_MILESTONES = [
377439
(Flow360Version("24.11.1"), _to_24_11_1),
378440
(Flow360Version("24.11.7"), _to_24_11_7),
@@ -386,7 +448,12 @@ def _to_25_7_6(params_as_dict):
386448
(Flow360Version("25.6.5"), _to_25_6_5),
387449
(Flow360Version("25.6.6"), _to_25_6_6),
388450
(Flow360Version("25.7.2"), _to_25_7_2),
451+
<<<<<<< HEAD
389452
(Flow360Version("25.8.0b4"), _to_25_7_6),
453+
=======
454+
(Flow360Version("25.7.6"), _to_25_7_6),
455+
(Flow360Version("25.7.7"), _to_25_7_7),
456+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
390457
] # A list of the Python API version tuple with there corresponding updaters.
391458

392459

flow360/component/simulation/outputs/outputs.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,20 @@ class _AnimationSettings(_OutputBase):
245245
+ " 0 is at beginning of simulation.",
246246
)
247247

248+
@pd.field_validator("frequency", "frequency_offset", mode="after")
249+
@classmethod
250+
def disable_frequency_settings_in_steady_simulation(cls, value, info: pd.ValidationInfo):
251+
"""Disable frequency settings in a steady simulation"""
252+
validation_info = get_validation_info()
253+
if validation_info is None or validation_info.time_stepping != TimeSteppingType.STEADY:
254+
return value
255+
# pylint: disable=unsubscriptable-object
256+
if value != cls.model_fields[info.field_name].default:
257+
raise ValueError(
258+
f"Output {info.field_name} cannot be specified in a steady simulation."
259+
)
260+
return value
261+
248262

249263
class _AnimationAndFileFormatSettings(_AnimationSettings):
250264
"""

flow360/component/simulation/simulation_params.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
from flow360.component.simulation.validation.validation_output import (
8787
_check_aero_acoustics_observer_time_step_size,
8888
_check_output_fields,
89+
_check_output_fields_valid_given_transition_model,
8990
_check_output_fields_valid_given_turbulence_model,
9091
_check_unique_surface_volume_probe_entity_names,
9192
_check_unique_surface_volume_probe_names,
@@ -559,6 +560,11 @@ def check_output_fields_valid_given_turbulence_model(params):
559560
"""Check output fields are valid given the turbulence model"""
560561
return _check_output_fields_valid_given_turbulence_model(params)
561562

563+
@pd.model_validator(mode="after")
564+
def check_output_fields_valid_given_transition_model(params):
565+
"""Check output fields are valid given the transition model"""
566+
return _check_output_fields_valid_given_transition_model(params)
567+
562568
@pd.model_validator(mode="after")
563569
def check_and_add_rotating_reference_frame_model_flag_in_volumezones(params):
564570
"""Ensure that all volume zones have the rotating_reference_frame_model flag with correct values"""

flow360/component/simulation/validation/validation_output.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,39 @@ def _check_output_fields_valid_given_turbulence_model(params):
133133
return params
134134

135135

136+
def _check_output_fields_valid_given_transition_model(params):
137+
"""Ensure that the output fields are consistent with the transition model used."""
138+
139+
if not params.models or not params.outputs:
140+
return params
141+
142+
transition_model = "None"
143+
for model in params.models:
144+
if isinstance(model, Fluid):
145+
transition_model = model.transition_model_solver.type_name
146+
break
147+
148+
if transition_model != "None":
149+
return params
150+
151+
transition_output_fields = [
152+
"residualTransition",
153+
"solutionTransition",
154+
"linearResidualTransition",
155+
]
156+
157+
for output_index, output in enumerate(params.outputs):
158+
if output.output_type in ("AeroAcousticOutput", "StreamlineOutput"):
159+
continue
160+
for item in output.output_fields.items:
161+
if isinstance(item, str) and item in transition_output_fields:
162+
raise ValueError(
163+
f"In `outputs`[{output_index}] {output.output_type}:, {item} is not a valid"
164+
f" output field when transition model is not used."
165+
)
166+
return params
167+
168+
136169
def _check_unsteadiness_to_use_aero_acoustics(params):
137170

138171
if not params.outputs:

flow360/version.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,10 @@
22
version
33
"""
44

5+
<<<<<<< HEAD
56
__version__ = "25.8.0b4"
67
__solver_version__ = "release-25.8"
8+
=======
9+
__version__ = "25.7.7"
10+
__solver_version__ = "release-25.7"
11+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
[tool.poetry]
22
name = "flow360"
3+
<<<<<<< HEAD
34
version = "v25.8.0b4"
5+
=======
6+
version = "v25.7.7"
7+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
48
description = "Flow360 Python Client"
59
authors = ["Flexcompute <support@flexcompute.com>"]
610

tests/ref/simulation/service_init_geometry.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
2+
<<<<<<< HEAD
23
"version": "25.8.0b4",
4+
=======
5+
"version": "25.7.7",
6+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
37
"unit_system": {
48
"name": "SI"
59
},

tests/ref/simulation/service_init_surface_mesh.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
2+
<<<<<<< HEAD
23
"version": "25.8.0b4",
4+
=======
5+
"version": "25.7.7",
6+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
37
"unit_system": {
48
"name": "SI"
59
},

tests/ref/simulation/service_init_volume_mesh.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
2+
<<<<<<< HEAD
23
"version": "25.8.0b4",
4+
=======
5+
"version": "25.7.7",
6+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
37
"unit_system": {
48
"name": "SI"
59
},

tests/simulation/converter/ref/ref_monitor.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
2+
<<<<<<< HEAD
23
"version": "25.8.0b4",
4+
=======
5+
"version": "25.7.7",
6+
>>>>>>> 72c81eec ([FXC-4006][FXC-4053][25.7] Add validation for transition model output fields and output frequency settings (#1587))
37
"unit_system": {
48
"name": "SI"
59
},

0 commit comments

Comments
 (0)