def get_volume_by_element_id(self, element_id=None, xyz_cid0=None, total=False): """ Gets the volume for one or more elements. Parameters ---------- element_id : (nelements, ) int ndarray; default=None the elements to consider xyz_cid0 : (nnodes, 3) float ndarray; default=None -> calculate the GRIDs in CORD2R=0 total : bool; default=False should the volume be summed Notes ----- Volume for a CHEXA is the average area of two opposing faces times the length between the centroids of those points """ nodes = self._get_node_locations_by_element_id(element_id, xyz_cid0) n1, n2, n3, n4, n5, n6, n7, n8 = nodes volume = volume8(n1, n2, n3, n4, n5, n6, n7, n8) if total: volume = abs(volume).sum() else: volume = abs(volume) return volume
def get_mass_matrix(self, i, model, positions, index0s, is_lumped=True): nnodes = 8 ndof = 3 * nnodes pid = self.property_id[i] rho = self.model.elements.properties_solid.psolid.get_density_by_property_id(pid)[0] n0, n1, n2, n3, n4, n5, n6, n7 = self.node_ids[i, :] V = volume8(positions[self.node_ids[i, 0]], positions[self.node_ids[i, 1]], positions[self.node_ids[i, 2]], positions[self.node_ids[i, 3]], positions[self.node_ids[i, 4]], positions[self.node_ids[i, 5]], positions[self.node_ids[i, 6]], positions[self.node_ids[i, 7]], ) mass = rho * V if is_lumped: mi = mass / 4. nnodes = 4 M = eye(ndof, dtype='float32') else: mi = mass / 20. M = ones((ndof, ndof), dtype='float32') for i in range(nnodes): j = i * 3 M[j:j+3, j:j+3] = 2. M *= mi dofs, nijv = self.get_dofs_nijv(index0s, n0, n1, n2, n3, n4, n5, n6, n7) return M, dofs, nijv