Source code for openaerostruct.structures.create_rhs

import numpy as np

import openmdao.api as om


[docs] class CreateRHS(om.ExplicitComponent): """ Compute the right-hand-side of the K * u = f linear system to solve for the displacements. The RHS is based on the loads. For the aerostructural case, these are recomputed at each design point based on the aerodynamic loads. Parameters ---------- loads[ny, 6] : numpy array Flattened array containing the loads applied on the FEM component, computed from the sectional forces. Returns ------- forces[6*(ny+1)] : numpy array Right-hand-side of the linear system. The loads from the aerodynamic analysis or the user-defined loads. """ def initialize(self): self.options.declare("surface", types=dict) def setup(self): surface = self.options["surface"] self.ny = surface["mesh"].shape[1] self.add_input("total_loads", val=np.zeros((self.ny, 6)), units="N") self.add_output("forces", val=np.ones(((self.ny + 1) * 6)), units="N") n = self.ny * 6 arange = np.arange((n)) self.declare_partials("forces", "total_loads", val=1.0, rows=arange, cols=arange) def compute(self, inputs, outputs): outputs["forces"][:] = 0.0 # Populate the right-hand side of the linear system using the # prescribed or computed loads outputs["forces"][: 6 * self.ny] += inputs["total_loads"].reshape(self.ny * 6) # Remove extremely small values from the RHS so the linear system # can more easily be solved outputs["forces"][np.abs(outputs["forces"]) < 1e-6] = 0.0