Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NPSS builder added #146

Merged
merged 12 commits into from
Mar 8, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def setup(self):
def setup_partials(self):
# this external code does not provide derivatives, use finite difference
# Note: step size should be larger than NPSS solver tolerance
self.declare_partials(of='*', wrt='*', method='fd', step=1e-3)
self.declare_partials(of='*', wrt='*', method='fd', step=1e-6)

def compute(self, inputs, outputs):
Alt_DES = inputs['Alt_DES']
Expand Down Expand Up @@ -99,15 +99,13 @@ class DesignEngineGroup(om.Group):
def setup(self):
self.add_subsystem('DESIGN', NPSSExternalCodeComp(),
promotes_inputs=[('W_DES', Aircraft.Engine.DESIGN_MASS_FLOW)],
# promotes_outputs=[('Fn_SLS', Aircraft.Engine.SCALED_SLS_THRUST), ('thrust_training_data', Dynamic.Mission.THRUST+'_train'),
# ('thrustmax_training_data', Dynamic.Mission.THRUST_MAX+'_train'), ('Wf_training_data', 'Wf_td')])
promotes_outputs=[('Fn_SLS', Aircraft.Engine.SCALED_SLS_THRUST), ('thrust_training_data', 'Fn_train'),
('thrustmax_training_data', 'Fn_max_train'), ('Wf_training_data', 'Wf_td')])

self.add_subsystem('neg_Wf', om.ExecComp('y=-x',
x={'val': np.ones(
vec_size), 'units': 'lbm/s'},
y={'val': np.ones(vec_size), 'units': 'lbm/s'}),
self.add_subsystem('negative_fuel_rate', om.ExecComp('y=-x',
x={'val': np.ones(
vec_size), 'units': 'lbm/s'},
y={'val': np.ones(vec_size), 'units': 'lbm/s'}),
promotes_inputs=[('x', 'Wf_td')],
promotes_outputs=[('y', 'Wf_inv_train')])

Expand All @@ -116,52 +114,3 @@ def configure(self):
self.set_input_defaults('DESIGN.Alt_DES', 0.0, units='ft')
self.set_input_defaults('DESIGN.MN_DES', 0.0)
super().configure()


if __name__ == "__main__":
import openmdao.api as om

SNOPT_EN = False
prob = om.Problem()
model = prob.model

# add system model
model.add_subsystem('p', DesignEngineGroup())

# Add solver
newton = model.nonlinear_solver = om.NewtonSolver()
newton.options['atol'] = 1e-3
newton.options['rtol'] = 1e-4
newton.options['iprint'] = 2
newton.options['debug_print'] = False
newton.options['maxiter'] = 50
newton.options['solve_subsystems'] = True
newton.options['max_sub_solves'] = 100
newton.options['err_on_non_converge'] = False
newton.linesearch = om.BoundsEnforceLS()
# newton.linesearch.options['maxiter'] = 1
newton.linesearch.options['bound_enforcement'] = 'scalar'
newton.linesearch.options['iprint'] = 2
newton.linesearch.options['print_bound_enforce'] = False

# model.nonlinear_solver = om.DirectSolver()

model.linear_solver = om.DirectSolver(assemble_jac=True)

prob.setup()

print('\n\nSTART MDP\n\n')
st = time.time()
# use run driver if optimizing.
# prob.run_driver()
# use run model if only using balances.
prob.run_model()
run_time = time.time() - st
print('\n\nEND MDP \n run time : ', run_time, '\n\n')

# print the output
# print('opt fail : ',prob.driver.fail )
print('Fn_SLS : ', prob.get_val('p.'+Aircraft.Engine.SCALED_SLS_THRUST))
print('Fn_train : ', prob.get_val('p.'+Dynamic.Mission.THRUST+'_train'))
print('Fn_max : ', prob.get_val('p.'+Dynamic.Mission.THRUST_MAX+'_train'))
print('Wf_td :', prob.get_val('p.Wf_td'))
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@
historical_name={'NPSS': 'shaft.Nmech'}
)

av.add_meta_data(
Dynamic.Engine.ELECTRIC_SHAFT_POWER,
units="hp",
desc="Power Extraction from the shaft",
default_value=0.,
meta_data=ExtendedMetaData,
historical_name={'NPSS': 'shaft.HPX'}
)
# av.add_meta_data(
# Dynamic.Engine.ELECTRIC_SHAFT_POWER,
# units="hp",
# desc="Power Extraction from the shaft",
# default_value=0.,
# meta_data=ExtendedMetaData,
# historical_name={'NPSS': 'shaft.HPX'}
# )
chapman178 marked this conversation as resolved.
Show resolved Hide resolved
20 changes: 10 additions & 10 deletions aviary/examples/external_subsystems/engine_NPSS/engine_variables.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@
# ---------------------------

class Aircraft(AviaryAircraft):

class Engine(AviaryAircraft.Engine):
DESIGN_MACH = "aircraft:engine:design_mach"
DESIGN_ALTITUDE = "aircraft:engine:design_alt"
DESIGN_MASS_FLOW = "aircraft:engine:design_mass_flow"
DESIGN_NET_THRUST = "aircraft:engine:design_net_thrust" # will need to use this to calculate the Aviary-core variable aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST using number of engines

class Engine(AviaryAircraft.Engine):
DESIGN_MACH = "aircraft:engine:design_mach"
DESIGN_ALTITUDE = "aircraft:engine:design_alt"
DESIGN_MASS_FLOW = "aircraft:engine:design_mass_flow"
# will need to use this to calculate the Aviary-core variable aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST using number of engines
DESIGN_NET_THRUST = "aircraft:engine:design_net_thrust"


# ---------------------------
# Dynamics data hierarchy
# ---------------------------

class Dynamic(AviaryDynamic):

class Engine:
ELECTRIC_SHAFT_POWER = "dynamic:engine:electric_shaft_power"
SHAFT_MECH_SPEED = "dynamic:engine:shaft_mech_speed" #Part power variable names

class Engine:
SHAFT_MECH_SPEED = "dynamic:engine:shaft_mech_speed" # Part power variable names
Original file line number Diff line number Diff line change
Expand Up @@ -137,20 +137,6 @@ def get_controls(self, phase_name):
variable to be controlled.
'''

# TODO: we will need to handle this throttle_dict differently if the
# injected electric input magnitude is greater than 400 hp
# throttle_dict = {'units': None, 'upper': 1, 'lower': .625, 'ref': 1}

# HPX_dict = {'units': 'hp', 'upper': 0., 'lower': -400, 'ref': 400., 'opt': True} # bounds are notional for now

# if phase_name == 'climb':
# controls_dict = {
# Dynamic.Engine.ELECTRIC_SHAFT_POWER : HPX_dict,
# }
# else:
# controls_dict = {}

# return controls_dict
return {}

def get_design_vars(self):
Expand All @@ -165,10 +151,8 @@ def get_design_vars(self):
'''
mass_flow_dict = {'units': 'lbm/s', 'upper': 450, 'lower': 100,
'ref': 450} # upper and lower are just notional for now
# GTOW_dict = {'units': 'kg', 'upper': 70_000, 'lower': 60_000, 'ref': 70_000}
design_vars = {
Aircraft.Engine.DESIGN_MASS_FLOW: mass_flow_dict,
# Mission.Design.GROSS_MASS : GTOW_dict
}

return design_vars
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from aviary.examples.external_subsystems.engine_NPSS.engine_variables import Aircraft, Dynamic

vars_to_connect = {
"Fn_train" : {
"Fn_train": {
"mission_name": [
Dynamic.Mission.THRUST+"_train",
],
Expand Down
Loading