Skip to content

[SCFD-5640] Separating the time averaged output from non time averaged ones in translated JSON #1263

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

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
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
159 changes: 61 additions & 98 deletions flow360/component/simulation/translator/solver_translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@
replace_dict_key,
translate_setting_and_apply_to_all_entities,
translate_value_or_expression_object,
update_dict_recursively,
)
from flow360.component.simulation.unit_system import LengthType
from flow360.component.simulation.user_code.core.types import (
Expand Down Expand Up @@ -128,12 +127,8 @@ def init_non_average_output(
base: dict,
obj_list,
class_type: Union[SliceOutput, IsosurfaceOutput, VolumeOutput, SurfaceOutput],
has_average_capability: bool,
):
"""Initialize the common output attribute for non-average output."""
if has_average_capability:
base["computeTimeAverages"] = False

base["animationFrequency"] = get_global_setting_from_first_instance(
obj_list,
class_type,
Expand All @@ -153,7 +148,6 @@ def init_average_output(
class_type: Union[TimeAverageVolumeOutput, TimeAverageSurfaceOutput],
):
"""Initialize the common output attribute for average output."""
base["computeTimeAverages"] = True
base["animationFrequencyTimeAverage"] = get_global_setting_from_first_instance(
obj_list,
class_type,
Expand All @@ -172,7 +166,7 @@ def init_average_output(
return base


def init_output_base(obj_list, class_type: Type, has_average_capability: bool, is_average: bool):
def init_output_base(obj_list, class_type: Type, is_average: bool):
"""Initialize the common output attribute."""

base = {"outputFields": []}
Expand All @@ -193,14 +187,13 @@ def init_output_base(obj_list, class_type: Type, has_average_capability: bool, i
base,
obj_list,
class_type,
has_average_capability,
)
return base


def add_unused_output_settings_for_comparison(output_dict: dict):
"""
Add unused output settings for easier debugging/comparsions.
Add unused output settings for easier debugging/comparisons.
"""
for freq_key in ["animationFrequencyTimeAverage", "animationFrequency"]:
if freq_key not in output_dict:
Expand Down Expand Up @@ -274,10 +267,10 @@ def translate_output_fields(
output_fields.append(output_field.name)
# Filter out the UserVariable Dicts
output_fields = [item for item in output_fields if isinstance(item, str)]
return {"outputFields": output_fields}
return {"outputFields": sorted(output_fields)}


def surface_probe_setting_translation_func(entity: SurfaceProbeOutput):
def surface_probe_setting_translation_func(entity: Union[SurfaceProbeOutput, SurfaceSliceOutput]):
"""Translate non-entities part of SurfaceProbeOutput"""
dict_with_merged_output_fields = monitor_translator(entity)
dict_with_merged_output_fields["surfacePatches"] = [
Expand All @@ -288,12 +281,18 @@ def surface_probe_setting_translation_func(entity: SurfaceProbeOutput):

def monitor_translator(
output_model: Union[
ProbeOutput, TimeAverageProbeOutput, SurfaceProbeOutput, TimeAverageSurfaceProbeOutput
ProbeOutput,
TimeAverageProbeOutput,
SurfaceProbeOutput,
TimeAverageSurfaceProbeOutput,
SurfaceSliceOutput,
],
):
"""Monitor translator"""
monitor_group = translate_output_fields(output_model)
monitor_group["computeTimeAverages"] = False
# Monitor output setting is fine grained to each monitor group. So no need to have different root level keys.
if not isinstance(output_model, SurfaceSliceOutput):
monitor_group["computeTimeAverages"] = False
monitor_group["animationFrequency"] = 1
monitor_group["animationFrequencyOffset"] = 0
if isinstance(output_model, (TimeAverageProbeOutput, TimeAverageSurfaceProbeOutput)):
Expand Down Expand Up @@ -400,28 +399,23 @@ def translate_volume_output(
volume_output = init_output_base(
output_params,
volume_output_class,
has_average_capability=True,
is_average=volume_output_class is TimeAverageVolumeOutput,
)
# Get outputFields
output_fields = []

output_fields = append_component_to_output_fields(
get_global_setting_from_first_instance(
output_params, volume_output_class, "output_fields"
).model_dump()["items"]
fields = get_global_setting_from_first_instance(
output_params, volume_output_class, "output_fields"
)
output_fields = append_component_to_output_fields(fields.model_dump()["items"])

for output_field in get_global_setting_from_first_instance(
output_params, volume_output_class, "output_fields"
).items:
for output_field in fields.items:
if isinstance(output_field, UserVariable):
output_fields.append(output_field.name)
# Filter out the UserVariable Dicts
output_fields = [item for item in output_fields if isinstance(item, str)]
volume_output.update(
{
"outputFields": output_fields,
"outputFields": sorted(output_fields),
}
)
return volume_output
Expand All @@ -434,12 +428,11 @@ def translate_surface_output(
):
"""Translate surface output settings."""

assert "boundaries" in translated # , "Boundaries must be translated before surface output"
assert "boundaries" in translated # "Boundaries must be translated before surface output"

surface_output = init_output_base(
output_params,
surface_output_class,
has_average_capability=True,
is_average=surface_output_class is TimeAverageSurfaceOutput,
)
surface_output["surfaces"] = translate_setting_and_apply_to_all_entities(
Expand All @@ -465,7 +458,6 @@ def translate_slice_output(
translated_output = init_output_base(
output_params,
output_class,
has_average_capability=True,
is_average=output_class is TimeAverageSliceOutput,
)
translated_output["slices"] = translate_setting_and_apply_to_all_entities(
Expand All @@ -480,42 +472,19 @@ def translate_slice_output(

def translate_isosurface_output(
input_params: SimulationParams,
output_class: Union[IsosurfaceOutput, TimeAverageIsosurfaceOutput],
output_params: list,
injection_function,
):
"""Translate slice or isosurface output settings."""
translated_output = init_output_base(
output_params,
IsosurfaceOutput,
has_average_capability=False,
is_average=False,
)
translated_output["isoSurfaces"] = translate_setting_and_apply_to_all_entities(
output_params,
IsosurfaceOutput,
translation_func=translate_output_fields,
to_list=False,
entity_injection_func=injection_function,
entity_injection_input_params=input_params,
)
return translated_output


def translate_time_average_isosurface_output(
input_params: SimulationParams,
output_params: list,
injection_function,
):
"""Translate time average isosurface output settings."""
translated_output = init_output_base(
output_params,
TimeAverageIsosurfaceOutput,
has_average_capability=True,
is_average=True,
output_class,
is_average=output_class is TimeAverageIsosurfaceOutput,
)
translated_output["isoSurfaces"] = translate_setting_and_apply_to_all_entities(
output_params,
TimeAverageIsosurfaceOutput,
output_class,
translation_func=translate_output_fields,
to_list=False,
entity_injection_func=injection_function,
Expand All @@ -533,7 +502,6 @@ def translate_surface_slice_output(
surface_slice_output = init_output_base(
output_params,
output_class,
has_average_capability=False,
is_average=False,
)
surface_slice_output["slices"] = translate_setting_and_apply_to_all_entities(
Expand Down Expand Up @@ -767,55 +735,50 @@ def translate_output(input_params: SimulationParams, translated: dict):

if outputs is None:
return translated
##:: Step1: Get translated["volumeOutput"]
volume_output = {}
volume_output_average = {}
if has_instance_in_list(outputs, VolumeOutput):
volume_output = translate_volume_output(outputs, VolumeOutput)
if has_instance_in_list(outputs, TimeAverageVolumeOutput):
volume_output_average = translate_volume_output(outputs, TimeAverageVolumeOutput)
# Merge
volume_output.update(**volume_output_average)
if volume_output:
translated["volumeOutput"] = add_unused_output_settings_for_comparison(volume_output)
##:: Step1: Get translated["volumeOutput"/"timeAverageVolumeOutput"]
volume_output_configs = [
(VolumeOutput, "volumeOutput"),
(TimeAverageVolumeOutput, "timeAverageVolumeOutput"),
]

for output_class, output_key in volume_output_configs:
if has_instance_in_list(outputs, output_class):
volume_output = translate_volume_output(outputs, output_class)
if volume_output:
translated[output_key] = add_unused_output_settings_for_comparison(volume_output)

##:: Step2: Get translated["surfaceOutput"]
surface_output = {}
surface_output_average = {}
if has_instance_in_list(outputs, SurfaceOutput):
surface_output = translate_surface_output(outputs, SurfaceOutput, translated)
if has_instance_in_list(outputs, TimeAverageSurfaceOutput):
surface_output_average = translate_surface_output(
outputs, TimeAverageSurfaceOutput, translated
)
# Merge
update_dict_recursively(surface_output, surface_output_average)
if surface_output:
translated["surfaceOutput"] = add_unused_output_settings_for_comparison(surface_output)
surface_output_configs = [
(SurfaceOutput, "surfaceOutput"),
(TimeAverageSurfaceOutput, "timeAverageSurfaceOutput"),
]
for output_class, output_key in surface_output_configs:
if has_instance_in_list(outputs, output_class):
surface_output = translate_surface_output(outputs, output_class, translated)
if surface_output:
translated[output_key] = add_unused_output_settings_for_comparison(surface_output)

##:: Step3: Get translated["sliceOutput"]
slice_output = {}
slice_output_average = {}
if has_instance_in_list(outputs, SliceOutput):
slice_output = translate_slice_output(outputs, SliceOutput, inject_slice_info)
if has_instance_in_list(outputs, TimeAverageSliceOutput):
slice_output_average = translate_slice_output(
outputs, TimeAverageSliceOutput, inject_slice_info
)
# Merge
update_dict_recursively(slice_output, slice_output_average)
if slice_output:
translated["sliceOutput"] = add_unused_output_settings_for_comparison(slice_output)
slice_output_configs = [
(SliceOutput, "sliceOutput"),
(TimeAverageSliceOutput, "timeAverageSliceOutput"),
]
for output_class, output_key in slice_output_configs:
if has_instance_in_list(outputs, output_class):
slice_output = translate_slice_output(outputs, output_class, inject_slice_info)
if slice_output:
translated[output_key] = add_unused_output_settings_for_comparison(slice_output)

##:: Step4: Get translated["isoSurfaceOutput"]
if has_instance_in_list(outputs, IsosurfaceOutput):
translated["isoSurfaceOutput"] = translate_isosurface_output(
input_params, outputs, inject_isosurface_info
)
if has_instance_in_list(outputs, TimeAverageIsosurfaceOutput):
translated["timeAverageIsoSurfaceOutput"] = translate_time_average_isosurface_output(
input_params, outputs, inject_isosurface_info
)
iso_surface_output_configs = [
(IsosurfaceOutput, "isoSurfaceOutput"),
(TimeAverageIsosurfaceOutput, "timeAverageIsoSurfaceOutput"),
]
for output_class, output_key in iso_surface_output_configs:
if has_instance_in_list(outputs, output_class):
translated[output_key] = translate_isosurface_output(
input_params, output_class, outputs, inject_isosurface_info
)

##:: Step5: Get translated["monitorOutput"]
probe_output = {}
Expand Down Expand Up @@ -886,7 +849,7 @@ def translate_output(input_params: SimulationParams, translated: dict):
surface_monitor_output, surface_monitor_output_average
)

##:: Step5.2: Get translated["surfaceMonitorOutput"]
##:: Step6: Get translated["surfaceSliceOutput"]
surface_slice_output = {}
if has_instance_in_list(outputs, SurfaceSliceOutput):
surface_slice_output = translate_surface_slice_output(outputs, SurfaceSliceOutput)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
"animationFrequencyTimeAverageOffset": 0,
"computeTimeAverages": false,
"outputFields": [],
"outputFormat": "paraview",
"startAverageIntegrationStep": -1,
Expand Down Expand Up @@ -146,7 +145,6 @@
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
"animationFrequencyTimeAverageOffset": 0,
"computeTimeAverages": false,
"outputFields": [
"primitiveVars",
"residualNavierStokes",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@
"VelocityRelative"
],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
Expand All @@ -96,7 +95,6 @@
"surfaceOutput": {
"outputFields": [],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"surfaces": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
"animationFrequencyTimeAverageOffset": 0,
"computeTimeAverages": false,
"outputFields": [],
"outputFormat": "paraview",
"startAverageIntegrationStep": -1,
Expand Down Expand Up @@ -161,7 +160,6 @@
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
"animationFrequencyTimeAverageOffset": 0,
"computeTimeAverages": false,
"outputFields": [
"primitiveVars",
"residualNavierStokes",
Expand Down
2 changes: 0 additions & 2 deletions tests/simulation/translator/ref/Flow360_XV15HoverMRF.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@
"qcriterion"
],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
Expand All @@ -117,7 +116,6 @@
"surfaceOutput": {
"outputFields": [],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"surfaces": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@
"uuu"
],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
Expand Down
2 changes: 0 additions & 2 deletions tests/simulation/translator/ref/Flow360_heatFluxCylinder.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@
"T"
],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"animationFrequencyTimeAverage": -1,
Expand All @@ -94,7 +93,6 @@
"surfaceOutput": {
"outputFields": [],
"outputFormat": "paraview",
"computeTimeAverages": false,
"animationFrequency": -1,
"animationFrequencyOffset": 0,
"surfaces": {
Expand Down
Loading
Loading