Flow123d  DF_patch_fe_darcy_complete-579fe1e
eval_points.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 eval_points.cc
15  * @brief
16  * @author David Flanderka
17  */
18 
19 #include "fem/eval_points.hh"
20 #include "fem/integral_acc.hh"
21 #include "fem/patch_fe_values.hh"
22 #include "quadrature/quadrature.hh"
23 #include "mesh/ref_element.hh"
24 #include <memory>
25 
26 
27 const unsigned int EvalPoints::undefined_dim = 10;
28 
30 : dim_eval_points_({DimEvalPoints(0), DimEvalPoints(1), DimEvalPoints(2), DimEvalPoints(3)}),
31  max_size_(0)
32 {}
33 
34 template <unsigned int dim>
35 std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal(Quadrature *quad) {
36  ASSERT_EQ(dim, quad->dim());
37 
38  auto tpl = IntegralTplHash::integral_tuple(dim, quad->size());
39  auto map_it = bulk_integrals_.find( tpl );
40  if (map_it == bulk_integrals_.end()) {
41  dim_eval_points_[dim].add_local_points<dim>( quad->get_points() );
42  uint i_subset = dim_eval_points_[dim].add_subset();
43 
44  bulk_integrals_[tpl] = std::make_shared<internal_integrals::Bulk>(quad, quad->dim(), shared_from_this(), i_subset);
45  map_it = bulk_integrals_.find( tpl );
46  this->set_max_size();
47  }
48  return map_it->second;
49 }
50 
51 template <>
52 std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal<0>(Quadrature *quad)
53 {
54  ASSERT_EQ(0, quad->dim());
55 
56  auto tpl = IntegralTplHash::integral_tuple(0, quad->size());
57  auto map_it = bulk_integrals_.find( tpl );
58  if (map_it == bulk_integrals_.end()) {
59  uint i_subset = dim_eval_points_[0].add_subset();
60 
61  bulk_integrals_[tpl] = std::make_shared<internal_integrals::Bulk>(quad, quad->dim(), shared_from_this(), i_subset);
62  map_it = bulk_integrals_.find( tpl );
63  this->set_max_size();
64  }
65  return map_it->second;
66 }
67 
68 template <unsigned int dim>
69 std::shared_ptr<internal_integrals::Edge> EvalPoints::add_edge_internal(Quadrature *quad)
70 {
71  ASSERT_EQ(dim, quad->dim()+1);
72 
73  auto tpl = IntegralTplHash::integral_tuple(dim, quad->size());
74  auto map_it = edge_integrals_.find( tpl );
75  if (map_it == edge_integrals_.end()) {
76  for (unsigned int i=0; i<dim+1; ++i) { // sides
77  Quadrature high_dim_q = quad->make_from_side<dim>(i);
78  dim_eval_points_[dim].add_local_points<dim>( high_dim_q.get_points() );
79  }
80  uint i_subset = dim_eval_points_[dim].add_subset();
81 
82  edge_integrals_[tpl] = std::make_shared<internal_integrals::Edge>(quad, quad->dim()+1, shared_from_this(), i_subset);
83  map_it = edge_integrals_.find( tpl );
84  this->set_max_size();
85  }
86  return map_it->second;
87 }
88 
89 uint EvalPoints::get_max_bulk_quad_size(unsigned int dim) const {
90  return get_max_integral_quad_size<internal_integrals::Bulk>(bulk_integrals_, dim);
91 }
92 
93 uint EvalPoints::get_max_side_quad_size(unsigned int dim) const {
94  return get_max_integral_quad_size<internal_integrals::Edge>(edge_integrals_, dim);
95 }
96 
97 template<class Integral>
99  uint max_qsize=0;
100  for (auto integral_it : integrals)
101  if (integral_it.second->dim() == dim)
102  if (integral_it.second->quad()->size() > max_qsize)
103  max_qsize = integral_it.second->quad()->size();
104  return max_qsize;
105 }
106 
108 : local_points_(dim), n_subsets_(0), dim_(dim)
109 {
110  subset_starts_[0] = 0;
112 }
113 
114 template <unsigned int dim>
116  ASSERT_GT(dim, 0).error("Dimension 0 not supported!\n");
117  unsigned int local_points_old_size = local_points_.size();
118  local_points_.resize(quad_points.size() + local_points_old_size);
119  for (unsigned int i=0; i<quad_points.size(); ++i) {
120  //DebugOut() << "add i: " << i << " : " << quad_points.vec<dim>(i);
121 
122  local_points_.set(i+local_points_old_size) = quad_points.vec<dim>(i);
123  }
124 }
125 
126 
128  ASSERT_LT(n_subsets_, EvalPoints::max_subsets).error("Maximal number of subsets exceeded!\n");
129 
130  n_subsets_++;
131  subset_starts_[n_subsets_] = this->size();
132  return n_subsets_ - 1;
133 }
134 
135 
136 template std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal<0>(Quadrature *);
137 template std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal<1>(Quadrature *);
138 template std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal<2>(Quadrature *);
139 template std::shared_ptr<internal_integrals::Bulk> EvalPoints::add_bulk_internal<3>(Quadrature *);
140 template std::shared_ptr<internal_integrals::Edge> EvalPoints::add_edge_internal<1>(Quadrature *);
141 template std::shared_ptr<internal_integrals::Edge> EvalPoints::add_edge_internal<2>(Quadrature *);
142 template std::shared_ptr<internal_integrals::Edge> EvalPoints::add_edge_internal<3>(Quadrature *);
143 template unsigned int EvalPoints::get_max_integral_quad_size<internal_integrals::Bulk>(IntegralPtrMap<internal_integrals::Bulk>, unsigned int) const;
144 template unsigned int EvalPoints::get_max_integral_quad_size<internal_integrals::Edge>(IntegralPtrMap<internal_integrals::Edge>, unsigned int) const;
145 
146 template void EvalPoints::DimEvalPoints::add_local_points<1>(const Armor::Array<double> &);
147 template void EvalPoints::DimEvalPoints::add_local_points<2>(const Armor::Array<double> &);
148 template void EvalPoints::DimEvalPoints::add_local_points<3>(const Armor::Array<double> &);
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.
Definition: asserts.hh:301
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Definition: asserts.hh:333
#define ASSERT_GT(a, b)
Definition of comparative assert macro (Greater Than) only for debug mode.
Definition: asserts.hh:317
void reinit(uint size)
Definition: armor.hh:746
ArmaVec< Type, nr > vec(uint mat_index) const
Definition: armor.hh:869
unsigned int size() const
Definition: armor.hh:776
Subobject holds evaluation points data of one dimension (0,1,2,3)
Definition: eval_points.hh:130
std::array< int, EvalPoints::max_subsets+1 > subset_starts_
Indices of subsets data in local_points_ vector, used size is n_subsets_ + 1.
Definition: eval_points.hh:184
DimEvalPoints(unsigned int dim)
Constructor.
Definition: eval_points.cc:107
uint add_subset()
Adds new subset and its end size to subset_starts_ array.
Definition: eval_points.cc:127
Armor::Array< double > local_points_
Local coords of points vector.
Definition: eval_points.hh:183
void add_local_points(const Armor::Array< double > &quad_points)
Adds set of local point to local_points_ (bulk or side).
Definition: eval_points.cc:115
void set_max_size()
Definition: eval_points.hh:191
static const unsigned int undefined_dim
Undefined dimension of new (empty) object.
Definition: eval_points.hh:57
unsigned int size(unsigned int dim) const
Return size of evaluation points object (number of points).
Definition: eval_points.hh:69
std::shared_ptr< internal_integrals::Edge > add_edge_internal(Quadrature *)
The same as add_bulk but for edge points on sides.
Definition: eval_points.cc:69
std::shared_ptr< internal_integrals::Bulk > add_bulk_internal(Quadrature *)
Definition: eval_points.cc:35
static const unsigned int max_subset_points
Maximal average number of points hold in subset.
Definition: eval_points.hh:63
uint get_max_integral_quad_size(IntegralPtrMap< Integral > integrals, unsigned int dim) const
Common implementation of get_max_bulk_quad_size and get_max_side_quad_size.
Definition: eval_points.cc:98
IntegralPtrMap< internal_integrals::Bulk > bulk_integrals_
Maps of all BulkIntegrals of dimensions 0,1,2,3.
Definition: eval_points.hh:204
uint get_max_bulk_quad_size(unsigned int dim) const
Return maximal size of quadrature of given dimension of bulk integral (Bulk, Coupling /lower-dim/)
Definition: eval_points.cc:89
IntegralPtrMap< internal_integrals::Edge > edge_integrals_
Maps of all EdgeIntegrals of dimensions 1,2,3.
Definition: eval_points.hh:207
std::array< DimEvalPoints, 4 > dim_eval_points_
Sub objects of dimensions 0,1,2,3.
Definition: eval_points.hh:201
static constexpr unsigned int max_subsets
Maximal number of hold subsets.
Definition: eval_points.hh:60
EvalPoints()
Constructor.
Definition: eval_points.cc:29
uint get_max_side_quad_size(unsigned int dim) const
Return maximal size of quadrature of given dimension of side integral (Edge, Coupling /higher-dim/,...
Definition: eval_points.cc:93
Base class for quadrature rules on simplices in arbitrary dimensions.
Definition: quadrature.hh:48
Quadrature make_from_side(unsigned int sid) const
Definition: quadrature.cc:47
const Armor::Array< double > & get_points() const
Return a reference to the whole array of quadrature points.
Definition: quadrature.hh:99
unsigned int size() const
Returns number of quadrature points.
Definition: quadrature.hh:86
unsigned int dim() const
Definition: quadrature.hh:72
std::unordered_map< std::tuple< uint, uint >, std::shared_ptr< Integral >, IntegralTplHash > IntegralPtrMap
Alias for unordered_map of shared_ptr<Integral> with custom hash.
unsigned int uint
Class FEValues calculates finite element data on the actual cells such as shape function values,...
Basic definitions of numerical quadrature rules.
Class RefElement defines numbering of vertices, sides, calculation of normal vectors etc.
static std::tuple< uint, uint > integral_tuple(uint dim, uint quad_size)
Create tuple from dimennsion and size of Quadrature.