93 #ifndef GETFEM_INTEGRATION_H__
94 #define GETFEM_INTEGRATION_H__
117 mutable std::vector<long_scalar_type> int_monomials;
118 mutable std::vector< std::vector<long_scalar_type> > int_face_monomials;
123 dim_type
dim(
void)
const {
return cvs->dim(); }
133 long_scalar_type
int_poly(
const base_poly &P)
const;
144 typedef std::shared_ptr<const poly_integration> ppoly_integration;
152 class integration_method;
153 typedef std::shared_ptr<const integration_method> pintegration_method;
156 class approx_integration {
160 bgeot::pconvex_ref cvr;
161 bgeot::pstored_point_tab pint_points;
162 std::vector<scalar_type> int_coeffs;
163 std::vector<size_type> repartition;
166 std::vector<PT_TAB> pt_to_store;
168 bool built_on_the_fly;
173 dim_type dim(
void)
const {
return cvr->structure()->dim(); }
174 size_type nb_points(
void)
const {
return int_coeffs.size(); }
176 size_type nb_points_on_convex(
void)
const {
return repartition[0]; }
179 {
return repartition[f+1] - repartition[f]; }
181 {
return repartition[f]; }
184 {
return cvr->structure()->nb_faces(); }
185 bool is_built_on_the_fly(
void)
const {
return built_on_the_fly; }
186 void set_built_on_the_fly(
void) { built_on_the_fly =
true; }
190 bgeot::pconvex_ref ref_convex(
void)
const {
return cvr; }
192 const std::vector<size_type> &repart(
void)
const {
return repartition; }
197 bgeot::pstored_point_tab pintegration_points(
void)
const
198 {
return pint_points; }
200 const base_node &point(
size_type i)
const
201 {
return (*pint_points)[i]; }
205 {
return (*pint_points)[repartition[f] + i]; }
207 const std::vector<scalar_type> &integration_coefficients(
void)
const
208 {
return int_coeffs; }
210 scalar_type coeff(
size_type i)
const {
return int_coeffs[i]; }
213 {
return int_coeffs[repartition[f] + i]; }
215 void add_point(
const base_node &pt, scalar_type w,
217 bool include_empty =
false);
218 void add_point_norepeat(
const base_node &pt, scalar_type w,
220 void add_point_full_symmetric(base_node pt, scalar_type w);
221 void add_method_on_face(pintegration_method ppi,
short_type f);
222 void valid_method(
void);
224 approx_integration(
void) : valid(false), built_on_the_fly(false) { }
225 approx_integration(bgeot::pconvex_ref cr)
226 : cvr(cr), repartition(cr->structure()->nb_faces()+1),
227 pt_to_store(cr->structure()->nb_faces()+1), valid(false),
228 built_on_the_fly(false)
229 { std::fill(repartition.begin(), repartition.end(), 0); }
230 virtual ~approx_integration() {}
233 typedef std::shared_ptr<const approx_integration> papprox_integration;
245 ppoly_integration ppi;
246 papprox_integration pai;
248 void remove() { pai = papprox_integration(); ppi = ppoly_integration(); }
252 const papprox_integration &approx_method(
void)
const {
return pai; }
253 const ppoly_integration &exact_method(
void)
const {
return ppi; }
255 void set_approx_method(papprox_integration paii)
256 { remove(); pai = paii; im_type = IM_APPROX; }
257 void set_exact_method(ppoly_integration ppii)
258 { remove(); ppi = ppii; im_type = IM_EXACT; }
260 bgeot::pstored_point_tab pintegration_points(
void)
const {
261 if (type() == IM_EXACT) {
263 std::vector<base_node> spt(1); spt[0] = base_node(n);
264 return store_point_tab(spt);
266 else if (type() == IM_APPROX)
267 return pai->pintegration_points();
268 else GMM_ASSERT1(
false,
"IM_NONE has no points");
276 case IM_EXACT:
return ppi->structure();
277 case IM_APPROX:
return pai->structure();
278 case IM_NONE: GMM_ASSERT1(
false,
"IM_NONE has no structure");
279 default: GMM_ASSERT3(
false,
"");
285 DAL_STORED_OBJECT_DEBUG_CREATED(
this,
"Exact integration method");
286 ppi = p; im_type = IM_EXACT;
290 DAL_STORED_OBJECT_DEBUG_CREATED(
this,
"Approximate integration method");
291 pai = p; im_type = IM_APPROX;
295 DAL_STORED_OBJECT_DEBUG_CREATED(
this,
"Integration method");
300 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Integration method"); }
312 bool throw_if_not_found =
true);
340 pintegration_method
im_none(
void);
344 papprox_integration composite_approx_int_method(
const bgeot::mesh_precomposite &mp,
346 bgeot::pconvex_ref cr);
350 scalar_type test_integration_error(papprox_integration pim, dim_type order);
352 papprox_integration get_approx_im_or_fail(pintegration_method pim);
357 typedef dal::naming_system<integration_method>::param_list im_param_list;
359 void add_integration_name(std::string name,
Geometric transformations on convexes.
Structure which dynamically collects points identifying points that are nearer than a certain very sm...
Handle composite polynomials.
Store a set of points, identifying points that are nearer than a certain very small distance.
Vector of integer (16 bits type) which represent the powers of a monomial.
Associate a name to a method descriptor and store method descriptors.
base class for static stored objects
this structure is not intended to be used directly.
Describe an integration method linked to a mesh.
Description of an exact integration of polynomials.
long_scalar_type int_poly(const base_poly &P) const
Evaluate the integral of the polynomial P on the reference element.
bgeot::pconvex_structure structure(void) const
{Structure of convex of reference.
long_scalar_type int_poly_on_face(const base_poly &P, short_type f) const
Evaluate the integral of the polynomial P on the face f of the reference element.
dim_type dim(void) const
Dimension of convex of reference.
defines and typedefs for namespace getfem
gmm::uint16_type short_type
used as the common short type integer in the library
std::shared_ptr< const convex_structure > pconvex_structure
Pointer on a convex structure description.
size_t size_type
used as the common size type in the library
pconvex_structure basic_structure(pconvex_structure cv)
Original structure (if concerned)
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation
GEneric Tool for Finite Element Methods.
pintegration_method exact_parallelepiped_im(size_type n)
return IM_EXACT_PARALLELEPIPED(n)
std::string name_of_int_method(pintegration_method p)
Get the string name of an integration method .
pintegration_method exact_simplex_im(size_type n)
return IM_EXACT_SIMPLEX(n)
pintegration_method exact_prism_im(size_type n)
return IM_EXACT_PRISM(n)
pintegration_method classical_approx_im(bgeot::pgeometric_trans pgt, dim_type degree)
try to find an approximate integration method for the geometric transformation pgt which is able to i...
pintegration_method classical_exact_im(bgeot::pgeometric_trans pgt)
return an exact integration method for convex type handled by pgt.
pintegration_method exact_classical_im(bgeot::pgeometric_trans pgt) IS_DEPRECATED
use classical_exact_im instead.
pintegration_method int_method_descriptor(std::string name, bool throw_if_not_found=true)
Get an integration method from its name .
integration_method_type
the list of main integration method types
pintegration_method im_none(void)
return IM_NONE