1 #ifndef _RHEOLEF_INTERPOLATE_H
2 #define _RHEOLEF_INTERPOLATE_H
104 #include "rheolef/field_expr.h"
120 template<
class T,
class M,
class Expr,
class Result>
125 trace_macro (
"Expr="<<pretty_typename_macro(Expr));
128 "interpolate: incompatible "<<Xh.valued()<<
"-valued space and "
131 Eigen::Matrix<Result,Eigen::Dynamic,1>
value;
132 Eigen::Matrix<T,Eigen::Dynamic,1> udof;
136 const piola_fem<T>& pf =
b.get_piola_fem();
137 trace_macro (
"pf.transform_need_piola="<<pf.transform_need_piola());
140 pops.
initialize (omega.get_piola_basis(),
b, iopt);
141 expr.initialize (Xh, pops, iopt);
142 expr.template valued_check<Result>();
144 iter_ie = omega.begin(),
145 last_ie = omega.end(); iter_ie != last_ie; ++iter_ie) {
149 expr.evaluate (omega, K,
value);
151 if (pf.transform_need_piola()) {
152 const Eigen::Matrix<piola<T>,Eigen::Dynamic,1>&
piola = pops.
get_piola (omega, K);
153 for (
size_type loc_inod = 0, loc_nnod =
value.size(); loc_inod < loc_nnod; ++loc_inod) {
156 Result old_value =
value[loc_inod];
160 trace_macro (
"inv_transf(K="<<K.
name()<<K.
dis_ie()<<
",loc_inod="<<loc_inod<<
"): old_value="
161 <<old_value<<
", value="<<
value[loc_inod]);
165 b.compute_dofs (hat_K,
value, udof);
169 "invalid sizes: basis("<<
b.name()<<
").size("<<hat_K.
name()<<
") = "<<
b.ndof(hat_K)
170 <<
", dis_idof.size="<<
dis_idof.size()<<
", udof.size="<<udof.size());
171 for (
size_type loc_idof = 0, loc_ndof = udof.size(); loc_idof < loc_ndof; ++loc_idof) {
174 trace_macro (
"uh(K="<<K.
name()<<K.
dis_ie()<<
",loc_idof="<<loc_idof<<
") = uh(dis_idof="<<
dis_idof[loc_idof]
175 <<
") = " << udof [loc_idof]);
180 trace_macro (
"interpolate done");
183 template<class T, class M, class Expr, class Result, class Status = typename details::is_equal<Result,typename Expr::value_type>::type>
188 const Expr& expr)
const
190 trace_macro (
"Expr="<<pretty_typename_macro(Expr));
191 trace_macro (
"Result="<<typename_macro(Result));
192 trace_macro (
"Status="<<typename_macro(Status));
193 trace_macro (
"Expr::value_type="<<typename_macro(
typename Expr::value_type));
194 fatal_macro (
"invalid type resolution");
198 template<
class T,
class M,
class Expr>
203 const Expr& expr)
const
205 return interpolate_generic<T,M,Expr,T>(Xh,expr);
208 template<
class T,
class M,
class Expr>
213 const Expr& expr)
const
215 return interpolate_generic<T,M,Expr,point_basic<T>>(Xh,expr);
218 template<
class T,
class M,
class Expr>
223 const Expr& expr)
const
225 return interpolate_generic<T,M,Expr,tensor_basic<T>>(Xh,expr);
228 template<
class T,
class M,
class Expr,
class Status>
233 const Expr& expr)
const
235 switch (expr.valued_tag()) {
238 return eval (Xh, expr);
242 return eval (Xh, expr);
247 return eval (Xh, expr);
250 warning_macro (
"Expr="<<pretty_typename_macro(Expr));
251 warning_macro (
"Status="<<typename_macro(Status));
252 error_macro (
"unexpected `"
254 <<
"' valued expression");
259 template<
class T,
class M,
class Expr,
class Result>
266 return eval (Xh,expr);
275 template<
class T,
class M,
class Expr>
276 typename std::enable_if<
277 details::is_field_expr_v2_nonlinear_arg<Expr>::value
278 && ! details::is_field_convertible<Expr>::value
279 && ! details::is_field_function<Expr>::value
285 typedef typename wrap_t::value_type result_t;
286 return details::interpolate_internal<T,M,wrap_t,result_t> (Xh, wrap_t(
expr));
290 template <
class T,
class M,
class Expr>
292 typename std::enable_if<
293 details::is_field_function<Expr>::value
299 typedef typename wrap_t::value_type result_t;
300 return details::interpolate_internal<T,M,wrap_t,result_t> (Xh, wrap_t(
expr));
306 template<
class T,
class M>
308 interpolate (
const space_basic<T,M>& X2h,
const field_basic<T,M>& u1h);
311 template <
class T,
class M,
class Expr>
313 typename std::enable_if<
314 details::is_field_convertible<Expr>::value
315 && ! details::is_field<Expr>::value
field::size_type size_type
void dis_dof_update() 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
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 &expr)
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>