30     dal::bit_vector res = convex_tab.index();
 
   31     for (dal::bv_visitor cv(convex_tab.index()); !cv.finished(); ++cv)
 
   38     mesh_convex_structure::ind_pt_ct::const_iterator it;
 
   40     for (it=convex_tab[ic].pts.begin();
 
   41          it != convex_tab[ic].pts.end() && (*it) != ip; ++it) ++ind;
 
   42     GMM_ASSERT1(it != convex_tab[ic].pts.end(),
 
   43                 "This point does not exist on this convex.");
 
   49     std::vector<size_type> doubles;
 
   53       for (
size_type l = 0; l < convex_tab[cv].pts.size(); ++l) {
 
   55         if (ind == i) ind = j;
 
   56         else if (ind == j) { ind = i; doubles.push_back(cv); }
 
   61       if (std::find(doubles.begin(), doubles.end(), cv) == doubles.end()) {
 
   62         for (
size_type l = 0; l < convex_tab[cv].pts.size(); ++l)
 
   63           if (convex_tab[cv].pts[l] == j) convex_tab[cv].pts[l] = i;
 
   71     std::vector<size_type> doubles;
 
   74       for (
size_type k = 0; k < convex_tab[i].pts.size(); ++k) {
 
   78           if (ind == i) ind = j;
 
   79           else if (ind == j) { ind = i; doubles.push_back(ip); }
 
   83       for (
size_type k = 0; k < convex_tab[j].pts.size(); ++k) {
 
   85         if (std::find(doubles.begin(), doubles.end(), ip) == doubles.end()) {
 
   87             if (points_tab[ip][l] == j) points_tab[ip][l] = i;
 
  102     for (
size_type l = 0; l < convex_tab[ic].pts.size(); ++l) {
 
  104       std::vector<size_type>::iterator it1= points_tab[ind].
begin(), it2 = it1;
 
  105       std::vector<size_type>::iterator ite= points_tab[ind].
end();
 
  106       for (; it2 != ite; ++it2) { *it1 = *it2; 
if (*it1 != ic) ++it1; }
 
  107       points_tab[ind].pop_back();
 
  119     for (
short_type iff = 0; iff < ps->nb_faces(); ++iff)
 
  126     for (dal::bv_visitor i(nn); !i.finished(); ++i)
 
  127       if (convex_tab[i].cstruct->dim() == n)
 
  134     for (dal::bv_visitor i(nn); !i.finished(); ++i)
 
  135       dmax = std::max(dmax, convex_tab[i].cstruct->dim());
 
  136     for ( ; dmax > 1; --dmax) 
to_faces(dmax);
 
  143       for (
size_type l = 0; l < convex_tab[cv].pts.size(); ++l)
 
  144         if (convex_tab[cv].pts[l] == i2) { ++nb; 
break; }
 
  150                                         std::vector<size_type> &ipt)
 const {
 
  154       for (
size_type l = 0; l < convex_tab[cv].pts.size(); ++l)
 
  155         if (convex_tab[cv].pts[l] == i2) { ipt.push_back(cv); 
break; }
 
  164       for (
size_type l = 0; l < convex_tab[cv].pts.size(); ++l)
 
  165         if (ip != convex_tab[cv].pts[l]) {
 
  167           if (std::find(s.begin(), s.end(), ind) != s.end()) s.push_back(ind);
 
  175     const mesh_convex_structure *q = &(convex_tab[ic]);
 
  176     std::vector<size_type>::const_iterator r = q->pts.begin();
 
  177     const convex_ind_ct *p = &(q->cstruct->ind_points_of_face(iff));
 
  181   size_type mesh_structure::memsize(
void)
 const {
 
  183       + convex_tab.memsize();
 
  184     for (
size_type i = 0; i < convex_tab.size(); ++i)
 
  185       mems += convex_tab[i].pts.size() * 
sizeof(
size_type);
 
  187       mems += points_tab[i].size() * 
sizeof(
size_type);
 
  193     for (i = 0; i < j; i++)
 
  194       if (!convex_tab.index_valid(i))
 
  197     if (points_tab.
size())
 
  198       for (i=0, j = (points_tab.
end()-points_tab.
begin())-1; i < j; ++i, --j){
 
  199         while (i < j && !(points_tab[i].empty())) ++i;
 
  200         while (i < j && points_tab[j].empty()) --j;
 
  206     points_tab = dal::dynamic_tas<ind_cv_ct, 8>();
 
  207     convex_tab = dal::dynamic_tas<mesh_convex_structure, 8>();
 
  211   void mesh_structure::stat(
void) {
 
  212     cout << 
"mesh structure with " << 
nb_convex() << 
" valid convex, " 
  213          << 
"for a total memory size of " << memsize() << 
" bytes.\n";
 
  226           && (convex_tab[ic].cstruct->dim()==convex_tab[icv].cstruct->dim()))
 
  233                                             const std::vector<short_type> &ftab,
 
  236     std::vector<size_type> ipts;
 
  238     switch (ftab.size()) {
 
  242         ipts.resize(pt.size());
 
  243         std::copy(pt.begin(), pt.end(), ipts.begin());
 
  250         ipts.resize(pt.size());
 
  251         std::copy(pt.begin(), pt.end(), ipts.begin());
 
  257         const mesh_convex_structure &q = convex_tab[ic];
 
  258         const convex_ind_ct &ind = q.cstruct->ind_common_points_of_faces(ftab);
 
  260         ipts.resize(ind.size());
 
  261         auto it = ind.cbegin();
 
  262         for (
size_type &ipt : ipts) ipt = q.pts[*it++];
 
  267     if (ipts.size() == 0) {
 
  271     auto ipt0 = ipts.cbegin();
 
  272     auto ipt1 = ipt0 + 1;
 
  274     for (
size_type icv : points_tab[*ipt0]) {
 
  290             && (convex_tab[ic].cstruct->dim()==convex_tab[icv].cstruct->dim()))
 
  291           if (std::find(s.begin(), s.end(), icv) == s.end())
 
  305           && (convex_tab[ic].cstruct->dim()==convex_tab[icv].cstruct->dim()))
 
  313     if (neighbor_element == 
size_type(-1)) 
return convex_face::invalid_face();
 
  316     auto nNeighborElementFaces = pcs->nb_faces();
 
  317     for (
short_type iff = 0; iff < nNeighborElementFaces; ++iff) {
 
  318       auto nPointsOnFace = pcs->nb_points_of_face(iff);
 
  320                                        nPointsOnFace, face_points.begin()))
 
  321         return {neighbor_element, iff};
 
  323     GMM_ASSERT2(
false, 
"failed to determine neighboring face");
 
  324     return convex_face::invalid_face();
 
  330     ind_cv_ct::const_iterator it = std::find(ct.begin(), ct.end(), ip);
 
  331     return (it != ct.end()) ? (it - ct.begin()): 
size_type(-1);
 
  340   void mesh_edge_list_convex(
pconvex_structure cvs, std::vector<size_type> points_of_convex,
 
  341                              size_type cv_id, edge_list &el, 
bool merge_convex)
 
  343     dim_type n = cvs->dim();
 
  345     size_type ncv = merge_convex ? 0 : cv_id;
 
  348       for (dim_type k = 0; k < n; ++k)
 
  349         for (dim_type l = dim_type(k+1); l <= n; ++l)
 
  350           el.add(edge_list_elt(points_of_convex[k],
 
  351                                points_of_convex[l], ncv));
 
  356         for (dim_type j = 0; j < n; ++j)
 
  357           if ((k & (1 << j)) == 0)
 
  358             el.add(edge_list_elt(points_of_convex[k],
 
  359                                  points_of_convex[k | (1 << j)], ncv));
 
  362       for (dim_type k = 0; k < n - 1; ++k)
 
  363         for (dim_type l = dim_type(k+1); l < n; ++l) {
 
  364           el.add(edge_list_elt(points_of_convex[k],
 
  365                                points_of_convex[l], ncv));
 
  366           el.add(edge_list_elt(points_of_convex[k+n],
 
  367                                points_of_convex[l+n], ncv));
 
  369       for (dim_type k = 0; k < n; ++k)
 
  370         el.add(edge_list_elt(points_of_convex[k],
 
  371                              points_of_convex[k+n], ncv));
 
  378       indpttab[0].resize(cvstab[0]->nb_points());
 
  379       std::copy(points_of_convex.begin(),
 
  380                 points_of_convex.end(), indpttab[0].begin());
 
  389         std::vector< size_type > pts = indpttab[ncs];
 
  390         if (cvs->dim() == 1) { 
 
  392           for (
size_type j = 1; j < cvs->nb_points(); ++j) {
 
  394             el.add(edge_list_elt((indpttab[ncs])[j-1],(indpttab[ncs])[j],ncv));
 
  401             cvstab[ncs+f] = (cvs->faces_structure())[f];
 
  402             indpttab[ncs+f].resize(cvs->nb_points_of_face(f));
 
  411             for (
size_type k = 0; k < cvs->nb_points_of_face(f); ++k)
 
  412               (indpttab[ncs+f])[k] = pts[cvs->ind_points_of_face(f)[k]];
 
  424   void mesh_edge_list(
const mesh_structure &m, edge_list &el,
 
  426     std::vector<size_type> p;
 
  427     for (dal::bv_visitor cv(m.convex_index()); !cv.finished(); ++cv) {
 
  428       p.resize(m.nb_points_of_convex(cv));
 
  429       std::copy(m.ind_points_of_convex(cv).begin(),
 
  430                 m.ind_points_of_convex(cv).end(), p.begin());
 
  431       mesh_edge_list_convex(m.structure_of_convex(cv), p, cv,
 
  439                                  std::vector<size_type> &cmk) {
 
  441     cmk.reserve(cvlst.card()); cmk.resize(0);
 
  443     std::deque<int> pile;
 
  444     std::vector<size_type> tab, connectivity(cvlst.last_true()+1),
 
  445       temp(cvlst.last_true()+1);
 
  449     std::fill(connectivity.begin(), connectivity.end(), 
size_type(-1));
 
  453     for (dal::bv_visitor j(cvlst); !j.finished(); ++j) {
 
  455       mesh_structure::ind_cv_ct::const_iterator itp = ct.begin(),
 
  459       for (; itp != itpe; ++itp) {
 
  461         mesh_structure::ind_cv_ct::const_iterator
 
  464         for ( ; it != ite; ++it)
 
  465           if (temp[*it] != j+1) { temp[*it] = j+1; nei++; }
 
  467       connectivity[j] = nei-1;
 
  468       if (nei < connectivity[cv]) cv = j;
 
  479         mesh_structure::ind_cv_ct::const_iterator
 
  482         for ( ; it != ite; ++it)
 
  483           if (connectivity[*it] != 
size_type(-1)) {
 
  485             pile.push_front(
int(*it));
 
  490         cv = std::min_element(connectivity.begin(), connectivity.end()) - connectivity.begin();
 
  491         if (connectivity[cv] == 
size_type(-1)) 
break;
 
  493       else { cv = pile.back(); pile.pop_back(); }
 
Mesh structure definition.
 
Mesh structure definition.
 
bool is_convex_valid(size_type i)
Return true if i is in convex_index()
 
size_type add_face_of_convex(size_type ic, short_type f)
Insert a new convex corresponding to face f of the convex ic.
 
short_type nb_points_of_convex(size_type ic) const
Return the number of points of convex ic.
 
const dal::bit_vector & convex_index() const
Return the list of valid convex IDs.
 
size_type neighbor_of_convex(size_type ic, short_type f) const
Return a neighbor convex of a given convex face.
 
short_type nb_faces_of_convex(size_type ic) const
Return the number of faces of convex ic.
 
bool is_convex_face_having_points(size_type ic, short_type face_num, short_type nb, ITER pit) const
Return true if the face of the convex contains the given list of points.
 
void clear()
erase the mesh
 
bool is_convex_having_points(size_type ic, short_type nb, ITER pit) const
Return true if the convex contains the listed points.
 
ind_pt_face_ct ind_points_of_face_of_convex(size_type ic, short_type f) const
Return a container of the (global) point number for face f or convex ic.
 
size_type nb_convex() const
The total number of convexes in the mesh.
 
size_type local_ind_of_convex_point(size_type ic, size_type ip) const
Return the "local" index for point ip of the mesh.
 
void neighbors_of_convex(size_type ic, short_type f, ind_set &s) const
Return in s a list of neighbors of a given convex face.
 
void swap_convex(size_type cv1, size_type cv2)
Exchange two convex IDs.
 
const ind_cv_ct & convex_to_point(size_type ip) const
Return a container of the convexes attached to point ip.
 
size_type add_convex(pconvex_structure cs, ITER ipts, bool *present=0)
Insert a new convex in the mesh_structure.
 
void add_faces_of_convex(size_type ic)
Insert new convexes corresponding to the faces of the convex ic.
 
pconvex_structure structure_of_convex(size_type ic) const
Return the pconvex_structure of the convex ic.
 
void ind_points_to_point(size_type, ind_set &) const
Return a container of the points attached (via an edge) to point ip.
 
size_type ind_in_convex_of_point(size_type ic, size_type ip) const
Find the local index of the point of global index ip with respect to the convex cv.
 
void optimize_structure()
Reorder the convex IDs and point IDs, such that there is no hole in their numbering.
 
void to_faces(dim_type n)
build a new mesh, such that its convexes are the faces of the convexes of the previous one
 
convex_face adjacent_face(size_type ic, short_type f) const
Return a face of the neighbouring element that is adjacent to the given face.
 
const ind_set & ind_points_of_convex(size_type ic) const
Return a container to the list of points attached to convex ic.
 
void sup_convex(size_type ic)
Remove the convex ic.
 
void swap_points(size_type i, size_type j)
Exchange two point IDs.
 
void to_edges()
build a new mesh, such that its convexes are the edges of the convexes of the previous one
 
size_type memsize(void) const
Gives the total memory occupied by the array.
 
iterator begin(void)
Iterator on the first element.
 
size_type size(void) const
Number of allocated elements.
 
iterator end(void)
Iterator on the last + 1 element.
 
indexed array reference (given a container X, and a set of indexes I, this class provides a pseudo-co...
 
gmm::uint16_type short_type
used as the common short type integer in the library
 
std::shared_ptr< const convex_structure > pconvex_structure
Pointer on a convex structure description.
 
pconvex_structure parallelepiped_structure(dim_type nc, dim_type k)
Give a pointer on the structures of a parallelepiped of dimension d.
 
void cuthill_mckee_on_convexes(const bgeot::mesh_structure &ms, std::vector< size_type > &cmk)
Return the cuthill_mc_kee ordering on the convexes.
 
pconvex_structure prism_P1_structure(dim_type nc)
Give a pointer on the structures of a prism of dimension d.
 
pconvex_structure simplex_structure(dim_type nc)
Give a pointer on the structures of a simplex of dimension d.
 
size_t size_type
used as the common size type in the library