from __future__ import division
import numpy as np
from openmdao.api import ExplicitComponent
R = 287.058
[docs]class DensityComp(ExplicitComponent):
'''
This component computes density from pressure and temperature.
Adapted from:
J.P. Jasa, J.T. Hwang, and J.R.R.A. Martins: Design and Trajectory Optimization of a Morphing Wing Aircraft
2018 AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference; AIAA SciTech Forum, January 2018
'''
def initialize(self):
self.options.declare('num_nodes', types=int)
def setup(self):
num_points = self.options['num_nodes']
self.add_input('p_MPa', shape=num_points)
self.add_input('T_1e2_K', shape=num_points)
self.add_output('rho_kg_m3', shape=num_points)
arange = np.arange(num_points)
self.declare_partials('rho_kg_m3', 'p_MPa', rows=arange, cols=arange)
self.declare_partials('rho_kg_m3', 'T_1e2_K', rows=arange, cols=arange)
def compute(self, inputs, outputs):
p_Pa = inputs['p_MPa'] * 1e6
T_K = inputs['T_1e2_K'] * 1e2
outputs['rho_kg_m3'] = p_Pa / R / T_K
def compute_partials(self, inputs, partials):
p_Pa = inputs['p_MPa'] * 1e6
T_K = inputs['T_1e2_K'] * 1e2
data = 1.0 / R / T_K
partials['rho_kg_m3', 'p_MPa'] = data * 1e6
data = -p_Pa / R / T_K ** 2
partials['rho_kg_m3', 'T_1e2_K'] = data * 1e2