Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
5 changes: 4 additions & 1 deletion flow360/component/simulation/models/surface_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import flow360.component.simulation.units as u
from flow360.component.simulation.framework.base_model import Flow360BaseModel
from flow360.component.simulation.framework.entity_base import EntityList
from flow360.component.simulation.framework.entity_base import EntityList, generate_uuid
from flow360.component.simulation.framework.expressions import StringExpression
from flow360.component.simulation.framework.single_attribute_base import (
SingleAttributeModel,
Expand Down Expand Up @@ -70,6 +70,7 @@ class BoundaryBase(Flow360BaseModel, metaclass=ABCMeta):
alias="surfaces",
description="List of boundaries with boundary condition imposed.",
)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.field_validator("entities", mode="after")
@classmethod
Expand Down Expand Up @@ -705,6 +706,7 @@ class Periodic(Flow360BaseModel):
description="Define the type of periodic boundary condition (translational/rotational) "
+ "via :class:`Translational`/:class:`Rotational`.",
)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.field_validator("entity_pairs", mode="after")
@classmethod
Expand Down Expand Up @@ -755,6 +757,7 @@ class PorousJump(Flow360BaseModel):
thickness: LengthType = pd.Field(
description="Thickness of the thin porous media on the surface"
)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.field_validator("entity_pairs", mode="after")
@classmethod
Expand Down
7 changes: 6 additions & 1 deletion flow360/component/simulation/models/volume_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
Flow360BaseModel,
RegistryLookup,
)
from flow360.component.simulation.framework.entity_base import EntityList
from flow360.component.simulation.framework.entity_base import EntityList, generate_uuid
from flow360.component.simulation.framework.expressions import (
StringExpression,
validate_angle_expression_of_t_seconds,
Expand Down Expand Up @@ -468,6 +468,7 @@ class PDEModelBase(Flow360BaseModel):

material: MaterialBase = pd.Field()
initial_condition: Optional[dict] = pd.Field(None)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)


class Fluid(PDEModelBase):
Expand Down Expand Up @@ -677,6 +678,7 @@ class ActuatorDisk(Flow360BaseModel):
+ "See :class:`ForcePerArea` documentation."
)
name: Optional[str] = pd.Field("Actuator disk", description="Name of the `ActuatorDisk` model.")
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)
type: Literal["ActuatorDisk"] = pd.Field("ActuatorDisk", frozen=True)


Expand Down Expand Up @@ -975,6 +977,7 @@ class BETDisk(MultiConstructorBaseModel):
)

private_attribute_input_cache: BETDiskCache = BETDiskCache()
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.model_validator(mode="after")
@_validator_append_instance_name
Expand Down Expand Up @@ -1434,6 +1437,7 @@ class Rotation(Flow360BaseModel):
+ "to be used for the rotation model. Steady state simulation requires this flag "
+ "to be True for all rotation models.",
)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.field_validator("entities", mode="after")
@classmethod
Expand Down Expand Up @@ -1533,6 +1537,7 @@ class PorousMedium(Flow360BaseModel):
volumetric_heat_source: Optional[Union[StringExpression, HeatSourceType]] = pd.Field(
None, description="The volumetric heat source."
)
private_attribute_id: str = pd.Field(default_factory=generate_uuid, frozen=True)

@pd.field_validator("entities", mode="after")
@classmethod
Expand Down
2 changes: 1 addition & 1 deletion flow360/component/simulation/simulation_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ def apply_default_fluid_settings(cls, v):
v = []
assert isinstance(v, list)
if not any(isinstance(item, Fluid) for item in v):
v.append(Fluid())
v.append(Fluid(private_attribute_id="__default_fluid"))
return v

@pd.field_validator("models", mode="after")
Expand Down
2 changes: 1 addition & 1 deletion flow360/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
version
"""

__version__ = "25.7.4b0"
__version__ = "25.7.5b0"
__solver_version__ = "release-25.7"
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "flow360"
version = "v25.7.4b0"
version = "v25.7.5b0"
description = "Flow360 Python Client"
authors = ["Flexcompute <[email protected]>"]

Expand Down
3 changes: 2 additions & 1 deletion tests/ref/simulation/service_init_geometry.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down Expand Up @@ -203,6 +203,7 @@
"p": "p"
},
"type": "Fluid",
"private_attribute_id": "__default_fluid",
"navier_stokes_solver": {
"absolute_tolerance": 1e-10,
"relative_tolerance": 0.0,
Expand Down
3 changes: 2 additions & 1 deletion tests/ref/simulation/service_init_surface_mesh.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down Expand Up @@ -203,6 +203,7 @@
"p": "p"
},
"type": "Fluid",
"private_attribute_id": "__default_fluid",
"navier_stokes_solver": {
"absolute_tolerance": 1e-10,
"relative_tolerance": 0.0,
Expand Down
3 changes: 2 additions & 1 deletion tests/ref/simulation/service_init_volume_mesh.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down Expand Up @@ -165,6 +165,7 @@
"p": "p"
},
"type": "Fluid",
"private_attribute_id": "__default_fluid",
"navier_stokes_solver": {
"absolute_tolerance": 1e-10,
"relative_tolerance": 0.0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@
}
]
},
"use_wall_function": false
"use_wall_function": false,
"private_attribute_id": "wall1"
},
{
"material": {
Expand Down Expand Up @@ -263,7 +264,8 @@
"type_name": "SpalartAllmaras",
"update_jacobian_frequency": 4
},
"type": "Fluid"
"type": "Fluid",
"private_attribute_id":"__default_fluid"
}
],
"operating_condition": {
Expand Down
2 changes: 1 addition & 1 deletion tests/simulation/converter/ref/ref_monitor.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"version":"25.7.4b0","unit_system":{"name":"SI"},"meshing":null,"reference_geometry":null,"operating_condition":null,"models":[{"material":{"type":"air","name":"air","dynamic_viscosity":{"reference_viscosity":{"value":0.00001716,"units":"Pa*s"},"reference_temperature":{"value":273.15,"units":"K"},"effective_temperature":{"value":110.4,"units":"K"}}},"initial_condition":{"type_name":"NavierStokesInitialCondition","constants":null,"rho":"rho","u":"u","v":"v","w":"w","p":"p"},"type":"Fluid","navier_stokes_solver":{"absolute_tolerance":1e-10,"relative_tolerance":0.0,"order_of_accuracy":2,"equation_evaluation_frequency":1,"linear_solver":{"max_iterations":30,"absolute_tolerance":null,"relative_tolerance":null},"private_attribute_dict":null,"CFL_multiplier":1.0,"kappa_MUSCL":-1.0,"numerical_dissipation_factor":1.0,"limit_velocity":false,"limit_pressure_density":false,"type_name":"Compressible","low_mach_preconditioner":false,"low_mach_preconditioner_threshold":null,"update_jacobian_frequency":4,"max_force_jac_update_physical_steps":0},"turbulence_model_solver":{"absolute_tolerance":1e-8,"relative_tolerance":0.0,"order_of_accuracy":2,"equation_evaluation_frequency":4,"linear_solver":{"max_iterations":20,"absolute_tolerance":null,"relative_tolerance":null},"private_attribute_dict":null,"CFL_multiplier":2.0,"type_name":"SpalartAllmaras","reconstruction_gradient_limiter":0.5,"quadratic_constitutive_relation":false,"modeling_constants":{"type_name":"SpalartAllmarasConsts","C_DES":0.72,"C_d":8.0,"C_cb1":0.1355,"C_cb2":0.622,"C_sigma":0.6666666666666666,"C_v1":7.1,"C_vonKarman":0.41,"C_w2":0.3,"C_w4":0.21,"C_w5":1.5,"C_t3":1.2,"C_t4":0.5,"C_min_rd":10.0},"update_jacobian_frequency":4,"max_force_jac_update_physical_steps":0,"hybrid_model":null,"rotation_correction":false, "controls":null,"low_reynolds_correction":false},"stopping_criterion": null,"transition_model_solver":{"type_name":"None"}}],"time_stepping":{"type_name":"Steady","max_steps":2000,"CFL":{"type":"adaptive","min":0.1,"max":10000.0,"max_relative_change":1.0,"convergence_limiting_factor":0.25}},"user_defined_dynamics":null,"user_defined_fields":[],"outputs":[{"name":"R1","entities":{"stored_entities":[{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"b9de2bce-36c1-4bbf-af0a-2c6a2ab713a4","name":"Point-0","location":{"value":[2.694298,0.0,1.0195910000000001],"units":"m"}}]},"output_fields":{"items":["primitiveVars"]},"moving_statistic": null,"output_type":"ProbeOutput"},{"name":"V3","entities":{"stored_entities":[{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"a79cffc0-31d0-499d-906c-f271c2320166","name":"Point-1","location":{"value":[4.007,0.0,-0.31760000000000005],"units":"m"}},{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"8947eb10-fc59-4102-b9c7-168a91ca22b9","name":"Point-2","location":{"value":[4.007,0.0,-0.29760000000000003],"units":"m"}},{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"27ac4e03-592b-4dba-8fa1-8f6678087a96","name":"Point-3","location":{"value":[4.007,0.0,-0.2776],"units":"m"}}]},"output_fields":{"items":["mut"]},"moving_statistic": null,"output_type":"ProbeOutput"}],"private_attribute_asset_cache":{"project_length_unit":null,"project_entity_info":null, "use_inhouse_mesher": false, "variable_context":null, "use_geometry_AI": false}}
{"version":"25.7.5b0","unit_system":{"name":"SI"},"meshing":null,"reference_geometry":null,"operating_condition":null,"models":[{"material":{"type":"air","name":"air","dynamic_viscosity":{"reference_viscosity":{"value":0.00001716,"units":"Pa*s"},"reference_temperature":{"value":273.15,"units":"K"},"effective_temperature":{"value":110.4,"units":"K"}}},"initial_condition":{"type_name":"NavierStokesInitialCondition","constants":null,"rho":"rho","u":"u","v":"v","w":"w","p":"p"},"type":"Fluid","navier_stokes_solver":{"absolute_tolerance":1e-10,"relative_tolerance":0.0,"order_of_accuracy":2,"equation_evaluation_frequency":1,"linear_solver":{"max_iterations":30,"absolute_tolerance":null,"relative_tolerance":null},"private_attribute_dict":null,"CFL_multiplier":1.0,"kappa_MUSCL":-1.0,"numerical_dissipation_factor":1.0,"limit_velocity":false,"limit_pressure_density":false,"type_name":"Compressible","low_mach_preconditioner":false,"low_mach_preconditioner_threshold":null,"update_jacobian_frequency":4,"max_force_jac_update_physical_steps":0},"turbulence_model_solver":{"absolute_tolerance":1e-8,"relative_tolerance":0.0,"order_of_accuracy":2,"equation_evaluation_frequency":4,"linear_solver":{"max_iterations":20,"absolute_tolerance":null,"relative_tolerance":null},"private_attribute_dict":null,"CFL_multiplier":2.0,"type_name":"SpalartAllmaras","reconstruction_gradient_limiter":0.5,"quadratic_constitutive_relation":false,"modeling_constants":{"type_name":"SpalartAllmarasConsts","C_DES":0.72,"C_d":8.0,"C_cb1":0.1355,"C_cb2":0.622,"C_sigma":0.6666666666666666,"C_v1":7.1,"C_vonKarman":0.41,"C_w2":0.3,"C_w4":0.21,"C_w5":1.5,"C_t3":1.2,"C_t4":0.5,"C_min_rd":10.0},"update_jacobian_frequency":4,"max_force_jac_update_physical_steps":0,"hybrid_model":null,"rotation_correction":false, "controls":null,"low_reynolds_correction":false},"stopping_criterion": null,"transition_model_solver":{"type_name":"None"}}],"time_stepping":{"type_name":"Steady","max_steps":2000,"CFL":{"type":"adaptive","min":0.1,"max":10000.0,"max_relative_change":1.0,"convergence_limiting_factor":0.25}},"user_defined_dynamics":null,"user_defined_fields":[],"outputs":[{"name":"R1","entities":{"stored_entities":[{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"b9de2bce-36c1-4bbf-af0a-2c6a2ab713a4","name":"Point-0","location":{"value":[2.694298,0.0,1.0195910000000001],"units":"m"}}]},"output_fields":{"items":["primitiveVars"]},"moving_statistic": null,"output_type":"ProbeOutput"},{"name":"V3","entities":{"stored_entities":[{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"a79cffc0-31d0-499d-906c-f271c2320166","name":"Point-1","location":{"value":[4.007,0.0,-0.31760000000000005],"units":"m"}},{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"8947eb10-fc59-4102-b9c7-168a91ca22b9","name":"Point-2","location":{"value":[4.007,0.0,-0.29760000000000003],"units":"m"}},{"private_attribute_registry_bucket_name":"PointEntityType","private_attribute_entity_type_name":"Point","private_attribute_id":"27ac4e03-592b-4dba-8fa1-8f6678087a96","name":"Point-3","location":{"value":[4.007,0.0,-0.2776],"units":"m"}}]},"output_fields":{"items":["mut"]},"moving_statistic": null,"output_type":"ProbeOutput"}],"private_attribute_asset_cache":{"project_length_unit":null,"project_entity_info":null, "use_inhouse_mesher": false, "variable_context":null, "use_geometry_AI": false}}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ def test_single_flow360_bet_convert(atol=1e-15, rtol=1e-10, debug=False):
print(">>> disk = ", disk)
print("=== disk ===\n", json.dumps(disk, indent=4, sort_keys=True))
print("=== ref_dict ===\n", json.dumps(ref_dict, indent=4, sort_keys=True))
assert compare_values(ref_dict, disk, atol=atol, rtol=rtol)
assert compare_values(
ref_dict, disk, atol=atol, rtol=rtol, ignore_keys=["private_attribute_id"]
)

with pytest.raises(
ValueError,
Expand Down
4 changes: 3 additions & 1 deletion tests/simulation/converter/test_bet_translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ def translate_and_compare(type, ref_json_file: str, atol=1e-15, rtol=1e-10, debu
print(">>> translated = ", translated)
print("=== translated ===\n", json.dumps(translated, indent=4, sort_keys=True))
print("=== ref_dict ===\n", json.dumps(ref_dict, indent=4, sort_keys=True))
assert compare_values(ref_dict, translated, atol=atol, rtol=rtol)
assert compare_values(
ref_dict, translated, atol=atol, rtol=rtol, ignore_keys=["private_attribute_id"]
)


def test_translated_c81_params():
Expand Down

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion tests/simulation/data/simulation_by_face_id.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down
4 changes: 3 additions & 1 deletion tests/simulation/framework/test_multi_constructor_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ def get_aerospace_condition_using_from_mach_reynolds():
def compare_objects_from_dict(dict1: dict, dict2: dict, object_class: type[Flow360BaseModel]):
obj1 = object_class.model_validate(dict1)
obj2 = object_class.model_validate(dict2)
assert obj1.model_dump_json() == obj2.model_dump_json()
assert obj1.model_dump_json(exclude={"private_attribute_id"}) == obj2.model_dump_json(
exclude={"private_attribute_id"}
)


def test_full_model(
Expand Down
2 changes: 1 addition & 1 deletion tests/simulation/params/data/geometry/simulation.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down
3 changes: 2 additions & 1 deletion tests/simulation/ref/simulation_with_project_variables.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down Expand Up @@ -123,6 +123,7 @@
"w": "w",
"p": "p"
},
"private_attribute_id": "__default_fluid",
"type": "Fluid",
"navier_stokes_solver": {
"absolute_tolerance": 1e-10,
Expand Down
2 changes: 1 addition & 1 deletion tests/simulation/service/params.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down
12 changes: 9 additions & 3 deletions tests/simulation/service/test_services_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -699,14 +699,19 @@ def _compare_validation_errors(err, exp_err):


def test_init():
def remove_model_and_output_id_in_default_dict(data):
data["outputs"][0].pop("private_attribute_id", None)
data["models"][0].pop("private_attribute_id", None)
data["models"][1].pop("private_attribute_id", None)

##1: test default values for geometry starting point
data = services.get_default_params(
unit_system_name="SI", length_unit="m", root_item_type="Geometry"
)
assert data["operating_condition"]["alpha"]["value"] == 0
assert data["operating_condition"]["alpha"]["units"] == "degree"
assert "velocity_magnitude" not in data["operating_condition"].keys()
data["outputs"][0].pop("private_attribute_id", None)
remove_model_and_output_id_in_default_dict(data)
# to convert tuples to lists:
data = json.loads(json.dumps(data))
compare_dict_to_ref(data, "../../ref/simulation/service_init_geometry.json")
Expand All @@ -716,7 +721,7 @@ def test_init():
unit_system_name="SI", length_unit="m", root_item_type="VolumeMesh"
)
assert "meshing" not in data
data["outputs"][0].pop("private_attribute_id", None)
remove_model_and_output_id_in_default_dict(data)
# to convert tuples to lists:
data = json.loads(json.dumps(data))
compare_dict_to_ref(data, "../../ref/simulation/service_init_volume_mesh.json")
Expand All @@ -731,7 +736,7 @@ def test_init():
assert data["private_attribute_asset_cache"]["project_length_unit"]["units"] == "cm"

assert data["models"][0]["roughness_height"]["units"] == "cm"
data["outputs"][0].pop("private_attribute_id", None)
remove_model_and_output_id_in_default_dict(data)
# to convert tuples to lists:
data = json.loads(json.dumps(data))
compare_dict_to_ref(data, "../../ref/simulation/service_init_surface_mesh.json")
Expand Down Expand Up @@ -945,6 +950,7 @@ def test_front_end_JSON_with_multi_constructor():
]
},
"use_wall_function": False,
"private_attribute_id": "wall1",
}
],
"operating_condition": {
Expand Down
2 changes: 2 additions & 0 deletions tests/simulation/test_expressions.py
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,8 @@ def test_project_variables_serialization():
with open("ref/simulation_with_project_variables.json", "r") as fh:
ref_data = fh.read()

# print(params.model_dump_json(indent=4, exclude_none=True))

assert ref_data == params.model_dump_json(indent=4, exclude_none=True)


Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "25.7.4b0",
"version": "25.7.5b0",
"unit_system": {
"name": "SI"
},
Expand Down
2 changes: 1 addition & 1 deletion tests/test_current_flow360_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@


def test_version():
assert __version__ == "25.7.4b0"
assert __version__ == "25.7.5b0"
Loading