Flow123d  master-f44eb46
field_value_cache.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file field_value_cache.cc
15  * @brief
16  * @author David Flanderka
17  */
18 
19 #include <limits>
21 #include "fields/field_values.hh"
22 #include "fields/eval_points.hh"
23 #include "fields/eval_subset.hh"
24 #include "fem/dh_cell_accessor.hh"
25 #include "create_processor.hh"
26 #include "mesh/accessors.hh"
27 
28 
29 /******************************************************************************
30  * Implementation of ElementCacheMap methods
31  */
32 
33 const unsigned int ElementCacheMap::undef_elem_idx = std::numeric_limits<unsigned int>::max();
34 //const unsigned int ElementCacheMap::simd_size_double = 4;
35 
36 
38 : simd_size_double(bparser::get_simd_size()), elm_idx_(CacheMapElementNumber::get(), ElementCacheMap::undef_elem_idx),
39  ready_to_reading_(false), element_eval_points_map_(nullptr), eval_point_data_(0),
40  regions_starts_(2*ElementCacheMap::regions_in_chunk,ElementCacheMap::regions_in_chunk),
41  element_starts_(2*ElementCacheMap::elements_in_chunk,ElementCacheMap::elements_in_chunk) {}
42 
43 
45  if (element_eval_points_map_!=nullptr) {
46  delete[] element_eval_points_map_;
47  }
48 }
49 
50 
51 void ElementCacheMap::init(std::shared_ptr<EvalPoints> eval_points) {
52  this->eval_points_ = eval_points;
53  unsigned int ep_data_size = eval_points_->max_size() * CacheMapElementNumber::get();
54  eval_point_data_.resize(ep_data_size);
55  element_eval_points_map_ = new int [ep_data_size];
56  for (unsigned int i=0; i<ep_data_size; ++i)
58 }
59 
60 
62  RevertableList<EvalPointData> eval_point_data_tmp = eval_point_data_;
63  std::sort(eval_point_data_tmp.begin(), eval_point_data_tmp.end());
65 
66  unsigned int last_region_idx = -1;
67  unsigned int last_element_idx = -1;
68  unsigned int i_pos=0; // position in eval_point_data_
69  bool is_new_reg, is_new_elm;
70 
71  // Erase element data of previous step
74  element_to_map_.clear();
75  element_to_map_bdr_.clear();
76  std::fill(elm_idx_.begin(), elm_idx_.end(), ElementCacheMap::undef_elem_idx);
77 
78  for (auto it=eval_point_data_tmp.begin(); it!=eval_point_data_tmp.end(); ++it) {
79  is_new_reg = (it->i_reg_ != last_region_idx);
80  is_new_elm = is_new_reg || (it->i_element_ != last_element_idx);
81  if (is_new_elm) {
82  if (is_new_reg) {
83  unsigned int last_eval_point = i_pos-1; // set size of block by SIMD size
84  while (i_pos % simd_size_double > 0) {
86  i_pos++;
87  }
88 
90  last_region_idx = it->i_reg_;
91  }
92  elm_idx_[element_starts_.temporary_size()] = it->i_element_;
93  if (it->i_reg_ % 2 == 1) // bulk region > to element_to_map_ (bulk)
95  else // boundary region to element_to_map_bdr_ (boundary)
98  last_element_idx = it->i_element_;
99  }
101  set_element_eval_point(element_starts_.temporary_size()-1, it->i_eval_point_, i_pos);
102  i_pos++;
103  }
104  unsigned int last_eval_point = i_pos-1; // set size of block of last region by SIMD size
105  while (i_pos % simd_size_double > 0) {
106  eval_point_data_.emplace_back( eval_point_data_[last_eval_point] );
107  i_pos++;
108  }
109 
115  set_of_regions_.clear();
116 }
117 
118 
120  ready_to_reading_ = false;
121 }
122 
124  ready_to_reading_ = true;
125 }
126 
Auxiliary data class holds number of elements in cache and allow to set this value explicitly (e....
static unsigned int get()
Return number of stored elements.
Directing class of FieldValueCache.
void set_element_eval_point(unsigned int i_elem_in_cache, unsigned int i_eval_point, int val) const
Set item of element_eval_points_map_.
ElementCacheMap()
Constructor.
RevertableList< unsigned int > element_starts_
Start positions of elements in eval_point_data_ (size = n_elements+1)
RevertableList< unsigned int > regions_starts_
Start positions of elements in regions (size = n_regions+1, last value is end of last region)
std::unordered_map< unsigned int, unsigned int > element_to_map_bdr_
Maps boundary element_idx to element index in patch - TODO remove.
void start_elements_update()
Start update of cache.
void finish_elements_update()
Finish update after reading data to cache.
void create_patch()
Create patch of cached elements before reading data to cache.
std::unordered_set< unsigned int > set_of_regions_
Keeps set of unique region indices of added eval. points.
RevertableList< EvalPointData > eval_point_data_
static const int unused_point
Special constant (.
void init(std::shared_ptr< EvalPoints > eval_points)
Init cache.
static const unsigned int undef_elem_idx
Index of invalid element in cache.
bool ready_to_reading_
Flag is set down during update of cache when this can't be read.
std::unordered_map< unsigned int, unsigned int > element_to_map_
Maps bulk element_idx to element index in patch - TODO remove.
std::shared_ptr< EvalPoints > eval_points() const
Getter of eval_points object.
std::shared_ptr< EvalPoints > eval_points_
Pointer to EvalPoints.
~ElementCacheMap()
Destructor.
int * element_eval_points_map_
Holds data of evaluating points in patch.
unsigned int simd_size_double
std::vector< unsigned int > elm_idx_
Vector of element indexes stored in cache.
std::vector< Type >::iterator begin()
void resize(std::size_t new_size)
std::vector< Type >::iterator end()
std::size_t make_permanent()
Finalize temporary part of data.
void reset()
Clear the list.
std::size_t emplace_back(Args &&... args)
std::size_t temporary_size() const
Return temporary size of list (full size of stored data).