Steady Solver Convergence Testing¶
"""Demonstrates analyzing the convergence of a steady simulation with multiple
airplanes.
The script will likely take a few minutes to run, and will log convergence progress and
results in a log file.
"""
import logging
import pterasoftware as ps
# Configure logging to write info level messages to a file. To display log messages on
# the console instead, omit the handler argument.
ps.set_up_logging(level="Info", handler=logging.FileHandler("example_convergence.log"))
# Create two Airplanes. Read through the solver and formation examples for more details
# on creating these Airplanes.
leading_airplane = ps.geometry.airplane.Airplane(
wings=[
ps.geometry.wing.Wing(
wing_cross_sections=[
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=8,
control_surface_symmetry_type="asymmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=8,
Lp_Wcsp_Lpp=(0.0, 5.0, 0.0),
control_surface_symmetry_type="symmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=None,
Lp_Wcsp_Lpp=(0.25, 10.0, 0.0),
control_surface_symmetry_type="symmetric",
),
],
name="Main Wing",
symmetric=True,
symmetryNormal_G=(0, 1, 0),
symmetryPoint_G_Cg=(0, 0, 0),
chordwise_spacing="uniform",
),
ps.geometry.wing.Wing(
wing_cross_sections=[
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca0012",
),
num_spanwise_panels=8,
control_surface_symmetry_type="symmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca0012",
),
num_spanwise_panels=None,
Lp_Wcsp_Lpp=(0.0, 5.0, 0.0),
control_surface_symmetry_type="symmetric",
),
],
name="Tail",
Ler_Gs_Cgs=(10, 0, 0),
symmetric=True,
symmetryNormal_G=(0, 1, 0),
symmetryPoint_G_Cg=(0, 0, 0),
chordwise_spacing="uniform",
),
],
name="Leading Airplane",
)
trailing_airplane = ps.geometry.airplane.Airplane(
wings=[
ps.geometry.wing.Wing(
wing_cross_sections=[
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=8,
control_surface_symmetry_type="asymmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=8,
Lp_Wcsp_Lpp=(0.0, 5.0, 0.0),
control_surface_symmetry_type="symmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca2412",
),
num_spanwise_panels=None,
Lp_Wcsp_Lpp=(0.25, 10.0, 0.0),
control_surface_symmetry_type="symmetric",
),
],
name="Main Wing",
symmetric=True,
symmetryNormal_G=(0, 1, 0),
symmetryPoint_G_Cg=(0, 0, 0),
chordwise_spacing="uniform",
),
ps.geometry.wing.Wing(
wing_cross_sections=[
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca0012",
),
num_spanwise_panels=8,
control_surface_symmetry_type="symmetric",
spanwise_spacing="cosine",
),
ps.geometry.wing_cross_section.WingCrossSection(
airfoil=ps.geometry.airfoil.Airfoil(
name="naca0012",
),
num_spanwise_panels=None,
Lp_Wcsp_Lpp=(0.0, 5.0, 0.0),
control_surface_symmetry_type="symmetric",
),
],
name="Tail",
Ler_Gs_Cgs=(10, 0, 0),
symmetric=True,
symmetryNormal_G=(0, 1, 0),
symmetryPoint_G_Cg=(0, 0, 0),
chordwise_spacing="uniform",
),
],
name="Trailing Airplane",
Cg_GP1_CgP1=(-20, 5, 0),
)
# Create an OperatingPoint.
operating_point = ps.operating_point.OperatingPoint()
# Create a SteadyProblem. We will pass this into the convergence function.
steady_problem = ps.problems.SteadyProblem(
airplanes=[leading_airplane, trailing_airplane],
operating_point=operating_point,
)
del leading_airplane
del trailing_airplane
del operating_point
# Run the steady convergence analysis. This will run several simulations, modifying
# average Panel aspect ratio and number of chordwise Panels with each iteration. Once it
# detects that each load coefficient has stopped changing by more than the relative
# tolerance (rtol) plus the absolute tolerance (atol) between successive meshes, it will
# return the parameters it found to result in a converged solution. See the
# analyze_steady_convergence function docstring for more details.
ps.convergence.analyze_steady_convergence(
ref_problem=steady_problem,
solver_type="steady ring vortex lattice method",
panel_aspect_ratio_bounds=(4, 1),
num_chordwise_panels_bounds=(3, 8),
rtol=0.01,
atol=0.001,
)
Output¶
Convergence log
INFO |convergence |Beginning convergence analysis
INFO |convergence | Converging:
INFO |convergence | cFX_W
INFO |convergence | cFY_W
INFO |convergence | cFZ_W
INFO |convergence | cMX_W_CgP1
INFO |convergence | cMY_W_CgP1
INFO |convergence | cMZ_W_CgP1
INFO |convergence | Panel aspect ratio: 4
INFO |convergence | Chordwise Panels: 3
INFO |convergence | Iteration number: 1/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0209 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence: not checked
INFO |convergence | Chordwise Panels: 4
INFO |convergence | Iteration number: 2/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0195 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 68.93%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 55.00%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 5
INFO |convergence | Iteration number: 3/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0318 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 98.77%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 6
INFO |convergence | Iteration number: 4/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0492 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 7
INFO |convergence | Iteration number: 5/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0782 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 8
INFO |convergence | Iteration number: 6/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.119 s
INFO |convergence | Panel aspect ratio convergence: not checked
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Panel aspect ratio: 3
INFO |convergence | Chordwise Panels: 3
INFO |convergence | Iteration number: 7/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0136 s
INFO |convergence | Panel aspect ratio convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Number of chordwise Panels convergence: not checked
INFO |convergence | Chordwise Panels: 4
INFO |convergence | Iteration number: 8/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0238 s
INFO |convergence | Panel aspect ratio convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 67.82%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 55.71%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 5
INFO |convergence | Iteration number: 9/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0387 s
INFO |convergence | Panel aspect ratio convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 93.77%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Chordwise Panels: 6
INFO |convergence | Iteration number: 10/24
INFO |convergence | Starting simulation
INFO |convergence | Simulation completed in 0.0684 s
INFO |convergence | Panel aspect ratio convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence | Number of chordwise Panels convergence:
INFO |convergence | cFX_W: 100.0%
INFO |convergence | cFY_W: 100.0%
INFO |convergence | cFZ_W: 100.0%
INFO |convergence | cMX_W_CgP1: 100.0%
INFO |convergence | cMY_W_CgP1: 100.0%
INFO |convergence | cMZ_W_CgP1: 100.0%
INFO |convergence |The analysis found a converged case:
INFO |convergence | Panel aspect ratio: 4
INFO |convergence | Chordwise Panels: 5
INFO |convergence | Simulation time: 0.0318 s
INFO |convergence | Spanwise Panels:
INFO |convergence | Leading Airplane:
INFO |convergence | Main Wing:
INFO |convergence | WingCrossSection 1: 6
INFO |convergence | WingCrossSection 2: 13
INFO |convergence | WingCrossSection 3: None
INFO |convergence | Tail:
INFO |convergence | WingCrossSection 1: 6
INFO |convergence | WingCrossSection 2: None
INFO |convergence | Trailing Airplane:
INFO |convergence | Main Wing:
INFO |convergence | WingCrossSection 1: 6
INFO |convergence | WingCrossSection 2: 13
INFO |convergence | WingCrossSection 3: None
INFO |convergence | Tail:
INFO |convergence | WingCrossSection 1: 6
INFO |convergence | WingCrossSection 2: None
INFO |convergence |Convergence analysis completed in 0.897 s