contour.cpp
1 #include <boost/foreach.hpp>
2 #include "contour.hpp"
3 #include <fstream>
4 #include "../../misc/simple_io.hpp"
5 #include "../../misc/hdf5_utils.hpp"
6 #include "../../misc/lazy_list.hpp"
7 
9 
10 namespace
11 {
12  vector<Vector2D> calc_contour_points(const hdsim& sim,
13  const LocalContourCriterion& lcc)
14  {
15  vector<Vector2D> res;
16  const Tessellation& tess = sim.getTessellation();
17  BOOST_FOREACH(const Edge& edge,tess.getAllEdges())
18  {
19  const std::pair<int,Vector2D> temp = lcc(edge,sim);
20  if(temp.first)
21  res.push_back(temp.second);
22  }
23  return res;
24  }
25 }
26 
28 (Trigger* p_trigger,
29  Index2FileName* p_i2f,
30  LocalContourCriterion* p_lcc):
31  p_trigger_(p_trigger),
32  count_(0),
33  p_i2f_(p_i2f),
34  p_lcc_(p_lcc) {}
35 
36 namespace {
37 
38  class ComponentExtractor: public LazyList<double>
39  {
40  public:
41 
42  ComponentExtractor(const vector<Vector2D>& source,
43  double Vector2D::* component):
44  source_(source), component_(component) {}
45 
46  size_t size(void) const
47  {
48  return source_.size();
49  }
50 
51  double operator[](size_t i) const
52  {
53  return source_[i].*component_;
54  }
55 
56  private:
57  const vector<Vector2D>& source_;
58  double Vector2D::* component_;
59  };
60 
61  void hdf5_write(const string& output_file,
62  const vector<Vector2D>& data,
63  const double time)
64  {
65  if(!data.empty())
66  (HDF5Shortcut(output_file))
67  ("time",vector<double>(1,time))
68  ("x",serial_generate(ComponentExtractor(data, &Vector2D::x)))
69  ("y",serial_generate(ComponentExtractor(data, &Vector2D::y)));
70  }
71 }
72 
74 {
75  if((*p_trigger_.get())(sim)){
76  hdf5_write((*p_i2f_.get())(count_),
77  calc_contour_points(sim,*p_lcc_.get()),
78  sim.getTime());
79  ++count_;
80  }
81 }
virtual ~LocalContourCriterion(void)
Class destructor.
Definition: contour.cpp:8
SequentialContour(Trigger *p_trigger, Index2FileName *p_i2f, LocalContourCriterion *p_lcc)
Class constructor.
Definition: contour.cpp:28
Abstract class for tessellation.
Newtonian hydrodynamic simulation.
Definition: hdsim2d.hpp:43
void operator()(const hdsim &sim)
Perform diagnostics.
Definition: contour.cpp:73
vector< T > serial_generate(const LazyList< T > &ll)
Creates a vector from an LazyList.
Definition: lazy_list.hpp:49
double getTime(void) const
Returns the time.
Definition: hdsim2d.cpp:729
Facilitates writing hdf5 files.
Definition: hdf5_utils.hpp:75
Interface between two cells.
Definition: Edge.hpp:13
const Tessellation & getTessellation(void) const
Returns the tessellation.
Definition: hdsim2d.cpp:722
double y
Component in the y direction.
Definition: geometry.hpp:48
Ordered list whose terms are evaluated lazily.
Definition: lazy_list.hpp:17
virtual const vector< Edge > & getAllEdges(void) const =0
Returns reference to the list of all edges.
Finds contour points on an unstructured mesh.
Class for generating sequential file names.
2D Mathematical vector
Definition: geometry.hpp:15
Abstract class for triggering events.
Definition: trigger.hpp:12
Recipe for creating a contour from the simulation.
Definition: contour.hpp:15
double x
Component in the x direction.
Definition: geometry.hpp:45