Skip to content

Commit 24f2017

Browse files
committed
Merge branch 'develop' into release-23.3.2
2 parents e2ccc08 + 044cc1f commit 24f2017

File tree

23 files changed

+208
-141
lines changed

23 files changed

+208
-141
lines changed

flow360/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
SubsonicOutflowPressure,
3232
WallFunction,
3333
)
34+
from .component.flow360_params.flow360_output import Slice, Slices
3435
from .component.flow360_params.flow360_params import (
3536
ActuatorDisk,
3637
AeroacousticOutput,
@@ -57,7 +58,6 @@
5758
PorousMedium,
5859
ProbeMonitor,
5960
SliceOutput,
60-
Slices,
6161
SlidingInterface,
6262
SpalartAllmaras,
6363
SurfaceIntegralMonitor,
@@ -73,6 +73,7 @@
7373
)
7474
from .component.flow360_params.solvers import (
7575
IncompressibleNavierStokesSolver,
76+
LinearSolver,
7677
NavierStokesSolver,
7778
)
7879
from .component.flow360_params.time_stepping import (

flow360/component/flow360_params/boundaries.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""
22
Boundaries parameters
33
"""
4-
import os
54
from abc import ABCMeta
65
from typing import Literal, Optional, Tuple, Union
76

flow360/component/flow360_params/flow360_output.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"""
44
from __future__ import annotations
55

6-
import os
76
from abc import ABCMeta
87
from typing import List, Literal, Optional, Union, get_args
98

flow360/component/flow360_params/flow360_params.py

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# pylint: disable=unused-import
66
from __future__ import annotations
77

8+
import json
89
import math
910
import os
1011
from abc import ABCMeta, abstractmethod
@@ -66,7 +67,6 @@
6667
ProbeMonitor,
6768
SliceOutput,
6869
SliceOutputLegacy,
69-
Slices,
7070
SurfaceIntegralMonitor,
7171
SurfaceOutput,
7272
SurfaceOutputLegacy,
@@ -485,7 +485,7 @@ class Geometry(Flow360BaseModel):
485485
:class: Geometry component
486486
"""
487487

488-
ref_area: Optional[AreaType.Positive] = pd.Field(alias="refArea")
488+
ref_area: Optional[AreaType.Positive] = pd.Field(alias="refArea", displayed="Reference area")
489489
moment_center: Optional[LengthType.Point] = pd.Field(alias="momentCenter")
490490
moment_length: Optional[LengthType.Moment] = pd.Field(alias="momentLength")
491491
mesh_unit: Optional[LengthType] = pd.Field(alias="meshUnit")
@@ -508,8 +508,8 @@ class FreestreamBase(Flow360BaseModel, metaclass=ABCMeta):
508508
"""
509509

510510
model_type: str
511-
alpha: Optional[float] = pd.Field(alias="alphaAngle", default=0)
512-
beta: Optional[float] = pd.Field(alias="betaAngle", default=0)
511+
alpha: Optional[float] = pd.Field(alias="alphaAngle", default=0, displayed="Alpha angle [deg]")
512+
beta: Optional[float] = pd.Field(alias="betaAngle", default=0, displayed="Beta angle [deg]")
513513
turbulent_viscosity_ratio: Optional[NonNegativeFloat] = pd.Field(
514514
alias="turbulentViscosityRatio"
515515
)
@@ -532,10 +532,10 @@ class FreestreamFromMach(FreestreamBase):
532532
"""
533533

534534
model_type: Literal["FromMach"] = pd.Field("FromMach", alias="modelType", const=True)
535-
Mach: PositiveFloat = pd.Field()
536-
Mach_ref: Optional[PositiveFloat] = pd.Field(alias="MachRef")
537-
mu_ref: PositiveFloat = pd.Field(alias="muRef")
538-
temperature: PositiveFloat = pd.Field(alias="Temperature")
535+
Mach: PositiveFloat = pd.Field(displayed="Mach number")
536+
Mach_ref: Optional[PositiveFloat] = pd.Field(alias="MachRef", displayed="Reference Mach number")
537+
mu_ref: PositiveFloat = pd.Field(alias="muRef", displayed="Dynamic viscosity [non-dim]")
538+
temperature: PositiveFloat = pd.Field(alias="Temperature", displayed="Temperature [K]")
539539

540540
# pylint: disable=arguments-differ, unused-argument
541541
def to_solver(self, params: Flow360Params, **kwargs) -> FreestreamFromMach:
@@ -553,10 +553,10 @@ class FreestreamFromMachReynolds(FreestreamBase):
553553
model_type: Literal["FromMachReynolds"] = pd.Field(
554554
"FromMachReynolds", alias="modelType", const=True
555555
)
556-
Mach: PositiveFloat = pd.Field()
557-
Mach_ref: Optional[PositiveFloat] = pd.Field(alias="MachRef")
558-
Reynolds: PositiveFloat = pd.Field()
559-
temperature: PositiveFloat = pd.Field(alias="Temperature")
556+
Mach: PositiveFloat = pd.Field(displayed="Mach number")
557+
Mach_ref: Optional[PositiveFloat] = pd.Field(alias="MachRef", displayed="Reference Mach number")
558+
Reynolds: PositiveFloat = pd.Field(displayed="Reynolds number")
559+
temperature: PositiveFloat = pd.Field(alias="Temperature", displayed="Temperature [K]")
560560

561561
# pylint: disable=arguments-differ, unused-argument
562562
def to_solver(self, params: Flow360Params, **kwargs) -> FreestreamFromMach:
@@ -572,10 +572,10 @@ class ZeroFreestream(FreestreamBase):
572572
"""
573573

574574
model_type: Literal["ZeroMach"] = pd.Field("ZeroMach", alias="modelType", const=True)
575-
Mach: Literal[0] = pd.Field(0, const=True)
576-
Mach_ref: pd.confloat(gt=1.0e-12) = pd.Field(alias="MachRef")
577-
mu_ref: PositiveFloat = pd.Field(alias="muRef")
578-
temperature: PositiveFloat = pd.Field(alias="Temperature")
575+
Mach: Literal[0] = pd.Field(0, const=True, displayed="Mach number")
576+
Mach_ref: pd.confloat(gt=1.0e-12) = pd.Field(alias="MachRef", displayed="Reference Mach number")
577+
mu_ref: PositiveFloat = pd.Field(alias="muRef", displayed="Dynamic viscosity [non-dim]")
578+
temperature: PositiveFloat = pd.Field(alias="Temperature", displayed="Temperature [K]")
579579

580580
# pylint: disable=arguments-differ, unused-argument
581581
def to_solver(self, params: Flow360Params, **kwargs) -> ZeroFreestream:
@@ -592,7 +592,9 @@ class FreestreamFromVelocity(FreestreamBase):
592592

593593
model_type: Literal["FromVelocity"] = pd.Field("FromVelocity", alias="modelType", const=True)
594594
velocity: VelocityType.Positive = pd.Field()
595-
velocity_ref: Optional[VelocityType.Positive] = pd.Field(alias="velocityRef")
595+
velocity_ref: Optional[VelocityType.Positive] = pd.Field(
596+
alias="velocityRef", displayed="Reference velocity"
597+
)
596598

597599
# pylint: disable=arguments-differ
598600
def to_solver(self, params: Flow360Params, **kwargs) -> FreestreamFromMach:
@@ -637,7 +639,9 @@ class ZeroFreestreamFromVelocity(FreestreamBase):
637639

638640
model_type: Literal["ZeroVelocity"] = pd.Field("ZeroVelocity", alias="modelType", const=True)
639641
velocity: Literal[0] = pd.Field(0, const=True)
640-
velocity_ref: VelocityType.Positive = pd.Field(alias="velocityRef")
642+
velocity_ref: VelocityType.Positive = pd.Field(
643+
alias="velocityRef", displayed="Reference velocity"
644+
)
641645

642646
# pylint: disable=arguments-differ
643647
def to_solver(self, params: Flow360Params, **kwargs) -> ZeroFreestream:
@@ -721,7 +725,7 @@ class AirPressureTemperature(Flow360BaseModel):
721725
722726
"""
723727

724-
model_type: str = pd.Field("AirPressure", alias="modelType", const=True)
728+
model_type: Literal["AirPressure"] = pd.Field("AirPressure", alias="modelType", const=True)
725729
pressure: PressureType = pd.Field()
726730
temperature: TemperatureType = pd.Field()
727731

@@ -754,7 +758,7 @@ class AirDensityTemperature(Flow360BaseModel):
754758
755759
"""
756760

757-
model_type: str = pd.Field("AirDensity", alias="modelType", const=True)
761+
model_type: Literal["AirDensity"] = pd.Field("AirDensity", alias="modelType", const=True)
758762
temperature: TemperatureType = pd.Field()
759763
density: DensityType = pd.Field()
760764

@@ -949,7 +953,9 @@ class Flow360Params(Flow360BaseModel):
949953
version: str = pd.Field(__version__, mutable=False)
950954

951955
geometry: Optional[Geometry] = pd.Field()
952-
fluid_properties: Optional[FluidPropertyTypes] = pd.Field(alias="fluidProperties")
956+
fluid_properties: Optional[FluidPropertyTypes] = pd.Field(
957+
alias="fluidProperties", discriminator="model_type"
958+
)
953959
boundaries: Boundaries = pd.Field()
954960
initial_condition: Optional[InitialConditions] = pd.Field(
955961
alias="initialCondition", discriminator="type"
@@ -1065,7 +1071,7 @@ def to_solver(self) -> Flow360Params:
10651071
return super().to_solver(self, exclude=["fluid_properties"])
10661072
return super().to_solver(self, exclude=["fluid_properties"])
10671073

1068-
def to_flow360_json(self) -> dict:
1074+
def to_flow360_json(self) -> str:
10691075
"""Generate a JSON representation of the model, as required by Flow360
10701076
10711077
Returns
@@ -1083,6 +1089,22 @@ def to_flow360_json(self) -> dict:
10831089
solver_params_json = solver_params.json(encoder=flow360_json_encoder)
10841090
return solver_params_json
10851091

1092+
def to_flow360_dict(self) -> dict:
1093+
"""Generate a dict representation of the model, as required by Flow360
1094+
1095+
Returns
1096+
-------
1097+
dict
1098+
Returns dict representation of the model.
1099+
1100+
Example
1101+
-------
1102+
>>> params.to_flow360_dict() # doctest: +SKIP
1103+
"""
1104+
1105+
flow360_dict = json.loads(self.to_flow360_json())
1106+
return flow360_dict
1107+
10861108
def append(self, params: Flow360Params, overwrite: bool = False):
10871109
if not isinstance(params, Flow360Params):
10881110
raise ValueError("params must be type of Flow360Params")

flow360/component/flow360_params/initial_condition.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ class ExpressionInitialCondition(InitialCondition):
2727
""":class:`ExpressionInitialCondition` class"""
2828

2929
type: Literal["expression"] = pd.Field("expression", const=True)
30-
rho: str = pd.Field()
31-
u: str = pd.Field()
32-
v: str = pd.Field()
33-
w: str = pd.Field()
34-
p: str = pd.Field()
30+
rho: str = pd.Field(displayed="rho [non-dim]")
31+
u: str = pd.Field(displayed="u [non-dim]")
32+
v: str = pd.Field(displayed="v [non-dim]")
33+
w: str = pd.Field(displayed="w [non-dim]")
34+
p: str = pd.Field(displayed="p [non-dim]")
3535

3636

3737
InitialConditions = Union[FreestreamInitialCondition, ExpressionInitialCondition]

flow360/component/flow360_params/solvers.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,6 @@ class NavierStokesSolver(GenericFlowSolverSettings):
121121
order upwind scheme and is the most stable. A value of 0.33 leads to a blended upwind/central scheme and is
122122
recommended for low subsonic flows leading to reduced dissipation
123123
124-
linear_iterations :
125-
Number of linear solver iterations
126-
127124
update_jacobian_frequency :
128125
Frequency at which the jacobian is updated.
129126
@@ -146,6 +143,9 @@ class NavierStokesSolver(GenericFlowSolverSettings):
146143
A factor in the range [0.01, 1.0] which exponentially reduces the dissipation of the numerical flux.
147144
The recommended starting value for most low-dissipation runs is 0.2
148145
146+
linear_solver:
147+
Linear solver settings
148+
149149
Returns
150150
-------
151151
:class:`NavierStokesSolver`
@@ -159,7 +159,6 @@ class NavierStokesSolver(GenericFlowSolverSettings):
159159
CFL_multiplier: Optional[PositiveFloat] = pd.Field(
160160
1.0, alias="CFLMultiplier", displayed="CFL Multiplier"
161161
)
162-
linear_iterations: Optional[PositiveInt] = pd.Field(alias="linearIterations")
163162
kappa_MUSCL: Optional[pd.confloat(ge=-1, le=1)] = pd.Field(
164163
-1, alias="kappaMUSCL", displayed="Kappa MUSCL"
165164
)
@@ -175,7 +174,7 @@ class NavierStokesSolver(GenericFlowSolverSettings):
175174
1, alias="numericalDissipationFactor"
176175
)
177176
linear_solver: Optional[LinearSolver] = pd.Field(
178-
LinearSolver(max_iterations=30), alias="linearSolver"
177+
LinearSolver(max_iterations=30), alias="linearSolver", displayed="Linear solver config"
179178
)
180179
limit_velocity: Optional[bool] = pd.Field(False, alias="limitVelocity")
181180
limit_pressure_density: Optional[bool] = pd.Field(False, alias="limitPressureDensity")
@@ -330,17 +329,22 @@ class TurbulenceModelSolver(GenericFlowSolverSettings, metaclass=ABCMeta):
330329
quadratic_constitutive_relation: Optional[bool] = pd.Field(
331330
False, alias="quadraticConstitutiveRelation"
332331
)
333-
reconstruction_gradient_limiter: Optional[pd.confloat(ge=0, le=2)] = pd.Field(
334-
1.0, alias="reconstructionGradientLimiter"
332+
reconstruction_gradient_limiter: Optional[float] = pd.Field(
333+
alias="reconstructionGradientLimiter"
334+
)
335+
model_constants: Optional[TurbulenceModelConstants] = pd.Field(
336+
alias="modelConstants", discriminator="model_type"
335337
)
336-
model_constants: Optional[TurbulenceModelConstants] = pd.Field(alias="modelConstants")
337338

338339

339340
class KOmegaSST(TurbulenceModelSolver):
340341
""":class:`KOmegaSST` class"""
341342

342343
model_type: Literal["kOmegaSST"] = pd.Field("kOmegaSST", alias="modelType", const=True)
343344
model_constants: Optional[TurbulenceModelConstantsSST] = pd.Field(alias="modelConstants")
345+
reconstruction_gradient_limiter: Optional[pd.confloat(ge=0, le=2)] = pd.Field(
346+
1.0, alias="reconstructionGradientLimiter"
347+
)
344348

345349

346350
class SpalartAllmaras(TurbulenceModelSolver):
@@ -351,6 +355,9 @@ class SpalartAllmaras(TurbulenceModelSolver):
351355
)
352356
rotation_correction: Optional[bool] = pd.Field(False, alias="rotationCorrection")
353357
model_constants: Optional[TurbulenceModelConstantsSA] = pd.Field(alias="modelConstants")
358+
reconstruction_gradient_limiter: Optional[pd.confloat(ge=0, le=2)] = pd.Field(
359+
0.5, alias="reconstructionGradientLimiter"
360+
)
354361

355362

356363
class NoneSolver(Flow360BaseModel):
@@ -495,6 +502,7 @@ class NavierStokesSolverLegacy(NavierStokesSolver, LegacyModel):
495502
linear_solver: Optional[LinearSolverLegacy] = pd.Field(
496503
alias="linearSolver", default=LinearSolverLegacy()
497504
)
505+
linear_iterations: Optional[PositiveInt] = pd.Field(alias="linearIterations")
498506

499507
def update_model(self):
500508
model = {

tests/params/test_solvers.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ def test_navier_stokes():
4848
kappa_MUSCL=-1,
4949
relative_tolerance=0,
5050
CFL_multiplier=1,
51-
linear_iterations=30,
5251
update_jacobian_frequency=4,
5352
equation_eval_frequency=1,
5453
max_force_jac_update_physical_steps=1,

tests/ref/case_params/params.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
"timeStepSize": "inf"
4343
},
4444
"navierStokesSolver": {
45+
"absoluteTolerance": 1.0e-10,
4546
"relativeTolerance": 0.0,
4647
"CFLMultiplier": 1.0,
47-
"linearIterations": 10,
4848
"kappaMUSCL": -1.0,
4949
"updateJacobianFrequency": 4,
5050
"equationEvalFrequency": 1,
@@ -130,5 +130,5 @@
130130
}
131131
}
132132
},
133-
"hash": "4aa5efab272a24cb4b2540c6f3ddb1357a4a405a2c8ebda6393ea3affb496b03"
133+
"hash": "8f6a65d066ce8a92d34e973a7b357429d6cd6071b8ec27080bcbc3be2e810b84"
134134
}

tests/ref/case_params/params.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ geometry:
2828
refArea:
2929
units: m**2
3030
value: 1.15315084119231
31-
hash: 4aa5efab272a24cb4b2540c6f3ddb1357a4a405a2c8ebda6393ea3affb496b03
31+
hash: 8f6a65d066ce8a92d34e973a7b357429d6cd6071b8ec27080bcbc3be2e810b84
3232
navierStokesSolver:
3333
CFLMultiplier: 1.0
34+
absoluteTolerance: 1.0e-10
3435
equationEvalFrequency: 1
3536
kappaMUSCL: -1.0
3637
limitPressureDensity: false
3738
limitVelocity: false
38-
linearIterations: 10
3939
linearSolver:
4040
absoluteTolerance: 1.0e-10
4141
maxIterations: 30

tests/test_flow360_params.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def test_update_from_multiple_files():
201201
geometry=fl.Geometry("data/case_params/geometry.yaml"),
202202
boundaries=fl.Boundaries("data/case_params/boundaries.yaml"),
203203
freestream=fl.FreestreamFromVelocity(velocity=286, alpha=3.06),
204-
navier_stokes_solver=fl.NavierStokesSolver(linear_iterations=10),
204+
navier_stokes_solver=fl.NavierStokesSolver(absolute_tolerance=1e-10),
205205
)
206206

207207
outputs = fl.Flow360Params.construct("data/case_params/outputs.yaml")
@@ -221,7 +221,7 @@ def test_update_from_multiple_files_dont_overwrite():
221221
geometry=fl.Geometry("data/case_params/geometry.yaml"),
222222
boundaries=fl.Boundaries("data/case_params/boundaries.yaml"),
223223
freestream=fl.FreestreamFromVelocity(velocity=286, alpha=3.06),
224-
navier_stokes_solver=fl.NavierStokesSolver(linear_iterations=10),
224+
navier_stokes_solver=fl.NavierStokesSolver(absolute_tolerance=1e-10),
225225
)
226226

227227
outputs = fl.Flow360Params.construct("data/case_params/outputs.yaml")
@@ -236,7 +236,7 @@ def test_update_from_multiple_files_overwrite():
236236
geometry=fl.Geometry("data/case_params/geometry.yaml"),
237237
boundaries=fl.Boundaries("data/case_params/boundaries.yaml"),
238238
freestream=fl.FreestreamFromVelocity(velocity=286, alpha=3.06),
239-
navier_stokes_solver=fl.NavierStokesSolver(linear_iterations=10),
239+
navier_stokes_solver=fl.NavierStokesSolver(absolute_tolerance=1e-10),
240240
)
241241

242242
outputs = fl.Flow360Params.construct("data/case_params/outputs.yaml")

0 commit comments

Comments
 (0)