Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
ClusterBoundarySinks.h
Go to the documentation of this file.
1#ifndef model_ClusterBoundarySinks_H_
2#define model_ClusterBoundarySinks_H_
3#include <map>
4#include <set>
5#include <vector>
6#include <Eigen/Core>
7namespace model
8{
9 // Normals of physical sink faces incident on each higher-order FEM node.
10 // Same-grain active periodic seams are not sinks; periodic GBs are.
11 template<class FE>
12 auto clusterBoundarySinks(const FE& fe)
13 {
14 std::map<size_t,std::vector<Eigen::Vector3d>> result;
15 std::set<size_t> visited;
16 using Element=typename FE::ElementType;
17 for(const auto& region : fe.mesh.regions())
18 {
19 for(const auto& entry : region.second->faces())
20 {
21 const auto& face=*entry.second;
22 if(!visited.insert(face.sID).second)
23 {
24 continue;
25 }
26 const auto* partner=face.periodicFacePair.second;
27 if(face.isExternal() && partner && face.regionIDs.first==partner->regionIDs.first)
28 {
29 continue;
30 }
31 std::set<size_t> nodes;
32 for(const auto* triangle : face.simplices())
33 {
34 const auto& element=fe.elements().at(triangle->parents().begin()->first);
35 const size_t opposite=element.simplex.childOrder(triangle->xID);
36 for(size_t n=0;n<Element::nodesPerElement;++n)
37 {
38 if(Element::baryStarsAndBars(n,opposite)==0)
39 {
40 nodes.insert(element.node(n).gID);
41 }
42 }
43 }
44 for(const auto node : nodes)
45 {
46 result[node].push_back(face.outNormal(face.regionIDs.first));
47 }
48 }
49 }
50 return result;
51 }
52}
53#endif
auto clusterBoundarySinks(const FE &fe)
REAL ** triangle
Definition triangle.cpp:508
result