1.1. Example 2

Description of example 2

'''Example 2 : Description of example 2'''
import numpy as np
import caddee.api as cd
import m3l
from python_csdl_backend import Simulator
from modopt.scipy_library import SLSQP
from modopt.csdl_library import CSDLProblem


caddee = cd.CADDEE()
caddee.system_model = system_model = cd.SystemModel()

# m3l sizing model
m3l_model = m3l.Model()


# Aircraft sizing
c172_sizing = cd.C172MassProperties()
mass_properties = c172_sizing.evaluate()
m3l_model.register_output(mass_properties)

ref_pt = np.array([4.5, 0., 5.]) * 0.3024
ref_pt = m3l_model.create_input('ref_pt', val=ref_pt)


# cruise condition
cruise_condition = cd.CruiseCondition(
    name="cruise_1",
    stability_flag=True,
    num_nodes=1,
)

# cruise_speed = m3l_model.create_input('cruise_speed', val=67.9)
mach_number = m3l_model.create_input('mach_number', val=np.array([0.15]))
altitude = m3l_model.create_input('cruise_altitude', val=np.array([1500]))
pitch_angle = m3l_model.create_input('pitch_angle', val=np.array([np.deg2rad(2.67324908)]), dv_flag=True, lower=np.deg2rad(-10), upper=np.deg2rad(10))
range = m3l_model.create_input('cruise_range', val=np.array([40000]))

ac_states, atmosphere = cruise_condition.evaluate(
    mach_number=mach_number, 
    pitch_angle=pitch_angle, 
    altitude=altitude, 
    cruise_range=range
)
m3l_model.register_output(ac_states)

# aero forces and moments
c172_aero_model = cd.C172AeroM3L(
    name='cruise_c172_aero_regression',
    num_nodes=1,
)
aileron_deflection = m3l_model.create_input(name='delta_a', val=np.array([0]))
rudder_deflection = m3l_model.create_input(name='delta_r', val=np.array([0]))
elevator_deflection = m3l_model.create_input(name='delta_e', val=np.array([np.deg2rad(-1.32724268)]), dv_flag=True, lower=np.deg2rad(-10), upper=np.deg2rad(10))

c172_aero_outputs = c172_aero_model.evaluate(
    ac_states=ac_states,
    delta_a=aileron_deflection,
    delta_r=rudder_deflection,
    delta_e=elevator_deflection,
)

m3l_model.register_output(c172_aero_outputs)


# prop forces and moments
c172_prop_model = cd.C172PropulsionModel(
    name='cruise_c172_prop_regression',
    num_nodes=1,
)


prop_radius = m3l_model.create_input('prop_radius', val=1.)
omega = m3l_model.create_input('omega', val=np.array([2109.07445251]), dv_flag=True, lower=2000, upper=2800, scaler=1e-3)
thrust_origin = m3l_model.create_input('thrust_origin', val=np.array([4.5, 0., 5.]) * 0.3024)
thrust_vector = m3l_model.create_input('thrust_vector', val=np.array([1., 0., 0.]))

c172_prop_outputs = c172_prop_model.evaluate(
    ac_states=ac_states,
    prop_radius=prop_radius,
    rpm=omega,
    thrust_origin=thrust_origin,
    thrust_vector=thrust_vector,
    ref_pt=ref_pt,
)
m3l_model.register_output(c172_prop_outputs)


trim_variables = cruise_condition.assemble_trim_residual(
    mass_properties=mass_properties, 
    aero_propulsive_outputs=[c172_aero_outputs, c172_prop_outputs],
    ac_states=ac_states,
    ref_pt=ref_pt,
)
m3l_model.register_output(trim_variables)


caddee_csdl_model = m3l_model.assemble_csdl()
# caddee_csdl_model.add_objective('cruise_1_eom_model.accelerations')

# create and run simulator
sim = Simulator(caddee_csdl_model, analytics=True)
sim.run()

cd.print_caddee_outputs(m3l_model, sim)