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();
225template <
class T,
class M>
230 if (iopt.
get_order() == std::numeric_limits<integrate_option::size_type>::max()) {
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
288template <
class T,
class M,
class Expr>
292 details::is_field_expr_v2_variational_arg<Expr>::value
311 details::is_field_expr_quadrature_arg<Expr>::value
312 ,field_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,
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>
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>
423 details::is_form_expr_quadrature_arg<Expr>::value
424 ,form_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,
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,
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,
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>
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() <<
"\"");
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,
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)
see the integrate_option page for the full documentation
typename scalar_traits< value_type >::type scalar_type
static iorheo::force_initialization dummy
#define trace_macro(message)
#define error_macro(message)
#define warning_macro(message)
void field_expr_v2_value_assembly(const geo_basic< T, M > &omega, const Expr &expr0, const integrate_option &iopt, Result &result)
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