EdgeLengthCorrect.cpp
1 #include "EdgeLengthCorrect.hpp"
2 
3 void CorrectEdgeLength(Tessellation const& tessold,Tessellation const& tessnew,
4  vector<double> &lengths)
5 {
6  int n=tessold.GetTotalSidesNumber();
7  int npoints=tessold.GetPointNo();
8  lengths.resize(static_cast<size_t>(n));
9  for(int i=0;i<npoints;++i)
10  {
11  vector<int> edgesold=tessold.GetCellEdges(i);
12  vector<int> edgesnew=tessnew.GetCellEdges(i);
13  int nedges=static_cast<int>(edgesold.size());
14  int nedgesnew=static_cast<int>(edgesnew.size());
15  for(int j=0;j<nedges;++j)
16  {
17  Edge const& edge=tessold.GetEdge(edgesold[static_cast<size_t>(j)]);
18  int n0=edge.neighbors.first;
19  int n1=edge.neighbors.second;
20  bool found=false;
21  // Don't do double work
22  if((n0<i&&n0>=0)||(n1<i&&n1>=0))
23  continue;
24  for(int k=0;k<nedgesnew;++k)
25  {
26  Edge const& edgenew=tessnew.GetEdge(edgesnew[static_cast<size_t>((k+j)%nedgesnew)]);
27  // are the two edges the same?
28  if(((tessold.GetOriginalIndex(n0)==tessnew.GetOriginalIndex(
29  edgenew.neighbors.first))&&
30  (tessold.GetOriginalIndex(n1)==tessnew.GetOriginalIndex(
31  edgenew.neighbors.second)))||((tessold.GetOriginalIndex(n0)==
32  tessnew.GetOriginalIndex(edgenew.neighbors.second))&&
33  (tessold.GetOriginalIndex(n1)==tessnew.GetOriginalIndex(
34  edgenew.neighbors.first))))
35  {
36  lengths[static_cast<size_t>(edgesold[static_cast<size_t>(j)])]=0.5*(edge.GetLength()+edgenew.GetLength());
37  found=true;
38  break;
39  }
40  }
41  if(!found)
42  lengths[static_cast<size_t>(edgesold[static_cast<size_t>(j)])]=0.5*edge.GetLength();
43  }
44  }
45 }
46 
47 void CorrectEdgeLength(Tessellation const& tessold,Tessellation const& tessmid,
48  Tessellation const& tessnew,vector<double> &lengths)
49 {
50  int n=tessmid.GetTotalSidesNumber();
51  int npoints=tessmid.GetPointNo();
52  lengths.resize(static_cast<size_t>(n));
53  for(int i=0;i<npoints;++i)
54  {
55  vector<int> edgesold=tessold.GetCellEdges(i);
56  vector<int> edgesnew=tessnew.GetCellEdges(i);
57  vector<int> edgesmid=tessmid.GetCellEdges(i);
58  int nedges=static_cast<int>(edgesold.size());
59  int nedgesnew=static_cast<int>(edgesnew.size());
60  int nedgesmid=static_cast<int>(edgesmid.size());
61  for(int j=0;j<nedgesmid;++j)
62  {
63  Edge const& edge=tessmid.GetEdge(edgesmid[static_cast<size_t>(j)]);
64  int n0=edge.neighbors.first;
65  int n1=edge.neighbors.second;
66  // Don't do double work
67  if((n0<i&&n0>=0)||(n1<i&&n1>=0))
68  continue;
69  lengths[static_cast<size_t>(edgesmid[static_cast<size_t>(j)])]=0.5*edge.GetLength();
70  for(int k=0;k<nedgesnew;++k)
71  {
72  Edge const& edgenew=tessnew.GetEdge(edgesnew[static_cast<size_t>((k+j)%nedgesnew)]);
73  // are the two edges the same?
74  if(((tessmid.GetOriginalIndex(n0)==tessnew.GetOriginalIndex(
75  edgenew.neighbors.first))&&
76  (tessmid.GetOriginalIndex(n1)==tessnew.GetOriginalIndex(
77  edgenew.neighbors.second)))||((tessmid.GetOriginalIndex(n0)==
78  tessnew.GetOriginalIndex(edgenew.neighbors.second))&&
79  (tessmid.GetOriginalIndex(n1)==tessnew.GetOriginalIndex(
80  edgenew.neighbors.first))))
81  {
82  lengths[static_cast<size_t>(edgesmid[static_cast<size_t>(j)])]+=0.25*edgenew.GetLength();
83  break;
84  }
85  }
86  for(int k=0;k<nedges;++k)
87  {
88  Edge const& edgeold=tessold.GetEdge(edgesold[static_cast<size_t>((k+j)%nedges)]);
89  // are the two edges the same?
90  if(((tessmid.GetOriginalIndex(n0)==tessold.GetOriginalIndex(
91  edgeold.neighbors.first))&&
92  (tessmid.GetOriginalIndex(n1)==tessold.GetOriginalIndex(
93  edgeold.neighbors.second)))||((tessmid.GetOriginalIndex(n0)==
94  tessold.GetOriginalIndex(edgeold.neighbors.second))&&
95  (tessmid.GetOriginalIndex(n1)==tessold.GetOriginalIndex(
96  edgeold.neighbors.first))))
97  {
98  lengths[static_cast<size_t>(edgesmid[static_cast<size_t>(j)])]+=0.25*edgeold.GetLength();
99  break;
100  }
101  }
102  }
103  }
104 }
Abstract class for tessellation.
virtual int GetPointNo(void) const =0
Get Total number of mesh generating points.
virtual int GetOriginalIndex(int point) const
Returns the original index of the duplicated point.
Definition: tessellation.cpp:5
Interface between two cells.
Definition: Edge.hpp:13
virtual Edge const & GetEdge(int index) const =0
Returns edge (interface between cells)
void CorrectEdgeLength(Tessellation const &tessold, Tessellation const &tessnew, vector< double > &lengths)
Corrects the length of the edges to be second order in time.
virtual int GetTotalSidesNumber(void) const =0
Returns the total number of faces.
std::pair< int, int > neighbors
Neighboring cells.
Definition: Edge.hpp:21
Attempts to improve the accuracy of the simulation by taking into accout the change in the length of ...
virtual vector< int > const & GetCellEdges(int index) const =0
Returns the indexes of a cell&#39;s edges.
double GetLength(void) const
Returns the length of the edge.
Definition: Edge.cpp:26