NASA CRM-HL example#
In this tutorial case we are looking at a 3-element airfoil, which is a cross-section of the NASA CRM-HL configuration. Documentation for this tutorial is available here
1import flow360 as fl
2from flow360.examples import Tutorial2DCRM
3
4Tutorial2DCRM.get_files()
5
6project = fl.Project.from_file(Tutorial2DCRM.geometry, name="Tutorial 2D CRM 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(name="farfield", 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=1.8487111e-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.2,
79 reynolds=5e6,
80 project_length_unit=1 * fl.u.m,
81 temperature=272.1,
82 alpha=16 * 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 name="wall",
94 ),
95 fl.Freestream(surfaces=farfield.farfield, name="Freestream"),
96 fl.SlipWall(surfaces=farfield.symmetry_planes, name="slipwall"),
97 fl.Fluid(
98 navier_stokes_solver=fl.NavierStokesSolver(
99 absolute_tolerance=1e-11,
100 linear_solver=fl.LinearSolver(max_iterations=35),
101 kappa_MUSCL=0.33,
102 ),
103 turbulence_model_solver=fl.SpalartAllmaras(
104 absolute_tolerance=1e-10,
105 linear_solver=fl.LinearSolver(max_iterations=25),
106 equation_evaluation_frequency=1,
107 ),
108 ),
109 ],
110 outputs=[
111 fl.VolumeOutput(
112 name="fl.VolumeOutput",
113 output_fields=[
114 "primitiveVars",
115 "vorticity",
116 "residualNavierStokes",
117 "residualTurbulence",
118 "Cp",
119 "Mach",
120 "qcriterion",
121 "mut",
122 ],
123 ),
124 fl.SurfaceOutput(
125 name="fl.SurfaceOutput",
126 surfaces=geometry["*"],
127 output_fields=["primitiveVars", "Cp", "Cf", "CfVec", "yPlus"],
128 ),
129 ],
130 )
131
132
133project.run_case(params=params, name="Case of tutorial 2D CRM from Python")