def Volume(self): (n1, n2, n3, n4, n5, n6) = self.nodePositions() A1 = Area(n3 - n1, n2 - n1) A2 = Area(n6 - n4, n5 - n4) c1 = (n1 + n2 + n3) / 3. c2 = (n4 + n5 + n6) / 3. V = (A1 + A2) / 2. * (c1 - c2) return abs(V)
def getFaceNodesAndArea(self, nid, nidOpposite): nids = self.nodeIDs()[:6] indx1 = nids.index(nid) indx2 = nids.index(nidOpposite) ## offset so it's easier to map the nodes with the QRG pack = [indx1 + 1, indx2 + 1] pack.sort() mapper = { # reverse points away from the element [1, 2]: [1, 2, 3], # close [2, 3]: [1, 2, 3], [1, 3]: [1, 2, 3], [4, 5]: [4, 5, 6], # far-reverse [5, 6]: [4, 5, 6], [4, 6]: [4, 5, 6], [1, 5]: [1, 2, 5, 4], # bottom [2, 4]: [1, 2, 5, 4], [1, 6]: [1, 3, 6, 4], # left-reverse [3, 4]: [1, 3, 6, 4], [2, 6]: [2, 5, 6, 3], # right [3, 5]: [2, 3, 6, 5], } pack2 = mapper[pack] if len(pack2) == 3: (n1, n2, n3) = pack2 faceNodeIDs = [n1, n2, n3] n1i = nids.index(n1 - 1) n2i = nids.index(n2 - 1) n3i = nids.index(n3 - 1) p1 = self.nodes[n1i].Position() p2 = self.nodes[n2i].Position() p3 = self.nodes[n3i].Position() a = p1 - p2 b = p1 - p3 A = Area(a, b) else: (n1, n2, n3, n4) = pack2 n1i = nids.index(n1 - 1) n2i = nids.index(n2 - 1) n3i = nids.index(n3 - 1) n4i = nids.index(n4 - 1) faceNodeIDs = [n1, n2, n3, n4] p1 = self.nodes[n1i].Position() p2 = self.nodes[n2i].Position() p3 = self.nodes[n3i].Position() p4 = self.nodes[n4i].Position() a = p1 - p3 b = p2 - p4 A = Area(a, b) return [faceNodeIDs, A]
def areaCentroid(self, n1, n2, n3, n4): a = n1 - n2 b = n2 - n4 area1 = Area(a, b) c1 = (n1 + n2 + n4) / 3. a = n2 - n4 b = n2 - n3 area2 = Area(a, b) c2 = (n2 + n3 + n4) / 3. area = area1 + area2 centroid = (c1 * area1 + c2 * area2) / area return(area, centroid)
def Area(self): r""" \f[ A = \frac{1}{2} \lvert (n_1-n_3) \times (n_2-n_4) \rvert \f] where a and b are the quad's cross node point vectors """ (n1, n2, n3, n4) = self.nodePositions() a = n1 - n3 b = n2 - n4 area = Area(a, b) return area
def Area(self): r""" returns the normal vector \f[ \large A = \frac{1}{2} (n_0-n_1) times (n_0-n_2) \f] """ (n1, n2, n3, n4, n5, n6) = self.nodePositions() a = n1 - n3 b = n1 - n5 area = Area(a, b) return area
def Area(self): r""" returns the normal vector \f[ \large A = \frac{1}{2} (n_0-n_1) \times (n_0-n_2) \f] """ (n0, n1, n2) = self.nodePositions() a = n0 - n1 b = n0 - n2 area = Area(a, b) return area
def AreaCentroid(self, debug=False): """ @code 1-----2 | /| | A1/ | | / | |/ A2 | 4-----3 centroid c = sum(ci*Ai)/sum(A) where: c=centroid A=area @endcode """ #if debug: # print("nodes = %s" %(self.nodes)) (n1, n2, n3, n4) = self.nodePositions() a = n1 - n2 b = n2 - n4 area1 = Area(a, b) c1 = self.CentroidTriangle(n1, n2, n4) a = n2 - n4 b = n2 - n3 area2 = Area(a, b) c2 = self.CentroidTriangle(n2, n3, n4) area = area1 + area2 centroid = (c1 * area1 + c2 * area2) / area if debug: print("c1=%s \n c2=%s \n a1=%s a2=%s" % (c1, c2, area1, area2)) print("type(centroid=%s centroid=%s \n" % (type(centroid), centroid)) return (area, centroid)