def testPlatformTower(self): myobj = frame.PlatformFrame(options=self.opt) myobj.node_mem2glob = {} myobj.node_glob2mem = {} myobj.compute(self.inputs, self.outputs) for k in self.outputs: self.inputs[k] = self.outputs[k] for k in self.discrete_outputs: self.discrete_inputs[k] = self.discrete_outputs[k] myobj = frame.PlatformTowerFrame() myobj.compute(self.inputs, self.outputs) npt.assert_equal( self.outputs["system_nodes"][:6, :], np.array( [ [0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.5, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 51.0], [0.0, 0.0, 101.0], ] ), ) npt.assert_equal( self.outputs["system_Fnode"][:6, :], 1e2 * np.array( [[0.0, 0.0, 2], [0.0, 0.0, 0.0], [0.0, 0.0, 2], [0.0, 0.0, 2.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] ), ) npt.assert_equal(self.outputs["system_Rnode"][:6], 0.1 * np.r_[3, 5, 5, 4, 0, 0]) npt.assert_equal(self.outputs["system_elem_n1"][:8], np.r_[0, 3, 2, 0, 3, 2, 1, 4]) npt.assert_equal(self.outputs["system_elem_n2"][:8], np.r_[3, 2, 0, 1, 1, 1, 4, 5]) npt.assert_equal(self.outputs["system_elem_D"][:8], 2.0) npt.assert_equal(self.outputs["system_elem_t"][:8], 0.1) npt.assert_equal(self.outputs["system_elem_A"][:8], np.r_[0.5 * np.arange(6) + 1, 4, 4]) npt.assert_equal(self.outputs["system_elem_Asx"][:8], np.r_[0.5 * np.arange(6) + 1, 4.1, 4.1]) npt.assert_equal(self.outputs["system_elem_Asy"][:8], np.r_[0.5 * np.arange(6) + 1, 4.1, 4.1]) npt.assert_equal(self.outputs["system_elem_Ixx"][:8], np.r_[2 * np.arange(6) + 1, 5, 5]) npt.assert_equal(self.outputs["system_elem_Iyy"][:8], np.r_[2 * np.arange(6) + 1, 5, 5]) npt.assert_equal(self.outputs["system_elem_Izz"][:8], np.r_[2 * np.arange(6) + 1, 10, 10]) # npt.assert_equal(self.outputs["system_elem_rho"][:8], np.r_[3 * np.arange(6)+1, 20, 20]) npt.assert_equal(self.outputs["system_elem_E"][:8], np.r_[3 * np.arange(6) + 1, 30, 30]) npt.assert_equal(self.outputs["system_elem_G"][:8], np.r_[4 * np.arange(6) + 1, 40, 40]) self.assertEqual(self.outputs["system_mass"], 6e3 + 5e3 + 1e4 + 1e3) self.assertEqual(self.outputs["variable_ballast_mass"], 6e4 - self.outputs["system_mass"]) npt.assert_equal( self.outputs["system_center_of_mass"], ( 6e3 * np.array([0.375, 0.25, 0.25]) + 5e3 * np.array([0.0, 0.0, 51.0]) + 1e3 * np.array([0.0, 0.0, 1.0]) + 1e4 * np.array([1.0, 1.0, 102.0]) ) / 2.2e4, ) npt.assert_equal(self.outputs["transition_piece_I"], 1e3 * 0.25 * np.r_[0.5, 0.5, 1.0, np.zeros(3)])
def testRunFrame(self): myobj = frame.PlatformFrame(options=self.opt) myobj.node_mem2glob = {} myobj.node_glob2mem = {} myobj.compute(self.inputs, self.outputs) for k in self.outputs: self.inputs[k] = self.outputs[k] for k in self.discrete_outputs: self.discrete_inputs[k] = self.discrete_outputs[k] myobj = frame.PlatformTowerFrame() myobj.compute(self.inputs, self.outputs) for k in self.outputs: self.inputs[k] = self.outputs[k] for k in self.discrete_outputs: self.discrete_inputs[k] = self.discrete_outputs[k] myobj = frame.FrameAnalysis(options=self.opt) myobj.compute(self.inputs, self.outputs) self.assertTrue(True)
def testTetrahedron(self): myobj = frame.PlatformFrame(options=self.opt) myobj.node_mem2glob = {} myobj.node_glob2mem = {} myobj.compute(self.inputs, self.outputs) # Check NULLs and implied number of nodes / elements npt.assert_equal(self.outputs["platform_nodes"][4:, :], NULL) npt.assert_equal(self.outputs["platform_Fnode"][4:, :], NULL) npt.assert_equal(self.outputs["platform_Rnode"][4:], NULL) npt.assert_equal(self.outputs["platform_elem_n1"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_n2"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_D"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_t"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_A"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Asx"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Asy"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Ixx"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Iyy"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Izz"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_rho"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_E"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_G"][6:], NULL) npt.assert_equal( self.outputs["platform_nodes"][:4, :], np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.5, 1.0, 0.0], [1.0, 0.0, 0.0]]), ) npt.assert_equal( self.outputs["platform_Fnode"][:4, :], 1e2 * np.array([[0.0, 0.0, 2], [0.0, 0.0, 0.0], [0.0, 0.0, 2], [0.0, 0.0, 2.0]]), ) npt.assert_equal(self.outputs["platform_Rnode"][:4], 0.1 * np.r_[3, 5, 5, 4]) npt.assert_equal(self.outputs["platform_elem_n1"][:6], np.r_[0, 3, 2, 0, 3, 2]) npt.assert_equal(self.outputs["platform_elem_n2"][:6], np.r_[3, 2, 0, 1, 1, 1]) npt.assert_equal(self.outputs["platform_elem_D"][:6], 2.0) npt.assert_equal(self.outputs["platform_elem_t"][:6], 0.1) npt.assert_equal(self.outputs["platform_elem_A"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Asx"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Asy"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Ixx"][:6], 2 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Iyy"][:6], 2 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Izz"][:6], 2 * np.arange(6) + 1) # npt.assert_equal(self.outputs["platform_elem_rho"][:6], 3 * np.arange(6)+1) npt.assert_equal(self.outputs["platform_elem_E"][:6], 3 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_G"][:6], 4 * np.arange(6) + 1) self.assertEqual(self.outputs["platform_displacement"], 6e1) npt.assert_equal(self.outputs["platform_center_of_buoyancy"], self.outputs["platform_nodes"][:4, :].mean(axis=0)) npt.assert_equal(self.outputs["platform_center_of_mass"], self.outputs["platform_nodes"][:4, :].mean(axis=0)) self.assertEqual(self.outputs["platform_mass"], 6e3) self.assertEqual(self.outputs["platform_cost"], 6 * 2e3) self.assertEqual(self.outputs["platform_Awater"], 30) self.assertEqual(self.outputs["platform_Iwater"], 6 * 15) npt.assert_equal(self.outputs["platform_added_mass"], 6 * np.arange(6)) npt.assert_array_less(1e2, self.outputs["platform_I_total"])
def testPlatformTower(self): myobj = frame.PlatformFrame(options=self.opt) myobj.node_mem2glob = {} myobj.node_glob2mem = {} myobj.compute(self.inputs, self.outputs) for k in self.outputs: self.inputs[k] = self.outputs[k] for k in self.discrete_outputs: self.discrete_inputs[k] = self.discrete_outputs[k] myobj = frame.PlatformTowerFrame() myobj.compute(self.inputs, self.outputs) npt.assert_equal( self.outputs["system_nodes"][:6, :], np.array( [ [0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.5, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 51.0], [0.0, 0.0, 101.0], ] ), ) npt.assert_equal( self.outputs["system_Fnode"][:6, :], 1e2 * np.array( [[0.0, 0.0, 2], [0.0, 0.0, 0.0], [0.0, 0.0, 2], [0.0, 0.0, 2.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] ), ) npt.assert_equal(self.outputs["system_Rnode"][:6], 0.1 * np.r_[3, 5, 5, 4, 0, 0]) npt.assert_equal(self.outputs["system_elem_n1"][:8], np.r_[0, 3, 2, 0, 3, 2, 1, 4]) npt.assert_equal(self.outputs["system_elem_n2"][:8], np.r_[3, 2, 0, 1, 1, 1, 4, 5]) npt.assert_equal(self.outputs["system_elem_D"][:8], 2.0) npt.assert_equal(self.outputs["system_elem_t"][:8], 0.1) npt.assert_equal(self.outputs["system_elem_A"][:8], np.r_[0.5 * np.arange(6) + 1, 4, 4]) npt.assert_equal(self.outputs["system_elem_Asx"][:8], np.r_[0.5 * np.arange(6) + 1, 4.1, 4.1]) npt.assert_equal(self.outputs["system_elem_Asy"][:8], np.r_[0.5 * np.arange(6) + 1, 4.1, 4.1]) npt.assert_equal(self.outputs["system_elem_Ixx"][:8], np.r_[2 * np.arange(6) + 1, 5, 5]) npt.assert_equal(self.outputs["system_elem_Iyy"][:8], np.r_[2 * np.arange(6) + 1, 5, 5]) npt.assert_equal(self.outputs["system_elem_Izz"][:8], np.r_[2 * np.arange(6) + 1, 10, 10]) # npt.assert_equal(self.outputs["system_elem_rho"][:8], np.r_[3 * np.arange(6)+1, 20, 20]) npt.assert_equal(self.outputs["system_elem_E"][:8], np.r_[3 * np.arange(6) + 1, 30, 30]) npt.assert_equal(self.outputs["system_elem_G"][:8], np.r_[4 * np.arange(6) + 1, 40, 40]) self.assertEqual(self.outputs["system_structural_mass"], 6e3 + 5e3 + 1e4 + 1e3) npt.assert_equal(self.outputs["system_elem_Px1"][:8], 1.0) npt.assert_equal(self.outputs["system_elem_Px2"][:8], 1.0) npt.assert_equal(self.outputs["system_elem_Py1"][:8], 2.0) npt.assert_equal(self.outputs["system_elem_Py2"][:8], 2.0) npt.assert_equal(self.outputs["system_elem_Pz1"][:8], 3.0) npt.assert_equal(self.outputs["system_elem_Pz2"][:8], 3.0) npt.assert_equal( self.outputs["system_structural_center_of_mass"], ( 6e3 * np.array([0.375, 0.25, 0.25]) + 5e3 * np.array([0.0, 0.0, 51.0]) + 1e3 * np.array([0.0, 0.0, 1.0]) + 1e4 * np.array([1.0, 1.0, 102.0]) ) / 2.2e4, ) self.assertEqual(self.outputs["variable_ballast_mass"], 6e4 - self.outputs["system_structural_mass"] - 3e3 / g) self.assertAlmostEqual( self.outputs["constr_variable_margin"], self.outputs["variable_ballast_mass"] / 1e3 / (10 + np.arange(6)).sum(), ) frac = (10 + np.arange(6)) / (10 + np.arange(6)).sum() V_frac = self.outputs["variable_ballast_mass"] / 1e3 * frac npt.assert_almost_equal(self.outputs["member_variable_volume"], V_frac) s_cg = np.interp(0.5 * V_frac, np.arange(10), np.linspace(0, 0.5, 10)) s_end = np.interp(V_frac, np.arange(10), np.linspace(0, 0.5, 10)) npt.assert_almost_equal(self.outputs["member_variable_height"], s_end) cg_mem = np.zeros((6, 3)) for k in range(6): cg_mem[k, :] = ( s_cg[k] * np.diff(self.inputs[f"member{k}:nodes_xyz"][:2, :], axis=0) + self.inputs[f"member{k}:nodes_xyz"][0, :] ) cg_var = np.dot(V_frac, cg_mem) / (self.outputs["variable_ballast_mass"] / 1e3) self.assertEqual(self.outputs["system_mass"], 6e3 + 5e3 + 1e4 + 1e3 + self.outputs["variable_ballast_mass"]) npt.assert_almost_equal( self.outputs["system_center_of_mass"], ( (6e3 + 5e3 + 1e4 + 1e3) * self.outputs["system_structural_center_of_mass"] + self.outputs["variable_ballast_mass"] * cg_var ) / self.outputs["system_mass"], ) npt.assert_equal(self.outputs["transition_piece_I"], 1e3 * 0.25 * np.r_[0.5, 0.5, 1.0, np.zeros(3)])
def testTetrahedron(self): myobj = frame.PlatformFrame(options=self.opt) myobj.node_mem2glob = {} myobj.node_glob2mem = {} myobj.compute(self.inputs, self.outputs) # Check NULLs and implied number of nodes / elements npt.assert_equal(self.outputs["platform_nodes"][4:, :], NULL) npt.assert_equal(self.outputs["platform_Fnode"][4:, :], NULL) npt.assert_equal(self.outputs["platform_Rnode"][4:], NULL) npt.assert_equal(self.outputs["platform_elem_n1"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_n2"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_D"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_t"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_A"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Asx"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Asy"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Ixx"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Iyy"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Izz"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_rho"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_E"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_G"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Px1"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Py1"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Pz1"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Px2"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Py2"][6:], NULL) npt.assert_equal(self.outputs["platform_elem_Pz2"][6:], NULL) npt.assert_equal( self.outputs["platform_nodes"][:4, :], np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.5, 1.0, 0.0], [1.0, 0.0, 0.0]]), ) npt.assert_equal( self.outputs["platform_Fnode"][:4, :], 1e2 * np.array([[0.0, 0.0, 2], [0.0, 0.0, 0.0], [0.0, 0.0, 2], [0.0, 0.0, 2.0]]), ) npt.assert_equal(self.outputs["platform_Rnode"][:4], 0.1 * np.r_[3, 5, 5, 4]) npt.assert_equal(self.outputs["platform_elem_n1"][:6], np.r_[0, 3, 2, 0, 3, 2]) npt.assert_equal(self.outputs["platform_elem_n2"][:6], np.r_[3, 2, 0, 1, 1, 1]) npt.assert_equal(self.outputs["platform_elem_D"][:6], 2.0) npt.assert_equal(self.outputs["platform_elem_t"][:6], 0.1) npt.assert_equal(self.outputs["platform_elem_A"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Asx"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Asy"][:6], 0.5 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Ixx"][:6], 2 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Iyy"][:6], 2 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Izz"][:6], 2 * np.arange(6) + 1) # npt.assert_equal(self.outputs["platform_elem_rho"][:6], 3 * np.arange(6)+1) npt.assert_equal(self.outputs["platform_elem_E"][:6], 3 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_G"][:6], 4 * np.arange(6) + 1) npt.assert_equal(self.outputs["platform_elem_Px1"][:6], 1.0) npt.assert_equal(self.outputs["platform_elem_Py1"][:6], 2.0) npt.assert_equal(self.outputs["platform_elem_Pz1"][:6], 3.0) npt.assert_equal(self.outputs["platform_elem_Px2"][:6], 1.0) npt.assert_equal(self.outputs["platform_elem_Py2"][:6], 2.0) npt.assert_equal(self.outputs["platform_elem_Pz2"][:6], 3.0) self.assertEqual(self.outputs["platform_displacement"], 6e1) centroid = np.array([0.375, 0.25, 0.25]) R = np.zeros(6) R[0] = np.sum((self.inputs["member0:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) R[1] = np.sum((self.inputs["member1:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) R[2] = np.sum((self.inputs["member2:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) R[3] = np.sum((self.inputs["member3:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) R[4] = np.sum((self.inputs["member4:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) R[5] = np.sum((self.inputs["member5:nodes_xyz"][:2, :2].mean(axis=0) - centroid[:2]) ** 2) npt.assert_equal(self.outputs["platform_center_of_buoyancy"], centroid) npt.assert_equal(self.outputs["platform_centroid"], centroid) npt.assert_equal(self.outputs["platform_center_of_mass"], centroid) self.assertEqual(self.outputs["platform_mass"], 6e3) self.assertEqual(self.outputs["platform_ballast_mass"], 6e2) self.assertEqual(self.outputs["platform_hull_mass"], 6e3 - 6e2) self.assertEqual(self.outputs["platform_cost"], 6 * 2e3) self.assertEqual(self.outputs["platform_Awater"], 30) self.assertEqual(self.outputs["platform_Iwater"], 6 * 15 + 5 * R.sum()) npt.assert_equal(self.outputs["platform_added_mass"], 6 * np.arange(6)) npt.assert_equal(self.outputs["platform_variable_capacity"], 10 + np.arange(6)) npt.assert_array_less(1e2, self.outputs["platform_I_total"])