1#ifndef _RHEO_INTEGRATE_H
2#define _RHEO_INTEGRATE_H
182#include "rheolef/field_expr.h"
183#include "rheolef/field_expr_variational.h"
184#include "rheolef/form_expr_variational.h"
186#include "rheolef/field_expr_value_assembly.h"
187#include "rheolef/field_vf_assembly.h"
188#include "rheolef/form_vf_assembly.h"
189#include "rheolef/form_expr_quadrature.h"
190#include "rheolef/field_expr_quadrature.h"
191#include "rheolef/form_lazy_expr.h"
193#include "rheolef/functor.h"
202template <
class T,
class M,
class Expr,
203 class Result =
typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type::value_type>
205typename std::enable_if<
206 details::is_field_expr_v2_nonlinear_arg<Expr>::value
207 && ! is_undeterminated<Result>::value,
212 Result dummy = Result())
215 if (omega.map_dimension() < omega.get_background_geo().map_dimension()) {
216 omega.get_background_geo().neighbour_guard();
219 field_expr_v2_value_assembly (omega, wrap_t(expr), iopt, result);
225template <
class T,
class M>
230 if (iopt.
get_order() == std::numeric_limits<integrate_option::size_type>::max()) {
233 details::f_constant <point_basic<T>,
T> one(1);
240template<
class T,
class M,
class Expr>
242typename std::enable_if<
243 details::is_field_expr_v2_nonlinear_arg<Expr>::value
244 && is_undeterminated<typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type::value_type>::value,
245 typename scalar_traits<typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type::value_type>::type
250 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type::value_type undef_t;
252 switch (expr.valued_tag()) {
262 <<
"' valued expression");
271template <
class T,
class M,
class Expr>
275 details::is_field_expr_quadrature_arg<Expr>::value
285 lh.do_integrate (domain, expr, iopt);
288template <
class T,
class M,
class Expr>
292 details::is_field_expr_v2_variational_arg<Expr>::value
302 return integrate (domain, expr_quad, fopt);
311 details::is_field_expr_quadrature_arg<Expr>::value
312 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
319 field_basic <typename Expr::scalar_type, typename Expr::memory_type>
lh;
320 const geo_basic <typename Expr::scalar_type, typename Expr::memory_type>&
321 dom = expr.get_vf_space().get_constitution().get_geo();
322 lh.do_integrate (dom, expr, iopt);
329 details::is_field_expr_v2_variational_arg<Expr>::value
330 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
347 details::is_field_expr_quadrature_arg<Expr>::value
348 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
352 const std::string& domname,
356 field_basic <typename Expr::scalar_type, typename Expr::memory_type>
lh;
357 const geo_basic <typename Expr::scalar_type, typename Expr::memory_type>&
358 dom = expr.get_vf_space().get_constitution().get_geo() [domname];
359 lh.do_integrate (dom, expr, iopt);
366 details::is_field_expr_v2_variational_arg<Expr>::value
367 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
371 const std::string& domname,
376 return integrate (domname, expr_quad, fopt);
383template <
class T,
class M,
class Expr>
387 details::is_form_expr_quadrature_arg<Expr>::value
388 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
397 a.do_integrate (domain, expr, fopt);
400template <
class T,
class M,
class Expr>
404 details::is_form_expr_v2_variational_arg<Expr>::value
405 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
414 return integrate (domain, expr_quad, fopt);
423 details::is_form_expr_quadrature_arg<Expr>::value
424 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
431 form_basic <typename Expr::scalar_type, typename Expr::memory_type> a;
432 geo_basic <typename Expr::scalar_type, typename Expr::memory_type>
433 dom_trial = expr.get_trial_space().get_constitution().get_geo(),
434 dom_test = expr.get_test_space().get_constitution().get_geo(),
437 if (dom_trial.is_broken() && dom_test.is_broken() &&
438 expr.get_trial_space().get_constitution().is_hierarchical() &&
439 expr.get_test_space().get_constitution().is_hierarchical() ) {
440 dom = dom_test.get_background_geo();
441 }
else if (dom_trial.name() == dom_test.name() ||
442 dom_trial.name() == dom_test.get_background_geo().name() ||
443 dom_trial.is_broken()) {
445 }
else if (dom_test.name() == dom_trial.get_background_geo().name() ||
446 dom_test.is_broken()) {
449 error_macro(
"integrate: incompatible domains: trial \""<<dom_trial.name()
450 <<
"\" and \"" << dom_test.name() <<
"\"");
452 trace_macro (
"dom_trial="<<dom_trial.name()<<
" dom_test="<<dom_test.name()<<
" -> dom="<<dom.name());
453 a.do_integrate (dom, expr, fopt);
460 details::is_form_expr_v2_variational_arg<Expr>::value
461 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
478 details::is_form_expr_quadrature_arg<Expr>::value
479 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
483 const std::string& domname,
487 form_basic <typename Expr::scalar_type, typename Expr::memory_type> a;
488 const geo_basic <typename Expr::scalar_type, typename Expr::memory_type>&
489 dom = expr.get_trial_space().get_constitution().get_background_geo()[domname];
490 a.do_integrate (dom, expr, fopt);
497 details::is_form_expr_v2_variational_arg<Expr>::value
498 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
502 const std::string& domname,
507 return integrate (domname, expr_quad, fopt);
512template <
class T,
class M,
class Expr>
516 details::is_field_expr_quadrature_arg<Expr>::value
517 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
521 const band_basic<T,M>&
gh,
525 field_basic <typename Expr::scalar_type, typename Expr::memory_type>
lh;
526 lh.do_integrate (
gh, expr, iopt);
529template <
class T,
class M,
class Expr>
533 details::is_field_expr_v2_variational_arg<Expr>::value
534 ,field_basic <typename Expr::scalar_type, typename Expr::memory_type>
538 const band_basic<T,M>&
gh,
546template <
class T,
class M,
class Expr>
550 details::is_form_expr_quadrature_arg<Expr>::value
551 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
555 const band_basic<T,M>&
gh,
559 form_basic <typename Expr::scalar_type, typename Expr::memory_type> a;
560 a.do_integrate (
gh, expr, fopt);
563template <
class T,
class M,
class Expr>
567 details::is_form_expr_v2_variational_arg<Expr>::value
568 ,form_basic <typename Expr::scalar_type, typename Expr::memory_type>
572 const band_basic<T,M>&
gh,
589 details::is_field_expr_quadrature_arg<Expr>::value
590 ,details::field_lazy_terminal_integrate <Expr>
594 const typename Expr::geo_type& domain,
596 const integrate_option& iopt = integrate_option())
598 return details::field_lazy_terminal_integrate<Expr> (domain, expr, iopt);
604 details::is_field_expr_v2_variational_arg<Expr>::value
605 ,details::field_lazy_terminal_integrate <details::field_expr_quadrature_on_element<Expr>>
609 const geo_basic<typename Expr::scalar_type, typename Expr::memory_type>& domain,
611 const integrate_option& iopt = integrate_option())
613 details::field_expr_quadrature_on_element<Expr> expr_quad(expr);
623 details::is_field_expr_quadrature_arg<Expr>::value
624 ,details::field_lazy_terminal_integrate <Expr>
629 const integrate_option& fopt = integrate_option())
631 return details::field_lazy_terminal_integrate<Expr> (expr, iopt);
637 details::is_field_expr_v2_variational_arg<Expr>::value
638 ,details::field_lazy_terminal_integrate <details::field_expr_quadrature_on_element<Expr>>
643 const integrate_option& fopt = integrate_option())
645 details::field_expr_quadrature_on_element<Expr> expr_quad(expr);
655 details::is_field_expr_quadrature_arg<Expr>::value
656 ,details::field_lazy_terminal_integrate <Expr>
660 const std::string& domname,
662 const integrate_option& fopt = integrate_option())
664 return details::field_lazy_terminal_integrate<Expr> (domname, expr, iopt);
670 details::is_field_expr_v2_variational_arg<Expr>::value
671 ,details::field_lazy_terminal_integrate <details::field_expr_quadrature_on_element<Expr>>
675 const std::string& domname,
677 const integrate_option& fopt = integrate_option())
679 details::field_expr_quadrature_on_element<Expr> expr_quad(expr);
692 details::is_form_expr_quadrature_arg<Expr>::value
693 ,details::form_lazy_terminal_integrate <Expr>
707 details::is_form_expr_v2_variational_arg<Expr>::value
708 ,details::form_lazy_terminal_integrate <details::form_expr_quadrature_on_element<Expr>>
726 details::is_form_expr_quadrature_arg<Expr>::value
727 ,details::form_lazy_terminal_integrate <Expr>
737 geo_basic <typename Expr::scalar_type, typename Expr::memory_type>
738 dom_trial = expr.get_trial_space().get_constitution().get_geo(),
739 dom_test = expr. get_test_space().get_constitution().get_geo(),
742 if (dom_trial.is_broken() && dom_test.is_broken() &&
743 expr.get_trial_space().get_constitution().is_hierarchical() &&
744 expr. get_test_space().get_constitution().is_hierarchical() ) {
745 dom = dom_test.get_background_geo();
746 }
else if (dom_trial.name() == dom_test.name() ||
747 dom_trial.name() == dom_test.get_background_geo().name() ||
748 dom_trial.is_broken()) {
749 dom = has_on_local_sides ? dom_trial : dom_test;
750 }
else if (dom_test.name() == dom_trial.get_background_geo().name() ||
751 dom_test.is_broken()) {
752 dom = has_on_local_sides ? dom_test : dom_trial;
754 error_macro(
"integrate: incompatible domains: trial \""<<dom_trial.name()
755 <<
"\" and \"" << dom_test.name() <<
"\"");
758 trace_macro (
"space_trial="<<expr.get_trial_space().name()<<
" space_test="<<expr. get_test_space().name());
759 trace_macro (
"dom_trial="<<dom_trial.name()<<
" dom_test="<<dom_test.name()<<
" -> dom="<<dom.name());
766 details::is_form_expr_v2_variational_arg<Expr>::value
767 ,details::form_lazy_terminal_integrate <details::form_expr_quadrature_on_element<Expr>>
784 details::is_form_expr_quadrature_arg<Expr>::value
785 ,details::form_lazy_terminal_integrate <Expr>
789 const std::string& domname,
793 form_basic <typename Expr::scalar_type, typename Expr::memory_type> a;
794 const geo_basic <typename Expr::scalar_type, typename Expr::memory_type>&
795 dom = expr.get_trial_space().get_constitution().get_background_geo()[domname];
802 details::is_form_expr_v2_variational_arg<Expr>::value
803 ,details::form_lazy_terminal_integrate <details::form_expr_quadrature_on_element<Expr>>
807 const std::string& domname,
field lh(Float epsilon, Float t, const test &v)
field gh(Float epsilon, Float t, const field &uh, const test &v)
generic mesh with rerefence counting
see the integrate_option page for the full documentation
typename scalar_traits< value_type >::type scalar_type
#define trace_macro(message)
#define error_macro(message)
#define warning_macro(message)
const std::string & valued_name(valued_type valued_tag)
This file is part of Rheolef.
std::enable_if< details::is_field_expr_v2_nonlinear_arg< Expr >::value &&!is_undeterminated< Result >::value, Result >::type integrate(const geo_basic< T, M > &omega, const Expr &expr, const integrate_option &iopt, Result dummy=Result())
see the integrate page for the full documentation
std::enable_if< details::is_field_expr_quadrature_arg< Expr >::value, details::field_lazy_terminal_integrate< Expr > >::type lazy_integrate(const typename Expr::geo_type &domain, const Expr &expr, const integrate_option &iopt=integrate_option())
see the integrate page for the full documentation