Flow123d  DF_patch_fe_data_tables-956a7bc
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 {
256  this->assemble_integrals();
257  add_into_patch = false;
258  }
259  ++cell_it;
260  }
261  }
262  if (add_into_patch) {
263  this->assemble_integrals();
264  }
265 
266  multidim_assembly_[1_d]->end();
267  END_TIMER( DimAssembly<1>::name() );
268  }
269 
270  /// Return ElementCacheMap
271  inline const ElementCacheMap &cache_map() const {
272  return element_cache_map_;
273  }
274 
275 private:
276  /// Common part of GenericAssemblz constructors.
277  void initialize() {
278  eval_points_ = std::make_shared<EvalPoints>();
279  // first step - create integrals, then - initialize cache and initialize subobject of dimensions
280  multidim_assembly_[1_d]->create_integrals(eval_points_, integrals_);
281  multidim_assembly_[2_d]->create_integrals(eval_points_, integrals_);
282  multidim_assembly_[3_d]->create_integrals(eval_points_, integrals_);
284  multidim_assembly_[1_d]->initialize(&element_cache_map_);
285  multidim_assembly_[2_d]->initialize(&element_cache_map_);
286  multidim_assembly_[3_d]->initialize(&element_cache_map_);
287  if (use_patch_fe_values_) {
289  }
290  active_integrals_ = multidim_assembly_[1_d]->n_active_integrals();
291  }
292 
293  /// Call assemblations when patch is filled
295  START_TIMER("create_patch");
297  END_TIMER("create_patch");
298  if (use_patch_fe_values_) {
299  START_TIMER("patch_reinit");
300  patch_reinit();
301  END_TIMER("patch_reinit");
302  }
303  START_TIMER("cache_update");
304  multidim_assembly_[1_d]->eq_fields_->cache_update(element_cache_map_); // TODO replace with sub FieldSet
305  END_TIMER("cache_update");
307 
308  {
309  START_TIMER("assemble_volume_integrals");
310  multidim_assembly_[1_d]->assemble_cell_integrals(bulk_integral_data_);
311  multidim_assembly_[2_d]->assemble_cell_integrals(bulk_integral_data_);
312  multidim_assembly_[3_d]->assemble_cell_integrals(bulk_integral_data_);
313  END_TIMER("assemble_volume_integrals");
314  }
315 
316  {
317  START_TIMER("assemble_fluxes_boundary");
318  multidim_assembly_[1_d]->assemble_boundary_side_integrals(boundary_integral_data_);
319  multidim_assembly_[2_d]->assemble_boundary_side_integrals(boundary_integral_data_);
320  multidim_assembly_[3_d]->assemble_boundary_side_integrals(boundary_integral_data_);
321  END_TIMER("assemble_fluxes_boundary");
322  }
323 
324  {
325  START_TIMER("assemble_fluxes_elem_elem");
326  multidim_assembly_[1_d]->assemble_edge_integrals(edge_integral_data_);
327  multidim_assembly_[2_d]->assemble_edge_integrals(edge_integral_data_);
328  multidim_assembly_[3_d]->assemble_edge_integrals(edge_integral_data_);
329  END_TIMER("assemble_fluxes_elem_elem");
330  }
331 
332  {
333  START_TIMER("assemble_fluxes_elem_side");
334  multidim_assembly_[2_d]->assemble_neighbour_integrals(coupling_integral_data_);
335  multidim_assembly_[3_d]->assemble_neighbour_integrals(coupling_integral_data_);
336  END_TIMER("assemble_fluxes_elem_side");
337  }
338  // clean integral data
344  if (use_patch_fe_values_) {
346  fe_values_.reset();
347  }
348  }
349 
350  void patch_reinit() {
353  multidim_assembly_[1_d]->add_patch_bulk_points(bulk_integral_data_);
354  multidim_assembly_[2_d]->add_patch_bulk_points(bulk_integral_data_);
355  multidim_assembly_[3_d]->add_patch_bulk_points(bulk_integral_data_);
356  }
358  multidim_assembly_[1_d]->add_patch_bdr_side_points(boundary_integral_data_);
359  multidim_assembly_[2_d]->add_patch_bdr_side_points(boundary_integral_data_);
360  multidim_assembly_[3_d]->add_patch_bdr_side_points(boundary_integral_data_);
361  }
363  multidim_assembly_[1_d]->add_patch_edge_points(edge_integral_data_);
364  multidim_assembly_[2_d]->add_patch_edge_points(edge_integral_data_);
365  multidim_assembly_[3_d]->add_patch_edge_points(edge_integral_data_);
366  }
368  multidim_assembly_[2_d]->add_patch_coupling_integrals(coupling_integral_data_);
369  multidim_assembly_[3_d]->add_patch_coupling_integrals(coupling_integral_data_);
370  }
371  this->fe_values_.reinit_patch();
372  }
373 
374  /**
375  * Add data of integrals to appropriate structure and register elements to ElementCacheMap.
376  *
377  * Types of used integrals must be set in data member \p active_integrals_.
378  */
381  if (cell.is_own()) { // Not ghost
382  this->add_volume_integral(cell);
383  }
384 
385  for( DHCellSide cell_side : cell.side_range() ) {
387  if (cell.is_own()) // Not ghost
388  if ( (cell_side.side().edge().n_sides() == 1) && (cell_side.side().is_boundary()) ) {
389  this->add_boundary_integral(cell_side);
390  continue;
391  }
393  if ( (cell_side.n_edge_sides() >= min_edge_sides_) && (cell_side.edge_sides().begin()->element().idx() == cell.elm_idx())) {
394  this->add_edge_integral(cell_side);
395  }
396  }
397 
399  bool add_low = true;
400  for( DHCellSide neighb_side : cell.neighb_sides() ) { // cell -> elm lower dim, neighb_side -> elm higher dim
401  if (cell.dim() != neighb_side.dim()-1) continue;
402  this->add_coupling_integral(cell, neighb_side, add_low);
403  add_low = false;
404  }
405  }
406  }
407 
408  /// Add data of volume integral to appropriate data structure.
409  inline void add_volume_integral(const DHCellAccessor &cell) {
410  uint subset_idx = integrals_.bulk_[cell.dim()-1]->get_subset_idx();
411  bulk_integral_data_.emplace_back(cell, subset_idx);
412 
413  unsigned int reg_idx = cell.elm().region_idx().idx();
414  table_sizes_.elem_sizes_[0][cell.dim()-1]++;
415  // Different access than in other integrals: We can't use range method CellIntegral::points
416  // because it passes element_patch_idx as argument that is not known during patch construction.
417  for (uint i=uint( eval_points_->subset_begin(cell.dim(), subset_idx) );
418  i<uint( eval_points_->subset_end(cell.dim(), subset_idx) ); ++i) {
419  element_cache_map_.add_eval_point(reg_idx, cell.elm_idx(), i, cell.local_idx());
420  table_sizes_.point_sizes_[0][cell.dim()-1]++;
421  }
422  }
423 
424  /// Add data of edge integral to appropriate data structure.
425  inline void add_edge_integral(const DHCellSide &cell_side) {
426  auto range = cell_side.edge_sides();
427  uint dim = range.begin()->dim();
428  edge_integral_data_.emplace_back(range, integrals_.edge_[dim-1]->get_subset_idx());
429 
430  for( DHCellSide edge_side : range ) {
431  unsigned int reg_idx = edge_side.element().region_idx().idx();
432  table_sizes_.elem_sizes_[1][dim-1]++;
433  for (auto p : integrals_.edge_[dim-1]->points(edge_side, &element_cache_map_) ) {
434  element_cache_map_.add_eval_point(reg_idx, edge_side.elem_idx(), p.eval_point_idx(), edge_side.cell().local_idx());
435  table_sizes_.point_sizes_[1][dim-1]++;
436  }
437  }
438  }
439 
440  /// Add data of coupling integral to appropriate data structure.
441  inline void add_coupling_integral(const DHCellAccessor &cell, const DHCellSide &ngh_side, bool add_low) {
442  coupling_integral_data_.emplace_back(cell, integrals_.coupling_[cell.dim()-1]->get_subset_low_idx(), ngh_side,
443  integrals_.coupling_[cell.dim()-1]->get_subset_high_idx());
444  table_sizes_.elem_sizes_[1][cell.dim()]++;
445  if (add_low) table_sizes_.elem_sizes_[0][cell.dim()-1]++;
446 
447  unsigned int reg_idx_low = cell.elm().region_idx().idx();
448  unsigned int reg_idx_high = ngh_side.element().region_idx().idx();
449  for (auto p : integrals_.coupling_[cell.dim()-1]->points(ngh_side, &element_cache_map_) ) {
450  element_cache_map_.add_eval_point(reg_idx_high, ngh_side.elem_idx(), p.eval_point_idx(), ngh_side.cell().local_idx());
451  table_sizes_.point_sizes_[1][cell.dim()]++;
452 
453  if (add_low) {
454  auto p_low = p.lower_dim(cell); // equivalent point on low dim cell
455  element_cache_map_.add_eval_point(reg_idx_low, cell.elm_idx(), p_low.eval_point_idx(), cell.local_idx());
456  table_sizes_.point_sizes_[0][cell.dim()-1]++;
457  }
458  }
459  }
460 
461  /// Add data of boundary integral to appropriate data structure.
462  inline void add_boundary_integral(const DHCellSide &bdr_side) {
463  boundary_integral_data_.emplace_back(integrals_.boundary_[bdr_side.dim()-1]->get_subset_low_idx(), bdr_side,
464  integrals_.boundary_[bdr_side.dim()-1]->get_subset_high_idx());
465 
466  unsigned int reg_idx = bdr_side.element().region_idx().idx();
467  table_sizes_.elem_sizes_[1][bdr_side.dim()-1]++;
468  for (auto p : integrals_.boundary_[bdr_side.dim()-1]->points(bdr_side, &element_cache_map_) ) {
469  element_cache_map_.add_eval_point(reg_idx, bdr_side.elem_idx(), p.eval_point_idx(), bdr_side.cell().local_idx());
470  table_sizes_.point_sizes_[1][bdr_side.dim()-1]++;
471 
472  BulkPoint p_bdr = p.point_bdr(bdr_side.cond().element_accessor()); // equivalent point on boundary element
473  unsigned int bdr_reg = bdr_side.cond().element_accessor().region_idx().idx();
474  // invalid local_idx value, DHCellAccessor of boundary element doesn't exist
475  element_cache_map_.add_eval_point(bdr_reg, bdr_side.cond().bc_ele_idx(), p_bdr.eval_point_idx(), -1);
476  }
477  }
478 
479  /// Calls cache_reallocate method on
480  inline void reallocate_cache() {
481  multidim_assembly_[1_d]->eq_fields_->cache_reallocate(this->element_cache_map_, multidim_assembly_[1_d]->used_fields_);
482  // DebugOut() << "Order of evaluated fields (" << DimAssembly<1>::name() << "):" << multidim_assembly_[1_d]->eq_fields_->print_dependency();
483  }
484 
485 
486  PatchFEValues<3> fe_values_; ///< Common FEValues object over all dimensions
487  bool use_patch_fe_values_; ///< Flag holds if common @p fe_values_ object is used in @p multidim_assembly_
489 
490  /// Holds mask of active integrals.
492 
493  /**
494  * Minimal number of sides on edge.
495  *
496  * Edge integral is created and calculated if number of sides is greater or equal than this value. Default value
497  * is 2 and can be changed
498  */
499  unsigned int min_edge_sides_;
500 
501  // Following variables hold data of all integrals depending of actual computed element.
502  // TODO sizes of arrays should be set dynamically, depend on number of elements in ElementCacheMap,
503  RevertableList<BulkIntegralData> bulk_integral_data_; ///< Holds data for computing bulk integrals.
504  RevertableList<EdgeIntegralData> edge_integral_data_; ///< Holds data for computing edge integrals.
505  RevertableList<CouplingIntegralData> coupling_integral_data_; ///< Holds data for computing couplings integrals.
506  RevertableList<BoundaryIntegralData> boundary_integral_data_; ///< Holds data for computing boundary integrals.
507 
508  /**
509  * Struct for pre-computing number of elements, sides, bulk points and side points on each dimension.
510  */
512 };
513 
514 
515 #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_
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_coupling_integral(const DHCellAccessor &cell, const DHCellSide &ngh_side, bool add_low)
Add data of coupling integral to appropriate data structure.
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.
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.