25 #include "rheolef/field_evaluate.h"
26 #include "rheolef/piola_util.h"
37 template<
class T,
class M>
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) {
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;
62 template<
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];
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];
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]);
135 template<
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];
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;
171 if (k != l)
value[loc_inod](l,k) +=
tmp;
179 template<
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];
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;
215 template<
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)
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) {
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;
249 template<
class T,
class M,
class Value>
256 Eigen::Matrix<Value,Eigen::Dynamic,1>&
value)
258 Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic> phij_xi;
260 fops.template evaluate <M,Value,details::differentiate_option::none> (omega_K, K, none, phij_xi);
266 #define _RHEOLEF_instanciation_value(T,M,Value) \
267 template 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); \
273 template 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); \
297 vector_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); \
307 tensor_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); \
315 field_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
327 #endif // _RHEOLEF_HAVE_MPI