Source code for openaerostruct.structures.local_stiff_transformed

import numpy as np

import openmdao.api as om


[docs] class LocalStiffTransformed(om.ExplicitComponent): def initialize(self): self.options.declare("surface", types=dict) def setup(self): surface = self.options["surface"] self.ny = ny = surface["mesh"].shape[1] self.add_input("transform", shape=(ny - 1, 12, 12)) self.add_input("local_stiff_permuted", shape=(ny - 1, 12, 12)) self.add_output("local_stiff_transformed", shape=(ny - 1, 12, 12)) indices = np.arange(144 * (ny - 1)).reshape((ny - 1, 12, 12)) ones = np.ones((12, 12), int) rows = np.einsum("ijk,lm->ijklm", indices, ones).flatten() cols = np.einsum("ilm,jk->ijklm", indices, ones).flatten() self.declare_partials("local_stiff_transformed", "transform", rows=rows, cols=cols) self.declare_partials("local_stiff_transformed", "local_stiff_permuted", rows=rows, cols=cols) def compute(self, inputs, outputs): outputs["local_stiff_transformed"] = np.einsum( "ilj,ilm,imk->ijk", inputs["transform"], inputs["local_stiff_permuted"], inputs["transform"] ) def compute_partials(self, inputs, partials): partials["local_stiff_transformed", "local_stiff_permuted"] = np.einsum( "ilj,imk->ijklm", inputs["transform"], inputs["transform"] ).flatten() partials["local_stiff_transformed", "transform"] = ( np.einsum("ilj,ilp,kq->ijkpq", inputs["transform"], inputs["local_stiff_permuted"], np.eye(12)) + np.einsum("jq,ipm,imk->ijkpq", np.eye(12), inputs["local_stiff_permuted"], inputs["transform"]) ).flatten()