38 void projection_on_convex_face
41 base_node &proj_ref, base_node &proj) {
46 size_type nb_pts_cv = gmm::mat_ncols(G_cv);
47 size_type nb_pts_fc = pgt->structure()->nb_points_of_face(fc);
49 GMM_ASSERT1( N == pt.size(),
"Dimensions mismatch");
50 GMM_ASSERT1( nb_pts_cv == pgt->nb_points(),
"Dimensions mismatch");
52 bgeot::convex_ind_ct ind_pts_fc = pgt->structure()->ind_points_of_face(fc);
54 base_matrix G_fc(N, nb_pts_fc);
56 gmm::copy(gmm::mat_col(G_cv,ind_pts_fc[i]),gmm::mat_col(G_fc,i));
59 base_matrix base_ref_fc(P,P-1);
62 GMM_ASSERT1( dref_pts_fc.size() == P,
"Dimensions mismatch");
64 gmm::copy(dref_pts_fc[i+1] - dref_pts_fc[0], gmm::mat_col(base_ref_fc,i));
74 proj_ref = gmm::mean_value(pgt->convex_ref()->points_of_face(fc));
76 base_vector val(nb_pts_fc);
77 pgt->poly_vector_val(proj_ref, ind_pts_fc, val);
82 base_matrix grad_fc(nb_pts_fc, P);
83 base_matrix grad_fc1(nb_pts_fc, P-1);
84 base_matrix B(N,P-1), BB(N,P), CS(P-1,P-1);
86 scalar_type EPS = 10E-12;
88 while (res > EPS && --cnt) {
90 pgt->poly_vector_grad(proj_ref, ind_pts_fc, grad_fc);
91 gmm::mult(grad_fc, base_ref_fc, grad_fc1);
96 gmm::mult(B, gmm::transposed(base_ref_fc), BB);
100 pgt->poly_vector_val(proj_ref, ind_pts_fc, val);
103 gmm::mult(gmm::transposed(BB), pt - proj, vres);
106 GMM_ASSERT1( res <= EPS,
107 "Iterative pojection on convex face did not converge");
108 pgt->project_into_reference_convex(proj_ref);
109 pgt->poly_vector_val(proj_ref, ind_pts_fc, val);
124 void normal_on_convex_face
126 const short_type fc,
const base_node &ref_pt, base_node &normal) {
131 size_type nb_pts_cv = gmm::mat_ncols(G_cv);
132 size_type nb_pts_fc = pgt->structure()->nb_points_of_face(fc);
134 GMM_ASSERT1( nb_pts_cv == pgt->nb_points(),
"Dimensions mismatch");
136 bgeot::convex_ind_ct ind_pts_fc = pgt->structure()->ind_points_of_face(fc);
138 base_matrix G_fc(N, nb_pts_fc);
140 gmm::copy(gmm::mat_col(G_cv,ind_pts_fc[i]),gmm::mat_col(G_fc,i));
143 base_matrix base_ref_fc(P,P-1);
146 GMM_ASSERT1( dref_pts_fc.size() == P,
"Dimensions mismatch");
148 gmm::copy(dref_pts_fc[i+1] - dref_pts_fc[0], gmm::mat_col(base_ref_fc,i));
153 base_matrix K(N,P-1);
155 base_matrix grad_fc(nb_pts_fc, P);
156 base_matrix grad_fc1(nb_pts_fc, P-1);
157 pgt->poly_vector_grad(ref_pt, ind_pts_fc, grad_fc);
158 gmm::mult(grad_fc, base_ref_fc, grad_fc1);
164 base_matrix grad_cv(nb_pts_cv, P);
165 pgt->poly_vector_grad(ref_pt, grad_cv);
169 base_matrix bases_product(P-1, P);
170 gmm::mult(gmm::transposed(K), KK, bases_product);
173 std::vector<size_type> ind(0);
175 if (j != i ) ind.push_back(j);
176 scalar_type det =
gmm::lu_det(gmm::sub_matrix(bases_product,
177 gmm::sub_interval(0, P-1),
178 gmm::sub_index(ind) ) );
179 gmm::add(gmm::scaled(gmm::mat_col(KK, i), (i % 2) ? -det : +det ), normal);
183 gmm::scale(normal, 1/gmm::vect_norm2(normal));
186 base_node cv_center(N), fc_center(N);
188 gmm::add(gmm::mat_col(G_cv,i), cv_center);
190 gmm::add(gmm::mat_col(G_fc,i), fc_center);
191 gmm::scale(cv_center, scalar_type(1)/scalar_type(nb_pts_cv));
192 gmm::scale(fc_center, scalar_type(1)/scalar_type(nb_pts_fc));
193 if (gmm::vect_sp(normal, fc_center -cv_center) < 0)
194 gmm::scale(normal, scalar_type(-1));
209 void normal_on_convex
211 const base_node &ref_pt, base_node &normal) {
216 GMM_ASSERT1( N == 2 || N == 3,
"Normal on convexes calculation is supported "
217 "only for space dimension equal to 2 or 3.");
218 GMM_ASSERT1( P < N,
"Normal on convex is defined only in a space of"
219 "higher dimension.");
224 base_matrix grad_cv(nb_pts, P);
225 pgt->poly_vector_grad(ref_pt, grad_cv);
230 if (P==1 && N == 2) {
234 else if (P==1 && N == 3) {
235 normal[0] = K(2,0)-K(1,0);
236 normal[1] = K(0,0)-K(2,0);
237 normal[2] = K(1,0)-K(0,0);
240 normal[0] = K(1,0)*K(2,1)-K(2,0)*K(1,1);
241 normal[1] = K(2,0)*K(0,1)-K(0,0)*K(2,1);
242 normal[2] = K(0,0)*K(1,1)-K(1,0)*K(0,1);
244 gmm::scale(normal, 1/gmm::vect_norm2(normal));
247 void projected_fem::build_kdtree(
void)
const {
250 dofs.setminus(blocked_dofs);
252 for (dal::bv_visitor dof(dofs); !dof.finished(); ++dof)
257 bool projected_fem::find_a_projected_point(
const base_node &pt, base_node &ptr_proj,
262 tree.nearest_neighbor(ipt, pt);
266 scalar_type dist_sel(1e10);
267 base_node proj_ref, proj_ref_sel, proj, proj_sel;
269 for (
size_type i=0; i < cvs.size(); ++i) {
272 if (rg_source.is_in(cv)) {
275 gic.
invert(pt, proj_ref, gt_invertible);
277 pgt->project_into_reference_convex(proj_ref);
278 proj = pgt->transform(proj_ref, mf_source.
linked_mesh().points_of_convex(cv));
280 if (dist < dist_sel) {
284 proj_ref_sel = proj_ref;
289 mesh_region::face_bitset faces = rg_source.faces_of_convex(cv);
290 if (faces.count() > 0) {
295 projection_on_convex_face(pgt, G, f, pt, proj_ref, proj);
297 if (dist < dist_sel) {
301 proj_ref_sel = proj_ref;
311 if (dist_sel < 0.05*elm_size) {
314 ptr_proj = proj_ref_sel;
327 "Dimensions mismatch between the source and the target meshes");
333 std::fill(ind_dof.begin(), ind_dof.end(),
size_type(-1));
336 rg_target.is_empty()) {
341 for (
mr_visitor i(rg_target); !i.finished(); ++i) {
346 if (dim_ == dim_type(-1)) {
348 if (i.is_face()) dim__ = dim_type(dim__ - 1);
349 GMM_ASSERT1(dim__ < N,
"The projection should take place in lower "
350 "dimensions than the mesh dimension. Otherwise "
351 "use the interpolated_fem object instead.");
354 GMM_ASSERT1(dim_ == dim__,
355 "Convexes/faces of different dimension in the target mesh");
358 GMM_ASSERT1(pim->type() == IM_APPROX,
359 "You have to use approximated integration to project a fem");
360 papprox_integration pai = pim->approx_method();
362 bgeot::pgeotrans_precomp pgp =
363 bgeot::geotrans_precomp(pgt, pai->pintegration_points(), 0);
366 size_type nb_pts = i.is_face() ? pai->nb_points_on_face(f)
367 : pai->nb_points_on_convex();
368 size_type start_pt = i.is_face() ? pai->ind_first_point_on_face(f) : 0;
369 elt_projection_data &e = elements[cv];
371 dal::bit_vector new_dofs;
373 pgp->transform(mim_target.
linked_mesh().points_of_convex(cv),
375 gausspt_projection_data &gppd = e.gausspt[start_pt + k];
376 gppd.iflags = find_a_projected_point(gpt, gppd.ptref, gppd.cv, gppd.f) ? 1 : 0;
380 mf_source.
linked_mesh().points_of_convex(gppd.cv, G);
382 normal_on_convex_face(pgt_source, G, gppd.f, gppd.ptref, gppd.normal);
384 normal_on_convex(pgt_source, G, gppd.ptref, gppd.normal);
386 base_node ppt = pgt_source->transform(gppd.ptref, G);
387 gppd.gap = gmm::vect_sp(gpt-ppt, gppd.normal);
390 if (gppd.iflags && (last_cv != gppd.cv || last_f != gppd.f)) {
393 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
395 if (!(blocked_dofs[dof]))
401 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
403 if (!(blocked_dofs[dof]))
413 dal::bit_vector old_dofs;
416 ind_dof[dof] = cnt++;
418 for (dal::bv_visitor dof(new_dofs); !dof.finished(); ++dof)
419 if (!(old_dofs[dof])) {
420 ind_dof[dof] = cnt++;
421 e.inddof.push_back(dof);
425 e.nb_dof = e.inddof.size();
426 max_dof = std::max(max_dof, e.nb_dof);
428 gausspt_projection_data &gppd = e.gausspt[start_pt + k];
432 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
434 gppd.local_dof[loc_dof] = new_dofs.is_in(dof) ? ind_dof[dof]
441 bgeot::convex_ind_ct ind_pts_fc = pf->structure(gppd.cv)->ind_points_of_face(gppd.f);
442 unsigned rdim =
target_dim() / pf->target_dim();
444 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
446 size_type loc_dof2 = ind_pts_fc[loc_dof];
447 gppd.local_dof[loc_dof2] = new_dofs.is_in(dof) ? ind_dof[dof]
451 for (
size_type ii = 0; ii < nbdof/rdim; ++ii)
452 for (
size_type jj = 0; jj < rdim; ++jj) {
455 size_type loc_dof2 = ind_pts_fc[ii]*rdim + jj;
456 gppd.local_dof[loc_dof2] = new_dofs.is_in(dof) ? ind_dof[dof]
468 base_node P(
dim()); gmm::fill(P,1./20);
469 std::vector<base_node> node_tab_(max_dof, P);
470 pspt_override = bgeot::store_point_tab(node_tab_);
472 dof_types_.resize(max_dof);
473 std::fill(dof_types_.begin(), dof_types_.end(),
479 std::fill(ind_dof.begin(), ind_dof.end(),
size_type(-1));
486 "Wrong convex number: " << cv);
487 std::map<size_type,elt_projection_data>::const_iterator eit;
488 eit = elements.find(cv);
489 return (eit != elements.end()) ? eit->second.nb_dof : 0;
494 std::map<size_type,elt_projection_data>::const_iterator eit;
495 eit = elements.find(cv);
496 GMM_ASSERT1(eit != elements.end(),
"Wrong convex number: " << cv);
497 return eit->second.inddof[i];
506 "Wrong convex number: " << cv);
513 { GMM_ASSERT1(
false,
"No base values, real only element."); }
516 { GMM_ASSERT1(
false,
"No grad values, real only element."); }
519 { GMM_ASSERT1(
false,
"No hess values, real only element."); }
521 inline void projected_fem::actualize_fictx(
pfem pf,
size_type cv,
522 const base_node &ptr)
const {
523 if (fictx_cv != cv) {
526 (mf_source.
linked_mesh().trans_of_convex(cv), pf, base_node(), G, cv);
533 base_tensor &t,
bool)
const {
534 std::map<size_type,elt_projection_data>::iterator eit;
536 if (eit == elements.end()) {
540 std::fill(t.begin(), t.end(), scalar_type(0));
544 elt_projection_data &e = eit->second;
549 std::fill(t.begin(), t.end(), scalar_type(0));
550 if (e.nb_dof == 0)
return;
552 std::map<size_type,gausspt_projection_data>::iterator git;
553 git = e.gausspt.find(c.ii());
555 (c.pgp()->get_ppoint_tab()
556 == e.pim->approx_method()->pintegration_points()) &&
557 git != e.gausspt.end()) {
558 gausspt_projection_data &gppd = git->second;
559 if (gppd.iflags & 1) {
560 if (gppd.iflags & 2) {
566 actualize_fictx(pf, cv, gppd.ptref);
567 pf->real_base_value(fictx, taux);
568 unsigned rdim =
target_dim() / pf->target_dim();
569 std::map<size_type,size_type>::const_iterator ii;
571 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
572 ii = gppd.local_dof.find(i);
573 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
575 t(ii->second,j) = taux(i,j);
578 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
580 ii = gppd.local_dof.find(i*rdim+j);
581 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
582 t(ii->second,j) = taux(i,0);
594 if (find_a_projected_point(c.
xreal(), ptref, cv, f)) {
596 actualize_fictx(pf, cv, ptref);
597 pf->real_base_value(fictx, taux);
600 ind_dof.at(e.inddof[i]) = i;
602 unsigned rdim =
target_dim() / pf->target_dim();
604 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
612 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
627 base_tensor &t,
bool)
const {
628 std::map<size_type,elt_projection_data>::iterator eit;
630 if (eit == elements.end()) {
635 std::fill(t.begin(), t.end(), scalar_type(0));
639 elt_projection_data &e = eit->second;
646 std::fill(t.begin(), t.end(), scalar_type(0));
647 if (e.nb_dof == 0)
return;
649 std::map<size_type,gausspt_projection_data>::iterator git;
650 git = e.gausspt.find(c.ii());
652 (c.pgp()->get_ppoint_tab()
653 == e.pim->approx_method()->pintegration_points()) &&
654 git != e.gausspt.end()) {
655 gausspt_projection_data &gppd = git->second;
656 if (gppd.iflags & 1) {
657 if (gppd.iflags & 4) {
663 actualize_fictx(pf, cv, gppd.ptref);
664 pf->real_grad_base_value(fictx, taux);
666 unsigned rdim =
target_dim() / pf->target_dim();
667 std::map<size_type,size_type>::const_iterator ii;
669 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
670 ii = gppd.local_dof.find(i);
671 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
674 t(ii->second, j, k) = taux(i, j, k);
677 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
679 ii = gppd.local_dof.find(i*rdim+j);
680 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
682 t(ii->second, j, k) = taux(i, 0, k);
693 if (find_a_projected_point(c.
xreal(), ptref, cv, f)) {
695 actualize_fictx(pf, cv, ptref);
696 pf->real_grad_base_value(fictx, taux);
698 ind_dof.at(e.inddof[i]) = i;
700 unsigned rdim =
target_dim() / pf->target_dim();
702 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
707 t(ii,j,k) = taux(i,j,k);
710 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
715 t(ij,j,k) = taux(i,0,k);
726 { GMM_ASSERT1(
false,
"Sorry, to be done."); }
729 base_node &normal, scalar_type &gap)
const {
730 std::map<size_type,elt_projection_data>::iterator eit;
733 if (eit != elements.end()) {
734 elt_projection_data &e = eit->second;
736 normal = base_node(c.N());
740 std::map<size_type,gausspt_projection_data>::iterator git;
741 git = e.gausspt.find(c.ii());
743 (c.pgp()->get_ppoint_tab()
744 == e.pim->approx_method()->pintegration_points()) &&
745 git != e.gausspt.end()) {
746 gausspt_projection_data &gppd = git->second;
747 if (gppd.iflags & 1) {
748 normal = gppd.normal;
752 normal = base_node(c.N());
760 projection_data(c.
xreal(), normal, gap);
763 void projected_fem::projection_data(
const base_node& pt,
764 base_node &normal, scalar_type &gap)
const {
767 if (find_a_projected_point(pt, ptref, cv, f)) {
771 normal_on_convex_face(pgt, G, f, ptref, normal);
773 normal_on_convex(pgt, G, ptref, normal);
774 base_node ppt = pgt->transform(ptref, G);
778 normal = base_node(pt.size());
786 std::map<size_type,elt_projection_data>::const_iterator eit;
787 for (eit = elements.begin(); eit != elements.end(); ++eit) {
788 std::map<size_type,gausspt_projection_data>::const_iterator git;
789 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
790 if (git->second.iflags)
791 bv.add(git->second.cv);
800 for (
mr_visitor v(rg_target); !v.finished(); ++v) {
802 papprox_integration pai = pim->approx_method();
803 size_type start_pt = v.is_face() ? pai->ind_first_point_on_face(v.f()) : 0;
804 size_type nb_pts = v.is_face() ? pai->nb_points_on_face(v.f())
805 : pai->nb_points_on_convex();
806 bool isProjectedOn =
false;
807 for (
size_type ip = 0; ip != nb_pts; ++ip) {
808 auto &proj_data = elements.at(v.cv()).gausspt[start_pt + ip];
809 if (proj_data.iflags) {
810 isProjectedOn =
true;
814 if (isProjectedOn) projected_target.add(v.cv(), v.f());
816 return projected_target;
820 scalar_type &meang)
const {
822 std::map<size_type,elt_projection_data>::const_iterator eit;
823 for (eit = elements.begin(); eit != elements.end(); ++eit) {
824 std::map<size_type,gausspt_projection_data>::const_iterator git;
825 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
826 if (git->second.iflags)
831 ming = 100000; maxg = 0; meang = 0;
834 !cv.finished(); ++cv) {
835 ming = std::min(ming, v[cv]);
836 maxg = std::max(maxg, v[cv]);
838 if (v[cv] > 0) ++cntg;
840 meang /= scalar_type(cntg);
843 size_type projected_fem::memsize()
const {
845 sz += blocked_dofs.memsize();
847 sz += elements.size() *
sizeof(elt_projection_data);
848 std::map<size_type,elt_projection_data>::const_iterator eit;
849 for (eit = elements.begin(); eit != elements.end(); ++eit) {
850 sz += eit->second.gausspt.size() *
sizeof(gausspt_projection_data);
851 sz += eit->second.inddof.capacity() *
sizeof(
size_type);
852 std::map<size_type,gausspt_projection_data>::const_iterator git;
853 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
854 sz += git->second.local_dof.size() *
sizeof(
size_type);
860 projected_fem::projected_fem(
const mesh_fem &mf_source_,
861 const mesh_im &mim_target_,
864 dal::bit_vector blocked_dofs_,
bool store_val)
865 : mf_source(mf_source_), mim_target(mim_target_),
866 rg_source(mf_source.linked_mesh().region(rg_source_)),
867 rg_target(mim_target.linked_mesh().region(rg_target_)),
868 store_values(store_val), blocked_dofs(blocked_dofs_), mi2(2), mi3(3) {
869 this->add_dependency(mf_source);
870 this->add_dependency(mim_target);
871 is_pol = is_lag = is_standard_fem =
false; es_degree = 5;
872 is_equiv = real_element_defined =
true;
878 DAL_SIMPLE_KEY(special_projfem_key,
pfem);
882 dal::bit_vector blocked_dofs_,
bool store_val) {
883 pfem pf = std::make_shared<projected_fem>
884 (mf_source_, mim_target_, rg_source_, rg_target_,blocked_dofs_,store_val);
885 dal::pstatic_stored_object_key
886 pk = std::make_shared<special_projfem_key>(pf);
dref_convex_pt_ct dir_points_of_face(short_type i) const
Direct points for a given face.
const base_node & xreal() const
coordinates of the current point, in the real convex.
void set_xref(const base_node &P)
change the current point (coordinates given in the reference convex)
does the inversion of the geometric transformation for a given convex
bool invert(const base_node &n, base_node &n_ref, scalar_type IN_EPS=1e-12, bool project_into_element=false)
given the node on the real element, returns the node on the reference element (even if it is outside ...
void add_point_with_id(const base_node &n, size_type i)
insert a new point, with an associated number.
void clear()
reset the tree, remove all points
const dal::bit_vector & convex_index() const
Return the list of valid convex IDs.
short_type nb_faces_of_convex(size_type ic) const
Return the number of faces of convex ic.
pconvex_structure structure_of_convex(size_type ic) const
Return the pconvex_structure of the convex ic.
size_type nb_allocated_convex() const
The number of convex indexes from 0 to the index of the last convex.
bool context_check() const
return true if update_from_context was called
structure passed as the argument of fem interpolation functions.
Describe a finite element method linked to a mesh.
virtual ind_dof_ct ind_basic_dof_of_element(size_type cv) const
Give an array of the dof numbers a of convex.
virtual dim_type get_qdim() const
Return the Q dimension.
const mesh & linked_mesh() const
Return a reference to the underlying mesh.
virtual size_type nb_basic_dof() const
Return the total number of basic degrees of freedom (before the optional reduction).
virtual dal::bit_vector basic_dof_on_region(const mesh_region &b) const
Get a list of basic dof lying on a given mesh_region.
virtual ind_dof_face_ct ind_basic_dof_of_face_of_element(size_type cv, short_type f) const
Give an array of the dof numbers lying of a convex face (all degrees of freedom whose associated base...
virtual base_node point_of_basic_dof(size_type cv, size_type i) const
Return the geometrical location of a degree of freedom.
virtual size_type nb_basic_dof_of_face_of_element(size_type cv, short_type f) const
Return the number of dof lying on the given convex face.
virtual pfem fem_of_element(size_type cv) const
Return the basic fem associated with an element (if no fem is associated, the function will crash!...
virtual size_type nb_basic_dof_of_element(size_type cv) const
Return the number of degrees of freedom attached to a given convex.
virtual const mesh::ind_cv_ct & convex_to_basic_dof(size_type d) const
Return the list of convexes attached to the specified dof.
Describe an integration method linked to a mesh.
virtual pintegration_method int_method_of_element(size_type cv) const
return the integration method associated with an element (in no integration is associated,...
const mesh & linked_mesh() const
Give a reference to the linked mesh of type mesh.
"iterator" class for regions.
structure used to hold a set of convexes and/or convex faces.
static mesh_region all_convexes()
provide a default value for the mesh_region parameters of assembly procedures etc.
virtual scalar_type convex_radius_estimate(size_type ic) const
Return an estimate of the convex largest dimension.
ref_convex convex(size_type ic) const
return a bgeot::convex object for the convex number ic.
mesh_region projected_target_region() const
faces and convexes from the target region that contain at least one Gauss point that is projected by ...
void hess_base_value(const base_node &, base_tensor &) const
Give the value of all hessians (on ref.
virtual size_type nb_dof(size_type cv) const
Number of degrees of freedom.
void real_base_value(const fem_interpolation_context &c, base_tensor &t, bool=true) const
Give the value of all components of the base functions at the current point of the fem_interpolation_...
dal::bit_vector projected_convexes() const
return the list of convexes of the projected mesh_fem which contain at least one gauss point (should ...
void gauss_pts_stats(unsigned &ming, unsigned &maxg, scalar_type &meang) const
return the min/max/mean number of gauss points in the convexes of the projected mesh_fem
void grad_base_value(const base_node &, base_tensor &) const
Give the value of all gradients (on ref.
virtual bgeot::pconvex_ref ref_convex(size_type cv) const
Return the convex of the reference element.
void real_hess_base_value(const fem_interpolation_context &, base_tensor &, bool=true) const
Give the hessian of all components of the base functions at the current point of the fem_interpolatio...
virtual const bgeot::convex< base_node > & node_convex(size_type cv) const
Gives the convex representing the nodes on the reference element.
virtual void update_from_context(void) const
this function has to be defined and should update the object when the context is modified.
void base_value(const base_node &, base_tensor &) const
Give the value of all components of the base functions at the point x of the reference element.
void real_grad_base_value(const fem_interpolation_context &c, base_tensor &t, bool=true) const
Give the gradient of all components of the base functions at the current point of the fem_interpolati...
indexed array reference (given a container X, and a set of indexes I, this class provides a pseudo-co...
FEM which projects a mesh_fem on a different mesh.
void mult_add(const L1 &l1, const L2 &l2, L3 &l3)
*/
number_traits< typename linalg_traits< V >::value_type >::magnitude_type vect_norm2(const V &v)
Euclidean norm of a vector.
number_traits< typename linalg_traits< V1 >::value_type >::magnitude_type vect_dist2(const V1 &v1, const V2 &v2)
Euclidean distance between two vectors.
void resize(V &v, size_type n)
*/
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
strongest_value_type< V1, V2 >::value_type vect_sp(const V1 &v1, const V2 &v2)
*/
void add(const L1 &l1, L2 &l2)
*/
linalg_traits< DenseMatrixLU >::value_type lu_det(const DenseMatrixLU &LU, const Pvector &pvector)
Compute the matrix determinant (via a LU factorization)
void lu_inverse(const DenseMatrixLU &LU, const Pvector &pvector, const DenseMatrix &AInv_)
Given an LU factored matrix, build the inverse of the matrix.
pdof_description global_dof(dim_type d)
Description of a global dof, i.e.
dim_type target_dim() const
dimension of the target space.
size_type convex_num() const
get the current convex number
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
dim_type dim() const
dimension of the reference element.
gmm::uint16_type short_type
used as the common short type integer in the library
pconvex_ref generic_dummy_convex_ref(dim_type nc, size_type n, short_type nf)
generic convex with n global nodes
size_t size_type
used as the common size type in the library
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation
void add_stored_object(pstatic_stored_object_key k, pstatic_stored_object o, permanence perm)
Add an object with two optional dependencies.
GEneric Tool for Finite Element Methods.
pfem new_projected_fem(const mesh_fem &mf_source, const mesh_im &mim_target, size_type rg_source_=size_type(-1), size_type rg_target_=size_type(-1), dal::bit_vector blocked_dofs=dal::bit_vector(), bool store_val=true)
create a new projected FEM.
store a point and the associated index for the kdtree.