www.mooseframework.org
EFAEdge.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "EFAEdge.h"
11 
12 #include "EFANode.h"
13 #include "EFAError.h"
14 #include "XFEMFuncs.h"
15 
16 EFAEdge::EFAEdge(EFANode * node1, EFANode * node2) : _edge_node1(node1), _edge_node2(node2)
17 {
18  _embedded_nodes.clear();
19  _intersection_x.clear();
20  _edge_interior_node = NULL;
22 }
23 
24 EFAEdge::EFAEdge(const EFAEdge & other_edge)
25 {
26  _edge_node1 = other_edge._edge_node1;
27  _edge_node2 = other_edge._edge_node2;
28  _intersection_x = other_edge._intersection_x;
29  _embedded_nodes = other_edge._embedded_nodes;
31 }
32 
33 EFAEdge::~EFAEdge() // do not delete edge node - they will be deleted
34 { // in EFAelement's destructor
35 }
36 
37 bool
38 EFAEdge::equivalent(const EFAEdge & other) const
39 {
40  bool isEqual = false;
41  if (other._edge_node1 == _edge_node1 && other._edge_node2 == _edge_node2)
42  isEqual = true;
43  else if (other._edge_node2 == _edge_node1 && other._edge_node1 == _edge_node2)
44  isEqual = true;
45 
46  // For cut along the edge case
47  if (isEqual)
48  {
51  isEqual = false;
52  }
53  return isEqual;
54 }
55 
56 bool
57 EFAEdge::isPartialOverlap(const EFAEdge & other) const
58 {
59  return containsEdge(other) || other.containsEdge(*this);
60 }
61 
62 bool
63 EFAEdge::containsEdge(const EFAEdge & other) const
64 {
65  return containsNode(other._edge_node1) && containsNode(other._edge_node2);
66 }
67 
68 bool
70  std::vector<EFANode *> & master_nodes,
71  std::vector<double> & master_weights) const
72 {
73  master_nodes.clear();
74  master_weights.clear();
75  bool masters_found = false;
76  if (_edge_node1 == node || _edge_node2 == node)
77  {
78  master_nodes.push_back(node);
79  master_weights.push_back(1.0);
80  masters_found = true;
81  }
82  else
83  {
84  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
85  {
86  if (_embedded_nodes[i] == node)
87  {
88  master_nodes.push_back(_edge_node1);
89  master_nodes.push_back(_edge_node2);
90  master_weights.push_back(1.0 - _intersection_x[i]);
91  master_weights.push_back(_intersection_x[i]);
92  masters_found = true;
93  break;
94  }
95  }
96  }
97  return masters_found;
98 }
99 
100 // TODO: Saving because I don't want to throw it away, but it needs more work to be used.
101 // bool
102 // EFAEdge::operator < (const edge_t & other) const
103 //{
104 // node_t * this_min_node;
105 // node_t * this_max_node;
106 // node_t * other_min_node;
107 // node_t * other_max_node;
108 //
109 // int this_node1_unique_index = ((int) edge_node1->category + 1) * edge_node1->id;
110 // int this_node2_unique_index = ((int) edge_node2->category + 1) * edge_node2->id;
111 // int other_node1_unique_index = ((int) other.edge_node1->category + 1) * edge_node1->id;
112 // int other_node2_unique_index = ((int) other.edge_node2->category + 1) * edge_node2->id;
113 // int this_min_index = std::min(this_node1_unique_index, this_node2_unique_index);
114 // int other_min_index = std::min(other_node1_unique_index, other_node2_unique_index);
115 //
116 // if (this_min_index < other_min_index)
117 // return true;
118 // else if (this_min_index == other_min_index)
119 // {
120 // int this_max_index = std::max(this_node1_unique_index, this_node2_unique_index);
121 // int other_max_index = std::max(other_node1_unique_index, other_node2_unique_index);
122 //
123 // if (this_max_index < other_max_index)
124 // return true;
125 // }
126 // return false;
127 //}
128 
129 void
130 EFAEdge::addIntersection(double position, EFANode * embedded_node_tmp, EFANode * from_node)
131 {
132  _embedded_nodes.push_back(embedded_node_tmp);
133  if (from_node == _edge_node1)
134  _intersection_x.push_back(position);
135  else if (from_node == _edge_node2)
136  _intersection_x.push_back(1.0 - position);
137  else
138  EFAError("In addIntersection from_node does not exist on edge");
139 }
140 
141 void
142 EFAEdge::resetIntersection(double position, EFANode * embedded_node_tmp, EFANode * from_node)
143 {
144  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
145  {
146  if (_embedded_nodes[i] == embedded_node_tmp)
147  {
148  if (from_node == _edge_node1)
149  _intersection_x[i] = position;
150  else if (from_node == _edge_node2)
151  _intersection_x[i] = 1.0 - position;
152  else
153  EFAError("In resetIntersection from_node does not exist on edge");
154  break;
155  }
156  }
157 }
158 
159 void
160 EFAEdge::copyIntersection(const EFAEdge & other, unsigned int from_node_id)
161 {
162  _embedded_nodes.clear();
163  _intersection_x.clear();
165  if (from_node_id == 0)
167  else if (from_node_id == 1)
168  {
169  for (unsigned int i = 0; i < other.numEmbeddedNodes(); ++i)
170  _intersection_x.push_back(1.0 - other._intersection_x[i]);
171  }
172  else
173  EFAError("from_node_id out of bounds");
174  if (_embedded_nodes.size() != _intersection_x.size())
175  EFAError("in copyIntersection num emb_nodes must == num of inters_x");
176 }
177 
178 EFANode *
179 EFAEdge::getNode(unsigned int index) const
180 {
181  if (index == 0)
182  return _edge_node1;
183  else if (index == 1)
184  return _edge_node2;
185  else
186  EFAError("In getNode index out of bounds");
187 }
188 
189 void
191 {
192  std::swap(_edge_node1, _edge_node2);
193  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
194  _intersection_x[i] = 1.0 - _intersection_x[i];
195 }
196 
197 bool
199 {
200  bool has = false;
201  if (_edge_node1->parent() != NULL)
203 
204  if (_edge_node2->parent() != NULL)
206 
207  return has || _embedded_nodes.size() > 0;
208 }
209 
210 bool
211 EFAEdge::hasIntersectionAtPosition(double position, EFANode * from_node) const
212 {
213  bool has_int = false;
214  if (hasIntersection())
215  {
216  double tmp_intersection_x = -1.0;
217  if (from_node == _edge_node1)
218  tmp_intersection_x = position;
219  else if (from_node == _edge_node2)
220  tmp_intersection_x = 1.0 - position;
221  else
222  EFAError("In hasIntersectionAtPosition from_node does not exist on edge");
223 
224  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
225  {
226  if (std::abs(tmp_intersection_x - _intersection_x[i]) < Xfem::tol)
227  {
228  has_int = true;
229  break;
230  }
231  }
232  }
233  return has_int;
234 }
235 
236 double
237 EFAEdge::getIntersection(unsigned int emb_id, EFANode * from_node) const
238 {
239  if (from_node == _edge_node1)
240  return _intersection_x[emb_id];
241  else if (from_node == _edge_node2)
242  return 1.0 - _intersection_x[emb_id];
243  else
244  EFAError("In getIntersection node not in edge");
245 }
246 
247 double
249 {
250  double xi = -100.0;
251  if (_edge_node1 == node)
252  xi = 0.0;
253  else if (_edge_node2 == node)
254  xi = 1.0;
255  else if (isEmbeddedNode(node))
256  {
257  unsigned int embedded_node_id = getEmbeddedNodeIndex(node);
258  xi = _intersection_x[embedded_node_id];
259  }
260  else
261  EFAError("the given node is not found in the current edge");
262  return xi;
263 }
264 
265 bool
266 EFAEdge::isEmbeddedNode(const EFANode * node) const
267 {
268  bool is_emb = false;
269  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
270  {
271  if (_embedded_nodes[i] == node)
272  {
273  is_emb = true;
274  break;
275  }
276  }
277  return is_emb;
278 }
279 
280 unsigned int
282 {
283  unsigned int index;
284  bool have_index = false;
285  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
286  {
287  if (_embedded_nodes[i] == node)
288  {
289  have_index = true;
290  index = i;
291  break;
292  }
293  }
294  if (!have_index)
295  EFAError("In getEmbeddedNodeIndex, could not find index");
296  return index;
297 }
298 
299 unsigned int
300 EFAEdge::getEmbeddedNodeIndex(double position, EFANode * from_node) const
301 {
302  bool have_index = false;
303  unsigned int index;
304  if (hasIntersection())
305  {
306  double tmp_intersection_x = -1.0; // dist from edge_node1
307  if (from_node == _edge_node1)
308  tmp_intersection_x = position;
309  else if (from_node == _edge_node2)
310  tmp_intersection_x = 1.0 - position;
311  else
312  EFAError("In getEmbeddedNodeIndex, from_node does not exist on edge");
313 
314  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
315  {
316  if (std::abs(tmp_intersection_x - _intersection_x[i]) < Xfem::tol)
317  {
318  have_index = true;
319  index = i;
320  break;
321  }
322  }
323  }
324  if (!have_index)
325  EFAError("In getEmbeddedNodeIndex, could not find index");
326  return index;
327 }
328 
329 EFANode *
330 EFAEdge::getEmbeddedNode(unsigned int index) const
331 {
332  if (index < _embedded_nodes.size())
333  return _embedded_nodes[index];
334  else
335  EFAError("in getEmbeddedNode index out of bounds");
336 }
337 
338 unsigned int
340 {
341  return _embedded_nodes.size();
342 }
343 
344 void
346 {
347  bool consistent = true;
351  consistent = false;
355  consistent = false;
356  if (!consistent)
357  EFAError("In consistencyCheck nodes on edge are not consistent");
358  if (_embedded_nodes.size() != _intersection_x.size())
359  EFAError("In consistencyCheck num of emb_nodes must be = num of inters_x");
360 }
361 
362 void
363 EFAEdge::switchNode(EFANode * new_node, EFANode * old_node)
364 {
365  if (_edge_node1 == old_node)
366  _edge_node1 = new_node;
367  else if (_edge_node2 == old_node)
368  _edge_node2 = new_node;
369  else if (isEmbeddedNode(old_node))
370  {
371  unsigned int id = getEmbeddedNodeIndex(old_node);
372  _embedded_nodes[id] = new_node;
373  }
374 }
375 
376 bool
377 EFAEdge::containsNode(const EFANode * node) const
378 {
379  return _edge_node1 == node || _edge_node2 == node || isEmbeddedNode(node);
380 }
381 
382 void
384 {
385  _embedded_nodes.clear();
386  _intersection_x.clear();
387 }
388 
389 void
391 {
392  unsigned int index = 0;
393  bool node_found = false;
394  for (unsigned int i = 0; i < _embedded_nodes.size(); ++i)
395  {
396  if (_embedded_nodes[i] == node)
397  {
398  index = i;
399  node_found = true;
400  break;
401  }
402  }
403  if (node_found)
404  {
405  _embedded_nodes.erase(_embedded_nodes.begin() + index);
406  _intersection_x.erase(_intersection_x.begin() + index);
407  }
408 }
EFAEdge::hasIntersectionAtPosition
bool hasIntersectionAtPosition(double position, EFANode *from_node) const
Definition: EFAEdge.C:211
EFAEdge::_edge_node2
EFANode * _edge_node2
Definition: EFAEdge.h:26
EFANode::category
N_CATEGORY category() const
Definition: EFANode.C:42
EFAEdge::isEmbeddedNode
bool isEmbeddedNode(const EFANode *node) const
Definition: EFAEdge.C:266
EFAEdge::EFAEdge
EFAEdge(EFANode *node1, EFANode *node2)
Definition: EFAEdge.C:16
EFAEdge::~EFAEdge
~EFAEdge()
Definition: EFAEdge.C:33
EFANode.h
EFANode::N_CATEGORY_LOCAL_INDEX
Definition: EFANode.h:23
EFANode::N_CATEGORY_TEMP
Definition: EFANode.h:20
EFAEdge::equivalent
bool equivalent(const EFAEdge &other) const
Definition: EFAEdge.C:38
EFAEdge::_intersection_x
std::vector< double > _intersection_x
Definition: EFAEdge.h:29
EFAEdge::copyIntersection
void copyIntersection(const EFAEdge &other, unsigned int from_node_id)
Definition: EFAEdge.C:160
EFAEdge::numEmbeddedNodes
unsigned int numEmbeddedNodes() const
Definition: EFAEdge.C:339
EFAEdge::addIntersection
void addIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
Definition: EFAEdge.C:130
EFAEdge::containsNode
bool containsNode(const EFANode *node) const
Definition: EFAEdge.C:377
XFEMFuncs.h
EFAEdge::getIntersection
double getIntersection(unsigned int emb_id, EFANode *from_node) const
Definition: EFAEdge.C:237
EFAEdge::switchNode
void switchNode(EFANode *new_node, EFANode *old_node)
Definition: EFAEdge.C:363
EFAEdge::removeEmbeddedNodes
void removeEmbeddedNodes()
Definition: EFAEdge.C:383
Xfem::tol
static const double tol
Definition: XFEMFuncs.h:20
EFAEdge::getNode
EFANode * getNode(unsigned int index) const
Definition: EFAEdge.C:179
EFAError.h
EFAEdge::resetIntersection
void resetIntersection(double position, EFANode *embedded_node_tmp, EFANode *from_node)
Definition: EFAEdge.C:142
EFAEdge::_edge_node1
EFANode * _edge_node1
Definition: EFAEdge.h:25
EFAEdge::reverseNodes
void reverseNodes()
Definition: EFAEdge.C:190
EFAEdge::getEmbeddedNode
EFANode * getEmbeddedNode(unsigned int index) const
Definition: EFAEdge.C:330
EFAEdge.h
EFAEdge::_edge_interior_node
EFANode * _edge_interior_node
Definition: EFAEdge.h:27
EFAEdge::consistencyCheck
void consistencyCheck()
Definition: EFAEdge.C:345
EFANode::N_CATEGORY_PERMANENT
Definition: EFANode.h:19
EFAEdge::distanceFromNode1
double distanceFromNode1(EFANode *node) const
Definition: EFAEdge.C:248
EFAEdge
Definition: EFAEdge.h:16
EFANode::N_CATEGORY_EMBEDDED_PERMANENT
Definition: EFANode.h:22
EFANode
Definition: EFANode.h:14
EFAEdge::hasIntersection
bool hasIntersection() const
Definition: EFAEdge.C:198
EFANode::parent
EFANode * parent() const
Definition: EFANode.C:48
EFAEdge::removeEmbeddedNode
void removeEmbeddedNode(EFANode *node)
Definition: EFAEdge.C:390
EFAEdge::isPartialOverlap
bool isPartialOverlap(const EFAEdge &other) const
Definition: EFAEdge.C:57
EFAEdge::_embedded_nodes
std::vector< EFANode * > _embedded_nodes
Definition: EFAEdge.h:28
EFAEdge::containsEdge
bool containsEdge(const EFAEdge &other) const
Definition: EFAEdge.C:63
EFAEdge::getEmbeddedNodeIndex
unsigned int getEmbeddedNodeIndex(EFANode *node) const
Definition: EFAEdge.C:281
EFAEdge::getNodeMasters
bool getNodeMasters(EFANode *node, std::vector< EFANode * > &master_nodes, std::vector< double > &master_weights) const
Definition: EFAEdge.C:69