RemovalStrategy.cpp
1 #include "RemovalStrategy.hpp"
2 #include <cmath>
3 
4 vector<int> RemovalStrategy::RemoveNearBoundary(vector<int> const& ToRemove,Tessellation
5  const& tess)const
6 {
7  int nrefine=static_cast<int>(ToRemove.size());
8  int npoints=tess.GetPointNo();
9  vector<int> res;
10  for(int i=0;i<nrefine;++i)
11  {
12  vector<int> const& edges=tess.GetCellEdges(ToRemove[static_cast<size_t>(i)]);
13  int nedge=static_cast<int>(edges.size());
14  bool good=true;
15  for(int j=0;j<nedge;++j)
16  {
17  Edge const& edge=tess.GetEdge(edges[static_cast<size_t>(j)]);
18  if(edge.neighbors.first>npoints||edge.neighbors.second>npoints)
19  {
20  good=false;
21  break;
22  }
23  }
24  if(good)
25  res.push_back(ToRemove[static_cast<size_t>(i)]);
26  }
27  return res;
28 }
29 
31 (vector<double> const& merits,vector<int> const&
32  candidates,Tessellation const& tess) const
33 {
34  vector<int> result;
35  vector<double> merits2;
36  if(merits.size()!=candidates.size())
37  throw UniversalError("Merits and Candidates don't have same size in RemovalStrategy");
38  // Make sure there are no neighbors
39  vector<int> bad_neigh;
40  int n=static_cast<int>(merits.size());
41  // int npoints=tess.GetPointNo();
42  for(int i=0;i<n;++i)
43  {
44  bool good=true;
45  vector<int> neigh=tess.GetNeighbors(candidates[static_cast<size_t>(i)]);
46  int nneigh=static_cast<int>(neigh.size());
47  if(find(bad_neigh.begin(),bad_neigh.end(),candidates[static_cast<size_t>(i)])!=
48  bad_neigh.end())
49  good=false;
50  else
51  {
52  for(int j=0;j<nneigh;++j)
53  {
54  if(binary_search(candidates.begin(),candidates.end(),neigh[static_cast<size_t>(j)]))
55  {
56  if(merits[static_cast<size_t>(i)]<merits[static_cast<size_t>(lower_bound(candidates.begin(),
57  candidates.end(),neigh[static_cast<size_t>(j)])-candidates.begin())])
58  {
59  good=false;
60  break;
61  }
62  if(fabs(merits[static_cast<size_t>(i)]-merits[static_cast<size_t>(lower_bound(candidates.begin(),
63  candidates.end(),neigh[static_cast<size_t>(j)])-candidates.begin())])<1e-9)
64  {
65  if(find(bad_neigh.begin(),bad_neigh.end(),neigh[static_cast<size_t>(j)])==
66  bad_neigh.end())
67  bad_neigh.push_back(neigh[static_cast<size_t>(j)]);
68  }
69  }
70  }
71  }
72  if(good)
73  {
74  result.push_back(candidates[static_cast<size_t>(i)]);
75  merits2.push_back(merits[static_cast<size_t>(i)]);
76  }
77  }
78  return result;
79 }
80 
81 void RemovalStrategy::CheckOutput(Tessellation const& tess,vector<int>
82  & ToRemove)const
83 {
84  sort(ToRemove.begin(),ToRemove.end());
85  int n=int(ToRemove.size());
86  for(int i=0;i<n;++i)
87  {
88  vector<int> edges=tess.GetCellEdges(ToRemove[static_cast<size_t>(i)]);
89  //check we are not near periodic boundary
90  for(int j=0;j<static_cast<int>(edges.size());++j)
91  {
92  Edge temp=tess.GetEdge(edges[static_cast<size_t>(j)]);
93 /* if(temp.neighbors.first>N||temp.neighbors.second>N)
94  throw UniversalError("Bad removal, neighbor is periodic");*/
95  if(temp.neighbors.first==ToRemove[static_cast<size_t>(i)])
96  {
97  if(binary_search(ToRemove.begin(),ToRemove.end(),temp.
98  neighbors.second))
99  throw UniversalError("Bad removal, neighboring cells");
100  }
101  else
102  if(binary_search(ToRemove.begin(),ToRemove.end(),temp.
103  neighbors.first))
104  throw UniversalError("Bad removal, neighboring cells");
105  }
106  }
107  return;
108 }
109 
Abstract class for tessellation.
vector< int > RemoveNearBoundary(vector< int > const &ToRemove, Tessellation const &tess) const
Removed from the list cells near periodic boundaries.
virtual int GetPointNo(void) const =0
Get Total number of mesh generating points.
Container for error reports.
void CheckOutput(Tessellation const &tess, vector< int > &ToRemove) const
Checks if the removed list is good, throws an error if not.
Interface between two cells.
Definition: Edge.hpp:13
virtual Edge const & GetEdge(int index) const =0
Returns edge (interface between cells)
virtual ~RemovalStrategy(void)
Virtual destructor.
std::pair< int, int > neighbors
Neighboring cells.
Definition: Edge.hpp:21
Abstract class for coarsening scheme.
vector< int > RemoveNeighbors(vector< double > const &merits, vector< int > const &candidates, Tessellation const &tess) const
Removes neighboring points and cells near the boundary which are not rigid walls. ...
virtual vector< int > const & GetCellEdges(int index) const =0
Returns the indexes of a cell&#39;s edges.
virtual vector< int > GetNeighbors(int index) const =0
Returns the indeces of the neighbors.