physical_geometry.cpp
1 #include "physical_geometry.hpp"
2 #include "../../tessellation/triangle_area.hpp"
3 
4 PhysicalGeometry::~PhysicalGeometry(void) {}
5 
7 
8 double SlabSymmetry::calcArea(const Edge& edge) const
9 {
10  return abs(edge.vertices.first-edge.vertices.second);
11 }
12 
13 double SlabSymmetry::calcVolume(const vector<Edge>& edge_list) const
14 {
15  double res = 0;
16  const Vector2D anchor = edge_list[0].vertices.first;
17  for(size_t i=1;i<edge_list.size();++i)
18  res += calc_triangle_area(anchor,edge_list[i].vertices.first,
19  edge_list[i].vertices.second);
20  return res;
21 }
22 
23 Vector2D SlabSymmetry::calcCentroid(const vector<Vector2D>& chull) const
24 {
25  Vector2D res;
26  double V = 0;
27  for (size_t i = 0; i < chull.size()-1; ++i)
28  {
29  double dv = calc_triangle_area(chull[0], chull[i], chull[i + 1]);
30  V += dv;
31  res += dv*0.3333333333*Vector2D(chull[0].x + chull[i].x + chull[i + 1].x, chull[0].y + chull[i].y + chull[i + 1].y);
32  }
33  res *= 1.0/V;
34  return res;
35 }
36 
37 double SlabSymmetry::calcVolume(const vector<Vector2D>& chull) const
38 {
39  double res = 0;
40  const Vector2D anchor = chull[0];
41  for(size_t i=1;i<chull.size()-1;++i)
42  res += calc_triangle_area(anchor,chull[i],chull[i+1]);
43  return res;
44 }
45 
46 Axis::Axis(const Vector2D& origin_i,
47  const Vector2D& direction_i):
48  origin(origin_i), direction(direction_i/abs(direction_i)) {}
49 
50 namespace
51 {
52  Vector2D change_coordinate(const Vector2D& v,
53  const Axis& axis)
54  {
55  return Vector2D(ScalarProd(v-axis.origin,
56  axis.direction),
57  std::abs(ScalarProd(v-axis.origin,
58  zcross(axis.direction))));
59  }
60 }
61 
63 (const Vector2D& origin, const Vector2D& direction):
64  axis_(origin,direction) {}
65 
66 double CylindricalSymmetry::calcArea(const Edge& edge) const
67 {
68  const Vector2D p1 = change_coordinate(edge.vertices.first, axis_);
69  const Vector2D p2 = change_coordinate(edge.vertices.second, axis_);
70  return M_PI*(p1.y+p2.y)*sqrt((p2.y - p1.y )*(p2.y - p1.y )+ (p2.x - p1.x)*(p2.x - p1.x));
71 }
72 
73 namespace {
74  double calc_cone_segment_volume(const Vector2D& p1,
75  const Vector2D& p2,
76  const Axis& axis)
77  {
78  const Vector2D q1 = change_coordinate(p1, axis);
79  const Vector2D q2 = change_coordinate(p2, axis);
80  return (M_PI/3.)*(q2.x-q1.x)*(q1.y*q1.y+ q2.y *q2.y +q1.y*q2.y);
81  }
82 
83  double calc_triangular_ring_volume(const Vector2D& p1,
84  const Vector2D& p2,
85  const Vector2D& p3,
86  const Axis& axis)
87  {
88  return std::abs(calc_cone_segment_volume(p1,p2,axis)+
89  calc_cone_segment_volume(p2,p3,axis)+
90  calc_cone_segment_volume(p3,p1,axis));
91  }
92 }
93 
94 double CylindricalSymmetry::calcVolume(const vector<Edge>& edge_list) const
95 {
96  double res = 0;
97  const Vector2D anchor = edge_list[0].vertices.first;
98  for(size_t i=1;i<edge_list.size();++i)
99  res += calc_triangular_ring_volume(anchor,
100  edge_list[i].vertices.first,
101  edge_list[i].vertices.second,
102  axis_);
103  return res;
104 }
105 
106 Vector2D CylindricalSymmetry::calcCentroid(const vector<Vector2D>& chull) const
107 {
108  double V = 0;
109  Vector2D res;
110  Vector2D anchor = change_coordinate(chull[0], axis_);
111  for (size_t i = 1; i < chull.size() - 1; ++i)
112  {
113  Vector2D q1 = change_coordinate(chull[i], axis_);
114  Vector2D q2 = change_coordinate(chull[i+1], axis_);
115  double dv = 0.5*std::abs(CrossProduct(q2 - anchor, q1 - anchor));
116  V += dv;
117  res += dv*Vector2D((2 * anchor.x*anchor.y + q1.x*anchor.y + q2.x*anchor.y + q1.y*anchor.x + q1.y*q1.x * 2 + q1.y*q2.x
118  + q2.y*anchor.x + q2.y*q1.x + 2 * q2.x*q2.y) / 12.0, (anchor.y*anchor.y + anchor.y*q1.y + anchor.y*q2.y
119  + q1.y*q2.y + q1.y*q1.y + q2.y*q2.y) / 6.0);
120  }
121  double realV = calcVolume(chull);
122  res *= 2*M_PI / realV;
123 
124  Vector2D perp = zcross(axis_.direction);
125  Vector2D res2(res.x*axis_.direction.x+res.y*perp.x, res.y*perp.y+res.x*axis_.direction.y);
126  return res2;
127 }
128 
129 double CylindricalSymmetry::calcVolume(const vector<Vector2D>& chull) const
130 {
131  double res = 0;
132  const Vector2D anchor = chull[0];
133  for(size_t i=1;i<chull.size()-1;++i)
134  res += calc_triangular_ring_volume(anchor,
135  chull[i],
136  chull[i+1],
137  axis_);
138  return res;
139 }
140 
142 {
143  return axis_;
144 }
double calcArea(const Edge &edge) const
Calculates the physical area of an edge.
Vector3D CrossProduct(Vector3D const &v1, Vector3D const &v2)
Returns the cross product of two vectors.
Definition: Vector3D.cpp:213
Interface between two cells.
Definition: Edge.hpp:13
Vector2D calcCentroid(const vector< Vector2D > &chull) const
Calculates the centroid of a cell.
Vector2D calcCentroid(const vector< Vector2D > &chull) const
Calculates the centroid of a cell.
double y
Component in the y direction.
Definition: geometry.hpp:48
const Axis & getAxis(void) const
Returns the axis of revolution.
double calcVolume(const vector< Edge > &edge_list) const
Calculates the physical volume of a cell.
double calcVolume(const vector< Edge > &edge_list) const
Calculates the physical volume of a cell.
double ScalarProd(Vector3D const &v1, Vector3D const &v2)
Scalar product of two vectors.
Definition: Vector3D.cpp:185
Axis of revolution.
Axis(const Vector2D &origin_i, const Vector2D &direction_i)
Class constructor.
std::pair< Vector2D, Vector2D > vertices
Points at the ends of the edge.
Definition: Edge.hpp:18
const Vector2D direction
Positive direction of the axis.
double calcArea(const Edge &edge) const
Calculates the physical area of an edge.
double calc_triangle_area(const Vector2D &p1, const Vector2D &p2, const Vector2D &p3)
Calculates the area of a triangle.
SlabSymmetry(void)
Class constructor.
Physical geometry of the grid.
double abs(Vector3D const &v)
Norm of a vector.
Definition: Vector3D.cpp:44
const Vector2D origin
Origin of the axis.
2D Mathematical vector
Definition: geometry.hpp:15
double x
Component in the x direction.
Definition: geometry.hpp:45
Vector2D zcross(Vector2D const &v)
Cross product of a vector in x,y plane with a unit vector in the z direction.
Definition: geometry.cpp:145
CylindricalSymmetry(const Vector2D &origin, const Vector2D &direction)
Class constructor.