2D 30p30n#
This example demonstrates the configuration and execution of a steady-state simulation for aerodynamic analysis of the 2D 30p30n multi-element airfoil using the Flow360 Python API. The process encompasses geometry import, automated mesh generation with multiple refinement strategies, specification of simulation parameters including the Spalart-Allmaras turbulence model, and definition of desired outputs before case submission via the Project
interface.
1import flow360 as fl
2from flow360.examples import Tutorial2D30p30n
3
4Tutorial2D30p30n.get_files()
5
6project = fl.Project.from_geometry(Tutorial2D30p30n.geometry, name="Tutorial 2D 30p30n from Python")
7geometry = project.geometry
8
9# show face and edge groupings
10geometry.show_available_groupings(verbose_mode=True)
11geometry.group_faces_by_tag("faceName")
12geometry.group_edges_by_tag("edgeName")
13
14
15with fl.SI_unit_system:
16 cylinders = [
17 fl.Cylinder(
18 name=f"cylinder{i+1}",
19 axis=[0, 1, 0],
20 center=[0.7, 0.5, 0],
21 outer_radius=outer_radius,
22 height=1.0,
23 )
24 for i, outer_radius in enumerate([1.1, 2.2, 3.3, 4.5])
25 ]
26 cylinder5 = fl.Cylinder(
27 name="cylinder5", axis=[-1, 0, 0], center=[6.5, 0.5, 0], outer_radius=6.5, height=10
28 )
29 farfield = fl.AutomatedFarfield(method="quasi-3d")
30 params = fl.SimulationParams(
31 meshing=fl.MeshingParams(
32 defaults=fl.MeshingDefaults(
33 surface_edge_growth_rate=1.17,
34 surface_max_edge_length=1.1,
35 curvature_resolution_angle=12 * fl.u.deg,
36 boundary_layer_growth_rate=1.17,
37 boundary_layer_first_layer_thickness=4.9536767e-06,
38 ),
39 refinement_factor=1.35,
40 gap_treatment_strength=0.5,
41 volume_zones=[farfield],
42 refinements=[
43 fl.UniformRefinement(name="refinement1", spacing=0.1, entities=[cylinders[0]]),
44 fl.UniformRefinement(name="refinement2", spacing=0.15, entities=[cylinders[1]]),
45 fl.UniformRefinement(name="refinement3", spacing=0.225, entities=[cylinders[2]]),
46 fl.UniformRefinement(name="refinement4", spacing=0.275, entities=[cylinders[3]]),
47 fl.UniformRefinement(name="refinement5", spacing=0.325, entities=[cylinder5]),
48 fl.SurfaceRefinement(name="wing", max_edge_length=0.74, faces=[geometry["wing"]]),
49 fl.SurfaceRefinement(
50 name="flap-slat",
51 max_edge_length=0.55,
52 faces=[geometry["flap"], geometry["slat"]],
53 ),
54 fl.SurfaceRefinement(
55 name="trailing",
56 max_edge_length=0.36,
57 faces=[
58 geometry["*Trailing"],
59 ],
60 ),
61 fl.SurfaceEdgeRefinement(
62 name="edges",
63 method=fl.HeightBasedRefinement(value=0.0007),
64 edges=[
65 geometry["*trailingEdge"],
66 geometry["*leadingEdge"],
67 ],
68 ),
69 fl.SurfaceEdgeRefinement(
70 name="symmetry", method=fl.ProjectAnisoSpacing(), edges=[geometry["symmetry"]]
71 ),
72 ],
73 ),
74 reference_geometry=fl.ReferenceGeometry(
75 moment_center=[0.25, 0, 0], moment_length=[1, 1, 1], area=0.01
76 ),
77 operating_condition=fl.operating_condition_from_mach_reynolds(
78 mach=0.17,
79 reynolds=1.71e06,
80 project_length_unit=1 * fl.u.m,
81 temperature=288.16,
82 alpha=8.5 * fl.u.deg,
83 beta=0 * fl.u.deg,
84 ),
85 time_stepping=fl.Steady(
86 max_steps=3000, CFL=fl.RampCFL(initial=20, final=300, ramp_steps=500)
87 ),
88 models=[
89 fl.Wall(
90 surfaces=[
91 geometry["*"],
92 ],
93 ),
94 fl.Freestream(surfaces=farfield.farfield),
95 fl.SlipWall(surfaces=farfield.symmetry_planes),
96 fl.Fluid(
97 navier_stokes_solver=fl.NavierStokesSolver(
98 absolute_tolerance=1e-11,
99 linear_solver=fl.LinearSolver(max_iterations=35),
100 kappa_MUSCL=0.33,
101 ),
102 turbulence_model_solver=fl.SpalartAllmaras(
103 absolute_tolerance=1e-10,
104 linear_solver=fl.LinearSolver(max_iterations=25),
105 equation_evaluation_frequency=1,
106 ),
107 ),
108 ],
109 outputs=[
110 fl.VolumeOutput(
111 output_fields=[
112 "primitiveVars",
113 "vorticity",
114 "residualNavierStokes",
115 "residualTurbulence",
116 "Cp",
117 "Mach",
118 "qcriterion",
119 "mut",
120 ],
121 ),
122 fl.SurfaceOutput(
123 surfaces=geometry["*"],
124 output_fields=["primitiveVars", "Cp", "Cf", "CfVec", "yPlus"],
125 ),
126 ],
127 )
128
129
130project.run_case(params=params, name="Case of tutorial 2D 30p30n from Python")
Notes#
The
AutomatedFarfield
is configured withmethod="quasi-3d"
to establish appropriate farfield conditions for a 2D simulation within a 3D mesh framework, utilizing slip walls on symmetry planes.Multiple mesh refinement types (
UniformRefinement
via cylindrical zones,SurfaceRefinement
,SurfaceEdgeRefinement
) are employed to control mesh resolution near the airfoil components and critical geometric features like leading and trailing edges.Turbulent flow is modeled using the Spalart-Allmaras model, configured via
fl.SpalartAllmaras
.