Source code for flow360.component.meshing.params
"""
Flow360 meshing parameters
"""
from typing import List, Optional, Union, get_args
import pydantic as pd
from typing_extensions import Literal
from ..flow360_params.params_base import (
Flow360BaseModel,
Flow360SortableBaseModel,
_self_named_property_validator,
flow360_json_encoder,
)
from ..types import Axis, Coordinate, NonNegativeFloat, PositiveFloat, Size
[docs]
class Aniso(Flow360BaseModel):
"""Aniso edge"""
type = pd.Field("aniso", const=True)
method: Literal["angle", "height", "aspectRatio"] = pd.Field()
value: PositiveFloat = pd.Field()
adapt: Optional[bool] = pd.Field()
[docs]
class ProjectAniso(Flow360BaseModel):
"""ProjectAniso edge"""
type = pd.Field("projectAnisoSpacing", const=True)
adapt: Optional[bool] = pd.Field()
[docs]
class UseAdjacent(Flow360BaseModel):
"""ProjectAniso edge"""
type = pd.Field("useAdjacent", const=True)
adapt: Optional[bool] = pd.Field()
EdgeType = Union[Aniso, ProjectAniso, UseAdjacent]
class _GenericEdgeWrapper(Flow360BaseModel):
v: EdgeType
class Edges(Flow360SortableBaseModel):
""":class:`Edges` class for setting up Edges meshing constrains
Parameters
----------
<edge_name> : EdgeType
Supported edge types: Union[Aniso, ProjectAniso, UseAdjacent]
Returns
-------
:class:`Edges`
An instance of the component class Edges.
Example
-------
>>>
"""
@classmethod
def get_subtypes(cls) -> list:
return list(get_args(_GenericEdgeWrapper.__fields__["v"].type_))
# pylint: disable=no-self-argument
@pd.root_validator(pre=True)
def validate_edge(cls, values):
"""Validator for edge list section
Raises
------
ValidationError
When edge is incorrect
"""
return _self_named_property_validator(
values, _GenericEdgeWrapper, msg="is not any of supported edge types."
)
class Face(Flow360BaseModel):
"""Face"""
max_edge_length: PositiveFloat = pd.Field(alias="maxEdgeLength")
adapt: Optional[bool] = pd.Field()
FaceType = Face
class _GenericFaceWrapper(Flow360BaseModel):
v: FaceType
class Faces(Flow360SortableBaseModel):
""":class:`Faces` class for setting up Faces meshing constrains
Parameters
----------
<face_name> : Face
Supported face types: Face(max_edge_lengt=)
Returns
-------
:class:`Faces`
An instance of the component class Faces.
Example
-------
>>>
"""
@classmethod
def get_subtypes(cls) -> list:
return [_GenericFaceWrapper.__fields__["v"].type_]
# pylint: disable=no-self-argument
@pd.root_validator(pre=True)
def validate_face(cls, values):
"""Validator for face list section
Raises
------
ValidationError
When face is incorrect
"""
return _self_named_property_validator(
values, _GenericFaceWrapper, msg="is not any of supported face types."
)
[docs]
class SurfaceMeshingParams(Flow360BaseModel):
"""
Flow360 Surface Meshing parameters
"""
max_edge_length: PositiveFloat = pd.Field(alias="maxEdgeLength")
edges: Optional[Edges] = pd.Field()
faces: Optional[Faces] = pd.Field()
curvature_resolution_angle: Optional[PositiveFloat] = pd.Field(
alias="curvatureResolutionAngle", default=15
)
growth_rate: Optional[PositiveFloat] = pd.Field(alias="growthRate", default=1.2)
[docs]
def flow360_json(self) -> str:
"""Generate a JSON representation of the model, as required by Flow360
Returns
-------
json
Returns JSON representation of the model.
Example
-------
>>> params.flow360_json() # doctest: +SKIP
"""
return self.json(encoder=flow360_json_encoder)
class Refinement(Flow360BaseModel):
"""Base class for refinement zones"""
center: Coordinate = pd.Field()
spacing: PositiveFloat
class BoxRefinement(Refinement):
"""
Box refinement zone
"""
type = pd.Field("box", const=True)
size: Size = pd.Field()
axis_of_rotation: Optional[Axis] = pd.Field(alias="axisOfRotation", default=(0, 0, 1))
angle_of_rotation: Optional[float] = pd.Field(alias="angleOfRotation", default=0)
class CylinderRefinement(Refinement):
"""
Box refinement zone
"""
type = pd.Field("cylinder", const=True)
radius: PositiveFloat = pd.Field()
length: PositiveFloat = pd.Field()
axis: Axis = pd.Field()
class Farfield(Flow360BaseModel):
"""
Farfield type for meshing
"""
type: Literal["auto", "quasi-3d"] = pd.Field()
[docs]
class Volume(Flow360BaseModel):
"""
Core volume meshing parameters
"""
first_layer_thickness: PositiveFloat = pd.Field(alias="firstLayerThickness")
growth_rate: Optional[PositiveFloat] = pd.Field(alias="growthRate", default=1.2)
gap_treatment_strength: Optional[pd.confloat(ge=0, le=1)] = pd.Field(
alias="gapTreatmentStrength"
)
class RotationalModelBase(Flow360BaseModel):
""":class: RotorDisk"""
name: Optional[str] = pd.Field()
inner_radius: Optional[NonNegativeFloat] = pd.Field(alias="innerRadius", default=0)
outer_radius: PositiveFloat = pd.Field(alias="outerRadius")
thickness: PositiveFloat = pd.Field()
center: Coordinate = pd.Field()
spacing_axial: PositiveFloat = pd.Field(alias="spacingAxial")
spacing_radial: PositiveFloat = pd.Field(alias="spacingRadial")
spacing_circumferential: PositiveFloat = pd.Field(alias="spacingCircumferential")
[docs]
class RotorDisk(RotationalModelBase):
""":class: RotorDisk"""
axis_thrust: Axis = pd.Field(alias="axisThrust")
class SlidingInterface(RotationalModelBase):
""":class: SlidingInterface for meshing"""
axis_of_rotation: Axis = pd.Field(alias="axisOfRotation")
enclosed_objects: Optional[List[str]] = pd.Field(alias="enclosedObjects", default=[])
[docs]
class VolumeMeshingParams(Flow360BaseModel):
"""
Flow360 Volume Meshing parameters
"""
volume: Volume = pd.Field()
refinement_factor: Optional[PositiveFloat] = pd.Field(alias="refinementFactor")
farfield: Optional[Farfield] = pd.Field()
refinement: Optional[List[Union[BoxRefinement, CylinderRefinement]]] = pd.Field()
rotor_disks: Optional[List[RotorDisk]] = pd.Field(alias="rotorDisks")
sliding_interfaces: Optional[List[SlidingInterface]] = pd.Field(alias="slidingInterfaces")
[docs]
def flow360_json(self) -> str:
"""Generate a JSON representation of the model, as required by Flow360
Returns
-------
json
Returns JSON representation of the model.
Example
-------
>>> params.flow360_json() # doctest: +SKIP
"""
return self.json(encoder=flow360_json_encoder)