Skip to main content
Version: 0.2.0

OpenAeroStruct VLM

The OasDiscipline wraps a complete OpenAeroStruct (OAS) vortex-lattice method (VLM) aerodynamic analysis as a single Philote discipline. Unlike the NACA and XFOIL disciplines which subclass ExplicitDiscipline, this discipline uses the OpenMdaoSubProblem pattern to package an entire OpenMDAO Group as a gRPC-servable discipline.

Architecture

The discipline contains two internal components:

┌─────────────────────────────────────────────────────┐
│ OasDiscipline (Philote gRPC server) │
│ │
│ ┌──────────────┐ ┌────────────────────────┐ │
│ │ Geometry │──mesh──▶ AeroPoint (VLM) │ │
│ │ (wing shape) │ │ (vortex-lattice solve)│ │
│ └──────────────┘ └────────────────────────┘ │
│ │
│ Inputs: Outputs: │
│ v (m/s) CL (scalar) │
│ alpha (deg) CD (scalar) │
│ Mach_number CM (3-vector) │
│ re (1/m) │
│ rho (kg/m^3) │
│ cg (3-vector, m) │
└─────────────────────────────────────────────────────┘

Geometry applies design variables (twist, chord, shear) to a baseline mesh.

AeroPoint runs the VLM aerodynamic analysis on the deformed mesh at the specified flight condition and computes lift, drag, and moment coefficients.

The OpenMdaoSubProblem Pattern

Where the NACA/XFOIL examples wrap external executables using ExplicitDiscipline, this example takes advantage of the fact that OAS is already an OpenMDAO Group. The OpenMdaoSubProblem base class handles the wrapping:

  1. Create an om.Group (OasAeroGroup) containing the solver components and their internal connections.
  2. Subclass OpenMdaoSubProblem and call self.add_group(group) to embed the Group in an internal om.Problem.
  3. Map inputs/outputs using self.add_mapped_input() and self.add_mapped_output() to define the Philote-level interface.

At runtime, compute() copies inputs into the internal problem, calls run_model(), and copies outputs back -- all handled by the base class.

When to use which pattern

Use caseRecommended class
Wrapping an external executable (file I/O)ExplicitDiscipline
Wrapping an OpenMDAO Group or ComponentOpenMdaoSubProblem
Need fine-grained control over compute logicExplicitDiscipline
Solver already built as an OpenMDAO modelOpenMdaoSubProblem

Inputs and Outputs

Inputs

Philote NameOpenMDAO PathShapeUnitsDescription
vv(1,)m/sFreestream velocity
alphaalpha(1,)degAngle of attack
Mach_numberMach_number(1,)--Mach number
rere(1,)1/mReynolds number per unit length
rhorho(1,)kg/m^3Air density
cgcg(3,)mCenter of gravity position

Outputs

Philote NameOpenMDAO PathShapeUnitsDescription
CLaero_point_0.wing_perf.CL(1,)--Lift coefficient
CDaero_point_0.wing_perf.CD(1,)--Drag coefficient
CMaero_point_0.CM(3,)--Moment coefficient vector

Mesh Configuration

Pass a mesh_dict to OasDiscipline to change the wing planform:

from philote_examples import OasDiscipline

# Default: rectangular wing (10 m span, 1 m chord, 7 spanwise panels)
discipline = OasDiscipline()

# CRM wing with 13 spanwise panels
discipline = OasDiscipline(
mesh_dict={
"num_y": 13,
"num_x": 3,
"wing_type": "CRM",
"symmetry": True,
"num_twist_cp": 5,
}
)

The default mesh configuration is:

{
"num_y": 7,
"num_x": 2,
"wing_type": "rect",
"symmetry": True,
"span": 10.0,
"root_chord": 1.0,
}

Surface Properties

Use surface_options to override defaults like viscous drag or baseline CD:

discipline = OasDiscipline(
surface_options={
"with_viscous": True,
"CD0": 0.015,
"with_wave": True,
}
)

The default surface properties include:

PropertyDefaultDescription
CL00.0Baseline lift coefficient
CD00.0Baseline drag coefficient
k_lam0.05Fraction of chord with laminar flow
t_over_c_cp[0.15]Thickness-to-chord ratio
c_max_t0.303Chordwise location of max thickness
with_viscousFalseEnable viscous drag estimation
with_waveFalseEnable wave drag estimation

Example Usage

from philote_examples import OasDiscipline
from philote_mdo.general import run_server

# Create the discipline with default rectangular wing
discipline = OasDiscipline()

# Start the gRPC server on port 50051
run_server(discipline, port=50051)