Source code for openaerostruct.geometry.radius_comp

""" Manipulate geometry mesh based on high-level design parameters. """

import numpy as np

import openmdao.api as om
from openaerostruct.structures.utils import radii


[docs] class RadiusComp(om.ExplicitComponent): """ Compute the radius of a structural spar based on the mesh and thickness over chord ratio. Parameters ---------- mesh[nx, ny, 3] : numpy array Nodal mesh defining the initial aerodynamic surface.. t_over_c[ny-1] : numpy array The streamwise thickness-to-chord ratio of each VLM panel. Returns ------- radius[ny-1] : numpy array Radius of each element of the FEM spar. """ def initialize(self): self.options.declare("surface", types=dict) def setup(self): surface = self.options["surface"] nx, ny = self.nx, self.ny = surface["mesh"].shape[:2] self.add_input("mesh", val=np.zeros((nx, ny, 3)), units="m") self.add_input("t_over_c", val=np.ones((ny - 1))) self.add_output("radius", val=np.ones((ny - 1)), units="m") arange = np.arange(ny - 1) self.declare_partials("radius", "t_over_c", rows=arange, cols=arange) row = np.tile(np.zeros(6), ny - 1) + np.repeat(arange, 6) rows = np.concatenate([row, row]) col = np.tile(np.arange(6), ny - 1) + np.repeat(3 * arange, 6) cols = np.concatenate([col, col + (nx - 1) * 3 * ny]) self.declare_partials("radius", "mesh", rows=rows, cols=cols) def compute(self, inputs, outputs): outputs["radius"] = radii(inputs["mesh"], inputs["t_over_c"]) def compute_partials(self, inputs, partials): """ Obtain the radii of the FEM element based on local chord. """ mesh = inputs["mesh"] vectors = mesh[-1, :, :] - mesh[0, :, :] chords = np.sqrt(np.sum(vectors**2, axis=1)) t_c = inputs["t_over_c"] dr_dtoc = 0.25 * (chords[:-1] + chords[1:]) partials["radius", "t_over_c"] = dr_dtoc dr_dchords = 0.25 * t_c dr = mesh[0, :] - mesh[-1, :] length = np.sqrt(np.sum(dr**2, axis=1)) dr = dr / length[:, np.newaxis] drad = np.empty((self.ny - 1, 6)) drad[:, :3] = np.einsum("i, ij -> ij", dr_dchords, dr[:-1, :]) drad[:, 3:] = np.einsum("i, ij -> ij", dr_dchords, dr[1:, :]) drad = drad.flatten() nn = 6 * (self.ny - 1) partials["radius", "mesh"][:nn] = drad partials["radius", "mesh"][nn:] = -drad