Skip to content

Commit

Permalink
new tutorials for UDD cases (#612)
Browse files Browse the repository at this point in the history
* new udd tutorials

* removed repetitive examples

---------

Co-authored-by: wiktor <wiktor.flexcompute.com>
  • Loading branch information
wiktor-flex authored and benflexcompute committed Dec 11, 2024
1 parent 03bd41e commit bbc817e
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 16 deletions.
72 changes: 72 additions & 0 deletions examples/tutorials/tutorial_udd_alpha_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import flow360 as fl
from flow360.examples import OM6wing

OM6wing.get_files()

project = fl.Project.from_file(
OM6wing.mesh_filename, name="Tutorial UDD alpha controller from Python"
)

volume_mesh = project.volume_mesh

with fl.SI_unit_system:
params = fl.SimulationParams(
reference_geometry=fl.ReferenceGeometry(
area=1.15315,
moment_center=[0, 0, 0],
moment_length=[1.47601, 0.80167, 1.47601],
),
operating_condition=fl.operating_condition_from_mach_reynolds(
reynolds=11.72e6,
mach=0.84,
project_length_unit=0.80167 * fl.u.m,
temperature=297.78,
alpha=3.06 * fl.u.deg,
beta=0 * fl.u.deg,
),
models=[
fl.Wall(name="NoSlipWall", surfaces=[volume_mesh["1"]]),
fl.SlipWall(name="SlipWall", surfaces=[volume_mesh["2"]]),
fl.Freestream(name="Freestream", surfaces=[volume_mesh["3"]]),
],
time_stepping=fl.Steady(
max_steps=2000,
),
user_defined_dynamics=[
fl.UserDefinedDynamic(
name="alphaController",
input_vars=["CL"],
constants={"CLTarget": 0.4, "Kp": 0.2, "Ki": 0.002},
output_vars={"alphaAngle": "if (pseudoStep > 500) state[0]; else alphaAngle;"},
state_vars_initial_value=["alphaAngle", "0.0"],
update_law=[
"if (pseudoStep > 500) state[0] + Kp * (CLTarget - CL) + Ki * state[1]; else state[0];",
"if (pseudoStep > 500) state[1] + (CLTarget - CL); else state[1];",
],
input_boundary_patches=[volume_mesh["1"]],
)
],
outputs=[
fl.VolumeOutput(
output_fields=[
"vorticity",
"Cp",
"mut",
"qcriterion",
"Mach",
]
),
fl.SurfaceOutput(
surfaces=volume_mesh["1"],
output_fields=[
"primitiveVars",
"Cp",
"Cf",
"CfVec",
"yPlus",
],
),
],
)

project.run_case(params=params, name="Case of tutorial UDD alpha controller from Python")
177 changes: 177 additions & 0 deletions examples/tutorials/tutorial_udd_forces_and_moments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
import flow360 as fl
from flow360.examples import TutorialUDDForcesMoments

TutorialUDDForcesMoments.get_files()

project = fl.Project.from_file(
TutorialUDDForcesMoments.geometry, name="Tutorial UDD forces and moments from Python"
)
geometry = project.geometry

geometry.show_available_groupings()
geometry.group_edges_by_tag("edgeName")
geometry.group_faces_by_tag("groupName")

with fl.SI_unit_system:
box1 = fl.Box(name="box1", size=[2, 6, 3], center=[6.5, 9, 0], axis_of_rotation=[0, 1, 0])
box2 = fl.Box(name="box2", size=[2, 6, 3], center=[6.5, -9, 0], axis_of_rotation=[0, 1, 0])
box3 = fl.Box(name="box3", size=[4, 8, 3], center=[12, 0, 2], axis_of_rotation=[0, 1, 0])
farfield = fl.AutomatedFarfield(name="farfield")
params = fl.SimulationParams(
meshing=fl.MeshingParams(
defaults=fl.MeshingDefaults(
surface_max_edge_length=0.5,
curvature_resolution_angle=10 * fl.u.deg,
boundary_layer_first_layer_thickness=2e-6,
boundary_layer_growth_rate=1.2,
),
refinement_factor=1,
refinements=[
fl.SurfaceEdgeRefinement(
method=fl.AngleBasedRefinement(value=1 * fl.u.deg),
edges=[geometry["leadingEdge"]],
),
fl.SurfaceEdgeRefinement(
method=fl.HeightBasedRefinement(value=5e-3), edges=[geometry["trailingEdge"]]
),
fl.SurfaceRefinement(max_edge_length=0.5, faces=[geometry["wing*"]]),
fl.UniformRefinement(
name="box_refinement1", entities=[box1, box2, box3], spacing=0.2
),
],
volume_zones=[farfield],
),
reference_geometry=fl.ReferenceGeometry(
area=60, moment_center=[5.7542, 0, 0], moment_length=[1, 1, 1]
),
operating_condition=fl.AerospaceCondition(
velocity_magnitude=50,
alpha=10 * fl.u.deg,
atmosphere=fl.ThermalState(temperature=288.15),
),
models=[
fl.Fluid(
navier_stokes_solver=fl.NavierStokesSolver(
absolute_tolerance=1e-9, linear_solver=fl.LinearSolver(max_iterations=35)
),
turbulence_model_solver=fl.SpalartAllmaras(
linear_solver=fl.LinearSolver(max_iterations=25)
),
),
fl.Wall(
name="NoSlipWall",
surfaces=[geometry["*Left"], geometry["*Right"], geometry["fuselage"]],
),
fl.Freestream(name="Freestream", surfaces=[farfield.farfield]),
],
time_stepping=fl.Steady(max_steps=5000),
outputs=[
fl.VolumeOutput(
output_fields=["primitiveVars", "vorticity", "qcriterion", "Cp", "Mach"]
),
fl.SurfaceOutput(
surfaces=[geometry["*"]],
output_fields=["primitiveVars", "Cf", "wallDistance", "Cp", "CfVec", "yPlus"],
),
],
user_defined_dynamics=[
fl.UserDefinedDynamic(
name="rightAileronHingeTorque",
input_vars=["forceX", "forceY", "forceZ", "momentX", "momentY", "momentZ"],
constants={
"density_kgpm3": 1.225,
"c_inf_mps": 340.29400580821283,
"l_grid_unit": 1,
"newCenterX": 5.7542,
"newCenterY": 7,
"newCenterZ": 0,
"newAxisX": 0,
"newAxisY": 1,
"newAxisZ": 0,
},
state_vars_initial_value=["0.0", "0.0", "0.0", "0.0", "0.0"],
update_law=[
"density_kgpm3 * c_inf_mps * c_inf_mps * l_grid_unit * l_grid_unit * l_grid_unit;",
"(momentX - ((newCenterY - momentCenterY) * forceZ - (newCenterZ - momentCenterZ) * forceY)) * state[0];",
"(momentY + ((newCenterX - momentCenterX) * forceZ - (newCenterZ - momentCenterZ) * forceX)) * state[0];",
"(momentZ - ((newCenterX - momentCenterX) * forceY - (newCenterY - momentCenterY) * forceX)) * state[0];",
"state[1] * newAxisX + state[2] * newAxisY + state[3] * newAxisZ;",
],
input_boundary_patches=[geometry["aileronRight"]],
),
fl.UserDefinedDynamic(
name="leftAileronHingeTorque",
input_vars=["forceX", "forceY", "forceZ", "momentX", "momentY", "momentZ"],
constants={
"density_kgpm3": 1.225,
"c_inf_mps": 340.29400580821283,
"l_grid_unit": 1,
"newCenterX": 5.7542,
"newCenterY": -7,
"newCenterZ": 0,
"newAxisX": 0,
"newAxisY": -1,
"newAxisZ": 0,
},
state_vars_initial_value=["0.0", "0.0", "0.0", "0.0", "0.0"],
update_law=[
"density_kgpm3 * c_inf_mps * c_inf_mps * l_grid_unit * l_grid_unit * l_grid_unit",
"(momentX - ((newCenterY - momentCenterY) * forceZ - (newCenterZ - momentCenterZ) * forceY)) * state[0];",
"(momentY + ((newCenterX - momentCenterX) * forceZ - (newCenterZ - momentCenterZ) * forceX)) * state[0];",
"(momentZ - ((newCenterX - momentCenterX) * forceY - (newCenterY - momentCenterY) * forceX)) * state[0];",
"state[1] * newAxisX + state[2] * newAxisY + state[3] * newAxisZ ",
],
input_boundary_patches=[geometry["aileronLeft"]],
),
fl.UserDefinedDynamic(
name="rightRudderHingeTorque",
input_vars=["forceX", "forceY", "forceZ", "momentX", "momentY", "momentZ"],
constants={
"density_kgpm3": 1.225,
"c_inf_mps": 340.29400580821283,
"l_grid_unit": 1,
"newCenterX": 12.01,
"newCenterY": 0.861,
"newCenterZ": 0.861,
"newAxisX": 0,
"newAxisY": 0.7071,
"newAxisZ": 0.7071,
},
state_vars_initial_value=["0.0", "0.0", "0.0", "0.0", "0.0"],
update_law=[
"density_kgpm3 * c_inf_mps * c_inf_mps * l_grid_unit * l_grid_unit * l_grid_unit",
"(momentX - ((newCenterY - momentCenterY) * forceZ - (newCenterZ - momentCenterZ) * forceY)) * state[0];",
"(momentY + ((newCenterX - momentCenterX) * forceZ - (newCenterZ - momentCenterZ) * forceX)) * state[0];",
"(momentZ - ((newCenterX - momentCenterX) * forceY - (newCenterY - momentCenterY) * forceX)) * state[0];",
"state[1] * newAxisX + state[2] * newAxisY + state[3] * newAxisZ ",
],
input_boundary_patches=[geometry["rudderRight"]],
),
fl.UserDefinedDynamic(
name="leftRudderHingeTorque",
input_vars=["forceX", "forceY", "forceZ", "momentX", "momentY", "momentZ"],
constants={
"density_kgpm3": 1.225,
"c_inf_mps": 340.29400580821283,
"l_grid_unit": 1,
"newCenterX": 12.01,
"newCenterY": -0.861,
"newCenterZ": 0.861,
"newAxisX": 0,
"newAxisY": -0.7071,
"newAxisZ": 0.7071,
},
state_vars_initial_value=["0.0", "0.0", "0.0", "0.0", "0.0"],
update_law=[
"density_kgpm3 * c_inf_mps * c_inf_mps * l_grid_unit * l_grid_unit * l_grid_unit",
"(momentX - ((newCenterY - momentCenterY) * forceZ - (newCenterZ - momentCenterZ) * forceY)) * state[0];",
"(momentY + ((newCenterX - momentCenterX) * forceZ - (newCenterZ - momentCenterZ) * forceX)) * state[0];",
"(momentZ - ((newCenterX - momentCenterX) * forceY - (newCenterY - momentCenterY) * forceX)) * state[0];",
"state[1] * newAxisX + state[2] * newAxisY + state[3] * newAxisZ ",
],
input_boundary_patches=[geometry["rudderLeft"]],
),
],
)

project.run_case(params, name="Case of tutorial UDD forces and moments from Python")
4 changes: 2 additions & 2 deletions flow360/examples/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from .cylinder3D import Cylinder3D
from .monitors import MonitorsAndSlices
from .om6wing import OM6wing
from .om6wing_user_defined_dynamics import OM6wingUserDefinedDynamics
from .rotating_spheres import RotatingSpheres
from .tutorial_2D_30p30n import Tutorial2D30p30n
from .tutorial_2D_crm import Tutorial2DCRM
Expand All @@ -18,6 +17,7 @@
from .tutorial_dynamic_derivatives import TutorialDynamicDerivatives
from .tutorial_periodic_BC import TutorialPeriodicBC
from .tutorial_RANS_xv15 import TutorialRANSXv15
from .tutorial_UDD_forces_moments import TutorialUDDForcesMoments

__all__ = [
"ActuatorDisk",
Expand All @@ -29,7 +29,6 @@
"Cylinder3D",
"MonitorsAndSlices",
"OM6wing",
"OM6wingUserDefinedDynamics",
"RotatingSpheres",
"Tutorial2DCRM",
"Tutorial2D30p30n",
Expand All @@ -40,4 +39,5 @@
"TutorialAutoMeshingInternalFlow",
"TutorialDynamicDerivatives",
"TutorialRANSXv15",
"TutorialUDDForcesMoments",
]
14 changes: 0 additions & 14 deletions flow360/examples/om6wing_user_defined_dynamics.py

This file was deleted.

12 changes: 12 additions & 0 deletions flow360/examples/tutorial_UDD_forces_moments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""
tutorial of UDD forces and moments example
"""

from .base_test_case import BaseTestCase


class TutorialUDDForcesMoments(BaseTestCase):
name = "tutorialUDDForcesMoments"

class url:
geometry = "https://simcloud-public-1.s3.amazonaws.com/tutorials/user_defined_postprocessing/UDD_FM_airplane.csm"

0 comments on commit bbc817e

Please sign in to comment.