38 void projection_on_convex_face
41 base_node &proj_ref) {
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);
61 dref_convex_pt_ct dref_pts_fc = pgt->convex_ref()->dir_points_of_face(fc);
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);
78 gmm::mult(G_fc, val, proj);
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);
92 gmm::mult(G_fc, grad_fc1, K);
93 gmm::mult(gmm::transposed(K), K, CS);
96 gmm::mult(B, gmm::transposed(base_ref_fc), BB);
100 pgt->poly_vector_val(proj_ref, ind_pts_fc, val);
101 gmm::mult(G_fc, val, proj);
103 gmm::mult(gmm::transposed(BB), pt - proj, vres);
106 GMM_ASSERT1( res <= EPS,
107 "Iterative pojection on convex face did not converge");
121 void normal_on_convex_face
123 const short_type fc,
const base_node &ref_pt, base_node &normal) {
128 size_type nb_pts_cv = gmm::mat_ncols(G_cv);
129 size_type nb_pts_fc = pgt->structure()->nb_points_of_face(fc);
131 GMM_ASSERT1( nb_pts_cv == pgt->nb_points(),
"Dimensions mismatch");
133 bgeot::convex_ind_ct ind_pts_fc = pgt->structure()->ind_points_of_face(fc);
135 base_matrix G_fc(N, nb_pts_fc);
137 gmm::copy(gmm::mat_col(G_cv,ind_pts_fc[i]),gmm::mat_col(G_fc,i));
140 base_matrix base_ref_fc(P,P-1);
142 dref_convex_pt_ct dref_pts_fc = pgt->convex_ref()->dir_points_of_face(fc);
143 GMM_ASSERT1( dref_pts_fc.size() == P,
"Dimensions mismatch");
145 gmm::copy(dref_pts_fc[i+1] - dref_pts_fc[0], gmm::mat_col(base_ref_fc,i));
150 base_matrix K(N,P-1);
152 base_matrix grad_fc(nb_pts_fc, P);
153 base_matrix grad_fc1(nb_pts_fc, P-1);
154 pgt->poly_vector_grad(ref_pt, ind_pts_fc, grad_fc);
155 gmm::mult(grad_fc, base_ref_fc, grad_fc1);
156 gmm::mult(G_fc, grad_fc1, K);
161 base_matrix grad_cv(nb_pts_cv, P);
162 pgt->poly_vector_grad(ref_pt, grad_cv);
163 gmm::mult(G_cv, grad_cv, KK);
166 base_matrix bases_product(P-1, P);
167 gmm::mult(gmm::transposed(K), KK, bases_product);
170 std::vector<size_type> ind(0);
172 if (j != i ) ind.push_back(j);
173 scalar_type det = gmm::lu_det(gmm::sub_matrix(bases_product,
174 gmm::sub_interval(0, P-1),
175 gmm::sub_index(ind) ) );
176 gmm::add(gmm::scaled(gmm::mat_col(KK, i), (i % 2) ? -det : +det ), normal);
180 gmm::scale(normal, 1/gmm::vect_norm2(normal));
183 base_node cv_center(N), fc_center(N);
185 gmm::add(gmm::mat_col(G_cv,i), cv_center);
187 gmm::add(gmm::mat_col(G_fc,i), fc_center);
188 gmm::scale(cv_center, scalar_type(1)/scalar_type(nb_pts_cv));
189 gmm::scale(fc_center, scalar_type(1)/scalar_type(nb_pts_fc));
190 if (gmm::vect_sp(normal, fc_center -cv_center) < 0)
191 gmm::scale(normal, scalar_type(-1));
206 void normal_on_convex
208 const base_node &ref_pt, base_node &normal) {
213 GMM_ASSERT1( N == 2 || N == 3,
"Normal on convexes calculation is supported " 214 "only for space dimension equal to 2 or 3.");
215 GMM_ASSERT1( P < N,
"Normal on convex is defined only in a space of" 216 "higher dimension.");
221 base_matrix grad_cv(nb_pts, P);
222 pgt->poly_vector_grad(ref_pt, grad_cv);
223 gmm::mult(G_cv, grad_cv, K);
227 if (P==1 && N == 2) {
231 else if (P==1 && N == 3) {
232 normal[0] = K(2,0)-K(1,0);
233 normal[1] = K(0,0)-K(2,0);
234 normal[2] = K(1,0)-K(0,0);
237 normal[0] = K(1,0)*K(2,1)-K(2,0)*K(1,1);
238 normal[1] = K(2,0)*K(0,1)-K(0,0)*K(2,1);
239 normal[2] = K(0,0)*K(1,1)-K(1,0)*K(0,1);
241 gmm::scale(normal, 1/gmm::vect_norm2(normal));
244 void projected_fem::build_kdtree(
void)
const {
247 dofs.setminus(blocked_dofs);
249 for (dal::bv_visitor dof(dofs); !dof.finished(); ++dof)
254 bool projected_fem::find_a_projected_point(base_node pt, base_node &ptr_proj,
259 tree.nearest_neighbor(ipt, pt);
263 scalar_type is_in_sel(1e10);
264 base_node proj_ref, proj_ref_sel;
266 for (
size_type i=0; i < cvs.size(); ++i) {
269 if (rg_source.is_in(cv)) {
272 gic.
invert(pt, proj_ref, gt_invertible);
274 scalar_type is_in = pgt->convex_ref()->is_in(proj_ref);
275 if (is_in < is_in_sel) {
279 proj_ref_sel = proj_ref;
284 mesh_region::face_bitset faces = rg_source.faces_of_convex(cv);
285 if (faces.count() > 0) {
286 bgeot::vectors_to_base_matrix(G, mf_source.
linked_mesh().points_of_convex(cv));
290 projection_on_convex_face(pgt, G, f, pt, proj_ref);
291 scalar_type is_in = pgt->convex_ref()->is_in(proj_ref);
292 if (is_in < is_in_sel) {
296 proj_ref_sel = proj_ref;
303 if (cv_sel !=
size_type(-1) && is_in_sel < 0.05) {
306 ptr_proj = proj_ref_sel;
318 "Dimensions mismatch between the source and the target meshes");
326 rg_target.is_empty()) {
331 for (
mr_visitor i(rg_target); !i.finished(); ++i) {
336 if (dim_ == dim_type(-1)) {
338 if (i.is_face()) dim__ = dim_type(dim__ - 1);
339 GMM_ASSERT1(dim__ < N,
"The projection should take place in lower " 340 "dimensions than the mesh dimension. Otherwise " 341 "use the interpolated_fem object instead.");
344 GMM_ASSERT1(dim_ == dim__,
345 "Convexes/faces of different dimension in the target mesh");
348 GMM_ASSERT1(pim->type() == IM_APPROX,
349 "You have to use approximated integration to project a fem");
350 papprox_integration pai = pim->approx_method();
352 bgeot::pgeotrans_precomp pgp =
353 bgeot::geotrans_precomp(pgt, pai->pintegration_points(), 0);
354 dal::bit_vector dofs;
357 size_type nb_pts = i.is_face() ? pai->nb_points_on_face(f) : pai->nb_points();
358 size_type start_pt = i.is_face() ? pai->ind_first_point_on_face(f) : 0;
359 elt_projection_data &e = elements[cv];
362 pgp->transform(mim_target.
linked_mesh().points_of_convex(cv),
364 gausspt_projection_data &gppd = e.gausspt[start_pt + k];
365 gppd.iflags = find_a_projected_point(gpt, gppd.ptref, gppd.cv, gppd.f) ? 1 : 0;
369 bgeot::vectors_to_base_matrix(G, mf_source.
linked_mesh().points_of_convex(gppd.cv));
371 normal_on_convex_face(pgt_source, G, gppd.f, gppd.ptref, gppd.normal);
373 normal_on_convex(pgt_source, G, gppd.ptref, gppd.normal);
375 base_node ppt = pgt_source->transform(gppd.ptref, G);
376 gppd.gap = gmm::vect_sp(gpt-ppt, gppd.normal);
379 if (gppd.iflags && (last_cv != gppd.cv || last_f != gppd.f)) {
382 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
384 if (!(blocked_dofs[idof])) dofs.add(idof);
389 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
391 if (!(blocked_dofs[idof])) dofs.add(idof);
398 e.nb_dof = dofs.card();
400 e.inddof.resize(dofs.card());
401 max_dof = std::max(max_dof, dofs.card());
403 for (dal::bv_visitor idof(dofs); !idof.finished(); ++idof)
404 { e.inddof[cnt] = idof; ind_dof[idof] = cnt++; }
406 gausspt_projection_data &gppd = e.gausspt[start_pt + k];
410 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
412 gppd.local_dof[loc_dof] = dofs.is_in(idof) ? ind_dof[idof]
419 bgeot::convex_ind_ct ind_pts_fc = pf->structure(gppd.cv)->ind_points_of_face(gppd.f);
420 unsigned rdim =
target_dim() / pf->target_dim();
422 for (
size_type loc_dof = 0; loc_dof < nbdof; ++loc_dof) {
424 size_type loc_dof2 = ind_pts_fc[loc_dof];
425 gppd.local_dof[loc_dof2] = dofs.is_in(idof) ? ind_dof[idof]
429 for (
size_type ii = 0; ii < nbdof/rdim; ++ii)
430 for (
size_type jj = 0; jj < rdim; ++jj) {
433 size_type loc_dof2 = ind_pts_fc[ii]*rdim + jj;
434 gppd.local_dof[loc_dof2] = dofs.is_in(idof) ? ind_dof[idof]
442 base_node P(
dim()); gmm::fill(P,1./20);
443 std::vector<base_node> node_tab_(max_dof, P);
444 pspt_override = bgeot::store_point_tab(node_tab_);
446 dof_types_.resize(max_dof);
447 std::fill(dof_types_.begin(), dof_types_.end(),
453 std::fill(ind_dof.begin(), ind_dof.end(),
size_type(-1));
460 "Wrong convex number: " << cv);
461 std::map<size_type,elt_projection_data>::const_iterator eit;
462 eit = elements.find(cv);
463 return (eit != elements.end()) ? eit->second.nb_dof : 0;
468 std::map<size_type,elt_projection_data>::const_iterator eit;
469 eit = elements.find(cv);
470 GMM_ASSERT1(eit != elements.end(),
"Wrong convex number: " << cv);
471 return eit->second.inddof[i];
480 "Wrong convex number: " << cv);
487 { GMM_ASSERT1(
false,
"No base values, real only element."); }
490 { GMM_ASSERT1(
false,
"No grad values, real only element."); }
493 { GMM_ASSERT1(
false,
"No hess values, real only element."); }
495 inline void projected_fem::actualize_fictx(
pfem pf,
size_type cv,
496 const base_node &ptr)
const {
497 if (fictx_cv != cv) {
498 bgeot::vectors_to_base_matrix
501 (mf_source.
linked_mesh().trans_of_convex(cv), pf, base_node(), G, cv);
508 base_tensor &t,
bool)
const {
509 std::map<size_type,elt_projection_data>::iterator eit;
511 if (eit == elements.end()) {
514 std::fill(t.begin(), t.end(), scalar_type(0));
518 elt_projection_data &e = eit->second;
522 std::fill(t.begin(), t.end(), scalar_type(0));
523 if (e.nb_dof == 0)
return;
525 std::map<size_type,gausspt_projection_data>::iterator git;
526 git = e.gausspt.find(c.ii());
528 (c.pgp()->get_ppoint_tab()
529 == e.pim->approx_method()->pintegration_points()) &&
530 git != e.gausspt.end()) {
531 gausspt_projection_data &gppd = git->second;
532 if (gppd.iflags & 1) {
533 if (gppd.iflags & 2) {
539 actualize_fictx(pf, cv, gppd.ptref);
540 pf->real_base_value(fictx, taux);
541 unsigned rdim =
target_dim() / pf->target_dim();
542 std::map<size_type,size_type>::const_iterator ii;
544 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
545 ii = gppd.local_dof.find(i);
546 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
548 t(ii->second,j) = taux(i,j);
551 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
553 ii = gppd.local_dof.find(i*rdim+j);
554 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
555 t(ii->second,j) = taux(i,0);
567 if (find_a_projected_point(c.
xreal(), ptref, cv, f)) {
569 actualize_fictx(pf, cv, ptref);
570 pf->real_base_value(fictx, taux);
573 ind_dof.at(e.inddof[i]) = i;
575 unsigned rdim =
target_dim() / pf->target_dim();
577 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
585 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
600 base_tensor &t,
bool)
const {
601 std::map<size_type,elt_projection_data>::iterator eit;
603 if (eit == elements.end()) {
606 std::fill(t.begin(), t.end(), scalar_type(0));
610 elt_projection_data &e = eit->second;
615 std::fill(t.begin(), t.end(), scalar_type(0));
616 if (e.nb_dof == 0)
return;
618 std::map<size_type,gausspt_projection_data>::iterator git;
619 git = e.gausspt.find(c.ii());
621 (c.pgp()->get_ppoint_tab()
622 == e.pim->approx_method()->pintegration_points()) &&
623 git != e.gausspt.end()) {
624 gausspt_projection_data &gppd = git->second;
625 if (gppd.iflags & 1) {
626 if (gppd.iflags & 4) {
632 actualize_fictx(pf, cv, gppd.ptref);
633 pf->real_grad_base_value(fictx, taux);
635 unsigned rdim =
target_dim() / pf->target_dim();
636 std::map<size_type,size_type>::const_iterator ii;
638 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
639 ii = gppd.local_dof.find(i);
640 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
643 t(ii->second, j, k) = taux(i, j, k);
646 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
648 ii = gppd.local_dof.find(i*rdim+j);
649 if (ii != gppd.local_dof.end() && ii->second !=
size_type(-1))
651 t(ii->second, j, k) = taux(i, 0, k);
662 if (find_a_projected_point(c.
xreal(), ptref, cv, f)) {
664 actualize_fictx(pf, cv, ptref);
665 pf->real_grad_base_value(fictx, taux);
667 ind_dof.at(e.inddof[i]) = i;
669 unsigned rdim =
target_dim() / pf->target_dim();
671 for (
size_type i = 0; i < pf->nb_dof(cv); ++i) {
676 t(ii,j,k) = taux(i,j,k);
679 for (
size_type i = 0; i < pf->nb_dof(cv); ++i)
684 t(ij,j,k) = taux(i,0,k);
695 { GMM_ASSERT1(
false,
"Sorry, to be done."); }
698 base_node &normal, scalar_type &gap)
const {
699 std::map<size_type,elt_projection_data>::iterator eit;
702 if (eit != elements.end()) {
703 elt_projection_data &e = eit->second;
705 normal = base_node(c.N());
709 std::map<size_type,gausspt_projection_data>::iterator git;
710 git = e.gausspt.find(c.ii());
712 (c.pgp()->get_ppoint_tab()
713 == e.pim->approx_method()->pintegration_points()) &&
714 git != e.gausspt.end()) {
715 gausspt_projection_data &gppd = git->second;
716 if (gppd.iflags & 1) {
717 normal = gppd.normal;
721 normal = base_node(c.N());
729 projection_data(c.
xreal(), normal, gap);
732 void projected_fem::projection_data(
const base_node& pt,
733 base_node &normal, scalar_type &gap)
const {
736 if (find_a_projected_point(pt, ptref, cv, f)) {
738 bgeot::vectors_to_base_matrix(G, mf_source.
linked_mesh().points_of_convex(cv));
740 normal_on_convex_face(pgt, G, f, ptref, normal);
742 normal_on_convex(pgt, G, ptref, normal);
743 base_node ppt = pgt->transform(ptref, G);
744 gap = gmm::vect_sp(pt-ppt, normal);
747 normal = base_node(pt.size());
755 std::map<size_type,elt_projection_data>::const_iterator eit;
756 for (eit = elements.begin(); eit != elements.end(); ++eit) {
757 std::map<size_type,gausspt_projection_data>::const_iterator git;
758 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
759 if (git->second.iflags)
760 bv.add(git->second.cv);
767 scalar_type &meang)
const {
769 std::map<size_type,elt_projection_data>::const_iterator eit;
770 for (eit = elements.begin(); eit != elements.end(); ++eit) {
771 std::map<size_type,gausspt_projection_data>::const_iterator git;
772 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
773 if (git->second.iflags)
778 ming = 100000; maxg = 0; meang = 0;
781 !cv.finished(); ++cv) {
782 ming = std::min(ming, v[cv]);
783 maxg = std::max(maxg, v[cv]);
785 if (v[cv] > 0) ++cntg;
787 meang /= scalar_type(cntg);
790 size_type projected_fem::memsize()
const {
792 sz += blocked_dofs.memsize();
794 sz += elements.size() *
sizeof(elt_projection_data);
795 std::map<size_type,elt_projection_data>::const_iterator eit;
796 for (eit = elements.begin(); eit != elements.end(); ++eit) {
797 sz += eit->second.gausspt.size() *
sizeof(gausspt_projection_data);
798 sz += eit->second.inddof.capacity() *
sizeof(
size_type);
799 std::map<size_type,gausspt_projection_data>::const_iterator git;
800 for (git = eit->second.gausspt.begin(); git != eit->second.gausspt.end(); ++git) {
801 sz += git->second.local_dof.size() *
sizeof(
size_type);
807 projected_fem::projected_fem(
const mesh_fem &mf_source_,
811 dal::bit_vector blocked_dofs_,
bool store_val)
812 : mf_source(mf_source_), mim_target(mim_target_),
815 store_values(store_val), blocked_dofs(blocked_dofs_), mi2(2), mi3(3) {
816 this->add_dependency(mf_source);
817 this->add_dependency(mim_target);
818 is_pol = is_lag = is_standard_fem =
false; es_degree = 5;
819 is_equiv = real_element_defined =
true;
825 DAL_SIMPLE_KEY(special_projfem_key,
pfem);
829 dal::bit_vector blocked_dofs_,
bool store_val) {
830 pfem pf = std::make_shared<projected_fem>
831 (mf_source_, mim_target_, rg_source_, rg_target_,blocked_dofs_,store_val);
832 dal::pstatic_stored_object_key
833 pk = std::make_shared<special_projfem_key>(pf);
virtual size_type nb_basic_dof_of_element(size_type cv) const
Return the number of degrees of freedom attached to a given convex.
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.
virtual pintegration_method int_method_of_element(size_type cv) const
return the integration method associated with an element (in no integration is associated, the function will crash! use the convex_index() of the mesh_im to check that a fem is associated to a given convex)
indexed array reference (given a container X, and a set of indexes I, this class provides a pseudo-co...
static mesh_region all_convexes()
provide a default value for the mesh_region parameters of assembly procedures etc.
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...
size_type convex_num() const
get the current convex number
dim_type dim() const
dimension of the reference element.
virtual const bgeot::convex< base_node > & node_convex(size_type cv) const
Gives the convex representing the nodes on the reference element.
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! us...
ref_convex convex(size_type ic) const
return a bgeot::convex object for the convex number ic.
pconvex_structure structure_of_convex(size_type ic) const
Return the pconvex_structure of the convex ic.
does the inversion of the geometric transformation for a given convex
Describe an integration method linked to a mesh.
const base_node & xreal() const
coordinates of the current point, in the real 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.
FEM which projects a mesh_fem on a different mesh.
number_traits< typename linalg_traits< V >::value_type >::magnitude_type vect_norm2(const V &v)
Euclidean norm of a vector.
virtual void update_from_context(void) const
this function has to be defined and should update the object when the context is modified.
void grad_base_value(const base_node &, base_tensor &) const
Give the value of all gradients (on ref.
virtual size_type nb_dof(size_type cv) const
Number of degrees of freedom.
size_t size_type
used as the common size type in the library
void add_stored_object(pstatic_stored_object_key k, pstatic_stored_object o, permanence perm)
Add an object with two optional dependencies.
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.
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_...
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 dim_type get_qdim() const
Return the Q dimension.
bool invert(const base_node &n, base_node &n_ref, scalar_type IN_EPS=1e-12)
given the node on the real element, returns the node on the reference element (even if it is outside ...
structure passed as the argument of fem interpolation functions.
virtual base_node point_of_basic_dof(size_type cv, size_type i) const
Return the geometrical location of a degree of freedom.
virtual bgeot::pconvex_ref ref_convex(size_type cv) const
Return the convex of the reference element.
dim_type target_dim() const
dimension of the target space.
"iterator" class for regions.
GEneric Tool for Finite Element Methods.
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...
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
Describe a finite element method linked to a mesh.
gmm::uint16_type short_type
used as the common short type integer in the library
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
size_type nb_allocated_convex() const
The number of convex indexes from 0 to the index of the last convex.
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 hess_base_value(const base_node &, base_tensor &) const
Give the value of all hessians (on ref.
store a point and the associated index for the kdtree.
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...
void set_xref(const base_node &P)
change the current point (coordinates given in the reference convex)
void mult_add(const L1 &l1, const L2 &l2, L3 &l3)
*/
const mesh & linked_mesh() const
Return a reference to the underlying mesh.
const mesh & linked_mesh() const
Give a reference to the linked mesh of type mesh.
pconvex_ref generic_dummy_convex_ref(dim_type nc, size_type n, short_type nf)
generic convex with n global nodes
bool context_check() const
return true if update_from_context was called
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 ...
short_type nb_faces_of_convex(size_type ic) const
Return the number of faces of convex ic.
const mesh_region region(size_type id) const
Return the region of index 'id'.
pdof_description global_dof(dim_type d)
Description of a global dof, i.e.
virtual ind_dof_ct ind_basic_dof_of_element(size_type cv) const
Give an array of the dof numbers a of convex.
void resize(M &v, size_type m, size_type n)
*/
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...
const dal::bit_vector & convex_index() const
Return the list of valid convex IDs.
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation