Skip to content

Commit 2802be2

Browse files
timryanbA-CGray
andauthored
Updating MPhys wrapper for 2.0 update (#428)
* Updating MPhys wrapper for 2.0 update * Updating recommended MPhys version in README * Updating recommended pygeo version for MPhys wrapper * Updating MPHys examples * Marking MPHys as optional in README * removing beta version requirement for MPhys * Minor README edit * Update build_real.sh * Fixing broken mphys tests * fixing formatting * fixing broken tests * formatting fix * black... --------- Co-authored-by: Alasdair Gray <alachris@umich.edu>
1 parent 4332e6e commit 2802be2

17 files changed

Lines changed: 231 additions & 98 deletions

.github/build_real.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
#!/bin/bash
22
set -e
3+
sed -i '/mphys/d' "$HOME/.config/pip/constraints.txt" # Remove the pip constraint on the mphys version
34
pip install .[testing,mphys]

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ Version Information
9494
The oldest and latest versions of the dependencies that we test regularly are the following (other versions may work, but no guarantees):
9595

9696
| Dependency | oldest | latest |
97-
| ------------------ | ------ | ------ |
97+
|--------------------|--------| ------ |
9898
| Python | 3.8 | 3.11 |
9999
| NumPy | 1.20 | latest |
100100
| SciPy | 1.6.0 | latest |
101101
| OpenMDAO | 3.15 | latest |
102-
| MPhys | 1.0.0 | latest |
103102
| Matplotlib | latest | latest |
103+
| MPhys (optional) | 2.0.0 | latest |
104104
| pyGeo (optional) | 1.6.0 | latest |
105105
| OpenVSP (optional) | 3.27.1 | 3.27.1 |
106106

openaerostruct/docs/advanced_features/scripts/mphys_opt_chord.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import openmdao.api as om
1111
import numpy as np
1212

13-
from mphys import Multipoint
14-
from mphys.scenario_aerodynamic import ScenarioAerodynamic
13+
from mphys.core import Multipoint, MPhysVariables
14+
from mphys.scenarios import ScenarioAerodynamic
1515
from pygeo.mphys import OM_DVGEOCOMP
1616

1717
from openaerostruct.geometry.utils import generate_vsp_surfaces
@@ -31,6 +31,7 @@ def setup(self):
3131
"S_ref_type": "wetted", # how we compute the wing area,
3232
# can be 'wetted' or 'projected'
3333
"twist_cp": np.zeros(3), # Define twist using 3 B-spline cp's
34+
"ref_axis_pos": 0.25, # Define the reference axis position. 0 is the leading edge, 1 is the trailing edge.
3435
# Aerodynamic performance of the lifting surface at
3536
# an angle of attack of 0 (alpha=0).
3637
# These CL0 and CD0 values are added to the CL and CD
@@ -61,12 +62,12 @@ def setup(self):
6162
re = 1e6
6263

6364
dvs = self.add_subsystem("dvs", om.IndepVarComp(), promotes=["*"])
64-
dvs.add_output("aoa", val=aoa, units="deg")
65-
dvs.add_output("yaw", val=beta, units="deg")
65+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=aoa, units="deg")
66+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=beta, units="deg")
6667
dvs.add_output("rho", val=rho, units="kg/m**3")
67-
dvs.add_output("mach", mach)
68+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, mach)
6869
dvs.add_output("v", vel, units="m/s")
69-
dvs.add_output("reynolds", re, units="1/m")
70+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER, re, units="1/m")
7071
dvs.add_output("cg", val=np.zeros((3)), units="m")
7172

7273
# Create mphys builder for aero solver
@@ -82,11 +83,25 @@ def setup(self):
8283
self.geometry.nom_add_discipline_coords("aero")
8384

8485
self.mphys_add_scenario("cruise", ScenarioAerodynamic(aero_builder=aero_builder))
85-
self.connect("mesh.x_aero0", "geometry.x_aero_in")
86-
self.connect("geometry.x_aero0", "cruise.x_aero")
86+
self.connect(
87+
f"mesh.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
88+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_INPUT}",
89+
)
90+
self.connect(
91+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_OUTPUT}",
92+
f"cruise.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
93+
)
8794

8895
# Connect dv ivc's to solver
89-
for dv in ["aoa", "yaw", "rho", "mach", "v", "reynolds", "cg"]:
96+
for dv in [
97+
MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK,
98+
MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE,
99+
MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER,
100+
MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER,
101+
"rho",
102+
"v",
103+
"cg",
104+
]:
90105
self.connect(dv, f"cruise.{dv}")
91106

92107
def configure(self):
@@ -119,7 +134,7 @@ def configure(self):
119134
prob.setup()
120135

121136
# Create a n^2 diagram for user to view model connections
122-
om.n2(prob)
137+
# om.n2(prob)
123138
prob.run_model()
124139
prob.run_driver()
125140
# Write optimized geometry to vsp file

openaerostruct/examples/rectangular_wing/mphys_example.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import openmdao.api as om
22
import numpy as np
33

4-
from mphys import Multipoint
5-
from mphys.scenario_aerodynamic import ScenarioAerodynamic
4+
from mphys.core import Multipoint, MPhysVariables
5+
from mphys.scenarios import ScenarioAerodynamic
66

77
from openaerostruct.geometry.utils import generate_mesh
88
from openaerostruct.mphys import AeroBuilder
@@ -62,12 +62,12 @@ def setup(self):
6262
re = 1e6
6363

6464
dvs = self.add_subsystem("dvs", om.IndepVarComp(), promotes=["*"])
65-
dvs.add_output("aoa", val=aoa, units="deg")
66-
dvs.add_output("yaw", val=beta, units="deg")
65+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=aoa, units="deg")
66+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=beta, units="deg")
6767
dvs.add_output("rho", val=rho, units="kg/m**3")
68-
dvs.add_output("mach", mach)
68+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, mach)
6969
dvs.add_output("v", vel, units="m/s")
70-
dvs.add_output("reynolds", re, units="1/m")
70+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER, re, units="1/m")
7171
dvs.add_output("cg", val=np.zeros((3)), units="m")
7272

7373
# Create mphys builder for aero solver
@@ -77,10 +77,21 @@ def setup(self):
7777
# Create mesh component and connect with solver
7878
self.add_subsystem("mesh", aero_builder.get_mesh_coordinate_subsystem())
7979
self.mphys_add_scenario("cruise", ScenarioAerodynamic(aero_builder=aero_builder))
80-
self.connect("mesh.x_aero0", "cruise.x_aero")
80+
self.connect(
81+
f"mesh.{MPhysVariables.Aerodynamics.Surface.Mesh.COORDINATES}",
82+
f"cruise.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
83+
)
8184

8285
# Connect dv ivc's to solver
83-
for dv in ["aoa", "yaw", "rho", "mach", "v", "reynolds", "cg"]:
86+
for dv in [
87+
MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK,
88+
MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE,
89+
MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER,
90+
MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER,
91+
"rho",
92+
"v",
93+
"cg",
94+
]:
8495
self.connect(dv, f"cruise.{dv}")
8596

8697

openaerostruct/examples/rectangular_wing/mphys_opt_chord.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import openmdao.api as om
1111
import numpy as np
1212

13-
from mphys import Multipoint
14-
from mphys.scenario_aerodynamic import ScenarioAerodynamic
13+
from mphys.core import Multipoint, MPhysVariables
14+
from mphys.scenarios import ScenarioAerodynamic
1515
from pygeo.mphys import OM_DVGEOCOMP
1616

1717
from openaerostruct.geometry.utils import generate_vsp_surfaces
@@ -62,12 +62,12 @@ def setup(self):
6262
re = 1e6
6363

6464
dvs = self.add_subsystem("dvs", om.IndepVarComp(), promotes=["*"])
65-
dvs.add_output("aoa", val=aoa, units="deg")
66-
dvs.add_output("yaw", val=beta, units="deg")
65+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=aoa, units="deg")
66+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=beta, units="deg")
6767
dvs.add_output("rho", val=rho, units="kg/m**3")
68-
dvs.add_output("mach", mach)
68+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, mach)
6969
dvs.add_output("v", vel, units="m/s")
70-
dvs.add_output("reynolds", re, units="1/m")
70+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER, re, units="1/m")
7171
dvs.add_output("cg", val=np.zeros((3)), units="m")
7272

7373
# Create mphys builder for aero solver
@@ -83,11 +83,25 @@ def setup(self):
8383
self.geometry.nom_add_discipline_coords("aero")
8484

8585
self.mphys_add_scenario("cruise", ScenarioAerodynamic(aero_builder=aero_builder))
86-
self.connect("mesh.x_aero0", "geometry.x_aero_in")
87-
self.connect("geometry.x_aero0", "cruise.x_aero")
86+
self.connect(
87+
f"mesh.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
88+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_INPUT}",
89+
)
90+
self.connect(
91+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_OUTPUT}",
92+
f"cruise.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
93+
)
8894

8995
# Connect dv ivc's to solver
90-
for dv in ["aoa", "yaw", "rho", "mach", "v", "reynolds", "cg"]:
96+
for dv in [
97+
MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK,
98+
MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE,
99+
MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER,
100+
MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER,
101+
"rho",
102+
"v",
103+
"cg",
104+
]:
91105
self.connect(dv, f"cruise.{dv}")
92106

93107
def configure(self):

openaerostruct/examples/rectangular_wing/mphys_opt_twist.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import openmdao.api as om
1010
import numpy as np
1111

12-
from mphys import Multipoint
13-
from mphys.scenario_aerodynamic import ScenarioAerodynamic
12+
from mphys.core import Multipoint, MPhysVariables
13+
from mphys.scenarios import ScenarioAerodynamic
1414
from pygeo.mphys import OM_DVGEOCOMP
1515

1616
from openaerostruct.geometry.utils import generate_vsp_surfaces
@@ -62,12 +62,12 @@ def setup(self):
6262
re = 1e6
6363

6464
dvs = self.add_subsystem("dvs", om.IndepVarComp(), promotes=["*"])
65-
dvs.add_output("aoa", val=aoa, units="deg")
66-
dvs.add_output("yaw", val=beta, units="deg")
65+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=aoa, units="deg")
66+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=beta, units="deg")
6767
dvs.add_output("rho", val=rho, units="kg/m**3")
68-
dvs.add_output("mach", mach)
68+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, mach)
6969
dvs.add_output("v", vel, units="m/s")
70-
dvs.add_output("reynolds", re, units="1/m")
70+
dvs.add_output(MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER, re, units="1/m")
7171
dvs.add_output("cg", val=np.zeros((3)), units="m")
7272

7373
# Create mphys builder for aero solver
@@ -83,11 +83,25 @@ def setup(self):
8383
self.geometry.nom_add_discipline_coords("aero")
8484

8585
self.mphys_add_scenario("cruise", ScenarioAerodynamic(aero_builder=aero_builder))
86-
self.connect("mesh.x_aero0", "geometry.x_aero_in")
87-
self.connect("geometry.x_aero0", "cruise.x_aero")
86+
self.connect(
87+
f"mesh.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
88+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_INPUT}",
89+
)
90+
self.connect(
91+
f"geometry.{MPhysVariables.Aerodynamics.Geometry.COORDINATES_OUTPUT}",
92+
f"cruise.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
93+
)
8894

8995
# Connect dv ivc's to solver
90-
for dv in ["aoa", "yaw", "rho", "mach", "v", "reynolds", "cg"]:
96+
for dv in [
97+
MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK,
98+
MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE,
99+
MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER,
100+
MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER,
101+
"rho",
102+
"v",
103+
"cg",
104+
]:
91105
self.connect(dv, f"cruise.{dv}")
92106

93107
def configure(self):

openaerostruct/mphys/aero_builder.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
from openaerostruct.mphys.aero_funcs_group import AeroFuncsGroup
1616

1717
try:
18-
from mphys.builder import Builder
19-
from mphys.distributed_converter import DistributedConverter, DistributedVariableDescription
18+
from mphys.core import Builder, MPhysVariables, DistributedConverter, DistributedVariableDescription
2019

2120
mphys_found = True
2221
except ImportError:
@@ -47,21 +46,33 @@ def initialize(self):
4746
self.options.declare("compressible", default=True, desc="prandtl glauert compressibiity flag", recordable=True)
4847

4948
def setup(self):
49+
self.surfaces = self.options["surfaces"]
5050
self.surfaces = self.options["surfaces"]
5151
self.compressible = self.options["compressible"]
5252

53-
self.set_input_defaults("aoa", val=0.0, units="deg")
54-
self.set_input_defaults("yaw", val=0.0, units="deg")
53+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=0.0, units="deg")
54+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=0.0, units="deg")
5555
if self.compressible:
56-
self.set_input_defaults("mach", val=0.0)
56+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, val=0.0)
5757

5858
nnodes = get_number_of_nodes(self.surfaces)
5959

6060
# Convert distributed mphys mesh input into a serial vector OAS can use
61-
in_vars = [DistributedVariableDescription(name="x_aero", shape=(nnodes * 3), tags=["mphys_coordinates"])]
61+
in_vars = [
62+
DistributedVariableDescription(
63+
name=MPhysVariables.Aerodynamics.Surface.COORDINATES, shape=(nnodes * 3), tags=["mphys_coordinates"]
64+
)
65+
]
6266

63-
self.add_subsystem("collector", DistributedConverter(distributed_inputs=in_vars), promotes_inputs=["x_aero"])
64-
self.connect("collector.x_aero_serial", "demuxer.x_aero")
67+
self.add_subsystem(
68+
"collector",
69+
DistributedConverter(distributed_inputs=in_vars),
70+
promotes_inputs=[MPhysVariables.Aerodynamics.Surface.COORDINATES],
71+
)
72+
self.connect(
73+
f"collector.{MPhysVariables.Aerodynamics.Surface.COORDINATES}_serial",
74+
f"demuxer.{MPhysVariables.Aerodynamics.Surface.COORDINATES}",
75+
)
6576

6677
# Demux flattened surface mesh vector into seperate vectors for each surface
6778
self.add_subsystem(
@@ -86,12 +97,21 @@ def setup(self):
8697
)
8798

8899
# Convert serial force vector to distributed, like mphys expects
89-
out_vars = [DistributedVariableDescription(name="f_aero", shape=(nnodes * 3), tags=["mphys_coupling"])]
100+
out_vars = [
101+
DistributedVariableDescription(
102+
name=MPhysVariables.Aerodynamics.Surface.LOADS, shape=(nnodes * 3), tags=["mphys_coupling"]
103+
)
104+
]
90105

91106
self.add_subsystem(
92-
"distributor", DistributedConverter(distributed_outputs=out_vars), promotes_outputs=["f_aero"]
107+
"distributor",
108+
DistributedConverter(distributed_outputs=out_vars),
109+
promotes_outputs=[MPhysVariables.Aerodynamics.Surface.LOADS],
110+
)
111+
self.connect(
112+
f"muxer.{MPhysVariables.Aerodynamics.Surface.LOADS}",
113+
f"distributor.{MPhysVariables.Aerodynamics.Surface.LOADS}_serial",
93114
)
94-
self.connect("muxer.f_aero", "distributor.f_aero_serial")
95115

96116

97117
class AeroBuilder(Builder):

openaerostruct/mphys/aero_funcs_group.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import openmdao.api as om
2+
from mphys.core import MPhysVariables
23

34
from openaerostruct.aerodynamics.functionals import VLMFunctionals
45
from openaerostruct.functionals.total_aero_performance import TotalAeroPerformance
@@ -23,9 +24,9 @@ def setup(self):
2324
self.surfaces = self.options["surfaces"]
2425
self.user_specified_Sref = self.options["user_specified_Sref"]
2526

26-
self.set_input_defaults("aoa", val=0.0, units="deg")
27-
self.set_input_defaults("yaw", val=0.0, units="deg")
28-
self.set_input_defaults("mach", val=0.0)
27+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK, val=0.0, units="deg")
28+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE, val=0.0, units="deg")
29+
self.set_input_defaults(MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER, val=0.0)
2930

3031
proms_in = []
3132
for surface in self.surfaces:
@@ -35,10 +36,10 @@ def setup(self):
3536
VLMFunctionals(surface=surface),
3637
promotes_inputs=[
3738
"v",
38-
("alpha", "aoa"),
39-
("beta", "yaw"),
40-
("Mach_number", "mach"),
41-
("re", "reynolds"),
39+
("alpha", MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK),
40+
("beta", MPhysVariables.Aerodynamics.FlowConditions.YAW_ANGLE),
41+
("Mach_number", MPhysVariables.Aerodynamics.FlowConditions.MACH_NUMBER),
42+
("re", MPhysVariables.Aerodynamics.FlowConditions.REYNOLDS_NUMBER),
4243
"rho",
4344
],
4445
)
@@ -89,5 +90,5 @@ def setup(self):
8990
base_name=self.options["scenario_name"],
9091
output_dir=self.options["output_dir"],
9192
),
92-
promotes_inputs=proms_in + ["*"],
93+
promotes_inputs=proms_in + [("alpha", MPhysVariables.Aerodynamics.FlowConditions.ANGLE_OF_ATTACK), "*"],
9394
)

openaerostruct/mphys/aero_mesh.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import numpy as np
22
import openmdao.api as om
3+
from mphys.core import MPhysVariables
34

45
from openaerostruct.mphys.utils import get_number_of_nodes, get_src_indices
56

@@ -26,7 +27,7 @@ def setup(self):
2627
else:
2728
xpts = np.zeros(0)
2829
self.add_output(
29-
"x_aero0",
30+
MPhysVariables.Aerodynamics.Surface.Mesh.COORDINATES,
3031
distributed=True,
3132
val=xpts,
3233
shape=xpts.size,

0 commit comments

Comments
 (0)