1 #ifndef _RHEOLEF_FIELD_EXPR_NONLINEAR_H
2 #define _RHEOLEF_FIELD_EXPR_NONLINEAR_H
3 #include "rheolef/field_evaluate.h"
4 #include "rheolef/tensor4.h"
6 #include <boost/functional.hpp>
15 template<
class Function>
22 template<
class Function>
28 typedef typename boost::unary_traits<Function>::function_type
function_type;
29 typedef typename boost::unary_traits<Function>::result_type
result_type;
55 for (
typename std::vector<result_type>::iterator
57 last = value.end(); iter != last; ++iter, ++q) {
80 template<
class Function>
83 public smart_pointer<field_expr_terminal_function_rep<Function> >
114 template<
class T,
class M>
130 template <
class Expr>
139 template<
class Result>
144 value.resize (
_bops.size(hat_K));
147 for (
typename std::vector<Result>::iterator
148 iter = value.begin(),
149 last = value.end(); iter != last; ++iter, ++q) {
154 _bops.set (hat_x,
_uh.get_space().get_numbering().get_basis());
155 _uh.dis_dof_update();
159 _bops.set (Xh.get_numbering().get_basis(),
_uh.get_space().get_numbering().get_basis());
160 _uh.dis_dof_update();
162 return are_compatible (
_uh.get_space(), Xh);
165 template<
class Result>
170 <<
"-valued evaluator");
177 template<
class T,
class M>
199 template <
class Expr>
206 template<
class Result>
217 template<
class RawExpr>
238 template<
class Result>
252 template<
class Function>
256 typedef typename boost::remove_const<
257 typename boost::remove_reference<
258 typename boost::unary_traits<Function>::argument_type>::type>::type
261 typedef typename boost::unary_traits<Function>::function_type
function_type;
265 typedef typename boost::unary_traits<Function>::result_type
type;
272 template<
class Function,
class Expr>
296 template<
class Result,
class Arg>
299 std::vector<Arg> tmp_value;
301 value.resize(tmp_value.size());
302 typename std::vector<Arg>::const_iterator tmp = tmp_value.begin();
303 for (
typename std::vector<Result>::iterator
304 iter = value.begin(),
305 last = value.end(); iter != last; ++iter, ++tmp) {
309 template<
class This,
class Result,
class Arg, space_constant::valued_type ArgTag>
314 switch (arg_valued_tag) {
316 obj.template evaluate_internal<Result,T> (K, value);
319 obj.template evaluate_internal<Result, point_basic<T> > (K, value);
322 obj.template evaluate_internal<Result, tensor_basic<T> > (K, value);
325 error_macro (
"unexpected valued tag="<<obj.valued_tag());
329 template<
class This,
class Result,
class Arg>
333 obj.template evaluate_internal<Result,T> (K, value);
336 template<
class This,
class Result,
class Arg>
340 obj.template evaluate_internal<Result, point_basic<T> > (K, value);
343 template<
class This,
class Result,
class Arg>
347 obj.template evaluate_internal<Result, tensor_basic<T> > (K, value);
350 template<
class Result>
354 typedef typename Expr::result_type argument_hint2_type;
359 eval (*
this, K, value);
371 template<
class Result>
377 <<
"-valued expression for "
379 <<
"-valued function argument");
385 template<
class Function>
389 typedef typename boost::remove_const<
390 typename boost::remove_reference<
391 typename boost::binary_traits<Function>::first_argument_type>::type>::type
393 typedef typename boost::remove_const<
394 typename boost::remove_reference<
395 typename boost::binary_traits<Function>::second_argument_type>::type>::type
400 template <
class Arg1,
class Arg2>
402 typedef typename boost::binary_traits<Function>::result_type
type;
409 template<
class Function,
class Expr1,
class Expr2>
435 template<
class Result,
class Arg1,
class Arg2>
437 _check<Result,Arg1,Arg2> ();
438 std::vector<Arg1> tmp1_value;
439 std::vector<Arg2> tmp2_value;
440 _expr1.evaluate (K, tmp1_value);
441 _expr2.evaluate (K, tmp2_value);
442 value.resize(tmp1_value.size());
443 typename std::vector<Arg1>::const_iterator tmp1 = tmp1_value.begin();
444 typename std::vector<Arg2>::const_iterator tmp2 = tmp2_value.begin();
445 for (
typename std::vector<Result>::iterator
446 iter = value.begin(),
447 last = value.end(); iter != last; ++iter, ++tmp1, ++tmp2) {
448 *iter =
_f (*tmp1, *tmp2);
451 template<
class This,
class Result,
class ReturnType,
class Arg1,
class Arg2>
462 template<
class This,
class Result,
class Arg1,
class Arg2>
465 obj.template evaluate_internal2 <Result,Arg1,Arg2> (K, value);
468 template<
class Result,
class Arg1,
class Arg2>
473 eval_int (*
this, K, value);
475 template<
class This,
class Result,
480 obj.template evaluate_call<Result, Arg1, Arg2> (K, value);
483 template<
class This,
class Result,
494 switch (arg1_valued_tag) {
496 switch (arg2_valued_tag) {
498 obj.template evaluate_call<Result, T1, T2> (K, value);
break;
500 obj.template evaluate_call<Result, T1, point_basic<T2> > (K, value);
break;
502 obj.template evaluate_call<Result, T1, tensor_basic<T2> > (K, value);
break;
503 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
508 switch (arg2_valued_tag) {
510 obj.template evaluate_call<Result, point_basic<T1>, T2> (K, value);
break;
512 obj.template evaluate_call<Result, point_basic<T1>,
point_basic<T2> > (K, value);
break;
514 obj.template evaluate_call<Result, point_basic<T1>,
tensor_basic<T2> > (K, value);
break;
515 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
520 switch (arg2_valued_tag) {
522 obj.template evaluate_call<Result, tensor_basic<T1>, T2> (K, value);
break;
524 obj.template evaluate_call<Result, tensor_basic<T1>,
point_basic<T2> > (K, value);
break;
526 obj.template evaluate_call<Result, tensor_basic<T1>,
tensor_basic<T2> > (K, value);
break;
527 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
531 default:
error_macro (
"unexpected first argument valued tag="<<arg1_valued_tag);
535 template<
class This,
class Result,
544 switch (arg2_valued_tag) {
546 obj.template evaluate_call<Result, Arg1, T2> (K, value);
break;
548 obj.template evaluate_call<Result, Arg1, point_basic<T2> > (K, value);
break;
550 obj.template evaluate_call<Result, Arg1, tensor_basic<T2> > (K, value);
break;
551 default:
error_macro (
"unexpected second argument valued tag="<<arg2_valued_tag);
555 template<
class This,
class Result,
564 switch (arg1_valued_tag) {
566 obj.template evaluate_call<Result, T1, Arg2> (K, value);
break;
568 obj.template evaluate_call<Result, point_basic<T1>, Arg2> (K, value);
break;
570 obj.template evaluate_call<Result, tensor_basic<T1>, Arg2> (K, value);
break;
571 default:
error_macro (
"unexpected first argument valued tag="<<arg1_valued_tag);
575 template<
class Result>
579 typedef typename Expr1::result_type first_argument_hint2_type;
582 typedef typename Expr1::result_type second_argument_hint2_type;
588 first_argument_type, first_argument_tag,
589 second_argument_type, second_argument_tag> eval;
590 eval (*
this, K, value);
594 _expr1.initialize (omega, hat_x);
595 _expr2.initialize (omega, hat_x);
598 bool is_homogeneous1 =
_expr1.initialize (Xh);
599 bool is_homogeneous2 =
_expr2.initialize (Xh);
600 return is_homogeneous1 && is_homogeneous2;
604 template<
class Result,
class Arg1,
class Arg2>
614 <<
"-valued expression for "
616 <<
"-valued function first argument");
619 <<
"-valued expression for "
621 <<
"-valued function second argument");
622 check_macro (resu_valued_tag == res2_valued_tag,
"invalid "
624 <<
"-valued result field for "
626 <<
"-valued function return type");
634 template<
class Function,
class Expr>
639 template<
class Function,
class T,
class M>
646 #endif // _RHEOLEF_FIELD_EXPR_NONLINEAR_H