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 "
133 std::vector<size_type> dis_idof;
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];
161 pf.inv_transform (
piola[loc_inod], value[loc_inod], value[loc_inod]);
164 <<old_value<<
", value="<<value[loc_inod]);
168 b.compute_dofs (hat_K, value, udof);
170 Xh.dis_idof (K, dis_idof);
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) {
177 trace_macro (
"uh(K="<<K.
name()<<K.
dis_ie()<<
",loc_idof="<<loc_idof<<
") = uh(dis_idof="<<dis_idof[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)
generic mesh with rerefence counting
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)
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>