Source code for RCAIDE.Framework.Analyses.Atmospheric.Constant_Temperature

import numpy as np
from warnings import warn
 
import RCAIDE
from RCAIDE.Framework.Core import Units
from RCAIDE.Framework.Analyses.Atmospheric import Atmospheric
from RCAIDE.Framework.Mission.Common.Conditions import Conditions 
from RCAIDE.Framework.Core.Arrays import atleast_2d_col 
from RCAIDE.Library.Attributes.Gases import Air
from RCAIDE.Library.Attributes.Planets import Earth



# ----------------------------------------------------------------------
#  Classes
# ----------------------------------------------------------------------
[docs] class Constant_Temperature(Atmospheric): """Implements a constant temperature with U.S. Standard Atmosphere (1976 version) freestream pressure Assumptions: None Source: U.S. Standard Atmosphere, 1976, U.S. Government Printing Office, Washington, D.C., 1976 """ def __defaults__(self): """This sets the default values for the analysis to function. Assumptions: None Source: N/A Inputs: None Outputs: None Properties Used: None """ atmo_data = RCAIDE.Library.Attributes.Atmospheres.Earth.Constant_Temperature() self.update(atmo_data)
[docs] def compute_values(self,altitude,temperature=288.15): """ Computes atmospheric values. Assumptions: Constant temperature atmosphere Source: U.S. Standard Atmosphere, 1976, U.S. Government Printing Office, Washington, D.C., 1976 Inputs: altitude [m] temperature [K] Outputs: atmo_data. pressure [Pa] temperature [K] speed_of_sound [m/s] dynamic_viscosity [kg/(m*s)] prandtl_number [-] Properties Used: self. fluid_properties.gas_specific_constant [J/(kg*K)] planet.sea_level_gravity [m/s^2] planet.mean_radius [m] breaks. altitude [m] pressure [Pa] """ # unpack zs = altitude gas = self.fluid_properties planet = self.planet grav = self.planet.sea_level_gravity Rad = self.planet.mean_radius R = gas.gas_specific_constant # check properties if not gas == Air(): warn('Constant_Temperature Atmosphere not using Air fluid properties') if not planet == Earth(): warn('Constant_Temperature Atmosphere not using Earth planet properties') # convert input if necessary zs = atleast_2d_col(zs) # get model altitude bounds zmin = self.breaks.altitude[0] zmax = self.breaks.altitude[-1] # convert geometric to geopotential altitude zs = zs/(1 + zs/Rad) # check ranges if np.amin(zs) < zmin: print("Warning: altitude requested below minimum for this atmospheric model; returning values for h = -2.0 km") zs[zs < zmin] = zmin if np.amax(zs) > zmax: print("Warning: altitude requested above maximum for this atmospheric model; returning values for h = 86.0 km") zs[zs > zmax] = zmax # initialize return data zeros = np.zeros_like(zs) p = zeros * 0.0 T = zeros * 0.0 rho = zeros * 0.0 a = zeros * 0.0 mu = zeros * 0.0 z0 = zeros * 0.0 T0 = zeros * 0.0 p0 = zeros * 0.0 alpha = zeros * 0.0 # populate the altitude breaks # this uses >= and <= to capture both edges and because values should be the same at the edges for i in range( len(self.breaks.altitude)-1 ): i_inside = (zs >= self.breaks.altitude[i]) & (zs <= self.breaks.altitude[i+1]) z0[ i_inside ] = self.breaks.altitude[i] T0[ i_inside ] = temperature p0[ i_inside ] = self.breaks.pressure[i] self.breaks.temperature[i+1]=temperature alpha[ i_inside ] = -(temperature - temperature)/ \ (self.breaks.altitude[i+1] - self.breaks.altitude[i]) # interpolate the breaks dz = zs-z0 i_isoth = (alpha == 0.) p = p0* np.exp(-1.*dz*grav/(R*T0)) T = temperature rho = gas.compute_density(T,p) a = gas.compute_speed_of_sound(T) mu = gas.compute_absolute_viscosity(T) K = gas.compute_thermal_conductivity(T) Pr = gas.compute_prandtl_number(T) atmo_data = Conditions() atmo_data.expand_rows(zs.shape[0]) atmo_data.pressure = p atmo_data.temperature = T atmo_data.density = rho atmo_data.speed_of_sound = a atmo_data.dynamic_viscosity = mu atmo_data.thermal_conductivity = K atmo_data.kinematic_viscosity = mu/rho atmo_data.prandtl_number = Pr return atmo_data