Flow123d  DF_patch_fe_mechanics-b866f5c
generic_assembly.hh
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 generic_assembly.hh
15  * @brief
16  */
17 
18 #ifndef GENERIC_ASSEMBLY_HH_
19 #define GENERIC_ASSEMBLY_HH_
20 
22 #include "fields/eval_subset.hh"
23 #include "fields/eval_points.hh"
25 #include "fem/fe_values.hh"
26 #include "fem/patch_fe_values.hh"
27 #include "tools/revertable_list.hh"
28 #include "system/sys_profiler.hh"
29 
30 
31 
32 /// Allow set mask of active integrals.
34  no_intg = 0,
35  bulk = 0x0001,
36  edge = 0x0002,
37  coupling = 0x0004,
38  boundary = 0x0008
39 };
40 
41 
42 /// Set of all used integral necessary in assemblation
44  std::array<std::shared_ptr<BulkIntegral>, 3> bulk_; ///< Bulk integrals of elements of dimensions 1, 2, 3
45  std::array<std::shared_ptr<EdgeIntegral>, 3> edge_; ///< Edge integrals between elements of dimensions 1, 2, 3
46  std::array<std::shared_ptr<CouplingIntegral>, 2> coupling_; ///< Coupling integrals between elements of dimensions 1-2, 2-3
47  std::array<std::shared_ptr<BoundaryIntegral>, 3> boundary_; ///< Boundary integrals betwwen elements of dimensions 1, 2, 3 and boundaries
48 };
49 
50 
51 /**
52  * Common interface class for all Assembly classes.
53  */
55 {
56 public:
57  /**
58  * Helper structzre holds data of cell (bulk) integral
59  *
60  * Data is specified by cell and subset index in EvalPoint object
61  */
63  /// Default constructor
65 
66  /// Constructor with data mebers initialization
67  BulkIntegralData(DHCellAccessor dhcell, unsigned int subset_idx)
68  : cell(dhcell), subset_index(subset_idx) {}
69 
70  /// Copy constructor
72  : cell(other.cell), subset_index(other.subset_index) {}
73 
74  DHCellAccessor cell; ///< Specified cell (element)
75  unsigned int subset_index; ///< Index (order) of subset in EvalPoints object
76  };
77 
78  /**
79  * Helper structzre holds data of edge integral
80  *
81  * Data is specified by side and subset index in EvalPoint object
82  */
84  /// Default constructor
87 
88  /// Copy constructor
91 
92  /// Constructor with data mebers initialization
94  : edge_side_range(range), subset_index(subset_idx) {}
95 
96  RangeConvert<DHEdgeSide, DHCellSide> edge_side_range; ///< Specified cell side (element)
97  unsigned int subset_index; ///< Index (order) of subset in EvalPoints object
98  };
99 
100  /**
101  * Helper structzre holds data of neighbour (coupling) integral
102  *
103  * Data is specified by cell, side and their subset indices in EvalPoint object
104  */
106  /// Default constructor
108 
109  /// Constructor with data mebers initialization
110  CouplingIntegralData(DHCellAccessor dhcell, unsigned int bulk_idx, DHCellSide dhside, unsigned int side_idx)
111  : cell(dhcell), bulk_subset_index(bulk_idx), side(dhside), side_subset_index(side_idx) {}
112 
113  /// Copy constructor
116 
118  unsigned int bulk_subset_index; ///< Index (order) of lower dim subset in EvalPoints object
119  DHCellSide side; ///< Specified cell side (higher dim element)
120  unsigned int side_subset_index; ///< Index (order) of higher dim subset in EvalPoints object
121  };
122 
123  /**
124  * Helper structzre holds data of boundary integral
125  *
126  * Data is specified by side and subset indices of side and appropriate boundary element in EvalPoint object
127  */
129  /// Default constructor
131 
132  /// Constructor with data mebers initialization
133  BoundaryIntegralData(unsigned int bdr_idx, DHCellSide dhside, unsigned int side_idx)
134  : bdr_subset_index(bdr_idx), side(dhside), side_subset_index(side_idx) {}
135 
136  /// Copy constructor
139 
140  // We don't need hold ElementAccessor of boundary element, side.cond().element_accessor() provides it.
141  unsigned int bdr_subset_index; ///< Index (order) of subset on boundary element in EvalPoints object
142  DHCellSide side; ///< Specified cell side (bulk element)
143  unsigned int side_subset_index; ///< Index (order) of subset on side of bulk element in EvalPoints object
144  };
145 
147 
149  virtual void assemble(std::shared_ptr<DOFHandlerMultiDim> dh) = 0;
150 
151  /// Getter to EvalPoints object
152  inline std::shared_ptr<EvalPoints> eval_points() const {
153  return eval_points_;
154  }
155 
156 protected:
157  AssemblyIntegrals integrals_; ///< Holds integral objects.
158  std::shared_ptr<EvalPoints> eval_points_; ///< EvalPoints object shared by all integrals
159  ElementCacheMap element_cache_map_; ///< ElementCacheMap according to EvalPoints
160 };
161 
162 
163 /**
164  * @brief Generic class of assemblation.
165  *
166  * Class
167  * - holds assemblation structures (EvalPoints, Integral objects, Integral data table).
168  * - associates assemblation objects specified by dimension
169  * - provides general assemble method
170  * - provides methods that allow construction of element patches
171  */
172 template < template<IntDim...> class DimAssembly>
174 {
175 public:
176  /// Constructor
177  GenericAssembly( typename DimAssembly<1>::EqFields *eq_fields, typename DimAssembly<1>::EqData *eq_data)
178  : use_patch_fe_values_(false),
179  multidim_assembly_(eq_fields, eq_data),
180  min_edge_sides_(2),
181  bulk_integral_data_(20, 10),
182  edge_integral_data_(12, 6),
185  {
186  initialize();
187  }
188 
189  /// Constructor
190  GenericAssembly( typename DimAssembly<1>::EqFields *eq_fields, typename DimAssembly<1>::EqData *eq_data, DOFHandlerMultiDim* dh)
191  : fe_values_(eq_data->quad_order(), dh->ds()->fe()),
192  use_patch_fe_values_(true),
193  multidim_assembly_(eq_fields, eq_data, &this->fe_values_),
194  min_edge_sides_(2),
195  bulk_integral_data_(20, 10),
196  edge_integral_data_(12, 6),
199  {
200  initialize();
201  }
202 
203  /// Getter to set of assembly objects
205  return multidim_assembly_;
206  }
207 
208  void set_min_edge_sides(unsigned int val) {
209  min_edge_sides_ = val;
210  }
211 
212  /**
213  * @brief General assemble methods.
214  *
215  * Loops through local cells and calls assemble methods of assembly
216  * object of each cells over space dimension.
217  *
218  * TODO:
219  * - make estimate of the cache fill for combination of (integral_type x element dimension)
220  * - add next cell to patch if current_patch_size + next_element_size <= fixed_cache_size
221  * - avoid reverting the integral data lists.
222  */
223  void assemble(std::shared_ptr<DOFHandlerMultiDim> dh) override {
224  START_TIMER( DimAssembly<1>::name() );
225  this->reallocate_cache();
226  multidim_assembly_[1_d]->begin();
227 
228  bool add_into_patch = false; // control variable
229  for(auto cell_it = dh->local_range().begin(); cell_it != dh->local_range().end(); )
230  {
231 
232  if (!add_into_patch) {
234  add_into_patch = true;
235  }
236 
237  START_TIMER("add_integrals_to_patch");
238  this->add_integrals_of_computing_step(*cell_it);
239  END_TIMER("add_integrals_to_patch");
240 
247  this->assemble_integrals();
248  add_into_patch = false;
249  } else {
255  if (use_patch_fe_values_) {
257  }
259  this->assemble_integrals();
260  add_into_patch = false;
261  }
262  ++cell_it;
263  }
264  }
265  if (add_into_patch) {
266  this->assemble_integrals();
267  }
268 
269  multidim_assembly_[1_d]->end();
270  END_TIMER( DimAssembly<1>::name() );
271  }
272 
273  /// Return ElementCacheMap
274  inline const ElementCacheMap &cache_map() const {
275  return element_cache_map_;
276  }
277 
278 private:
279  /// Common part of GenericAssemblz constructors.
280  void initialize() {
281  eval_points_ = std::make_shared<EvalPoints>();
282  // first step - create integrals, then - initialize cache and initialize subobject of dimensions
283  multidim_assembly_[1_d]->create_integrals(eval_points_, integrals_);
284  multidim_assembly_[2_d]->create_integrals(eval_points_, integrals_);
285  multidim_assembly_[3_d]->create_integrals(eval_points_, integrals_);
287  multidim_assembly_[1_d]->initialize(&element_cache_map_);
288  multidim_assembly_[2_d]->initialize(&element_cache_map_);
289  multidim_assembly_[3_d]->initialize(&element_cache_map_);
290  if (use_patch_fe_values_) {
292  }
293  active_integrals_ = multidim_assembly_[1_d]->n_active_integrals();
294  }
295 
296  /// Call assemblations when patch is filled
298  START_TIMER("create_patch");
300  END_TIMER("create_patch");
301  if (use_patch_fe_values_) {
302  START_TIMER("patch_reinit");
303  patch_reinit();
304  END_TIMER("patch_reinit");
305  }
306  START_TIMER("cache_update");
307  multidim_assembly_[1_d]->eq_fields_->cache_update(element_cache_map_); // TODO replace with sub FieldSet
308  END_TIMER("cache_update");
310 
311  {
312  START_TIMER("assemble_volume_integrals");
313  multidim_assembly_[1_d]->assemble_cell_integrals(bulk_integral_data_);
314  multidim_assembly_[2_d]->assemble_cell_integrals(bulk_integral_data_);
315  multidim_assembly_[3_d]->assemble_cell_integrals(bulk_integral_data_);
316  END_TIMER("assemble_volume_integrals");
317  }
318 
319  {
320  START_TIMER("assemble_fluxes_boundary");
321  multidim_assembly_[1_d]->assemble_boundary_side_integrals(boundary_integral_data_);
322  multidim_assembly_[2_d]->assemble_boundary_side_integrals(boundary_integral_data_);
323  multidim_assembly_[3_d]->assemble_boundary_side_integrals(boundary_integral_data_);
324  END_TIMER("assemble_fluxes_boundary");
325  }
326 
327  {
328  START_TIMER("assemble_fluxes_elem_elem");
329  multidim_assembly_[1_d]->assemble_edge_integrals(edge_integral_data_);
330  multidim_assembly_[2_d]->assemble_edge_integrals(edge_integral_data_);
331  multidim_assembly_[3_d]->assemble_edge_integrals(edge_integral_data_);
332  END_TIMER("assemble_fluxes_elem_elem");
333  }
334 
335  {
336  START_TIMER("assemble_fluxes_elem_side");
337  multidim_assembly_[2_d]->assemble_neighbour_integrals(coupling_integral_data_);
338  multidim_assembly_[3_d]->assemble_neighbour_integrals(coupling_integral_data_);
339  END_TIMER("assemble_fluxes_elem_side");
340  }
341  // clean integral data
347  if (use_patch_fe_values_) {
350  fe_values_.reset();
351  }
352  }
353 
354  void patch_reinit() {
357  multidim_assembly_[1_d]->add_patch_bulk_points(bulk_integral_data_);
358  multidim_assembly_[2_d]->add_patch_bulk_points(bulk_integral_data_);
359  multidim_assembly_[3_d]->add_patch_bulk_points(bulk_integral_data_);
360  }
362  multidim_assembly_[1_d]->add_patch_bdr_side_points(boundary_integral_data_);
363  multidim_assembly_[2_d]->add_patch_bdr_side_points(boundary_integral_data_);
364  multidim_assembly_[3_d]->add_patch_bdr_side_points(boundary_integral_data_);
365  }
367  multidim_assembly_[1_d]->add_patch_edge_points(edge_integral_data_);
368  multidim_assembly_[2_d]->add_patch_edge_points(edge_integral_data_);
369  multidim_assembly_[3_d]->add_patch_edge_points(edge_integral_data_);
370  }
372  multidim_assembly_[2_d]->add_patch_coupling_integrals(coupling_integral_data_);
373  multidim_assembly_[3_d]->add_patch_coupling_integrals(coupling_integral_data_);
374  }
375  this->fe_values_.reinit_patch();
376  }
377 
378  /**
379  * Add data of integrals to appropriate structure and register elements to ElementCacheMap.
380  *
381  * Types of used integrals must be set in data member \p active_integrals_.
382  */
384  bool add_bulk_points = true; // Detects if bulk points will be added, same points are used in BulkIntegral and CouplingIntegral
386  if (cell.is_own()) { // Not ghost
387  this->add_volume_integral(cell);
388  add_bulk_points = false;
389  }
390 
391  for( DHCellSide cell_side : cell.side_range() ) {
393  if (cell.is_own()) // Not ghost
394  if ( (cell_side.side().edge().n_sides() == 1) && (cell_side.side().is_boundary()) ) {
395  this->add_boundary_integral(cell_side);
396  continue;
397  }
399  if ( (cell_side.n_edge_sides() >= min_edge_sides_) && (cell_side.edge_sides().begin()->element().idx() == cell.elm_idx())) {
400  this->add_edge_integral(cell_side);
401  }
402  }
403 
405  // Adds data of bulk points only if bulk point were not added during processing of bulk integral
406  if (add_bulk_points) {
407  for( DHCellSide ngh_side : cell.neighb_sides() ) {
408  if (cell.dim() == ngh_side.dim()-1) {
409  unsigned int reg_idx_low = cell.elm().region_idx().idx();
410  table_sizes_tmp_.elem_sizes_[0][cell.dim()-1]++;
411  for (auto p : integrals_.coupling_[cell.dim()-1]->points(ngh_side, &element_cache_map_) ) {
412  auto p_low = p.lower_dim(cell); // equivalent point on low dim cell
413  element_cache_map_.add_eval_point(reg_idx_low, cell.elm_idx(), p_low.eval_point_idx(), cell.local_idx());
414  table_sizes_tmp_.point_sizes_[0][cell.dim()-1]++;
415  }
416  break;
417  }
418  }
419  }
420  // Adds data of side points of all neighbour objects
421  for( DHCellSide ngh_side : cell.neighb_sides() ) { // cell -> elm lower dim, ngh_side -> elm higher dim
422  if (cell.dim() != ngh_side.dim()-1) continue;
423  coupling_integral_data_.emplace_back(cell, integrals_.coupling_[cell.dim()-1]->get_subset_low_idx(), ngh_side,
424  integrals_.coupling_[cell.dim()-1]->get_subset_high_idx());
425  table_sizes_tmp_.elem_sizes_[1][cell.dim()]++;
426 
427  unsigned int reg_idx_high = ngh_side.element().region_idx().idx();
428  for (auto p : integrals_.coupling_[cell.dim()-1]->points(ngh_side, &element_cache_map_) ) {
429  element_cache_map_.add_eval_point(reg_idx_high, ngh_side.elem_idx(), p.eval_point_idx(), ngh_side.cell().local_idx());
430  table_sizes_tmp_.point_sizes_[1][cell.dim()]++;
431  }
432  }
433  }
434  }
435 
436  /// Add data of volume integral to appropriate data structure.
437  inline void add_volume_integral(const DHCellAccessor &cell) {
438  uint subset_idx = integrals_.bulk_[cell.dim()-1]->get_subset_idx();
439  bulk_integral_data_.emplace_back(cell, subset_idx);
440 
441  unsigned int reg_idx = cell.elm().region_idx().idx();
442  table_sizes_tmp_.elem_sizes_[0][cell.dim()-1]++;
443  // Different access than in other integrals: We can't use range method CellIntegral::points
444  // because it passes element_patch_idx as argument that is not known during patch construction.
445  for (uint i=uint( eval_points_->subset_begin(cell.dim(), subset_idx) );
446  i<uint( eval_points_->subset_end(cell.dim(), subset_idx) ); ++i) {
447  element_cache_map_.add_eval_point(reg_idx, cell.elm_idx(), i, cell.local_idx());
448  table_sizes_tmp_.point_sizes_[0][cell.dim()-1]++;
449  }
450  }
451 
452  /// Add data of edge integral to appropriate data structure.
453  inline void add_edge_integral(const DHCellSide &cell_side) {
454  auto range = cell_side.edge_sides();
455  uint dim = range.begin()->dim();
456  edge_integral_data_.emplace_back(range, integrals_.edge_[dim-1]->get_subset_idx());
457 
458  for( DHCellSide edge_side : range ) {
459  unsigned int reg_idx = edge_side.element().region_idx().idx();
460  table_sizes_tmp_.elem_sizes_[1][dim-1]++;
461  for (auto p : integrals_.edge_[dim-1]->points(edge_side, &element_cache_map_) ) {
462  element_cache_map_.add_eval_point(reg_idx, edge_side.elem_idx(), p.eval_point_idx(), edge_side.cell().local_idx());
463  table_sizes_tmp_.point_sizes_[1][dim-1]++;
464  }
465  }
466  }
467 
468  /// Add data of boundary integral to appropriate data structure.
469  inline void add_boundary_integral(const DHCellSide &bdr_side) {
470  boundary_integral_data_.emplace_back(integrals_.boundary_[bdr_side.dim()-1]->get_subset_low_idx(), bdr_side,
471  integrals_.boundary_[bdr_side.dim()-1]->get_subset_high_idx());
472 
473  unsigned int reg_idx = bdr_side.element().region_idx().idx();
474  table_sizes_tmp_.elem_sizes_[1][bdr_side.dim()-1]++;
475  for (auto p : integrals_.boundary_[bdr_side.dim()-1]->points(bdr_side, &element_cache_map_) ) {
476  element_cache_map_.add_eval_point(reg_idx, bdr_side.elem_idx(), p.eval_point_idx(), bdr_side.cell().local_idx());
477  table_sizes_tmp_.point_sizes_[1][bdr_side.dim()-1]++;
478 
479  BulkPoint p_bdr = p.point_bdr(bdr_side.cond().element_accessor()); // equivalent point on boundary element
480  unsigned int bdr_reg = bdr_side.cond().element_accessor().region_idx().idx();
481  // invalid local_idx value, DHCellAccessor of boundary element doesn't exist
482  element_cache_map_.add_eval_point(bdr_reg, bdr_side.cond().bc_ele_idx(), p_bdr.eval_point_idx(), -1);
483  }
484  }
485 
486  /// Calls cache_reallocate method on
487  inline void reallocate_cache() {
488  multidim_assembly_[1_d]->eq_fields_->cache_reallocate(this->element_cache_map_, multidim_assembly_[1_d]->used_fields_);
489  // DebugOut() << "Order of evaluated fields (" << DimAssembly<1>::name() << "):" << multidim_assembly_[1_d]->eq_fields_->print_dependency();
490  }
491 
492 
493  PatchFEValues<3> fe_values_; ///< Common FEValues object over all dimensions
494  bool use_patch_fe_values_; ///< Flag holds if common @p fe_values_ object is used in @p multidim_assembly_
496 
497  /// Holds mask of active integrals.
499 
500  /**
501  * Minimal number of sides on edge.
502  *
503  * Edge integral is created and calculated if number of sides is greater or equal than this value. Default value
504  * is 2 and can be changed
505  */
506  unsigned int min_edge_sides_;
507 
508  // Following variables hold data of all integrals depending of actual computed element.
509  // TODO sizes of arrays should be set dynamically, depend on number of elements in ElementCacheMap,
510  RevertableList<BulkIntegralData> bulk_integral_data_; ///< Holds data for computing bulk integrals.
511  RevertableList<EdgeIntegralData> edge_integral_data_; ///< Holds data for computing edge integrals.
512  RevertableList<CouplingIntegralData> coupling_integral_data_; ///< Holds data for computing couplings integrals.
513  RevertableList<BoundaryIntegralData> boundary_integral_data_; ///< Holds data for computing boundary integrals.
514 
515  /// Struct for pre-computing number of elements, sides, bulk points and side points on each dimension.
517  /// Same as previous but hold temporary values during adding elements, sides and points.
519 };
520 
521 
522 #endif /* GENERIC_ASSEMBLY_HH_ */
uint bc_ele_idx()
Definition: accessors.hh:374
ElementAccessor< 3 > element_accessor()
Base point accessor class.
Definition: eval_subset.hh:55
unsigned int eval_point_idx() const
Return index in EvalPoints object.
Definition: eval_subset.hh:84
static unsigned int get()
Return number of stored elements.
Cell accessor allow iterate over DOF handler cells.
RangeConvert< DHNeighbSide, DHCellSide > neighb_sides() const
Returns range of neighbour cell of lower dimension corresponding to cell of higher dimension.
bool is_own() const
Return true if accessor represents own element (false for ghost element)
unsigned int dim() const
Return dimension of element appropriate to cell.
Range< DHCellSide > side_range() const
Returns range of cell sides.
unsigned int elm_idx() const
Return serial idx to element of loc_ele_idx_.
ElementAccessor< 3 > elm() const
Return ElementAccessor to element of loc_ele_idx_.
unsigned int local_idx() const
Return local index to element (index of DOF handler).
Side accessor allows to iterate over sides of DOF handler cell.
unsigned int elem_idx() const
Boundary cond() const
const DHCellAccessor & cell() const
Return DHCellAccessor appropriate to the side.
RangeConvert< DHEdgeSide, DHCellSide > edge_sides() const
Returns range of all sides looped over common Edge.
unsigned int dim() const
Return dimension of element appropriate to the side.
ElementAccessor< 3 > element() const
Class allows to iterate over sides of edge.
Provides the numbering of the finite element degrees of freedom on the computational mesh.
Definition: dofhandler.hh:151
RegionIdx region_idx() const
Definition: accessors.hh:201
Directing class of FieldValueCache.
unsigned int get_simd_rounded_size()
Returns number of eval. points with addition of max simd duplicates due to regions.
void start_elements_update()
Start update of cache.
void finish_elements_update()
Finish update after reading data to cache.
void clear_element_eval_points_map()
Reset all items of elements_eval_points_map.
void create_patch()
Create patch of cached elements before reading data to cache.
RevertableList< EvalPointData > eval_point_data_
void add_eval_point(unsigned int i_reg, unsigned int i_ele, unsigned int i_eval_point, unsigned int dh_loc_idx)
void init(std::shared_ptr< EvalPoints > eval_points)
Init cache.
void make_paermanent_eval_points()
Mark eval_point_data_ as permanent.
ElementCacheMap element_cache_map_
ElementCacheMap according to EvalPoints.
std::shared_ptr< EvalPoints > eval_points_
EvalPoints object shared by all integrals.
std::shared_ptr< EvalPoints > eval_points() const
Getter to EvalPoints object.
AssemblyIntegrals integrals_
Holds integral objects.
virtual void assemble(std::shared_ptr< DOFHandlerMultiDim > dh)=0
Generic class of assemblation.
PatchFEValues< 3 > fe_values_
Common FEValues object over all dimensions.
MixedPtr< DimAssembly, 1 > multidim_assembly_
Assembly object.
RevertableList< EdgeIntegralData > edge_integral_data_
Holds data for computing edge integrals.
void assemble_integrals()
Call assemblations when patch is filled.
void assemble(std::shared_ptr< DOFHandlerMultiDim > dh) override
General assemble methods.
GenericAssembly(typename DimAssembly< 1 >::EqFields *eq_fields, typename DimAssembly< 1 >::EqData *eq_data, DOFHandlerMultiDim *dh)
Constructor.
unsigned int min_edge_sides_
void add_boundary_integral(const DHCellSide &bdr_side)
Add data of boundary integral to appropriate data structure.
const ElementCacheMap & cache_map() const
Return ElementCacheMap.
void add_volume_integral(const DHCellAccessor &cell)
Add data of volume integral to appropriate data structure.
void add_edge_integral(const DHCellSide &cell_side)
Add data of edge integral to appropriate data structure.
PatchFEValues< 3 >::TableSizes table_sizes_
Struct for pre-computing number of elements, sides, bulk points and side points on each dimension.
RevertableList< BoundaryIntegralData > boundary_integral_data_
Holds data for computing boundary integrals.
int active_integrals_
Holds mask of active integrals.
void initialize()
Common part of GenericAssemblz constructors.
RevertableList< CouplingIntegralData > coupling_integral_data_
Holds data for computing couplings integrals.
void set_min_edge_sides(unsigned int val)
void reallocate_cache()
Calls cache_reallocate method on.
GenericAssembly(typename DimAssembly< 1 >::EqFields *eq_fields, typename DimAssembly< 1 >::EqData *eq_data)
Constructor.
bool use_patch_fe_values_
Flag holds if common fe_values_ object is used in multidim_assembly_.
void add_integrals_of_computing_step(DHCellAccessor cell)
MixedPtr< DimAssembly, 1 > multidim_assembly() const
Getter to set of assembly objects.
RevertableList< BulkIntegralData > bulk_integral_data_
Holds data for computing bulk integrals.
PatchFEValues< 3 >::TableSizes table_sizes_tmp_
Same as previous but hold temporary values during adding elements, sides and points.
void init_finalize()
Finalize initialization, creates child (patch) arena and passes it to PatchPointValue objects.
void resize_tables(TableSizes table_sizes)
Resize tables of patch_point_vals_.
void reinit_patch()
Reinit data.
void reset()
Reset PatchpointValues structures.
IterConvert< ObjectIn, ObjectOut > begin()
Iterator to begin item of range.
unsigned int idx() const
Returns a global index of the region.
Definition: region.hh:81
Class FEValues calculates finite element data on the actual cells such as shape function values,...
Iter< Object > make_iter(Object obj)
ActiveIntegrals
Allow set mask of active integrals.
@ coupling
@ boundary
@ no_intg
@ bulk
@ edge
unsigned int uint
unsigned int IntDim
A dimension index type.
Definition: mixed.hh:19
Class FEValues calculates finite element data on the actual cells such as shape function values,...
Definitions of particular quadrature rules on simplices.
Set of all used integral necessary in assemblation.
std::array< std::shared_ptr< BulkIntegral >, 3 > bulk_
Bulk integrals of elements of dimensions 1, 2, 3.
std::array< std::shared_ptr< CouplingIntegral >, 2 > coupling_
Coupling integrals between elements of dimensions 1-2, 2-3.
std::array< std::shared_ptr< BoundaryIntegral >, 3 > boundary_
Boundary integrals betwwen elements of dimensions 1, 2, 3 and boundaries.
std::array< std::shared_ptr< EdgeIntegral >, 3 > edge_
Edge integrals between elements of dimensions 1, 2, 3.
unsigned int side_subset_index
Index (order) of subset on side of bulk element in EvalPoints object.
BoundaryIntegralData(unsigned int bdr_idx, DHCellSide dhside, unsigned int side_idx)
Constructor with data mebers initialization.
BoundaryIntegralData(const BoundaryIntegralData &other)
Copy constructor.
unsigned int bdr_subset_index
Index (order) of subset on boundary element in EvalPoints object.
DHCellSide side
Specified cell side (bulk element)
BulkIntegralData(DHCellAccessor dhcell, unsigned int subset_idx)
Constructor with data mebers initialization.
DHCellAccessor cell
Specified cell (element)
unsigned int subset_index
Index (order) of subset in EvalPoints object.
BulkIntegralData(const BulkIntegralData &other)
Copy constructor.
unsigned int bulk_subset_index
Index (order) of lower dim subset in EvalPoints object.
CouplingIntegralData(DHCellAccessor dhcell, unsigned int bulk_idx, DHCellSide dhside, unsigned int side_idx)
Constructor with data mebers initialization.
unsigned int side_subset_index
Index (order) of higher dim subset in EvalPoints object.
CouplingIntegralData(const CouplingIntegralData &other)
Copy constructor.
DHCellSide side
Specified cell side (higher dim element)
EdgeIntegralData(const EdgeIntegralData &other)
Copy constructor.
RangeConvert< DHEdgeSide, DHCellSide > edge_side_range
Specified cell side (element)
unsigned int subset_index
Index (order) of subset in EvalPoints object.
EdgeIntegralData(RangeConvert< DHEdgeSide, DHCellSide > range, unsigned int subset_idx)
Constructor with data mebers initialization.
std::size_t revert_temporary()
Erase temporary part of data.
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 permanent_size() const
Return permanent size of list.
#define END_TIMER(tag)
Ends a timer with specified tag.
#define START_TIMER(tag)
Starts a timer with specified tag.