1#ifndef _RHEOLEF_INTERPOLATE_H
2#define _RHEOLEF_INTERPOLATE_H
104#include "rheolef/field.h"
105#include "rheolef/field_expr.h"
106#include "rheolef/field_expr_terminal.h"
122template<
class T,
class M,
class Expr,
class Result>
131 "interpolate: incompatible "<<Xh.valued()<<
"-valued space and "
134 Eigen::Matrix<Result,Eigen::Dynamic,1>
value;
135 Eigen::Matrix<T,Eigen::Dynamic,1> udof;
139 const piola_fem<T>& pf =
b.get_piola_fem();
140trace_macro (
"pf.transform_need_piola="<<pf.transform_need_piola());
143 pops.
initialize (omega.get_piola_basis(),
b, iopt);
144 expr.initialize (Xh, pops, iopt);
145 expr.template valued_check<Result>();
147 iter_ie = omega.begin(),
148 last_ie = omega.end(); iter_ie != last_ie; ++iter_ie) {
152 expr.evaluate (omega, K,
value);
154 if (pf.transform_need_piola()) {
155 const Eigen::Matrix<piola<T>,Eigen::Dynamic,1>&
piola = pops.
get_piola (omega, K);
156 for (
size_type loc_inod = 0, loc_nnod =
value.size(); loc_inod < loc_nnod; ++loc_inod) {
159 Result old_value =
value[loc_inod];
164 <<old_value<<
", value="<<
value[loc_inod]);
168 b.compute_dofs (hat_K,
value, udof);
172 "invalid sizes: basis("<<
b.name()<<
").size("<<hat_K.
name()<<
") = "<<
b.ndof(hat_K)
173 <<
", dis_idof.size="<<
dis_idof.size()<<
", udof.size="<<udof.size());
174 for (
size_type loc_idof = 0, loc_ndof = udof.size(); loc_idof < loc_ndof; ++loc_idof) {
178 <<
") = " << udof [loc_idof]);
186template<class T, class M, class Expr, class Result, class Status = typename details::is_equal<Result,typename Expr::value_type>::type>
191 const Expr& expr)
const
193 trace_macro (
"Expr="<<pretty_typename_macro(Expr));
196 trace_macro (
"Expr::value_type="<<typename_macro(
typename Expr::value_type));
201template<
class T,
class M,
class Expr>
206 const Expr& expr)
const
208 return interpolate_generic<T,M,Expr,T>(Xh,expr);
211template<
class T,
class M,
class Expr>
216 const Expr& expr)
const
218 return interpolate_generic<T,M,Expr,point_basic<T>>(Xh,expr);
221template<
class T,
class M,
class Expr>
226 const Expr& expr)
const
228 return interpolate_generic<T,M,Expr,tensor_basic<T>>(Xh,expr);
231template<
class T,
class M,
class Expr,
class Status>
236 const Expr& expr)
const
238 switch (expr.valued_tag()) {
241 return eval (Xh, expr);
245 return eval (Xh, expr);
250 return eval (Xh, expr);
257 <<
"' valued expression");
262template<
class T,
class M,
class Expr,
class Result>
269 return eval (Xh,expr);
278template<
class T,
class M,
class Expr>
279typename std::enable_if<
281 details::is_field_expr_v2_nonlinear_arg<Expr>
284 details::is_field<Expr>
285 ,details::has_field_rdof_interface<Expr>
286 ,details::is_field_function<Expr>
295 typedef typename wrap_t::value_type result_t;
296 return details::interpolate_internal<T,M,wrap_t,result_t> (Xh, wrap_t(
expr));
301template <
class T,
class M,
class Expr>
303typename std::enable_if<
304 details::has_field_rdof_interface<Expr>::value
305 && ! details::is_field<Expr>::value
313template<
class T,
class M>
315interpolate (
const space_basic<T,M>& X2h,
const field_basic<T,M>& u1h);
319template <
class T,
class M,
class Expr>
321typename std::enable_if<
322 details::is_field_function<Expr>::value
328 typedef typename wrap_t::value_type result_t;
329 return details::interpolate_internal<T,M,wrap_t,result_t> (Xh, wrap_t(
expr));
field::size_type size_type
void dis_dof_update(const SetOp &=SetOp()) const
dis_reference dis_dof_entry(size_type dis_idof)
see the geo_element page for the full documentation
see the integrate_option page for the full documentation
void initialize(const basis_basic< T > &piola_basis, const quadrature< T > &quad, const integrate_option &iopt)
const Eigen::Matrix< piola< T >, Eigen::Dynamic, 1 > & get_piola(const geo_basic< T, M > &omega, const geo_element &K) const
see the reference_element page for the full documentation
#define trace_macro(message)
#define error_macro(message)
#define fatal_macro(message)
#define warning_macro(message)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
field_basic< T, M > interpolate_internal(const space_basic< T, M > &Xh, const Expr &expr)
field_basic< T, M > interpolate_generic(const space_basic< T, M > &Xh, const Expr &expr0)
const std::string & valued_name(valued_type valued_tag)
void dis_idof(const basis_basic< T > &b, const geo_size &gs, const geo_element &K, typename std::vector< size_type >::iterator dis_idof_tab)
This file is part of Rheolef.
field_basic< T, M > interpolate(const space_basic< T, M > &V2h, const field_basic< T, M > &u1h)
see the interpolate page for the full documentation
field_basic< T, M > operator()(const space_basic< T, M > &Xh, const Expr &expr) const
helper for generic field value_type: T, point_basic<T> or tensor_basic<T>