25#include "rheolef/field_evaluate.h"
26#include "rheolef/piola_util.h"
37template<
class T,
class M>
43 const std::vector<size_t>& dis_idof,
44 Eigen::Matrix<T,Eigen::Dynamic,1>& value)
47 const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
48 phij_xi = bops.template evaluate<T> (hat_K);
51 value.resize (loc_nnod);
52 for (
size_type loc_jdof = 0; loc_jdof < loc_ndof; ++loc_jdof) {
53 const T& u_jdof = uh.
dis_dof (dis_idof[loc_jdof]);
54 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
55 value[loc_inod] += phij_xi (loc_inod,loc_jdof)*u_jdof;
62template<
class T,
class M>
68 const std::vector<size_t>& dis_idof_tab,
70 std::vector<size_t>& dis_inod_geo,
76 if (uh.
get_space().get_constitution().is_hierarchical()) {
78 const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
79 phij_xi = bops.template evaluate<T> (hat_K);
82 value.resize (loc_nnod);
83 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
87 for (
size_type loc_comp_jdof = 0; loc_comp_jdof < loc_comp_ndof; ++loc_comp_jdof) {
88 for (
size_type k_comp = 0; k_comp < n_comp; k_comp++) {
89 size_type loc_jdof = loc_comp_jdof + k_comp*loc_comp_ndof;
90 assert_macro (loc_jdof < loc_ndof,
"invalid local index "<<loc_jdof<<
" out of range [0:"<<loc_ndof<<
"[");
91 size_type dis_jdof = dis_idof_tab[loc_jdof];
92 assert_macro (dis_jdof < dis_ndof,
"invalid distr index");
93 const T& u_jdof = uh.
dis_dof (dis_jdof);
94 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
95 value[loc_inod][k_comp] += phij_xi(loc_inod,loc_jdof)*u_jdof;
101 const Eigen::Matrix<point_basic<T>,Eigen::Dynamic,Eigen::Dynamic>&
102 phij_xi = bops.template evaluate<point_basic<T>> (hat_K);
105 value.resize (loc_nnod);
106 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
109 for (
size_type loc_jdof = 0; loc_jdof < loc_ndof; ++loc_jdof) {
110 size_type dis_jdof = dis_idof_tab[loc_jdof];
111 assert_macro (dis_jdof < dis_ndof,
"invalid distributed index");
112 const T& u_jdof = uh.
dis_dof (dis_jdof);
113 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
114 value[loc_inod] += phij_xi(loc_inod,loc_jdof)*u_jdof;
124 Eigen::Matrix<tensor_basic<T>,Eigen::Dynamic,1> DF;
126 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
128 value[loc_inod] = (1/J)*(DF[loc_inod]*value[loc_inod]);
135template<
class T,
class M>
141 const std::vector<size_t>& dis_idof_tab,
145 const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
146 phij_xi = bops.template evaluate<T> (hat_K);
148 size_type loc_comp_ndof = phij_xi.cols();
149 value.resize (loc_nnod);
150 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
157 for (
size_type loc_comp_jdof = 0; loc_comp_jdof < loc_comp_ndof; ++loc_comp_jdof) {
158 for (
size_type kl_comp = 0; kl_comp < n_comp; kl_comp++) {
159 size_type loc_jdof = loc_comp_jdof + kl_comp*loc_comp_ndof;
160 assert_macro (loc_jdof < loc_ndof,
"invalid local index "<<loc_jdof<<
" out of range [0:"<<loc_ndof<<
"[");
161 size_type dis_jdof = dis_idof_tab[loc_jdof];
162 assert_macro (dis_jdof < dis_ndof,
"invalid distr index");
163 const T& u_jdof = uh.
dis_dof (dis_jdof);
164 std::pair<size_type,size_type> kl
168 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
169 T tmp = phij_xi (loc_inod, loc_comp_jdof)*u_jdof;
170 value[loc_inod](k,l) += tmp;
171 if (k != l) value[loc_inod](l,k) += tmp;
179template<
class T,
class M>
185 const std::vector<size_t>& dis_idof_tab,
187 Eigen::Matrix<T,Eigen::Dynamic,1>& value)
190 const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
191 phij_xi = bops.template evaluate<T> (hat_K);
193 size_type loc_comp_ndof = phij_xi.cols();
194 value.resize (loc_nnod);
195 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
199 size_type loc_ndof = dis_idof_tab.size();
201 for (
size_type loc_comp_jdof = 0; loc_comp_jdof < loc_comp_ndof; ++loc_comp_jdof) {
202 size_type loc_jdof = loc_comp_jdof + k_comp*loc_comp_ndof;
203 assert_macro (loc_jdof < loc_ndof,
"invalid local index "<<loc_jdof<<
" out of range [0:"<<loc_ndof<<
"[");
204 size_type dis_jdof = dis_idof_tab[loc_jdof];
205 assert_macro (dis_jdof < dis_ndof,
"invalid distr index");
206 const T& u_jdof = uh.
dis_dof (dis_jdof);
207 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
208 value[loc_inod] += phij_xi (loc_inod,loc_comp_jdof)*u_jdof;
215template<
class T,
class M,
class Value>
221 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& phij_xi,
222 Eigen::Matrix<Value,Eigen::Dynamic,1>& value)
227 std::vector<size_type> dis_idof;
228 uh.
get_space().get_constitution().assembly_dis_idof (omega_K, K, dis_idof);
230 Eigen::Matrix<T,Eigen::Dynamic,1> udof (loc_ndof);
232 "invalid sizes phij_xi("<<phij_xi.rows()<<
","<<phij_xi.cols()<<
") and udof("<<udof.size()<<
")");
233 for (
size_type loc_jdof = 0; loc_jdof < loc_ndof; ++loc_jdof) {
235 udof [loc_jdof] = uh.
dis_dof (dis_idof[loc_jdof]);
240 value.resize (loc_nnod);
241 for (
size_type loc_inod = 0; loc_inod < loc_nnod; ++loc_inod) {
243 for (
size_type loc_jdof = 0; loc_jdof < loc_ndof; ++loc_jdof) {
244 sum += phij_xi (loc_inod,loc_jdof)*udof[loc_jdof];
246 value[loc_inod] = sum;
249template<
class T,
class M,
class Value>
256 Eigen::Matrix<Value,Eigen::Dynamic,1>& value)
258 Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic> phij_xi;
259 details::differentiate_option none;
260 fops.template evaluate <M,Value,details::differentiate_option::none> (omega_K, K, none, phij_xi);
266#define _RHEOLEF_instanciation_value(T,M,Value) \
267template void field_evaluate_continued ( \
268 const field_basic<T,M>& uh, \
269 const geo_basic<T,M>& omega_K, \
270 const geo_element& K, \
271 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& phij_xi, \
272 Eigen::Matrix<Value,Eigen::Dynamic,1>& value); \
273template void field_evaluate ( \
274 const field_basic<T,M>& uh, \
275 const fem_on_pointset<T>& fops, \
276 const geo_basic<T,M>& omega_K, \
277 const geo_element& K, \
278 Eigen::Matrix<Value,Eigen::Dynamic,1>& value); \
281#define _RHEOLEF_instanciation(T,M) \
282_RHEOLEF_instanciation_value(T,M,T) \
283_RHEOLEF_instanciation_value(T,M,point_basic<T>) \
284_RHEOLEF_instanciation_value(T,M,tensor_basic<T>) \
285_RHEOLEF_instanciation_value(T,M,tensor3_basic<T>) \
286_RHEOLEF_instanciation_value(T,M,tensor4_basic<T>) \
290 const field_basic<T,M>& uh, \
291 const basis_on_pointset<T>& bops, \
292 reference_element hat_K, \
293 const std::vector<size_t>& dis_idof, \
294 Eigen::Matrix<T,Eigen::Dynamic,1>& value); \
297vector_field_evaluate<T,M> ( \
298 const field_basic<T,M>& uh, \
299 const basis_on_pointset<T>& bops, \
300 reference_element hat_K, \
301 const std::vector<size_t>& dis_idof_tab, \
302 const basis_on_pointset<T>& piola_on_geo_basis, \
303 std::vector<size_t>& dis_inod_geo, \
304 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>& value); \
307tensor_field_evaluate<T,M> ( \
308 const field_basic<T,M>& uh, \
309 const basis_on_pointset<T>& bops, \
310 reference_element hat_K, \
311 const std::vector<size_t>& dis_idof_tab, \
312 Eigen::Matrix<tensor_basic<T>,Eigen::Dynamic,1>& value); \
315field_component_evaluate<T,M> ( \
316 const field_basic<T,M>& uh, \
317 const basis_on_pointset<T>& bops, \
318 reference_element hat_K, \
319 const std::vector<size_t>& dis_idof_tab, \
321 Eigen::Matrix<T,Eigen::Dynamic,1>& value); \
325#ifdef _RHEOLEF_HAVE_MPI
#define _RHEOLEF_instanciation(T, M, A)
field::size_type size_type
see the Float page for the full documentation
const T & dis_dof(size_type dis_idof) const
size_type dis_ndof() const
const geo_type & get_geo() const
const space_type & get_space() const
generic mesh with rerefence counting
see the geo_element page for the full documentation
see the reference_element page for the full documentation
size_type dimension() const
#define assert_macro(ok_condition, message)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
size_type n_component(valued_type valued_tag, size_type d, coordinate_type sys_coord)
std::pair< size_type, size_type > tensor_subscript(valued_type valued_tag, coordinate_type sys_coord, size_type i_comp)
This file is part of Rheolef.
void field_evaluate(const field_basic< T, M > &uh, const basis_on_pointset< T > &bops, reference_element hat_K, const std::vector< size_t > &dis_idof, Eigen::Matrix< T, Eigen::Dynamic, 1 > &value)
void tensor_field_evaluate(const field_basic< T, M > &uh, const basis_on_pointset< T > &bops, reference_element hat_K, const std::vector< size_t > &dis_idof_tab, Eigen::Matrix< tensor_basic< T >, Eigen::Dynamic, 1 > &value)
void jacobian_piola_transformation(const geo_basic< T, M > &omega, const basis_on_pointset< T > &piola_on_pointset, reference_element hat_K, const std::vector< size_t > &dis_inod, Eigen::Matrix< tensor_basic< T >, Eigen::Dynamic, 1 > &DF)
void field_evaluate_continued(const field_basic< T, M > &uh, const geo_basic< T, M > &omega_K, const geo_element &K, const Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > &phij_xi, Eigen::Matrix< Value, Eigen::Dynamic, 1 > &value)
T det_jacobian_piola_transformation(const tensor_basic< T > &DF, size_t d, size_t map_d)
void vector_field_evaluate(const field_basic< T, M > &uh, const basis_on_pointset< T > &bops, reference_element hat_K, const std::vector< size_t > &dis_idof_tab, const basis_on_pointset< T > &piola_on_geo_basis, std::vector< size_t > &dis_inod_geo, Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &value)
void field_component_evaluate(const field_basic< T, M > &uh, const basis_on_pointset< T > &bops, reference_element hat_K, const std::vector< size_t > &dis_idof_tab, size_t k_comp, Eigen::Matrix< T, Eigen::Dynamic, 1 > &value)