Flow123d  release_3.0.0-1182-ga9abfa7
observe.cc
Go to the documentation of this file.
1 /*
2  * observe.cc
3  *
4  * Created on: Jun 28, 2016
5  * Author: jb
6  */
7 
8 #include <string>
9 #include <numeric>
10 #include <cmath>
11 #include <algorithm>
12 #include <unordered_set>
13 #include <queue>
14 
15 #include "system/global_defs.h"
16 #include "input/accessors.hh"
17 #include "input/input_type.hh"
19 
20 #include "mesh/side_impl.hh"
21 #include "mesh/mesh.h"
22 #include "mesh/bih_tree.hh"
23 #include "mesh/region.hh"
24 #include "mesh/accessors.hh"
25 #include "io/observe.hh"
26 #include "io/element_data_cache.hh"
27 #include "fem/mapping_p1.hh"
28 #include "tools/unit_si.hh"
29 
30 
31 namespace IT = Input::Type;
32 
33 
34 /**
35  * Helper class allows to work with ObservePoint above elements with different dimensions
36  *
37  * Allows:
38  * - calculate projection of points by dimension
39  * - snap to subelement
40  */
41 template<unsigned int dim>
43 public:
44  /// Constructor
46 
47  ObservePointData projection(arma::vec3 input_point, unsigned int i_elm, ElementAccessor<3> elm) {
48  arma::mat::fixed<3, dim+1> elm_map = mapping_.element_map(elm);
49  arma::vec::fixed<dim+1> projection = mapping_.project_real_to_unit(input_point, elm_map);
50  projection = mapping_.clip_to_element(projection);
51 
52  ObservePointData data;
53  data.element_idx_ = i_elm;
54  data.local_coords_ = projection.rows(1, elm.dim());
55  data.global_coords_ = elm_map*projection;
56  data.distance_ = arma::norm(data.global_coords_ - input_point, 2);
57  data.proc_ = elm.proc();
58 
59  return data;
60  }
61 
62  /**
63  * Snap local coords to the subelement. Called by the ObservePoint::snap method.
64  */
65  void snap_to_subelement(ObservePointData & observe_data, ElementAccessor<3> elm, unsigned int snap_dim)
66  {
67  if (snap_dim <= dim) {
68  double min_dist = 2.0; // on the ref element the max distance should be about 1.0, smaler then 2.0
69  arma::vec min_center;
70  for(auto &center : RefElement<dim>::centers_of_subelements(snap_dim))
71  {
72  double dist = arma::norm(center - observe_data.local_coords_, 2);
73  if ( dist < min_dist) {
74  min_dist = dist;
75  min_center = center;
76  }
77  }
78  observe_data.local_coords_ = min_center;
79  }
80 
81  arma::mat::fixed<3, dim+1> elm_map = mapping_.element_map(elm);
82  observe_data.global_coords_ = elm_map * RefElement<dim>::local_to_bary(observe_data.local_coords_);
83  }
84 
85 private:
86  /// Mapping object.
88 };
89 
90 template class ProjectionHandler<1>;
91 template class ProjectionHandler<2>;
92 template class ProjectionHandler<3>;
93 
94 
95 /**
96  * Helper struct, used as comparator of priority queue in ObservePoint::find_observe_point.
97  */
99 {
100  bool operator()(const ObservePointData& lhs, const ObservePointData& rhs) const
101  {
102  return lhs.distance_ > rhs.distance_;
103  }
104 };
105 
106 
107 /*******************************************************************
108  * implementation of ObservePoint
109  */
110 
112  return IT::Record("ObservePoint", "Specification of the observation point.\n"
113  "The actual observation element and the observation point on it is determined as follows:\n\n"
114  "1. Find an initial element containing the initial point. If no such element exists, we report an error.\n"
115  "2. Use BFS (Breadth-first search) starting from the inital element to find the 'observe element'. The observe element is the closest element.\n"
116  "3. Find the closest projection of the inital point on the observe element and snap this projection according to the ``snap_dim``.\n")
117  .allow_auto_conversion("point")
118  .declare_key("name", IT::String(),
120  "Default name have the form 'obs_<id>', where 'id' "
121  "is the rank of the point on the input."),
122  "Optional point name, which has to be unique.\n"
123  "Any string that is a valid YAML key in record without any quoting can be used, however, "
124  "using just alpha-numerical characters, and underscore instead of the space, is recommended."
125  )
127  "Initial point for the observe point search.")
128  .declare_key("snap_dim", IT::Integer(0, 4), IT::Default("4"),
129  "The dimension of the sub-element to which center we snap. For value 4 no snapping is done. "
130  "For values 0 up to 3 the element containing the initial point is found and then the observe"
131  "point is snapped to the nearest center of the sub-element of the given dimension. "
132  "E.g. for dimension 2 we snap to the nearest center of the face of the initial element."
133  )
134  .declare_key("snap_region", IT::String(), IT::Default("\"ALL\""),
135  "The region of the initial element for snapping. Without snapping we make a projection to the initial element.")
136  .declare_key("search_radius", IT::Double(0.0),
137  IT::Default::read_time("Maximal distance of the observe point from the mesh relative to the mesh diameter. "),
138  "Global value is defined in mesh record by the key global_snap_radius.")
139  .close();
140 }
141 
143 {}
144 
145 
146 ObservePoint::ObservePoint(Input::Record in_rec, Mesh &mesh, unsigned int point_idx)
147 {
148  in_rec_ = in_rec;
149 
150  string default_label = string("obs_") + std::to_string(point_idx);
151  name_ = in_rec.val<string>("name", default_label );
152 
153  vector<double> tmp_coords;
154  in_rec.val<Input::Array>("point").copy_to(tmp_coords);
155  input_point_= arma::vec(tmp_coords);
156 
157  snap_dim_ = in_rec.val<unsigned int>("snap_dim");
158 
159  snap_region_name_ = in_rec.val<string>("snap_region");
160 
161  const BoundingBox &main_box = mesh.get_bih_tree().tree_box();
162  double max_mesh_size = arma::max(main_box.max() - main_box.min());
163  max_search_radius_ = in_rec_.val<double>("search_radius", mesh.global_snap_radius()) * max_mesh_size;
164 }
165 
166 
167 
169  return observe_data_.distance_ < numeric_limits<double>::infinity();
170 }
171 
172 
173 
175 {
176  ElementAccessor<3> elm = mesh.element_accessor(observe_data_.element_idx_);
177  switch (elm.dim()) {
178  case 1:
179  {
181  ph.snap_to_subelement(observe_data_, elm, snap_dim_);
182  break;
183  }
184  case 2:
185  {
187  ph.snap_to_subelement(observe_data_, elm, snap_dim_);
188  break;
189  }
190  case 3:
191  {
193  ph.snap_to_subelement(observe_data_, elm, snap_dim_);
194  break;
195  }
196  default: ASSERT(false).error("Clipping supported only for dim=1,2,3.");
197  }
198 }
199 
200 
201 
203  RegionSet region_set = mesh.region_db().get_region_set(snap_region_name_);
204  if (region_set.size() == 0)
205  THROW( RegionDB::ExcUnknownSet() << RegionDB::EI_Label(snap_region_name_) << in_rec_.ei_address() );
206 
207 
208  const BIHTree &bih_tree=mesh.get_bih_tree();
209  vector<unsigned int> candidate_list;
210  std::unordered_set<unsigned int> closed_elements(1023);
211  std::priority_queue< ObservePointData, std::vector<ObservePointData>, CompareByDist > candidate_queue;
212 
213  // search for the initial element
214  auto projected_point = bih_tree.tree_box().project_point(input_point_);
215  bih_tree.find_point(projected_point, candidate_list, true);
216 
217  // closest element
218  ObservePointData min_observe_point_data;
219 
220  for (unsigned int i_candidate=0; i_candidate<candidate_list.size(); ++i_candidate) {
221  unsigned int i_elm=candidate_list[i_candidate];
222  ElementAccessor<3> elm = mesh.element_accessor(i_elm);
223 
224  // project point, add candidate to queue
225  auto observe_data = point_projection( i_elm, elm );
226 
227  // save the closest element for later diagnostic
228  if(observe_data.distance_ < min_observe_point_data.distance_)
229  min_observe_point_data = observe_data;
230 
231  // queue only the elements in the maximal search radius
232  if (observe_data.distance_ <= max_search_radius_)
233  candidate_queue.push(observe_data);
234  closed_elements.insert(i_elm);
235  }
236 
237  // no candidates found -> exception
238  if (candidate_queue.empty()) {
239  THROW(ExcNoObserveElementCandidates()
240  << EI_PointName(name_)
241  << EI_Point(input_point_)
242  << EI_ClosestEle(min_observe_point_data));
243  }
244 
245  while (!candidate_queue.empty())
246  {
247  auto candidate_data = candidate_queue.top();
248  candidate_queue.pop();
249 
250  unsigned int i_elm=candidate_data.element_idx_;
251  ElementAccessor<3> elm = mesh.element_accessor(i_elm);
252 
253  // test if candidate is in region and update projection
254  if (elm.region().is_in_region_set(region_set)) {
255  ASSERT_LE(candidate_data.distance_, observe_data_.distance_).error();
256 
257  observe_data_.distance_ = candidate_data.distance_;
258  observe_data_.element_idx_ = candidate_data.element_idx_;
259  observe_data_.local_coords_ = candidate_data.local_coords_;
260  observe_data_.global_coords_ = candidate_data.global_coords_;
261  observe_data_.proc_ = candidate_data.proc_;
262  break;
263  }
264 
265  // add candidates to queue
266  for (unsigned int n=0; n < elm->n_nodes(); n++)
267  for(unsigned int i_node_ele : mesh.node_elements()[elm.node_accessor(n).idx()]) {
268  if (closed_elements.find(i_node_ele) == closed_elements.end()) {
269  ElementAccessor<3> neighbor_elm = mesh.element_accessor(i_node_ele);
270  auto observe_data = point_projection( i_node_ele, neighbor_elm );
271  if (observe_data.distance_ <= max_search_radius_)
272  candidate_queue.push(observe_data);
273  closed_elements.insert(i_node_ele);
274  }
275  }
276  }
277 
278  if (! have_observe_element()) {
279  THROW(ExcNoObserveElement()
280  << EI_RegionName(snap_region_name_)
281  << EI_PointName(name_)
282  << EI_Point(input_point_)
283  << EI_ClosestEle(min_observe_point_data));
284  }
285  snap( mesh );
286  ElementAccessor<3> elm = mesh.element_accessor(observe_data_.element_idx_);
287  double dist = arma::norm(elm.centre() - input_point_, 2);
288  double elm_norm = arma::norm(elm.bounding_box().max() - elm.bounding_box().min(), 2);
289  if (dist > 2*elm_norm)
290  WarningOut().fmt("Observe point ({}) is too distant from the mesh.\n", name_);
291 }
292 
293 
294 
295 
296 void ObservePoint::output(ostream &out, unsigned int indent_spaces, unsigned int precision)
297 {
298  out << setw(indent_spaces) << "" << "- name: " << name_ << endl;
299  out << setw(indent_spaces) << "" << " init_point: " << field_value_to_yaml(input_point_, precision) << endl;
300  out << setw(indent_spaces) << "" << " snap_dim: " << snap_dim_ << endl;
301  out << setw(indent_spaces) << "" << " snap_region: " << snap_region_name_ << endl;
302  out << setw(indent_spaces) << "" << " observe_point: " << field_value_to_yaml(observe_data_.global_coords_, precision) << endl;
303 }
304 
305 
306 
308  switch (elm.dim()) {
309  case 1:
310  {
312  return ph.projection(input_point_, i_elm, elm);
313  break;
314  }
315  case 2:
316  {
318  return ph.projection(input_point_, i_elm, elm);
319  break;
320  }
321  case 3:
322  {
324  return ph.projection(input_point_, i_elm, elm);
325  break;
326  }
327  default:
328  ASSERT(false).error("Invalid element dimension!");
329  }
330 
331  return ObservePointData(); // Should not happen.
332 }
333 
334 
335 
336 
337 /*******************************************************************
338  * implementation of Observe
339  */
340 
341 const unsigned int Observe::max_observe_value_time = 1000;
342 
343 
344 Observe::Observe(string observe_name, Mesh &mesh, Input::Array in_array, unsigned int precision, std::string unit_str)
345 : observe_name_(observe_name),
346  precision_(precision),
347  point_ds_(nullptr),
348  observe_time_idx_(0)
349 {
351  observe_values_time_.push_back(numeric_limits<double>::signaling_NaN());
352 
353  unsigned int global_point_idx=0, local_point_idx=0;
354 
355  // in_rec is Output input record.
356  for(auto it = in_array.begin<Input::Record>(); it != in_array.end(); ++it) {
357  ObservePoint point(*it, mesh, points_.size());
358  point.find_observe_point(mesh);
359  point.observe_data_.global_idx_ = global_point_idx++;
360  if (point.observe_data_.proc_ == mesh.get_el_ds()->myp()) {
361  point.observe_data_.local_idx_ = local_point_idx++;
362  point_4_loc_.push_back(point.observe_data_.global_idx_);
363  }
364  else
365  point.observe_data_.local_idx_ = -1;
366  points_.push_back( point );
367  observed_element_indices_.push_back(point.observe_data_.element_idx_);
368  }
369  // make local to global map, distribution
370  point_ds_ = new Distribution(Observe::max_observe_value_time * point_4_loc_.size(), PETSC_COMM_WORLD);
371 
372  // make indices unique
373  std::sort(observed_element_indices_.begin(), observed_element_indices_.end());
374  auto last = std::unique(observed_element_indices_.begin(), observed_element_indices_.end());
376 
377  time_unit_str_ = unit_str;
379 
380  if (points_.size() == 0) return;
382  if (rank_==0) {
383  FilePath observe_file_path(observe_name_ + "_observe.yaml", FilePath::output_file);
384  try {
385  observe_file_path.open_stream(observe_file_);
386  //observe_file_.setf(std::ios::scientific);
387  observe_file_.precision(this->precision_);
388 
389  } INPUT_CATCH(FilePath::ExcFileOpen, FilePath::EI_Address_String, in_array)
390  output_header();
391  }
392 }
393 
395  observe_file_.close();
396  if (point_ds_!=nullptr) delete point_ds_;
397 }
398 
399 
400 template <typename T>
401 ElementDataCache<T> & Observe::prepare_compute_data(std::string field_name, double field_time, unsigned int n_rows,
402  unsigned int n_cols)
403 {
406  else
407  ASSERT(fabs(field_time / time_unit_seconds_ - observe_values_time_[observe_time_idx_]) < 2*numeric_limits<double>::epsilon())
408  (field_time)(observe_values_time_[observe_time_idx_]);
409 
410  OutputDataFieldMap::iterator it=observe_field_values_.find(field_name);
411  if (it == observe_field_values_.end()) {
412  observe_field_values_[field_name]
413  = std::make_shared< ElementDataCache<T> >(field_name, n_rows * n_cols, point_ds_->lsize());
414  it=observe_field_values_.find(field_name);
415  }
416  return dynamic_cast<ElementDataCache<T> &>(*(it->second));
417 }
418 
419 // explicit instantiation of template method
420 #define OBSERVE_PREPARE_COMPUTE_DATA(TYPE) \
421 template ElementDataCache<TYPE> & Observe::prepare_compute_data<TYPE>(std::string field_name, double field_time, \
422  unsigned int n_rows, unsigned int n_cols)
423 
425 OBSERVE_PREPARE_COMPUTE_DATA(unsigned int);
427 
428 
430  unsigned int indent = 2;
431  observe_file_ << "# Observation file: " << observe_name_ << endl;
432  observe_file_ << "time_unit: " << time_unit_str_ << endl;
433  observe_file_ << "time_unit_in_seconds: " << time_unit_seconds_ << endl;
434  observe_file_ << "points:" << endl;
435  for(auto &point : points_)
436  point.output(observe_file_, indent, precision_);
437  observe_file_ << "data:" << endl;
438 
439 }
440 
441 void Observe::output_time_frame(double time, bool flush) {
442  if (points_.size() == 0) return;
443 
444  if ( ! no_fields_warning ) {
445  no_fields_warning=true;
446  // check that observe fields are set
448  // first call and no fields
449  ASSERT(observe_field_values_.size() == 0);
450  WarningOut() << "No observe fields for the observation stream: " << observe_name_ << endl;
451  }
452  }
453 
455  ASSERT(observe_field_values_.size() == 0);
456  return;
457  }
458 
459  observe_time_idx_++;
460  if ( (observe_time_idx_==Observe::max_observe_value_time) || flush ) {
462  for (unsigned int i=0; i<Observe::max_observe_value_time; ++i)
463  for (unsigned int j=0; j<point_4_loc_.size(); ++j) local_to_global[i*point_4_loc_.size()+j] = i*points_.size()+point_4_loc_[j];
464 
465  for(auto &field_data : observe_field_values_) {
466  auto serial_data = field_data.second->gather(point_ds_, &(local_to_global[0]));
467  if (rank_==0) field_data.second = serial_data;
468  }
469 
470  if (rank_ == 0) {
471  unsigned int indent = 2;
472  for (unsigned int i_time=0; i_time<observe_time_idx_; ++i_time) {
473  observe_file_ << setw(indent) << "" << "- time: " << observe_values_time_[i_time] << endl;
474  for(auto &field_data : observe_field_values_) {
475  observe_file_ << setw(indent) << "" << " " << field_data.second->field_input_name() << ": ";
476  field_data.second->print_yaml_subarray(observe_file_, precision_, i_time*points_.size(), (i_time+1)*points_.size());
477  observe_file_ << endl;
478  }
479  }
480  }
481 
482  observe_values_time_.clear();
484  observe_values_time_.push_back(numeric_limits<double>::signaling_NaN());
485  observe_time_idx_ = 0;
486  } else {
487  observe_values_time_.push_back( numeric_limits<double>::signaling_NaN() );
488  }
489 
490 }
491 
493  auto bgn_it = make_iter<ObservePointAccessor>( ObservePointAccessor(this, 0) );
494  auto end_it = make_iter<ObservePointAccessor>( ObservePointAccessor(this, point_4_loc_.size()) );
495  return Range<ObservePointAccessor>(bgn_it, end_it);
496 }
497 
ObservePointData point_projection(unsigned int i_elm, ElementAccessor< 3 > elm)
Project point to given element by dimension of this element.
Definition: observe.cc:307
std::vector< ObservePoint > points_
Full information about observe points.
Definition: observe.hh:275
Class MappingP1 implements the affine transformation of the unit cell onto the actual cell...
Iterator< ValueType > begin() const
Bounding box in 3d ambient space.
Definition: bounding_box.hh:54
#define OBSERVE_PREPARE_COMPUTE_DATA(TYPE)
Definition: observe.cc:420
OutputDataFieldMap observe_field_values_
Stored field values.
Definition: observe.hh:280
unsigned int n_nodes() const
Definition: elements.h:129
Observe(string observe_name, Mesh &mesh, Input::Array in_array, unsigned int precision, std::string unit_str)
Definition: observe.cc:344
vector< vector< unsigned int > > const & node_elements()
Definition: mesh.cc:999
std::ofstream observe_file_
Output file stream.
Definition: observe.hh:290
RegionSet get_region_set(const std::string &set_name) const
Definition: region.cc:329
Accessor to input data conforming to declared Array.
Definition: accessors.hh:567
string field_value_to_yaml(const T &mat, unsigned int prec)
NodeAccessor< 3 > node_accessor(unsigned int ni) const
Definition: accessors.hh:149
unsigned int proc_
Actual process of the observe point.
Definition: observe.hh:59
BaryPoint project_real_to_unit(const RealPoint &point, const ElementMap &map) const
Definition: mapping_p1.cc:278
std::vector< LongIdx > point_4_loc_
Index set assigning to local point index its global index.
Definition: observe.hh:303
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
ProjectionHandler()
Constructor.
Definition: observe.cc:45
double convert_unit_from(std::string actual_unit) const
Convert and check user-defined unit.
Definition: unit_si.cc:217
static const Input::Type::Record & get_input_type()
Definition: observe.cc:111
#define INPUT_CATCH(ExceptionType, AddressEITag, input_accessor)
Definition: accessors.hh:64
void output_time_frame(double time, bool flush)
Definition: observe.cc:441
bool have_observe_element()
Definition: observe.cc:168
static Default obligatory()
The factory function to make an empty default value which is obligatory.
Definition: type_record.hh:110
double global_snap_radius() const
Maximal distance of observe point from Mesh relative to its size.
Definition: mesh.cc:941
Definition: mesh.h:76
void output(ostream &out, unsigned int indent_spaces, unsigned int precision)
Definition: observe.cc:296
static const unsigned int max_observe_value_time
Maximal size of observe values times vector.
Definition: observe.hh:269
#define ASSERT_LE(a, b)
Definition of comparative assert macro (Less or Equal)
Definition: asserts.hh:303
Mat< double, N, 1 > vec
Definition: armor.hh:211
unsigned int element_idx_
Final element of the observe point. The index in the mesh.
Definition: observe.hh:43
std::string time_unit_str_
String representation of the time unit.
Definition: observe.hh:293
int rank_
Definition: observe.hh:272
const RegionDB & region_db() const
Definition: mesh.h:143
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
Definition: asserts.hh:346
std::string to_string(const T &value)
Definition: string.h:29
std::string observe_name_
Definition: observe.hh:287
Class for declaration of the integral input data.
Definition: type_base.hh:490
arma::vec local_coords_
Local (barycentric) coordinates on the element.
Definition: observe.hh:52
unsigned int proc() const
Definition: accessors.hh:125
Record & close() const
Close the Record for further declarations of keys.
Definition: type_record.cc:304
Class for declaration of inputs sequences.
Definition: type_base.hh:346
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
Definition: mesh.cc:727
IteratorBase end() const
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.
Definition: accessors.hh:285
void open_stream(Stream &stream) const
Definition: file_path.cc:211
Global macros to enhance readability and debugging, general constants.
virtual Record & allow_auto_conversion(const string &from_key)
Allows shorter input of the Record providing only value of the from_key given as the parameter...
Definition: type_record.cc:133
Class for declaration of the input data that are floating point numbers.
Definition: type_base.hh:541
arma::vec3 global_coords_
Global coordinates of the observation point.
Definition: observe.hh:49
unsigned int precision_
Precision of float output.
Definition: observe.hh:297
void find_observe_point(Mesh &mesh)
Definition: observe.cc:202
DummyInt isnan(...)
Definition: format.h:306
Range helper class.
bool operator()(const ObservePointData &lhs, const ObservePointData &rhs) const
Definition: observe.cc:100
const BoundingBox & tree_box() const
Definition: bih_tree.cc:229
Accessor to the data with type Type::Record.
Definition: accessors.hh:292
const Ret val(const string &key) const
UnitSI & s(int exp=1)
Definition: unit_si.cc:76
void output_header()
Definition: observe.cc:429
std::vector< unsigned int > observed_element_indices_
Elements of the o_points.
Definition: observe.hh:277
const Point & max() const
double distance_
Definition: observe.hh:56
Class for O(log N) lookup for intersections with a set of bounding boxes.
Definition: bih_tree.hh:38
BoundingBox bounding_box() const
Definition: accessors.hh:157
Record & declare_key(const string &key, std::shared_ptr< TypeBase > type, const Default &default_value, const string &description, TypeBase::attribute_map key_attributes=TypeBase::attribute_map())
Declares a new key of the Record.
Definition: type_record.cc:503
void snap_to_subelement(ObservePointData &observe_data, ElementAccessor< 3 > elm, unsigned int snap_dim)
Definition: observe.cc:65
Range< ObservePointAccessor > local_range() const
Returns local range of observe points.
Definition: observe.cc:492
ElementDataCache< T > & prepare_compute_data(std::string field_name, double field_time, unsigned int n_rows, unsigned int n_cols)
Definition: observe.cc:401
Distribution * get_el_ds() const
Definition: mesh.h:164
Region region() const
Definition: accessors.hh:95
ObservePointData projection(arma::vec3 input_point, unsigned int i_elm, ElementAccessor< 3 > elm)
Definition: observe.cc:47
const BIHTree & get_bih_tree()
Getter for BIH. Creates and compute BIH at first call.
Definition: mesh.cc:932
#define MPI_Comm_rank
Definition: mpi.h:236
Dedicated class for storing path to input and output files.
Definition: file_path.hh:54
unsigned int myp() const
get my processor
static Default read_time(const std::string &description)
The factory function to make an default value that will be specified at the time when a key will be r...
Definition: type_record.hh:97
friend class ObservePointAccessor
Definition: observe.hh:311
void find_point(const Space< 3 >::Point &point, std::vector< unsigned int > &result_list, bool full_list=false) const
Definition: bih_tree.cc:287
double time_unit_seconds_
Time unit in seconds.
Definition: observe.hh:295
std::vector< double > observe_values_time_
Common evaluation time of the fields for single time frame.
Definition: observe.hh:284
bool is_in_region_set(const RegionSet &set) const
Definition: region.cc:46
MappingP1< dim, 3 > mapping_
Mapping object.
Definition: observe.cc:87
Point project_point(const Point &point) const
#define WarningOut()
Macro defining &#39;warning&#39; record of log.
Definition: logger.hh:246
#define MPI_COMM_WORLD
Definition: mpi.h:123
static BaryPoint local_to_bary(const LocalPoint &lp)
Converts from local to barycentric coordinates.
Definition: ref_element.cc:296
unsigned int observe_time_idx_
Index of actual (last) time in observe_values_time_ vector.
Definition: observe.hh:309
const Point & min() const
Record type proxy class.
Definition: type_record.hh:182
Distribution * point_ds_
Parallel distribution of observe points.
Definition: observe.hh:306
unsigned int dim() const
Definition: accessors.hh:87
Class for representation SI units of Fields.
Definition: unit_si.hh:40
BaryPoint clip_to_element(BaryPoint &barycentric)
Definition: mapping_p1.cc:300
ElementMap element_map(ElementAccessor< 3 > elm) const
Definition: mapping_p1.cc:268
void snap(Mesh &mesh)
Definition: observe.cc:174
bool no_fields_warning
Definition: observe.hh:300
Class for declaration of the input data that are in string format.
Definition: type_base.hh:589
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Definition: exceptions.hh:53
~Observe()
Destructor, must close the file.
Definition: observe.cc:394
unsigned int lsize(int proc) const
get local size