Source code for openaerostruct.structures.section_properties_tube

import numpy as np

import openmdao.api as om


[docs] class SectionPropertiesTube(om.ExplicitComponent): """ Compute geometric properties for a tube element. The thicknesses are added to the interior of the element, so the 'radius' value is the outer radius of the tube. parameters ---------- radius : numpy array Outer radii for each FEM element. thickness : numpy array Tube thickness for each FEM element. Returns ------- A : numpy array Cross-sectional area for each FEM element. Iy : numpy array Area moment of inertia around the y-axis for each FEM element. Iz : numpy array Area moment of inertia around the z-axis for each FEM element. J : numpy array Polar moment of inertia for each FEM element. """ def initialize(self): self.options.declare("surface", types=dict) def setup(self): self.surface = surface = self.options["surface"] self.ny = surface["mesh"].shape[1] self.add_input("radius", val=np.ones((self.ny - 1)), units="m") self.add_input("thickness", val=np.ones((self.ny - 1)) * 0.1, units="m") self.add_output("A", val=np.zeros((self.ny - 1)), units="m**2") self.add_output("Iy", val=np.zeros((self.ny - 1)), units="m**4") self.add_output("Iz", val=np.zeros((self.ny - 1)), units="m**4") self.add_output("J", val=np.zeros((self.ny - 1)), units="m**4") a = np.arange((self.ny - 1)) self.declare_partials("*", "*", rows=a, cols=a) self.set_check_partial_options(wrt="*", method="cs") def compute(self, inputs, outputs): pi = np.pi # Add thickness to the interior of the radius. # The outer radius is the inputs['radius'] amount. r1 = inputs["radius"] - inputs["thickness"] r2 = inputs["radius"] # Compute the area, area moments of inertia, and polar moment of inertia outputs["A"] = pi * (r2**2 - r1**2) outputs["Iy"] = pi * (r2**4 - r1**4) / 4.0 outputs["Iz"] = pi * (r2**4 - r1**4) / 4.0 outputs["J"] = pi * (r2**4 - r1**4) / 2.0 def compute_partials(self, inputs, partials): pi = np.pi radius = inputs["radius"].real t = inputs["thickness"].real r1 = radius - t r2 = radius dr1_dr = 1.0 dr2_dr = 1.0 dr1_dt = -1.0 dr2_dt = 0.0 r1_3 = r1**3 r2_3 = r2**3 partials["A", "radius"] = 2 * pi * (r2 * dr2_dr - r1 * dr1_dr) partials["A", "thickness"] = 2 * pi * (r2 * dr2_dt - r1 * dr1_dt) partials["Iy", "radius"] = pi * (r2_3 * dr2_dr - r1_3 * dr1_dr) partials["Iy", "thickness"] = pi * (r2_3 * dr2_dt - r1_3 * dr1_dt) partials["Iz", "radius"] = pi * (r2_3 * dr2_dr - r1_3 * dr1_dr) partials["Iz", "thickness"] = pi * (r2_3 * dr2_dt - r1_3 * dr1_dt) partials["J", "radius"] = 2 * pi * (r2_3 * dr2_dr - r1_3 * dr1_dr) partials["J", "thickness"] = 2 * pi * (r2_3 * dr2_dt - r1_3 * dr1_dt)