Skip to Content.
Sympa Menu

cgal-discuss - [cgal-discuss] Periodic mesh expansion

Subject: CGAL users discussion list

List archive

[cgal-discuss] Periodic mesh expansion


Chronological Thread 
  • From: <>
  • To: "" <>
  • Subject: [cgal-discuss] Periodic mesh expansion
  • Date: Mon, 24 Oct 2022 14:10:37 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=v+lI2OmlXDcgYhcait7w5CIKDTjOqzyfonf4KPDeAs8=; b=GkytWlqfHSpjrKSLV3xrsI0wIhQpOg3XQfwkezZPXcG/bc9OrpT0RmAimfW07Q/mhkmSA4cxtY0AxbM06sserqOS2uYXrbbjbQn6IadThYddGjrIysd0btfS9b72k/jdIlNBOw8CKiyQAvf8DchQUKzXgEIJp465mTnyBcQ4rerYt4cmWYjrUepb546jDbQw5qceS9otXjGVFYHHO0VTYI07W0KBuTrXe3NOwNv2LREIzkmHuJVNHO6e4uJSp6T5Sbghk0RAMK0223PpzDaGyPktn9FUX+/VZun/GNzUTq+7hrMGbAb2pkgZdFqyzaJGMn3U4Bcap3rp3DWagariaQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=l6q29qo3BSgSj/1KIjOQjtwmktd0u4sqSNV3QfLu4NJVbzQA8WeJ866ANy4mzd0d6fU7saUfscemdiCoS3n15i0VgoITuPrylXRnNc9IgJMff3Xae5r8/epsbnyHzxP//W3pEwp2Qcqk9gU6OjeyOqnO/VFb/fu3BS6+AsdGZm1fiPo6pLkXM4gPKkS5rE9NSOBLmJrn+1KGIx2YWs+yBfuZyxlHgCtNQdTx91ZiCwEj0RlRXtwP5vzJDvhdSSf73M1yREJhgQlugOAjU6gVLV0e5kzBjZKe0S1MCm8YeWjFPmVlzFe7LusiZh6Fn48miig49KBGmMKd+OMFVIaUQQ==
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None ; spf=Pass ; spf=Pass
  • Ironport-data: A9a23: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 Zus
  • Ironport-hdrordr: A9a23:kfV7j63r2Ao1MRdca91+dwqjBXlyeYIsimQD101hICG9Lfb0qy n+pp4mPEHP4wr5AEtQ4exoS5PwOk80lKQFl7X5WI3PYOCIghrNEGgP1+rfKnjbalTDH41mpO 5dmspFebrN5DFB5K6UjjVQUexQpuVvm5rY5ts2uk0dKD2CHJsQjTuRZDz6LmRGAC19QbYpHp uV4cRK4xC6f24MU8i9Dn4ZG8DeutzijvvdEFU7Li9izDPLoSKj6bb8HRTd9AwZSSlzzbAr9n WAuxDl55+kr+qwxnbnpiXuBtVt6ZfcIpYqPr3AtiEmEESjtu+aXvUhZ1S2hkF7nAn2gGxa0O Uk7S1QfPiboEmhBF1d6SGdpjUIlgxeo0MLxTKj8AfeSOHCNUAH4vB69PdkWwqc71BlsMB30a pN0W7cv51LDQnYlCC449TTTRllmke9vHJnyIco/gtieJpbbKUUoZ0U/UtTHptFFCXm6Jo/GO 0rCM3H/v5ZfV6TcnictGhyx96nWGg1A369Mzw/Uuf86UkooJlU9Tpq+CVEpAZwyHsUceg12w zlWp4Y6o1zcg==
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: 63569ce1_X+glYTj37GZXx3SyGvIoqRyOv2gXU+3xVpuSWYKvrAdtKDP TAeb0rZaps1NBgUiCKwDSRe8a3SCd4j9wX9DvwQ==
  • Msip_labels:

Dear all,

I am trying to expand a periodic mesh and have it returned in a new c3t3 structure instead of having to save a .mesh file and load it afterwards. For this I have tried modifying the File_medit.h found in the Periodic_3_mesh_3/IO folder but am having a few issues. First of all, the tetrahedrals seem to not be properly added when I call the build_triangulation function although the finite_cell vector has all collected values in it. I am having a similar issue with the border_facets, although in this case I am also not sure what data I am supposed to place in surface_patch_id and if perhaps this is causing the issues. I have included the code I am using bellow. Any help is appreciated.


Regards, Kim

/* ==========================================================================
 *  Based on CGAL's File_medit.h. See CGAL Periodic_3_mesh_3/IO.
 * ==========================================================================*/

#ifndef CGAL_PERIODIC_REPLICATOR_H
#define CGAL_PERIODIC_REPLICATOR_H

#include <CGAL/license/Periodic_3_mesh_3.h>

#include <CGAL/Mesh_3/io_signature.h>
#include <CGAL/Mesh_3/tet_soup_to_c3t3.h>
//
#include <CGAL/array.h>
#include <CGAL/assertions.h>
#include <CGAL/IO/File_medit.h>

#include <boost/unordered_map.hpp>

#include <algorithm>
#include <fstream>
#include <iostream>
#include <cstring>
#include <sstream>
#include <cstring>
#include <map>
namespace CGAL {

  namespace periodic_replicator {

    /**
     * \brief expands a periodic mesh to the c3t3 variable
     * \param c3t3_periodic the mesh
     * \param occurrence_count the number of copies that are printed
     * \param distinguish_copies if set to `true`, each copy is assigned a unique color.
     *                           Otherwise, all domains are drawn with subdomain index-based colors.
     * \param rebind if set to `true`, labels of cells are rebinded into [1..nb_of_labels]
     * \param c3t3 the output mesh
     */
    template <class C3T3_Periodic, class C3T3, bool rebind, bool no_patch>  ////template <class C3T3_Periodic>
    void replicate_periodic_mesh(const C3T3_Periodic& c3t3_periodic,
                                int occurrence_count[3],
                                const bool distinguish_copies,
                                C3T3& c3t3)
    {
      #ifdef CGAL_MESH_3_IO_VERBOSE
        std::cerr << "Output to medit:\n";
      #endif

      CGAL_precondition(c3t3_periodic.triangulation().is_1_cover());

      typedef CGAL::Mesh_3::Medit_pmap_generator<C3T3_Periodic, rebind, no_patch>  Generator;
      typedef typename Generator::Cell_pmap                               Cell_pmap;
      typedef typename Generator::Facet_pmap                              Facet_pmap;
      typedef typename Generator::Facet_pmap_twice                        Facet_pmap_twice;
      typedef typename Generator::Vertex_pmap                             Vertex_pmap;
      //Generator().print_twice();
      Cell_pmap cell_pmap(c3t3_periodic);
      Facet_pmap facet_pmap(c3t3_periodic, cell_pmap);
      Facet_pmap_twice facet_pmap_twice(c3t3_periodic, cell_pmap);
      Vertex_pmap vertex_pmap(c3t3_periodic, cell_pmap, facet_pmap);

  //    const Facet_index_property_map_twice& facet_twice_pmap = Facet_index_property_map_twice(),
      const bool print_each_facet_twice = false;//Generator().print_twice();
     
      CGAL_precondition(occurrence_count[0] >= 1 && occurrence_count[1] >= 1 && occurrence_count[2] >= 1);

      // Periodic typedef
      typedef typename C3T3_Periodic::Triangulation  Triangulation_periodic;
      typedef Triangulation_periodic                 Tr_periodic;

      typedef typename Tr_periodic::Bare_point       Bare_point;
      typedef typename Tr_periodic::Weighted_point   Weighted_point;

      typedef typename C3T3_Periodic::Vertex_handle  Vertex_handle;
      typedef typename C3T3_Periodic::Cell_handle    Cell_handle;

      typedef typename Tr_periodic::Vertex_iterator  Vertex_iterator;
      typedef typename C3T3_Periodic::Facet_iterator Facet_iterator;
      typedef typename C3T3_Periodic::Cell_iterator  Cell_iterator;

      typedef typename Tr_periodic::Offset           Offset;

      const Triangulation_periodic& tr_periodic = c3t3_periodic.triangulation();

      // Non-periodic typedef
      typedef typename C3T3::Triangulation  Triangulation;
      typedef Triangulation                 Tr;

      typedef typename Tr::Point Point_3;
      typedef std::array<int, 3> Facet; // 3 = id
      typedef std::array<int, 5> Tet_with_ref; // first 4 = id, fifth = reference

      //
      std::vector<Point_3> points;
      //std::map<Facet, typename Tr::Cell::Surface_patch_index> border_facets_;
      std::map<Facet, typename C3T3::Surface_patch_index> border_facets;
      std::vector<Tet_with_ref> finite_cells;

      //
      int number_of_vertices = static_cast<int>(tr_periodic.number_of_vertices());
      int number_of_facets = static_cast<int>(c3t3_periodic.number_of_facets());
      int number_of_cells = static_cast<int>(c3t3_periodic.number_of_cells());

      // number of reproductions over the different axes
      int Ox_rn = ceil(occurrence_count[0]);
      int Oy_rn = ceil(occurrence_count[1]);
      int Oz_rn = ceil(occurrence_count[2]);

      int occ_mult = Ox_rn * Oy_rn * Oz_rn;

      #ifdef CGAL_PERIODIC_3_MESH_3_VERBOSE
        std::cerr << "Expanding periodic mesh... " << std::endl;
        std::cerr << "occurrences over each axis: "
                  << Ox_rn << " " << Oy_rn << " " << Oz_rn << std::endl;
        std::cerr << number_of_vertices << " vertices" << std::endl;
        std::cerr << number_of_facets << " facets" << std::endl;
        std::cerr << number_of_cells << " cells" << std::endl;
      #endif

      std::ofstream os("output_control.mesh");
      os << std::setprecision(17);

      // Vertices
      int medit_number_of_vertices = (Ox_rn + 1) * (Oy_rn + 1) * (Oz_rn + 1) * number_of_vertices;

      os << "MeshVersionFormatted 1\n"
         << "Dimension 3\n"
         << "Vertices\n" << medit_number_of_vertices << std::endl;

      // Build the set of points that is needed to draw all the elements.

      // On each axis, we repeat n+1 times the point, where 'n' is the number of
      // instances of the mesh that will be printed over that axis. This is because
      // a cell 'c' might have point(c,i) that is equal to v with an offset 2

      boost::unordered_map<Vertex_handle, int> V;
      int inum = 1; // '1' because medit ids start at 1

      for(int i=0; i<=Oz_rn; ++i) {
        for(int j=0; j<=Oy_rn; ++j) {
          for(int k=0; k<=Ox_rn; ++k) {
            for(Vertex_iterator vit = tr_periodic.vertices_begin(); vit != tr_periodic.vertices_end(); ++vit) {
              if(i == 0 && j == 0 && k == 0)
                V[vit] = inum++;

              const Offset off(k, j, i);
              const Weighted_point& p = tr_periodic.point(vit);
              const Bare_point bp = tr_periodic.construct_point(p, off);

              int id;
              if(i >= 1 || j >= 1 || k >= 1)
                id = 7;
              else
                id = tr_periodic.off_to_int(off);

              os << CGAL::to_double(bp.x()) << ' '
                 << CGAL::to_double(bp.y()) << ' '
                 << CGAL::to_double(bp.z()) << ' ';

              if(!distinguish_copies || occ_mult == 1)
                os << get(vertex_pmap, vit) << '\n';
              else
                os << 32 * id + 1 << '\n';

              points.push_back(Point_3(CGAL::to_double(bp.x()),
                                       CGAL::to_double(bp.y()),
                                       CGAL::to_double(bp.z())));
            }
          }
        }
      }

      // Triangles
      int medit_number_of_triangles = occ_mult * number_of_facets;
      if(print_each_facet_twice)
        medit_number_of_triangles *= 2;

      os << "Triangles\n" << medit_number_of_triangles << std::endl;
      for(int i=0; i<Oz_rn; ++i) {
        for(int j=0; j<Oy_rn; ++j) {
          for(int k=0; k<Ox_rn; ++k) {
            const Offset off(k, j, i);
            for(Facet_iterator fit = c3t3_periodic.facets_begin(); fit != c3t3_periodic.facets_end(); ++fit) {
              typename Tr::Cell::Surface_patch_index surface_patch_id;
              Facet facet;
              for(int l=0; l<4; ++l) {
                if(l == fit->second)
                  continue;

                Cell_handle c = fit->first;
                Vertex_handle v = c->vertex(l);
                const Offset combined_off = tr_periodic.combine_offsets(
                                              off, tr_periodic.int_to_off(c->offset(l)));
                const int vector_offset = combined_off.x() +
                                          combined_off.y() * (Ox_rn + 1) +
                                          combined_off.z() * (Ox_rn + 1) * (Oy_rn + 1);
                const int id = vector_offset * number_of_vertices + V[v];
                CGAL_assertion(1 <= id && id <= medit_number_of_vertices);
                os << id << " ";

                //facet[l] = id;
                int temp_ = id;
                facet[l] = temp_;
              }

              // For multiple copies, color to distinguish copies rather than to distinguish subdomains
              //int temptest;
              if(!distinguish_copies || occ_mult == 1){
                os << get(facet_pmap, *fit) << '\n';
              } else {
                os << 1 + k + 3*j + 9*i << '\n';
              }

              surface_patch_id.first = 0;
              surface_patch_id.second = 1;
              border_facets.insert(std::make_pair(facet, surface_patch_id));

              // Print triangle again if needed
              if(print_each_facet_twice) {
                for(int l=0; l<4; ++l) {
                  if(l == fit->second)
                    continue;

                  Cell_handle c = fit->first;
                  Vertex_handle v = c->vertex(l);
                  const Offset combined_off = tr_periodic.combine_offsets(
                                                off, tr_periodic.int_to_off(c->offset(l)));
                  const int vector_offset = combined_off.x() +
                                            combined_off.y() * (Ox_rn + 1) +
                                            combined_off.z() * (Ox_rn + 1) * (Oy_rn + 1);
                  const int id = vector_offset * number_of_vertices + V[v];
                  CGAL_assertion(1 <= id && id <= medit_number_of_vertices);
                  os << id << " ";

                  int temp_ = id;
                  facet[l] = temp_;
                }

                if(!distinguish_copies || occ_mult == 1)
                  os << get(facet_pmap_twice, *fit) << '\n';
                else
                  os << 1 + k + 3*j + 9*i << '\n';

                  //surface_patch_id = ???;
                  //border_facets.insert(std::make_pair(facet, surface_patch_id));
              }
            }
          }
        }
      }

      // Tetrahedra
      os << "Tetrahedra\n" << occ_mult * number_of_cells << std::endl;
      for(int i=0; i<Oz_rn; ++i) {
        for(int j=0; j<Oy_rn; ++j) {
          for(int k=0; k<Ox_rn; ++k) {
            const Offset off(k, j, i);
            for(Cell_iterator cit = c3t3_periodic.cells_begin(); cit !=c3t3_periodic.cells_end(); ++cit) {
              Tet_with_ref t;
              for(int l=0; l<4; ++l) {
                const Offset combined_off = tr_periodic.combine_offsets(
                                              off, tr_periodic.int_to_off(cit->offset(l)));
                const int vector_offset = combined_off.x() +
                                          combined_off.y() * (Ox_rn + 1) +
                                          combined_off.z() * (Ox_rn + 1) * (Oy_rn + 1);

                const int id = vector_offset * number_of_vertices + V[cit->vertex(l)];
                CGAL_assertion(1 <= id && id <= medit_number_of_vertices);

                os << id << " ";

                t[l] = id - 1;
              }
                   
              // For multiple copies, color to distinguish copies rather than to distinguish subdomains
              if(!distinguish_copies || occ_mult == 1) {
                os << get(cell_pmap, cit) << '\n';
                t[4] = get(cell_pmap, cit);
              } else {
                os << 1 + k + 3*j + 9*i << '\n';
                t[4] = 1 + k + 3*j + 9*i;
              }

              finite_cells.push_back(t);
            }
          }
        }
      }

      os << "End" << std::endl;

      //
      //std::vector<typename Tr::Vertex_handle> vertices(0);
      std::vector<typename Tr::Vertex_handle> vertices(points.size() + 1);
      bool is_well_built = build_triangulation<Tr, true>(c3t3.triangulation(), points, finite_cells, border_facets, vertices, true/*verbose*/, false/*replace_domain*/);

      // Check
      std::cout << points.size() << " points" << std::endl;
      std::cout << border_facets.size() << " border facets" << std::endl;
      std::cout << finite_cells.size() << " cells" << std::endl;

      std::cout << c3t3.number_of_facets() << " border facets expanded c3t3" << std::endl;
      std::cout << c3t3.number_of_cells() << " cells expanded c3t3" << std::endl;
    }

    #ifdef CGAL_MESH_3_IO_VERBOSE
      std::cerr << "done.\n";
    #endif

  } // namespace periodic_replicator

} // namespace CGAL

#endif // CGAL_PERIODIC_REPLICATOR_H




Archive powered by MHonArc 2.6.19+.

Top of Page