Skip to content
Snippets Groups Projects
Select Git revision
  • gmsh_4_12_2
  • master default protected
  • overlaps_tags_and_distributed_export
  • overlaps_tags_and_distributed_export_rebased
  • relaying
  • alphashapes
  • patches-4.14
  • steplayer
  • bl
  • pluginMeshQuality
  • fixBugsAmaury
  • hierarchical-basis
  • new_export_boris
  • oras_vs_osm
  • reassign_partitions
  • distributed_fwi
  • rename-classes
  • fix/fortran-api-example-t4
  • robust_partitions
  • reducing_files
  • fix_overlaps
  • gmsh_4_14_0
  • gmsh_4_13_1
  • gmsh_4_13_0
  • gmsh_4_12_1
  • gmsh_4_12_0
  • gmsh_4_11_1
  • gmsh_4_11_0
  • gmsh_4_10_5
  • gmsh_4_10_4
  • gmsh_4_10_3
  • gmsh_4_10_2
  • gmsh_4_10_1
  • gmsh_4_10_0
  • gmsh_4_9_5
  • gmsh_4_9_4
  • gmsh_4_9_3
  • gmsh_4_9_2
  • gmsh_4_9_1
  • gmsh_4_9_0
40 results

t6.cpp

Blame
  • t12.cpp 3.60 KiB
    // -----------------------------------------------------------------------------
    //
    //  Gmsh C++ tutorial 12
    //
    //  Cross-patch meshing with compounds
    //
    // -----------------------------------------------------------------------------
    
    #include <set>
    #include <gmsh.h>
    
    // "Compound" meshing constraints allow to generate meshes across surface
    // boundaries, which can be useful e.g. for imported CAD models (e.g. STEP) with
    // undesired small features.
    
    // When a `setCompound()' meshing constraint is given, at mesh generation time
    // Gmsh
    //  1. meshes the underlying elementary geometrical entities, individually
    //  2. creates a discrete entity that combines all the individual meshes
    //  3. computes a discrete parametrization (i.e. a piece-wise linear mapping)
    //     on this discrete entity
    //  4. meshes the discrete entity using this discrete parametrization instead
    //     of the underlying geometrical description of the underlying elementary
    //     entities making up the compound
    //  5. optionally, reclassifies the mesh elements and nodes on the original
    //     entities
    
    // Step 3. above can only be performed if the mesh resulting from the
    // combination of the individual meshes can be reparametrized, i.e. if the shape
    // is "simple enough". If the shape is not amenable to reparametrization, you
    // should create a full mesh of the geometry and first re-classify it to
    // generate patches amenable to reparametrization (see `t13.cpp').
    
    // The mesh of the individual entities performed in Step 1. should usually be
    // finer than the desired final mesh; this can be controlled with the
    // `Mesh.CompoundMeshSizeFactor' option.
    
    // The optional reclassification on the underlying elementary entities in Step
    // 5. is governed by the `Mesh.CompoundClassify' option.
    
    int main(int argc, char **argv)
    {
      gmsh::initialize();
    
      gmsh::model::add("t12");
    
      double lc = 0.1;
    
      gmsh::model::geo::addPoint(0, 0, 0, lc, 1);
      gmsh::model::geo::addPoint(1, 0, 0, lc, 2);
      gmsh::model::geo::addPoint(1, 1, 0.5, lc, 3);
      gmsh::model::geo::addPoint(0, 1, 0.4, lc, 4);
      gmsh::model::geo::addPoint(0.3, 0.2, 0, lc, 5);
      gmsh::model::geo::addPoint(0, 0.01, 0.01, lc, 6);
      gmsh::model::geo::addPoint(0, 0.02, 0.02, lc, 7);
      gmsh::model::geo::addPoint(1, 0.05, 0.02, lc, 8);
      gmsh::model::geo::addPoint(1, 0.32, 0.02, lc, 9);
    
      gmsh::model::geo::addLine(1, 2, 1);
      gmsh::model::geo::addLine(2, 8, 2);
      gmsh::model::geo::addLine(8, 9, 3);
      gmsh::model::geo::addLine(9, 3, 4);
      gmsh::model::geo::addLine(3, 4, 5);
      gmsh::model::geo::addLine(4, 7, 6);
      gmsh::model::geo::addLine(7, 6, 7);
      gmsh::model::geo::addLine(6, 1, 8);
      gmsh::model::geo::addSpline({7, 5, 9}, 9);
      gmsh::model::geo::addLine(6, 8, 10);
    
      gmsh::model::geo::addCurveLoop({5, 6, 9, 4}, 11);
      gmsh::model::geo::addSurfaceFilling({11}, 1);
    
      gmsh::model::geo::addCurveLoop({-9, 3, 10, 7}, 13);
      gmsh::model::geo::addSurfaceFilling({13}, 5);
    
      gmsh::model::geo::addCurveLoop({-10, 2, 1, 8}, 15);
      gmsh::model::geo::addSurfaceFilling({15}, 10);
    
      gmsh::model::geo::synchronize();
    
      // Treat curves 2, 3 and 4 as a single curve when meshing (i.e. mesh across
      // points 6 and 7)
      gmsh::model::mesh::setCompound(1, {2, 3, 4});
    
      // Idem with curves 6, 7 and 8
      gmsh::model::mesh::setCompound(1, {6, 7, 8});
    
      // Treat surfaces 1, 5 and 10 as a single surface when meshing (i.e. mesh
      // across curves 9 and 10)
      gmsh::model::mesh::setCompound(2, {1, 5, 10});
    
      gmsh::model::mesh::generate(2);
      gmsh::write("t12.msh");
    
      // Launch the GUI to see the results:
      std::set<std::string> args(argv, argv + argc);
      if(!args.count("-nopopup")) gmsh::fltk::run();
    
      gmsh::finalize();
    
      return 0;
    }