19#include "libmesh/mesh.h"
20#include "libmesh/elem.h"
21#include "libmesh/node.h"
25 unsigned int n_qpoints,
27 :
XFEMCutElem(elem, n_qpoints, n_sides), _efa_elem3d(CEMelem, true)
38 Point node_coor(0.0, 0.0, 0.0);
39 std::vector<EFANode *> master_nodes;
40 std::vector<Point> master_points;
41 std::vector<double> master_weights;
44 for (
unsigned int i = 0; i < master_nodes.size(); ++i)
51 Point node_p((*node)(0), (*node)(1), (*node)(2));
52 master_points.push_back(node_p);
57 for (
unsigned int i = 0; i < master_nodes.size(); ++i)
58 node_coor += master_weights[i] * master_points[i];
68 std::vector<std::vector<unsigned int>> frag_face_indices;
69 std::vector<EFANode *> frag_nodes;
71 int face_num = frag_face_indices.size();
72 int node_num = frag_nodes.size();
75 int * order =
new int[face_num];
76 for (
int i = 0; i < face_num; ++i)
78 if (frag_face_indices[i].size() > (
unsigned int)order_max)
79 order_max = frag_face_indices[i].size();
80 order[i] = frag_face_indices[i].size();
83 double * coord =
new double[3 * node_num];
84 for (
unsigned int i = 0; i < frag_nodes.size(); ++i)
87 coord[3 * i + 0] =
p(0);
88 coord[3 * i + 1] =
p(1);
89 coord[3 * i + 2] =
p(2);
92 int * node =
new int[face_num * order_max];
94 for (
int i = 0; i < face_num; ++i)
95 for (
unsigned int j = 0; j < frag_face_indices[i].size(); ++j)
96 node[order_max * i + j] = frag_face_indices[i][j];
110 Real frag_surf = 0.0;
112 std::vector<std::vector<unsigned int>> frag_face_indices;
113 std::vector<EFANode *> frag_nodes;
115 int face_num = frag_face_indices.size();
118 bool contains_all =
true;
121 for (
int i = 0; i < face_num; ++i)
124 for (
unsigned int j = 0; j < frag_face_indices[i].size(); ++j)
126 EFANode * efa_node = frag_nodes[frag_face_indices[i][j]];
129 contains_all =
false;
136 for (
unsigned int j = 0; j < frag_face_indices[i].size(); ++j)
138 unsigned int m = ((j + 1) == frag_face_indices[i].size()) ? 0 : j + 1;
142 frag_surf += 0.5 * (edge_p1(0) - edge_p2(0)) * (edge_p1(1) + edge_p2(1));
161 Point orig(0.0, 0.0, 0.0);
162 std::vector<std::vector<EFANode *>> cut_plane_nodes;
168 std::vector<EFANode *> node_line;
169 for (
unsigned int j = 0; j < face->
numNodes(); ++j)
170 node_line.push_back(face->
getNode(j));
171 cut_plane_nodes.push_back(node_line);
174 if (cut_plane_nodes.size() == 0)
175 mooseError(
"no cut plane found in this element");
176 if (plane_id < cut_plane_nodes.size())
178 std::vector<Point> cut_plane_points;
179 for (
unsigned int i = 0; i < cut_plane_nodes[plane_id].size(); ++i)
180 cut_plane_points.push_back(
getNodeCoordinates(cut_plane_nodes[plane_id][i], displaced_mesh));
182 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
183 orig += cut_plane_points[i];
184 orig /= cut_plane_points.size();
192 Point normal(0.0, 0.0, 0.0);
193 std::vector<std::vector<EFANode *>> cut_plane_nodes;
199 std::vector<EFANode *> node_line;
200 for (
unsigned int j = 0; j < face->
numNodes(); ++j)
201 node_line.push_back(face->
getNode(j));
202 cut_plane_nodes.push_back(node_line);
205 if (cut_plane_nodes.size() == 0)
206 mooseError(
"no cut plane found in this element");
207 if (plane_id < cut_plane_nodes.size())
209 std::vector<Point> cut_plane_points;
210 for (
unsigned int i = 0; i < cut_plane_nodes[plane_id].size(); ++i)
211 cut_plane_points.push_back(
getNodeCoordinates(cut_plane_nodes[plane_id][i], displaced_mesh));
214 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
215 center += cut_plane_points[i];
216 center /= cut_plane_points.size();
218 for (
unsigned int i = 0; i < cut_plane_points.size(); ++i)
220 unsigned int iplus1 = i < cut_plane_points.size() - 1 ? i + 1 : 0;
223 normal += ray1.
cross(ray2);
225 normal /= cut_plane_points.size();
237 mooseError(
"getCrackTipOriginAndDirection not yet implemented for XFEMCutElem3D");
245 mooseError(
"getFragmentFaces not yet implemented for XFEMCutElem3D");
257 unsigned int counter = 0;
267 std::vector<Point> & intersectionPoints,
270 intersectionPoints.clear();
271 std::vector<std::vector<EFANode *>> cut_plane_nodes;
277 std::vector<EFANode *> node_line;
278 for (
unsigned int j = 0; j < face->
numNodes(); ++j)
279 node_line.push_back(face->
getNode(j));
280 cut_plane_nodes.push_back(node_line);
283 if (cut_plane_nodes.size() == 0)
284 mooseError(
"No cut plane found in this element");
286 if (plane_id < cut_plane_nodes.size())
288 intersectionPoints.resize(cut_plane_nodes[plane_id].size());
289 for (
unsigned int i = 0; i < cut_plane_nodes[plane_id].size(); ++i)
290 intersectionPoints[i] =
getNodeCoordinates(cut_plane_nodes[plane_id][i], displaced_mesh);
void mooseError(Args &&... args)
EFAFragment3D * getFragment(unsigned int frag_id) const
virtual void getMasterInfo(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
EFAFace * getFace(unsigned int face_id) const
bool containsNode(const EFANode *node) const
unsigned int numNodes() const
EFANode * getNode(unsigned int node_id) const
bool isFaceInterior(unsigned int face_id) const
void getNodeInfo(std::vector< std::vector< unsigned int > > &face_node_indices, std::vector< EFANode * > &nodes) const
EFAFace * getFace(unsigned int face_id) const
virtual Point getCutPlaneOrigin(unsigned int plane_id, MeshBase *displaced_mesh=nullptr) const
virtual void computeMomentFittingWeights()
virtual void getIntersectionInfo(unsigned int plane_id, Point &normal, std::vector< Point > &intersectionPoints, MeshBase *displaced_mesh=nullptr) const
XFEMCutElem3D(Elem *elem, const EFAElement3D *const CEMelem, unsigned int n_qpoints, unsigned int n_sides)
Constructor initializes XFEMCutElem3D object.
virtual unsigned int numCutPlanes() const
virtual Point getNodeCoordinates(EFANode *node, MeshBase *displaced_mesh=nullptr) const
virtual const EFAElement * getEFAElement() const
virtual void computePhysicalVolumeFraction()
Computes the volume fraction of the element fragment.
virtual Point getCutPlaneNormal(unsigned int plane_id, MeshBase *displaced_mesh=nullptr) const
virtual void getCrackTipOriginAndDirection(unsigned tip_id, Point &origin, Point &direction) const
virtual void getFragmentFaces(std::vector< std::vector< Point > > &frag_faces, MeshBase *displaced_mesh=nullptr) const
virtual void computePhysicalFaceAreaFraction(unsigned int side)
Computes the surface area fraction of the element side.
std::vector< Real > _new_weights
quadrature weights from volume fraction and moment fitting
std::vector< Node * > _nodes
std::vector< Real > _physical_areafrac
std::vector< Real > _elem_side_area
virtual const Node * node_ptr(const dof_id_type i) const=0
TypeVector< typename CompareTypes< Real, T2 >::supertype > cross(const TypeVector< T2 > &v) const
void i4vec_zero(int n, int a[])
double polyhedron_volume_3d(double coord[], int order_max, int face_num, int node[], int node_num, int order[])
void normalizePoint(Point &p)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real