hdsim_3d.cpp
1 #include <cassert>
2 #include "hdsim_3d.hpp"
4 
6 time_(0), cycle_(0) {}
7 
9 {
10  ++cycle_;
11  time_ += dt;
12 }
13 
15 {
16  return time_;
17 }
18 
20 {
21  return cycle_;
22 }
23 
25  const vector<ComputationalCell>& cells,
26  const EquationOfState& eos,
27  const PointMotion3D& pm,
28  const TimeStepCalculator& tsc,
29  const FluxCalculator3D& fc,
30  const CellUpdater3D& cu):
31 tess_(tess), eos_(eos), cells_(cells),
32  extensive_(serial_generate(ExtensiveGenerator(cells,tess,eos))),
33  pm_(pm), tsc_(tsc), fc_(fc), cu_(cu), pt_()
34 {
35  assert(tess.GetPointNo()==cells.size());
36 }
37 
38 namespace
39 {
40  class PointVelocitiesCalculator: public LazyList<Vector3D>
41  {
42  public:
43 
44  PointVelocitiesCalculator(const PointMotion3D& pm,
45  const Tessellation3D& tess):
46  pm_(pm), tess_(tess) {}
47 
48  size_t size(void) const
49  {
50  return tess_.GetPointNo();
51  }
52 
53  Vector3D operator[](size_t i) const
54  {
55  return pm_(tess_.GetMeshPoint(i));
56  }
57 
58  private:
59  const PointMotion3D& pm_;
60  const Tessellation3D& tess_;
61  };
62 
63  void update_extensive(const vector<Conserved3D>& fluxes,
64  double dt,
65  const Tessellation3D& tess,
66  vector<Conserved3D>& extensive)
67  {
68  for(size_t i=0;i<tess.GetTotalFacesNumber();++i)
69  {
70  const Conserved3D delta = dt*tess.GetFace(i).GetArea()*fluxes[i];
71  if(!tess.IsGhostPoint(tess.GetFace(i).neighbors.first))
72  extensive[tess.GetFace(i).neighbors.first] -= delta;
73  if(!tess.IsGhostPoint(tess.GetFace(i).neighbors.second))
74  extensive[tess.GetFace(i).neighbors.second] += delta;
75  }
76  }
77 
78  class AllCellsUpdater: public LazyList<ComputationalCell>
79  {
80  public:
81 
82  AllCellsUpdater(const Tessellation3D& tess,
83  const vector<Conserved3D>& extensive,
84  const EquationOfState& eos,
85  const CellUpdater3D& cu):
86  tess_(tess), extensive_(extensive), eos_(eos), cu_(cu) {}
87 
88  size_t size(void) const
89  {
90  return extensive_.size();
91  }
92 
93  ComputationalCell operator[](size_t i) const
94  {
95  return cu_(extensive_[i]/tess_.GetVolume(i),eos_);
96  }
97 
98  private:
99  const Tessellation3D& tess_;
100  const vector<Conserved3D>& extensive_;
101  const EquationOfState& eos_;
102  const CellUpdater3D& cu_;
103  };
104 
105  class PointPositionUpdater: public LazyList<Vector3D>
106  {
107  public:
108 
109  PointPositionUpdater(const Tessellation3D& tess,
110  const vector<Vector3D>& velocities,
111  double dt):
112  tess_(tess), velocities_(velocities), dt_(dt) {}
113 
114  size_t size(void) const
115  {
116  return velocities_.size();
117  }
118 
119  Vector3D operator[](size_t i) const
120  {
121  return tess_.GetMeshPoint(i)+dt_*velocities_[i];
122  }
123 
124  private:
125  const Tessellation3D& tess_;
126  const vector<Vector3D>& velocities_;
127  const double dt_;
128  };
129 }
130 
132 {
133  const double dt = tsc_(tess_,cells_,eos_);
134  const vector<Vector3D> point_velocities =
135  serial_generate(PointVelocitiesCalculator(pm_,tess_));
136  update_extensive(fc_(tess_,cells_,eos_,point_velocities),
137  dt,tess_,extensive_);
138  tess_.Update(serial_generate(PointPositionUpdater(tess_,
139  point_velocities,
140  dt)));
141  cells_ = serial_generate(AllCellsUpdater(tess_,extensive_,eos_,cu_));
142  pt_.update(dt);
143 }
144 
146 {
147  return tess_;
148 }
149 
150 const vector<ComputationalCell>& HDSim3D::getCells(void) const
151 {
152  return cells_;
153 }
const vector< ComputationalCell > & getCells(void) const
Access to computational cells.
Definition: hdsim_3d.cpp:150
void timeAdvance()
Advances the simulation in time (first order)
Definition: hdsim_3d.cpp:131
std::pair< size_t, size_t > neighbors
Neighboring cells.
Definition: Face.hpp:23
Abstract class for time step calculator.
Abstract class for tessellation in 3D.
Abstract class for flux calculator.
Abstract class for point motion.
virtual bool IsGhostPoint(size_t index) const =0
Checks if a point is a ghost point or not.
vector< T > serial_generate(const LazyList< T > &ll)
Creates a vector from an LazyList.
Definition: lazy_list.hpp:49
Container for the hydrodynamic variables.
double getCycle(void) const
Returns the number of times time advance was called.
Definition: hdsim_3d.cpp:19
HDSim3D(Tessellation3D &tess, const vector< ComputationalCell > &cells, const EquationOfState &eos, const PointMotion3D &pm, const TimeStepCalculator &tsc, const FluxCalculator3D &fc, const CellUpdater3D &cu)
Class constructor.
Definition: hdsim_3d.cpp:24
double getTime(void) const
Returns the current time of the simulation.
Definition: hdsim_3d.cpp:14
Generates a list of conserved variables.
void update(double dt)
Update the progress tracker.
Definition: hdsim_3d.cpp:8
Ordered list whose terms are evaluated lazily.
Definition: lazy_list.hpp:17
3D Mathematical vector
Definition: Vector3D.hpp:15
ProgressTracker(void)
Class constructor.
Definition: hdsim_3d.cpp:5
Base class for equation of state.
virtual Face const & GetFace(size_t index) const =0
Returns Face (interface between cells)
virtual size_t GetPointNo(void) const =0
Get Total number of mesh generating points.
double GetArea(void) const
Returns the area of the face.
Definition: Face.cpp:24
Abstract clas for cell update scheme.
virtual size_t GetTotalFacesNumber(void) const =0
Returns the total number of faces.
Conserved variables for a 3D computational cell.
Definition: conserved_3d.hpp:7
const Tessellation3D & getTesselation(void) const
Access to tessellation.
Definition: hdsim_3d.cpp:145
Generates extensive conserved variables.