Skip to content

Commit 5496d79

Browse files
committed
fix broken connection in run.py; clean up other things a bit and verify with latest remote codes+beta
1 parent 25c9ecc commit 5496d79

File tree

5 files changed

+75
-42
lines changed

5 files changed

+75
-42
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Summary of top-level codes:
2+
3+
run.py: most basic code that demonstrates a single scenario, doing a derivative check at the starting design
4+
run_parallel.py: code that demonstrates two scenarios, evaluated in parallel with MultipointParallel, doing a derivative check at the starting design
5+
as_opt_parallel.py: runs an optimization of the previous code's two scenarios (mass minimization subject to lift and stress constraints at the two flight conditions)
6+
as_opt_remote_serial.py: runs the same optimization using one remote component that evaluates the MultipointParallel group in as_opt_parallel.py
7+
as_opt_remote_parallel.py: runs the same optimization using two parallel remote components, which each evaluates the Multipoint analysis in run.py
8+
9+
The optimizations should complete with the following metrics; note that objective and constraint names can vary slightly based on the optimization script.
10+
11+
Nonlinear constraints
12+
{'multipoint.aerostructural1.C_L': array([0.15]),
13+
'multipoint.aerostructural1.func_struct': array([1.00000023]),
14+
'multipoint.aerostructural2.C_L': array([0.45]),
15+
'multipoint.aerostructural2.func_struct': array([1.00000051])}
16+
17+
Objectives
18+
{'multipoint.aerostructural1.mass': array([8.73298752e-05])}
19+
20+
Optimization terminated successfully (Exit mode 0)
21+
Current function value: 0.008732987524877025
22+
Iterations: 22
23+
Function evaluations: 24
24+
Gradient evaluations: 22
25+
26+
Note that the remote scripts, which both use mphys_server.py, are set up to use the K4 queue of NASA Langley's K cluster.
27+
To run this script on an HPC not supported by pbs4py, you will likely have to write your own pbs4py Launcher constructor.
28+
Further details on remote components may be found on the document page: https://openmdao.github.io/mphys/basics/remote_components.html

examples/aerostructural/supersonic_panel/aerodynamics_mphys.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from piston_theory import PistonTheory
77

8-
X_AERO0_MESH= MPhysVariables.Aerodynamics.Surface.Mesh.COORDINATES
8+
X_AERO0_MESH = MPhysVariables.Aerodynamics.Surface.Mesh.COORDINATES
99
X_AERO = MPhysVariables.Aerodynamics.Surface.COORDINATES
1010
F_AERO = MPhysVariables.Aerodynamics.Surface.LOADS
1111

examples/aerostructural/supersonic_panel/as_opt_parallel.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,25 @@ def initialize(self):
3232
self.options.declare('scenario_names')
3333

3434
def setup(self):
35-
for i in range(len(self.options['scenario_names'])):
35+
36+
for scenario_name in self.options['scenario_names']:
3637

3738
# create the run directory
3839
if self.comm.rank==0:
39-
if not os.path.isdir(self.options['scenario_names'][i]):
40-
os.mkdir(self.options['scenario_names'][i])
40+
if not os.path.isdir(scenario_name):
41+
os.mkdir(scenario_name)
4142
self.comm.Barrier()
4243

4344
nonlinear_solver = om.NonlinearBlockGS(maxiter=100, iprint=2, use_aitken=True, aitken_initial_factor=0.5)
4445
linear_solver = om.LinearBlockGS(maxiter=40, iprint=2, use_aitken=True, aitken_initial_factor=0.5)
45-
self.mphys_add_scenario(self.options['scenario_names'][i],
46+
self.mphys_add_scenario(scenario_name,
4647
ScenarioAeroStructural(
4748
aero_builder=self.options['aero_builder'],
4849
struct_builder=self.options['struct_builder'],
4950
ldxfer_builder=self.options['xfer_builder'],
5051
geometry_builder=self.options['geometry_builder'],
5152
in_MultipointParallel=True,
52-
run_directory=self.options['scenario_names'][i]),
53+
run_directory=scenario_name),
5354
coupling_nonlinear_solver=nonlinear_solver,
5455
coupling_linear_solver=linear_solver)
5556

@@ -98,12 +99,14 @@ def setup(self):
9899
geometry_builder = GeometryBuilder(builders)
99100

100101
# add parallel multipoint group
101-
self.add_subsystem('multipoint',AerostructParallel(
102-
aero_builder=aero_builder,
103-
struct_builder=struct_builder,
104-
xfer_builder=xfer_builder,
105-
geometry_builder=geometry_builder,
106-
scenario_names=self.scenario_names))
102+
self.add_subsystem('multipoint',
103+
AerostructParallel(
104+
aero_builder=aero_builder,
105+
struct_builder=struct_builder,
106+
xfer_builder=xfer_builder,
107+
geometry_builder=geometry_builder,
108+
scenario_names=self.scenario_names)
109+
)
107110

108111
for i in range(len(self.scenario_names)):
109112

examples/aerostructural/supersonic_panel/run.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def setup(self):
110110

111111
for var in ['modulus', 'yield_stress', 'density', 'mach', 'qdyn', 'aoa', 'dv_struct']:
112112
self.connect(var, self.scenario_name+'.'+var)
113+
self.connect('geometry_morph_param', 'geometry.geometry_morph_param')
113114
self.connect(f'geometry.{X_AERO0_GEOM_OUTPUT}', f'{self.scenario_name}.{X_AERO0}')
114115
self.connect(f'geometry.{X_STRUCT_GEOM_OUTPUT}', f'{self.scenario_name}.{X_STRUCT}')
115116

examples/aerostructural/supersonic_panel/run_parallel.py

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,36 @@
2323
N_el_aero = 7
2424

2525
class AerostructParallel(MultipointParallel):
26-
def __init__(self, aero_builder=None, struct_builder=None, xfer_builder=None, geometry_builder=None, scenario_names=None):
27-
super().__init__()
28-
self.aero_builder = aero_builder
29-
self.struct_builder = struct_builder
30-
self.xfer_builder = xfer_builder
31-
self.geometry_builder = geometry_builder
32-
self.scenario_names = scenario_names
26+
27+
def initialize(self):
28+
self.options.declare('aero_builder')
29+
self.options.declare('struct_builder')
30+
self.options.declare('xfer_builder')
31+
self.options.declare('geometry_builder')
32+
self.options.declare('scenario_names')
3333

3434
def setup(self):
35-
for i in range(len(self.scenario_names)):
35+
36+
for scenario_name in self.options['scenario_names']:
3637
nonlinear_solver = om.NonlinearBlockGS(maxiter=100, iprint=2, use_aitken=True, aitken_initial_factor=0.5)
3738
linear_solver = om.LinearBlockGS(maxiter=40, iprint=2, use_aitken=True, aitken_initial_factor=0.5)
38-
self.mphys_add_scenario(self.scenario_names[i],
39+
self.mphys_add_scenario(scenario_name,
3940
ScenarioAeroStructural(
40-
aero_builder=self.aero_builder,
41-
struct_builder=self.struct_builder,
42-
ldxfer_builder=self.xfer_builder,
43-
geometry_builder=self.geometry_builder,
41+
aero_builder=self.options['aero_builder'],
42+
struct_builder=self.options['struct_builder'],
43+
ldxfer_builder=self.options['xfer_builder'],
44+
geometry_builder=self.options['geometry_builder'],
4445
in_MultipointParallel=True),
4546
coupling_nonlinear_solver=nonlinear_solver,
4647
coupling_linear_solver=linear_solver)
4748

4849
# OM group
4950
class Model(om.Group):
51+
def initialize(self):
52+
self.options.declare('scenario_names', default=['aerostructural1','aerostructural2'])
53+
5054
def setup(self):
55+
self.scenario_names = self.options['scenario_names']
5156

5257
# ivc
5358
self.add_subsystem('ivc', om.IndepVarComp(), promotes=['*'])
@@ -76,38 +81,34 @@ def setup(self):
7681
aero_builder = AeroBuilder(aero_setup)
7782

7883
# xfer builder
79-
xfer_builder = XferBuilder(
80-
aero_builder=aero_builder,
81-
struct_builder=struct_builder
82-
)
84+
xfer_builder = XferBuilder(aero_builder=aero_builder, struct_builder=struct_builder)
8385

8486
# geometry
8587
builders = {'struct': struct_builder, 'aero': aero_builder}
8688
geometry_builder = GeometryBuilder(builders)
8789

88-
# list of scenario names
89-
scenario_names = ['aerostructural1','aerostructural2']
90-
9190
# add parallel multipoint group
92-
self.add_subsystem('multipoint',AerostructParallel(
93-
aero_builder=aero_builder,
94-
struct_builder=struct_builder,
95-
xfer_builder=xfer_builder,
96-
geometry_builder=geometry_builder,
97-
scenario_names=scenario_names))
91+
self.add_subsystem('multipoint',
92+
AerostructParallel(
93+
aero_builder=aero_builder,
94+
struct_builder=struct_builder,
95+
xfer_builder=xfer_builder,
96+
geometry_builder=geometry_builder,
97+
scenario_names=self.scenario_names)
98+
)
9899

99-
for i in range(len(scenario_names)):
100+
for i in range(len(self.scenario_names)):
100101

101102
# connect scalar inputs to the scenario
102103
for var in ['modulus', 'yield_stress', 'density', 'dv_struct']:
103-
self.connect(var, 'multipoint.'+scenario_names[i]+'.'+var)
104+
self.connect(var, 'multipoint.'+self.scenario_names[i]+'.'+var)
104105

105106
# connect vector inputs
106107
for var in ['mach', 'qdyn', 'aoa']:
107-
self.connect(var, 'multipoint.'+scenario_names[i]+'.'+var, src_indices=[i])
108+
self.connect(var, 'multipoint.'+self.scenario_names[i]+'.'+var, src_indices=[i])
108109

109110
# connect top-level geom parameter
110-
self.connect('geometry_morph_param', 'multipoint.'+scenario_names[i]+'.geometry.geometry_morph_param')
111+
self.connect('geometry_morph_param', 'multipoint.'+self.scenario_names[i]+'.geometry.geometry_morph_param')
111112

112113
# run model and check derivatives
113114
if __name__ == "__main__":

0 commit comments

Comments
 (0)