1#ifndef _RHEOLEF_FIELD_EXPR_RECURSIVE_H
2#define _RHEOLEF_FIELD_EXPR_RECURSIVE_H
47#include "rheolef/field_expr_terminal.h"
58template<
class UnaryFunction,
class Expr>
85 std::is_same<UnaryFunction,details::unary_plus>
86 ,std::is_same<UnaryFunction,details::negate>
87 ,std::is_same<UnaryFunction,details::binder_first <details::plus, scalar_type>>
88 ,std::is_same<UnaryFunction,details::binder_second<details::plus, scalar_type>>
89 ,std::is_same<UnaryFunction,details::binder_first <details::minus, scalar_type>>
90 ,std::is_same<UnaryFunction,details::binder_second<details::minus, scalar_type>>
91 ,std::is_same<UnaryFunction,details::binder_first <details::multiplies,scalar_type>>
92 ,std::is_same<UnaryFunction,details::binder_second<details::multiplies,scalar_type>>
93 ,std::is_same<UnaryFunction,details::binder_second<details::divides, scalar_type>>
99 return is_affine_homogeneous::value
100 &&
_expr.have_homogeneous_space (Vh);
114 const UnaryFunction
_f;
137 bool is_on_band ()
const {
return _expr.is_on_band(); }
148 {
_expr.initialize (pops, iopt); }
154 {
_expr.initialize (Xh, pops, iopt); }
159 template<
class Result,
class Arg,
class Status>
166 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
168 fatal_macro (
"invalid type resolution: Result="<<typename_macro(Result)
169 <<
", Arg="<<typename_macro(Arg)
170 <<
", UnaryFunction="<<typename_macro(UnaryFunction));
178 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
180 fatal_macro (
"invalid type resolution: Result="<<typename_macro(Result)
181 <<
", Arg="<<typename_macro(Arg)
182 <<
", UnaryFunction="<<typename_macro(UnaryFunction));
185 template<
class Result,
class Arg>
193 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
195 Eigen::Matrix<Arg,Eigen::Dynamic,1> value1;
196 obj._expr.evaluate (omega_K, K, value1);
197 value.resize(value1.size());
198 for (
size_type i = 0, ni = value.rows(); i < ni; ++i) {
199 value[i] = obj._f (value1[i]);
209 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
211 Eigen::Matrix<Arg,Eigen::Dynamic,1> value1;
212 obj._expr.evaluate_on_side (omega_K, K, sid, value1);
213 value.resize (value1.size());
214 for (
size_type i = 0, ni = value.rows(); i < ni; ++i) {
215 value[i] = obj._f (value1[i]);
222 template<
class Result,
class Arg,
class M>
226 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
235 eval (*
this, omega_K, K, value);
240 template<
class Result,
class Arg,
class M>
245 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
254 eval (*
this, omega_K, K, sid, value);
259 template<class This, class Result, class Arg, space_constant::valued_type ArgTag = space_constant::valued_tag_traits<Arg>::value>
263 template<
class This,
class Result,
class Arg>
270 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
274 switch (arg_valued_tag) {
276 obj.template evaluate_call<Result,T,M> (omega_K, K, value);
break;
278 obj.template evaluate_call<Result, point_basic<T> > (omega_K, K, value);
break;
281 obj.template evaluate_call<Result, tensor_basic<T> > (omega_K, K, value);
break;
282 default: {
error_macro (
"unexpected valued tag="<<arg_valued_tag); }
291 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
295 switch (arg_valued_tag) {
297 obj.template evaluate_call<Result,T> (omega_K, K, sid, value);
break;
299 obj.template evaluate_call<Result, point_basic<T> > (omega_K, K, value);
break;
302 obj.template evaluate_call<Result, tensor_basic<T> > (omega_K, K, value);
break;
303 default: {
error_macro (
"unexpected valued tag="<<arg_valued_tag); }
308#define _RHEOLEF_evaluate_switch_specialization(VALUED,VALUE) \
309 template<class This, class Result, class Arg> \
310 struct evaluate_switch <This, Result, Arg, VALUED> { \
311 typedef typename scalar_traits<Arg>::type T; \
312 typedef typename float_traits<Arg>::type float_type; \
316 const geo_basic<float_type,memory_type>& omega_K, \
317 const geo_element& K, \
318 Eigen::Matrix<Result,Eigen::Dynamic,1>& value) const \
319 { obj.template evaluate_call<Result, VALUE> (omega_K, K, value); } \
322 void evaluate_on_side ( \
324 const geo_basic<float_type,M>& omega_K, \
325 const geo_element& K, \
326 const side_information_type& sid, \
327 Eigen::Matrix<Result,Eigen::Dynamic,1>& value) const \
328 { obj.template evaluate_call<Result, VALUE> (omega_K, K, sid, value); } \
336#undef _RHEOLEF_evaluate_switch_specialization
341 template<
class Result>
344 const geo_basic<float_type,memory_type>& omega_K,
345 const geo_element& K,
346 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
348 typedef field_expr_v2_nonlinear_node_unary<UnaryFunction, Expr> This;
349 typedef typename details::generic_unary_traits<UnaryFunction>::template hint<typename Expr::value_type,Result>::argument_type
351 evaluate_switch <This, Result, A1> helper;
352 helper.evaluate (*
this, omega_K, K, value);
357 template<
class Result>
360 const geo_basic<float_type,memory_type>& omega_K,
361 const geo_element& K,
362 const side_information_type& sid,
363 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
365 typedef field_expr_v2_nonlinear_node_unary<UnaryFunction, Expr> This;
366 typedef typename details::generic_unary_traits<UnaryFunction>::template hint<typename Expr::value_type,Result>::argument_type
368 evaluate_switch <This, Result, A1> helper;
369 helper.evaluate_on_side (*
this, omega_K, K, sid, value);
372 template<
class Result>
374 typedef typename details::generic_unary_traits<UnaryFunction>::template hint<typename Expr::value_type,Result>::argument_type
376 if (! is_undeterminated<A1>::value)
return _expr.template valued_check<A1>();
386 Eigen::Matrix<scalar_type,Eigen::Dynamic,1>
389 Eigen::Matrix<point_basic<scalar_type>,Eigen::Dynamic,1>
392 Eigen::Matrix<tensor_basic<scalar_type>,Eigen::Dynamic,1>
395 Eigen::Matrix<tensor3_basic<scalar_type>,Eigen::Dynamic,1>
398 Eigen::Matrix<tensor4_basic<scalar_type>,Eigen::Dynamic,1>
402template<
class UnaryFunction,
class Expr>
404 const UnaryFunction&
f,
419 field_expr_v2_nonlinear_node_unary<F,Expr>::is_affine_homogeneous::value>::type>: std::true_type {};
431#define _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator(FUNCTION,FUNCTOR) \
432template<class Expr> \
436 details::is_field_expr_v2_nonlinear_arg<Expr>::value \
437 && ! details::is_field_expr_v2_constant <Expr>::value \
438 && ! details::has_field_rdof_interface <Expr>::value \
439 ,details::field_expr_v2_nonlinear_node_unary< \
441 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type \
444FUNCTION (const Expr& expr) \
446 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type wrap_t; \
447 return details::field_expr_v2_nonlinear_node_unary <FUNCTOR,wrap_t> (FUNCTOR(), wrap_t(expr)); \
452#undef _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator
457#define _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator(FUNCTION,FUNCTOR) \
458template<class Expr> \
462 ( details::is_field_expr_v2_nonlinear_arg<Expr>::value \
463 || details::is_field<Expr>::value) \
464 && ! details::is_field_expr_v2_constant <Expr>::value \
465 ,details::field_expr_v2_nonlinear_node_unary< \
467 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type \
470FUNCTION (const Expr& expr) \
472 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr>::type wrap_t; \
473 return details::field_expr_v2_nonlinear_node_unary <FUNCTOR,wrap_t> (FUNCTOR(), wrap_t(expr)); \
475#define _RHEOLEF_make_field_expr_v2_nonlinear_unary_function(FUNCTION) \
476 _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator(FUNCTION, details::FUNCTION##_)
504#undef _RHEOLEF_make_field_expr_v2_nonlinear_unary_function
505#undef _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator
511template<
class Function,
class Expr>
521compose (
const Function&
f,
const Expr& expr)
525 return details::field_expr_v2_nonlinear_node_unary <fun_wrap_t, expr_wrap_t> (
fun_wrap_t(
f), expr_wrap_t(expr));
534template<
class BinaryFunction,
class Expr1,
class Expr2>
540 using result_type =
typename details::generic_binary_traits<BinaryFunction>::template result_hint<typename Expr1::result_type,typename Expr2::result_type>::type;
549 const BinaryFunction&
f,
566 std::is_same<BinaryFunction,details::plus>
567 ,std::is_same<BinaryFunction,details::minus>
569 ,is_field_expr_affine_homogeneous<Expr1>
570 ,is_field_expr_affine_homogeneous<Expr2>
574 std::is_same<BinaryFunction,details::multiplies>
575 ,std::is_same<BinaryFunction,details::divides>
577 ,is_field_expr_affine_homogeneous<Expr1>
578 ,is_field_expr_v2_constant <Expr2>
581 std::is_same<BinaryFunction,details::multiplies>
582 ,is_field_expr_v2_constant <Expr1>
583 ,is_field_expr_affine_homogeneous<Expr2>
588 return is_affine_homogeneous::value
589 && _expr1.have_homogeneous_space (Vh)
590 && _expr2.have_homogeneous_space (Vh2)
591 && Vh.name() == Vh2.name();
597 typename Expr1::scalar_type,
598 typename Expr2::scalar_type>::type;
602 const_iterator (
const BinaryFunction&
f,
typename Expr1::const_iterator iter1,
typename Expr2::const_iterator iter2)
603 : _f(
f), _iter1 (iter1), _iter2 (iter2) {}
605 value_type operator* ()
const {
return _f (*_iter1, *_iter2); }
607 const BinaryFunction
_f;
622 return details::generic_binary_traits<BinaryFunction>::valued_tag(_expr1.valued_tag(), _expr2.valued_tag());
631 _expr1.initialize (pops, iopt);
632 _expr2.initialize (pops, iopt);
639 _expr1.initialize (Xh, pops, iopt);
640 _expr2.initialize (Xh, pops, iopt);
645 template<
class Result,
class Arg1,
class Arg2,
class M>
649 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
651 Eigen::Matrix<Arg1,Eigen::Dynamic,1> value1; _expr1.evaluate (omega_K, K, value1);
652 Eigen::Matrix<Arg2,Eigen::Dynamic,1> value2; _expr2.evaluate (omega_K, K, value2);
653 value.resize (value1.size());
655 for (
size_t i = 0, ni = value.rows(); i < ni; ++i) {
656 value[i] = _f (value1[i], value2[i]);
659 template<
class Result,
class Arg1,
class Arg2,
class M>
664 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
666 Eigen::Matrix<Arg1,Eigen::Dynamic,1> value1; _expr1.evaluate_on_side (omega_K, K, sid, value1);
667 Eigen::Matrix<Arg2,Eigen::Dynamic,1> value2; _expr2.evaluate_on_side (omega_K, K, sid, value2);
668 value.resize (value1.size());
669 for (
size_t i = 0, ni = value.rows(); i < ni; ++i) {
670 value[i] = _f (value1[i], value2[i]);
673 template<
class This,
class Result,
class ReturnType,
class Arg1,
class Arg2>
674 struct evaluate_internal {
678 const geo_basic<float_type,M>& omega_K,
679 const geo_element& K,
680 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
683 << pretty_typename_macro(ReturnType) <<
": "
684 << pretty_typename_macro(Result) <<
" was expected for function "
685 << pretty_typename_macro(BinaryFunction) <<
"("
686 << pretty_typename_macro(Arg1) <<
","
687 << pretty_typename_macro(Arg2) <<
")");
692 const geo_basic<float_type,M>& omega_K,
693 const geo_element& K,
694 const side_information_type& sid,
695 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
698 << pretty_typename_macro(ReturnType) <<
": "
699 << pretty_typename_macro(Result) <<
" was expected for function "
700 << pretty_typename_macro(BinaryFunction) <<
"("
701 << pretty_typename_macro(Arg1) <<
","
702 << pretty_typename_macro(Arg2) <<
")");
705 template<
class This,
class Result,
class Arg1,
class Arg2>
706 struct evaluate_internal<This,Result,Result,Arg1,Arg2> {
712 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
713 { obj.template evaluate_internal2<Result,Arg1,Arg2,M> (omega_K, K, value); }
721 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
722 { obj.template evaluate_internal2 <Result,Arg1,Arg2,M> (omega_K, K, sid, value);
725 template<
class Result,
class Arg1,
class Arg2,
class M>
729 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
731 typedef typename details::generic_binary_traits<BinaryFunction>::template result_hint<Arg1,Arg2>::type ReturnType;
732 typedef field_expr_v2_nonlinear_node_binary<BinaryFunction, Expr1, Expr2> This;
733 evaluate_internal<This,Result,ReturnType,Arg1,Arg2> eval_int;
734 eval_int (*
this, omega_K, K, value);
736 template<
class Result,
class Arg1,
class Arg2,
class M>
741 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
743 typedef typename details::generic_binary_traits<BinaryFunction>::template result_hint<Arg1,Arg2>::type ReturnType;
744 typedef field_expr_v2_nonlinear_node_binary<BinaryFunction, Expr1, Expr2> This;
745 evaluate_internal<This,Result,ReturnType,Arg1,Arg2> eval_int;
746 eval_int (*
this, omega_K, K, sid, value);
749 template<
class This,
class Result,
750 class Arg1, space_constant::valued_type Arg1Tag,
751 class Arg2, space_constant::valued_type Arg2Tag>
758 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
759 { obj.template evaluate_call<Result, Arg1, Arg2> (omega_K, K, value); }
767 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
768 { obj.template evaluate_call<Result, Arg1, Arg2> (omega_K, K, sid, value); }
771 template<
class This,
class Result,
775 Arg1, space_constant::last_valued,
776 Arg2, space_constant::last_valued> {
782 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
788 switch (arg1_valued_tag) {
789 case space_constant::scalar: {
790 switch (arg2_valued_tag) {
791 case space_constant::scalar:
792 return obj.template evaluate_call<Result, T1, T2> (omega_K, K, value);
break;
793 case space_constant::vector:
794 return obj.template evaluate_call<Result, T1, point_basic<T2> > (omega_K, K, value);
break;
795 case space_constant::tensor:
796 case space_constant::unsymmetric_tensor:
797 return obj.template evaluate_call<Result, T1, tensor_basic<T2> > (omega_K, K, value);
break;
798 case space_constant::tensor3:
799 return obj.template evaluate_call<Result, T1, tensor3_basic<T2> >(omega_K, K, value);
break;
800 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
804 case space_constant::vector: {
805 switch (arg2_valued_tag) {
806 case space_constant::scalar:
807 return obj.template evaluate_call<Result, point_basic<T1>, T2> (omega_K, K, value);
break;
808 case space_constant::vector:
809 return obj.template evaluate_call<Result, point_basic<T1>,
point_basic<T2> > (omega_K, K, value);
break;
810 case space_constant::tensor:
811 case space_constant::unsymmetric_tensor:
812 return obj.template evaluate_call<Result, point_basic<T1>,
tensor_basic<T2> > (omega_K, K, value);
break;
813 case space_constant::tensor3:
814 return obj.template evaluate_call<Result, point_basic<T1>,
tensor3_basic<T2> >(omega_K, K, value);
break;
815 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
819 case space_constant::tensor:
820 case space_constant::unsymmetric_tensor: {
821 switch (arg2_valued_tag) {
822 case space_constant::scalar:
823 return obj.template evaluate_call<Result, tensor_basic<T1>, T2> (omega_K, K, value);
break;
824 case space_constant::vector:
825 return obj.template evaluate_call<Result, tensor_basic<T1>,
point_basic<T2> > (omega_K, K, value);
break;
826 case space_constant::tensor:
827 case space_constant::unsymmetric_tensor:
828 return obj.template evaluate_call<Result, tensor_basic<T1>,
tensor_basic<T2> > (omega_K, K, value);
break;
829 case space_constant::tensor3:
830 return obj.template evaluate_call<Result, tensor_basic<T1>,
tensor3_basic<T2> >(omega_K, K, value);
break;
831 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
835 case space_constant::tensor3: {
836 switch (arg2_valued_tag) {
837 case space_constant::scalar:
838 return obj.template evaluate_call<Result, tensor3_basic<T1>, T2> (omega_K, K, value);
break;
839 case space_constant::vector:
840 return obj.template evaluate_call<Result, tensor3_basic<T1>,
point_basic<T2> > (omega_K, K, value);
break;
841 case space_constant::tensor:
842 case space_constant::unsymmetric_tensor:
843 return obj.template evaluate_call<Result, tensor3_basic<T1>,
tensor_basic<T2> > (omega_K, K, value);
break;
844 case space_constant::tensor3:
845 return obj.template evaluate_call<Result, tensor3_basic<T1>,
tensor3_basic<T2> >(omega_K, K, value);
break;
846 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
850 default:
error_macro (
"unexpected first argument valued tag="<<arg1_valued_tag);
855 template<
class This,
class Result,
856 class Arg1, space_constant::valued_type Arg1Tag,
860 Arg2, space_constant::last_valued> {
866 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
870 switch (arg2_valued_tag) {
871 case space_constant::scalar:
872 return obj.template evaluate_call<Result, Arg1, T2> (omega_K, K, value);
break;
873 case space_constant::vector:
874 return obj.template evaluate_call<Result, Arg1, point_basic<T2> > (omega_K, K, value);
break;
875 case space_constant::tensor:
876 case space_constant::unsymmetric_tensor:
877 return obj.template evaluate_call<Result, Arg1, tensor_basic<T2> > (omega_K, K, value);
break;
878 case space_constant::tensor3:
879 return obj.template evaluate_call<Result, Arg1, tensor3_basic<T2> > (omega_K, K, value);
break;
880 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
885 template<
class This,
class Result,
887 class Arg2, space_constant::valued_type Arg2Tag>
889 Arg1, space_constant::last_valued,
896 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
900 switch (arg1_valued_tag) {
901 case space_constant::scalar:
902 return obj.template evaluate_call<Result, T1, Arg2> (omega_K, K, value);
break;
903 case space_constant::vector:
904 return obj.template evaluate_call<Result, point_basic<T1>, Arg2> (omega_K, K, value);
break;
905 case space_constant::tensor:
906 case space_constant::unsymmetric_tensor:
907 return obj.template evaluate_call<Result, tensor_basic<T1>, Arg2> (omega_K, K, value);
break;
908 case space_constant::tensor3:
909 return obj.template evaluate_call<Result, tensor3_basic<T1>, Arg2>(omega_K, K, value);
break;
910 default:
error_macro (
"unexpected first argument valued tag="<<arg1_valued_tag);
914 template<
class Result,
class M>
918 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
920 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
921 typename Expr1::value_type
922 ,
typename Expr2::value_type
923 ,Result>::first_argument_type A1;
924 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
925 typename Expr1::value_type
926 ,
typename Expr2::value_type
927 ,Result>::second_argument_type A2;
930 typedef field_expr_v2_nonlinear_node_binary<BinaryFunction, Expr1, Expr2> This;
931 evaluate_switch <This, Result, A1, first_argument_tag, A2, second_argument_tag> eval;
932 eval (*
this, omega_K, K, value);
934 template<
class Result,
class M>
940 Eigen::Matrix<Result,Eigen::Dynamic,1>& value)
const
942 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
943 typename Expr1::value_type
944 ,
typename Expr2::value_type
945 ,Result>::first_argument_type A1;
946 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
947 typename Expr1::value_type
948 ,
typename Expr2::value_type
949 ,Result>::second_argument_type A2;
952 typedef field_expr_v2_nonlinear_node_binary<BinaryFunction, Expr1, Expr2> This;
953 evaluate_switch <This, Result, A1, first_argument_tag, A2, second_argument_tag> eval;
954 eval (*
this, omega_K, K, sid, value);
956 template<
class Result>
958 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
959 typename Expr1::value_type
960 ,
typename Expr2::value_type
961 ,Result>::first_argument_type A1;
962 typedef typename details::generic_binary_traits<BinaryFunction>::template hint<
963 typename Expr1::value_type
964 ,
typename Expr2::value_type
965 ,Result>::second_argument_type A2;
978template<
class BinaryFunction,
class Expr1,
class Expr2>
979field_expr_v2_nonlinear_node_binary<BinaryFunction,Expr1,Expr2>::field_expr_v2_nonlinear_node_binary (
980 const BinaryFunction&
f,
992 field_expr_v2_nonlinear_node_binary<F,Expr1,Expr2>::is_affine_homogeneous::value>::type>: std::true_type {};
1044#define _RHEOLEF_make_field_expr_v2_nonlinear_binary(FUNCTION,FUNCTOR) \
1045template<class Expr1, class Expr2> \
1049 details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1050 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1051 && ! details::is_field_expr_v2_constant <Expr1>::value \
1052 && ! details::is_field_expr_v2_constant <Expr2>::value \
1053 ,details::field_expr_v2_nonlinear_node_binary< \
1055 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1056 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1059FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1061 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1062 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1063 return details::field_expr_v2_nonlinear_node_binary <FUNCTOR,wrap1_t,wrap2_t> \
1064 (FUNCTOR(), wrap1_t(expr1), wrap2_t(expr2)); \
1066template<class Expr1, class Expr2> \
1070 details::is_field_expr_v2_constant <Expr1>::value \
1071 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1072 && ! details::is_field_expr_v2_constant <Expr2>::value \
1073 && !(details::has_field_rdof_interface <Expr2>::value \
1074 && details::is_rheolef_arithmetic <Expr1>::value) \
1075 ,details::field_expr_v2_nonlinear_node_unary< \
1076 details::binder_first< \
1078 ,typename details::field_promote_first_argument< \
1080 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1083 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1086FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1088 typedef typename details::field_promote_first_argument< \
1090 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1093 typedef details::binder_first<FUNCTOR,value_type> fun_t; \
1094 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1095 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap2_t>(fun_t(FUNCTOR(), expr1), wrap2_t(expr2)); \
1097template<class Expr1, class Expr2> \
1101 details::is_field_expr_v2_constant <Expr2>::value \
1102 && details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1103 && ! details::is_field_expr_v2_constant <Expr1>::value \
1104 && !(details::has_field_rdof_interface <Expr1>::value \
1105 && details::is_rheolef_arithmetic <Expr2>::value) \
1106 ,details::field_expr_v2_nonlinear_node_unary< \
1107 details::binder_second< \
1109 ,typename details::field_promote_second_argument< \
1110 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1114 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1117FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1119 typedef typename details::field_promote_second_argument< \
1120 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1124 typedef details::binder_second<FUNCTOR,value_type> fun_t; \
1125 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1126 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap1_t>(fun_t(FUNCTOR(), expr2), wrap1_t(expr1)); \
1131#undef _RHEOLEF_make_field_expr_v2_nonlinear_binary
1136#define _RHEOLEF_make_field_expr_v2_nonlinear_binary(FUNCTION,FUNCTOR) \
1137template<class Expr1, class Expr2> \
1141 details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1142 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1143 && ! details::is_field_expr_v2_constant <Expr1>::value \
1144 && ! details::is_field_expr_v2_constant <Expr2>::value \
1145 ,details::field_expr_v2_nonlinear_node_binary< \
1147 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1148 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1151FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1153 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1154 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1155 return details::field_expr_v2_nonlinear_node_binary <FUNCTOR,wrap1_t,wrap2_t> \
1156 (FUNCTOR(), wrap1_t(expr1), wrap2_t(expr2)); \
1158template<class Expr1, class Expr2> \
1162 details::is_field_expr_v2_constant <Expr1>::value \
1163 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1164 && ! details::is_field_expr_v2_constant <Expr2>::value \
1165 && !(details::has_field_rdof_interface <Expr2>::value \
1166 && details::is_rheolef_arithmetic <Expr1>::value) \
1167 ,details::field_expr_v2_nonlinear_node_unary< \
1168 details::binder_first< \
1170 ,typename details::field_promote_first_argument< \
1172 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1175 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1178FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1180 typedef typename details::field_promote_first_argument< \
1182 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1185 typedef details::binder_first<FUNCTOR,value_type> fun_t; \
1186 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1187 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap2_t>(fun_t(FUNCTOR(), expr1), wrap2_t(expr2)); \
1189template<class Expr1, class Expr2> \
1193 details::is_field_expr_v2_constant <Expr2>::value \
1194 && details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1195 && ! details::is_field_expr_v2_constant <Expr1>::value \
1196 && !(details::has_field_rdof_interface <Expr1>::value \
1197 && details::is_rheolef_arithmetic <Expr2>::value) \
1198 ,details::field_expr_v2_nonlinear_node_unary< \
1199 details::binder_second< \
1201 ,typename details::field_promote_second_argument< \
1202 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1206 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1209FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1211 typedef typename details::field_promote_second_argument< \
1212 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1216 typedef details::binder_second<FUNCTOR,value_type> fun_t; \
1217 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1218 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap1_t>(fun_t(FUNCTOR(), expr2), wrap1_t(expr1)); \
1221#undef _RHEOLEF_make_field_expr_v2_nonlinear_binary
1226#define _RHEOLEF_make_field_expr_v2_nonlinear_binary(FUNCTION,FUNCTOR) \
1227template<class Expr1, class Expr2> \
1231 details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1232 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1233 && ! details::is_field_expr_v2_constant <Expr1>::value \
1234 && ! details::is_field_expr_v2_constant <Expr2>::value \
1235 ,details::field_expr_v2_nonlinear_node_binary< \
1237 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1238 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1241FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1243 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1244 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1245 return details::field_expr_v2_nonlinear_node_binary <FUNCTOR,wrap1_t,wrap2_t> \
1246 (FUNCTOR(), wrap1_t(expr1), wrap2_t(expr2)); \
1248template<class Expr1, class Expr2> \
1252 details::is_field_expr_v2_constant <Expr1>::value \
1253 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1254 && ! details::is_field_expr_v2_constant <Expr2>::value \
1255 ,details::field_expr_v2_nonlinear_node_unary< \
1256 details::binder_first< \
1258 ,typename details::field_promote_first_argument< \
1260 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1263 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1266FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1268 typedef typename details::field_promote_first_argument< \
1270 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1273 typedef details::binder_first<FUNCTOR,value_type> fun_t; \
1274 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1275 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap2_t>(fun_t(FUNCTOR(), expr1), wrap2_t(expr2)); \
1277template<class Expr1, class Expr2> \
1281 details::is_field_expr_v2_constant <Expr2>::value \
1282 && details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1283 && ! details::is_field_expr_v2_constant <Expr1>::value \
1284 && !(details::has_field_rdof_interface <Expr1>::value \
1285 && details::is_rheolef_arithmetic <Expr2>::value) \
1286 ,details::field_expr_v2_nonlinear_node_unary< \
1287 details::binder_second< \
1289 ,typename details::field_promote_second_argument< \
1290 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1294 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1297FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1299 typedef typename details::field_promote_second_argument< \
1300 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1304 typedef details::binder_second<FUNCTOR,value_type> fun_t; \
1305 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1306 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap1_t>(fun_t(FUNCTOR(), expr2), wrap1_t(expr1)); \
1309#undef _RHEOLEF_make_field_expr_v2_nonlinear_binary
1314#define _RHEOLEF_make_field_expr_v2_nonlinear_binary(FUNCTION,FUNCTOR) \
1315template<class Expr1, class Expr2> \
1319 details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1320 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1321 && ! details::is_field_expr_v2_constant <Expr1>::value \
1322 && ! details::is_field_expr_v2_constant <Expr2>::value \
1323 ,details::field_expr_v2_nonlinear_node_binary< \
1325 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1326 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1329FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1331 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1332 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1333 return details::field_expr_v2_nonlinear_node_binary <FUNCTOR,wrap1_t,wrap2_t> \
1334 (FUNCTOR(), wrap1_t(expr1), wrap2_t(expr2)); \
1336template<class Expr1, class Expr2> \
1340 details::is_field_expr_v2_constant <Expr1>::value \
1341 && details::is_field_expr_v2_nonlinear_arg<Expr2>::value \
1342 && ! details::is_field_expr_v2_constant <Expr2>::value \
1343 ,details::field_expr_v2_nonlinear_node_unary< \
1344 details::binder_first< \
1346 ,typename details::field_promote_first_argument< \
1348 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1351 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type \
1354FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1356 typedef typename details::field_promote_first_argument< \
1358 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type \
1361 typedef details::binder_first<FUNCTOR,value_type> fun_t; \
1362 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type wrap2_t; \
1363 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap2_t>(fun_t(FUNCTOR(), expr1), wrap2_t(expr2)); \
1365template<class Expr1, class Expr2> \
1369 details::is_field_expr_v2_constant <Expr2>::value \
1370 && details::is_field_expr_v2_nonlinear_arg<Expr1>::value \
1371 && ! details::is_field_expr_v2_constant <Expr1>::value \
1372 ,details::field_expr_v2_nonlinear_node_unary< \
1373 details::binder_second< \
1375 ,typename details::field_promote_second_argument< \
1376 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1380 ,typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type \
1383FUNCTION (const Expr1& expr1, const Expr2& expr2) \
1385 typedef typename details::field_promote_second_argument< \
1386 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type \
1390 typedef details::binder_second<FUNCTOR,value_type> fun_t; \
1391 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type wrap1_t; \
1392 return details::field_expr_v2_nonlinear_node_unary<fun_t,wrap1_t>(fun_t(FUNCTOR(), expr2), wrap1_t(expr1)); \
1395#define _RHEOLEF_make_field_expr_v2_nonlinear_binary_function(FUNCTION) \
1396 _RHEOLEF_make_field_expr_v2_nonlinear_binary (FUNCTION, details::FUNCTION##_) \
1407#undef _RHEOLEF_make_field_expr_v2_nonlinear_binary_function
1408#undef _RHEOLEF_make_field_expr_v2_nonlinear_binary
1418template<
class Function,
class Expr1,
class Expr2>
1423 && ! details::is_field_expr_v2_constant <Expr1>::value
1425 && ! details::is_field_expr_v2_constant <Expr2>::value
1426 ,details::field_expr_v2_nonlinear_node_binary<
1432compose (
const Function&
f,
const Expr1& expr1,
const Expr2& expr2)
1434 typedef typename details::function_traits<Function>::functor_type
fun_wrap_t;
1435 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type
expr1_wrap_t;
1436 typedef typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type
expr2_wrap_t;
1437 return details::field_expr_v2_nonlinear_node_binary
1442template <
class Function,
class Expr1,
class Expr2>
1446 details::is_field_expr_v2_constant <Expr1>::value
1448 && ! details::is_field_expr_v2_constant <Expr2>::value
1450 details::binder_first<
1454 ,
typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type
1460compose (
const Function&
f,
const Expr1& expr1,
const Expr2& expr2)
1464 ,
typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr2>::type::value_type
1467 typedef details::binder_first<wrap_fun_t,value_type> binded_fun_t;
1470 <binded_fun_t, wrap2_t>
1471 (binded_fun_t(wrap_fun_t(
f), expr1), wrap2_t(expr2));
1474template <
class Function,
class Expr1,
class Expr2>
1478 details::is_field_expr_v2_nonlinear_arg<Expr1>::value
1479 && ! details::is_field_expr_v2_constant <Expr1>::value
1480 && details::is_field_expr_v2_constant <Expr2>::value
1481 ,details::field_expr_v2_nonlinear_node_unary<
1482 details::binder_second<
1483 typename details::function_traits<Function>::functor_type
1485 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type
1489 ,
typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type
1492compose (
const Function&
f,
const Expr1& expr1,
const Expr2& expr2)
1495 typename details::field_expr_v2_nonlinear_terminal_wrapper_traits<Expr1>::type::value_type
1502 <binded_fun_t, wrap1_t>
1503 (binded_fun_t(wrap_fun_t(
f), expr2), wrap1_t(expr1));
field::size_type size_type
std::array< Eigen::Matrix< tensor_basic< scalar_type >, Eigen::Dynamic, 1 >,reference_element::max_variant > _tensor_val
band_basic< float_type, memory_type > band_type
typename scalar_traits< value_type >::type scalar_type
geo_element::size_type size_type
typename details::generic_unary_traits< UnaryFunction >::template result_hint< typename Expr::result_type >::type result_type
and_type< or_type< std::is_same< UnaryFunction, details::unary_plus >,std::is_same< UnaryFunction, details::negate >,std::is_same< UnaryFunction, details::binder_first< details::plus, scalar_type > >,std::is_same< UnaryFunction, details::binder_second< details::plus, scalar_type > >,std::is_same< UnaryFunction, details::binder_first< details::minus, scalar_type > >,std::is_same< UnaryFunction, details::binder_second< details::minus, scalar_type > >,std::is_same< UnaryFunction, details::binder_first< details::multiplies, scalar_type > >,std::is_same< UnaryFunction, details::binder_second< details::multiplies, scalar_type > >,std::is_same< UnaryFunction, details::binder_second< details::divides, scalar_type > > >,is_field_expr_affine_homogeneous< Expr > > is_affine_homogeneous
std::array< Eigen::Matrix< tensor3_basic< scalar_type >, Eigen::Dynamic, 1 >,reference_element::max_variant > _tensor3_val
void initialize(const piola_on_pointset< float_type > &pops, const integrate_option &iopt)
std::array< Eigen::Matrix< tensor4_basic< scalar_type >, Eigen::Dynamic, 1 >,reference_element::max_variant > _tensor4_val
field_expr_v2_nonlinear_node_unary< UnaryFunction, Expr > self_type
std::array< Eigen::Matrix< scalar_type, Eigen::Dynamic, 1 >,reference_element::max_variant > _scalar_val
geo_basic< float_type, memory_type > geo_type
const_iterator begin_dof() const
typename Expr::memory_type memory_type
static const space_constant::valued_type valued_hint
std::array< Eigen::Matrix< point_basic< scalar_type >, Eigen::Dynamic, 1 >,reference_element::max_variant > _vector_val
void evaluate_call(const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
void evaluate_call(const geo_basic< float_type, M > &omega_K, const geo_element &K, const side_information_type &sid, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
bool have_homogeneous_space(space_basic< scalar_type, memory_type > &Vh) const
typename float_traits< scalar_type >::type float_type
const Expr & expr() const
_RHEOLEF_evaluate_switch_specialization(space_constant::scalar, T) _RHEOLEF_evaluate_switch_specialization(space_constant Expr _expr
void initialize(const space_basic< float_type, memory_type > &Xh, const piola_on_pointset< float_type > &pops, const integrate_option &iopt)
field_expr_v2_nonlinear_node_unary(const UnaryFunction &f, const Expr &expr)
space_basic< float_type, memory_type > space_type
space_constant::valued_type valued_tag() const
see the geo_element page for the full documentation
reference_element::size_type size_type
see the integrate_option page for the full documentation
static const variant_type max_variant
typename scalar_traits< value_type >::type scalar_type
typename Expr1::memory_type memory_type
typename details::generic_binary_traits< BinaryFunction >::template result_hint< typename Expr1::result_type, typename Expr2::result_type >::type result_type
or_type< and_type< or_type< std::is_same< BinaryFunction, details::plus >,std::is_same< BinaryFunction, details::minus > >,is_field_expr_affine_homogeneous< Expr1 >,is_field_expr_affine_homogeneous< Expr2 > >,and_type< or_type< std::is_same< BinaryFunction, details::multiplies >,std::is_same< BinaryFunction, details::divides > >,is_field_expr_affine_homogeneous< Expr1 >,is_field_expr_v2_constant< Expr2 > >,and_type< std::is_same< BinaryFunction, details::multiplies >,is_field_expr_v2_constant< Expr1 >,is_field_expr_affine_homogeneous< Expr2 > > > is_affine_homogeneous
#define error_macro(message)
#define fatal_macro(message)
void get_geo(istream &in, my_geo &omega)
details::field_expr_v2_nonlinear_terminal_wrapper_traits< Expr1 >::type expr1_wrap_t
details::function_traits< Function >::functor_type fun_wrap_t
#define _RHEOLEF_make_field_expr_v2_nonlinear_binary_function(FUNCTION)
#define _RHEOLEF_make_field_expr_v2_nonlinear_binary(FUNCTION, FUNCTOR)
#define _RHEOLEF_evaluate_switch_specialization(VALUED, VALUE)
details::field_expr_v2_nonlinear_terminal_wrapper_traits< Expr2 >::type expr2_wrap_t
#define _RHEOLEF_make_field_expr_v2_nonlinear_unary_function(FUNCTION)
#define _RHEOLEF_make_field_expr_v2_nonlinear_unary_operator(FUNCTION, FUNCTOR)
This file is part of Rheolef.
bool valued_check() const
void initialize(const piola_on_pointset< float_type > &pops, const integrate_option &iopt)
U tr(const tensor_basic< U > &a, size_t d=3)
T norm2(const vec< T, M > &x)
norm2(x): see the expression page for the full documentation
const_iterator begin_dof() const
void evaluate(const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
void evaluate_on_side(const geo_basic< float_type, M > &omega_K, const geo_element &K, const side_information_type &sid, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
field_expr_v2_nonlinear_node_binary(const BinaryFunction &f, const Expr1 &expr1, const Expr2 &expr2)
bool have_homogeneous_space(space_basic< scalar_type, memory_type > &Vh) const
void evaluate_internal2(const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
csr< T, sequential > trans(const csr< T, sequential > &a)
trans(a): see the form page for the full documentation
T norm(const vec< T, M > &x)
norm(x): see the expression page for the full documentation
details::field_expr_v2_nonlinear_node_nary< typename details::function_traits< Function >::functor_type, typename details::field_expr_v2_nonlinear_terminal_wrapper_traits< Exprs >::type... > ::type compose(const Function &f, const Exprs &... exprs)
see the compose page for the full documentation
void evaluate_call(const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
std::forward_iterator_tag iterator_category
Expr2::const_iterator _iter2
typename promote< typename Expr1::scalar_type, typename Expr2::scalar_type >::type value_type
const_iterator(const BinaryFunction &f, typename Expr1::const_iterator iter1, typename Expr2::const_iterator iter2)
Expr1::const_iterator _iter1
std::ptrdiff_t difference_type
typename Expr::scalar_type value_type
std::forward_iterator_tag iterator_category
Expr::const_iterator _expr_iter
const_iterator & operator++()
const_iterator(UnaryFunction f, typename Expr::const_iterator expr_iter)
value_type operator*() const
std::ptrdiff_t difference_type
void operator()(const self_type &obj, const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value)
void evaluate_on_side(const This &obj, const geo_basic< float_type, M > &omega_K, const geo_element &K, const side_information_type &sid, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
void evaluate(const This &obj, const geo_basic< float_type, M > &omega_K, const geo_element &K, Eigen::Matrix< Result, Eigen::Dynamic, 1 > &value) const
static space_constant::valued_type valued_tag(space_constant::valued_type)