CM2 MeshTools® Suite /release 4.8.0

by | Dec 28, 2017

  • 4.8.0
  • December, 2017
  • All CM2 MeshTools® Suite
  • Major release of the CM2 MeshTools® Suite
  • Due to changes in the API, client applications must be recompiled against the new headers


  • Lib names suffix is _48 for this series.
  • New Visual Studio 2017 builds (Win32, Win64, MD, MT).
  • New GCC 5 and GCC 6 builds (Linux86, Linux64).
  • Visual Studio < 2010 and GCC < 4.8 are deprecated and will be no longer supported in future versions.
    In the long term, C++98 will be deprecated. C++11-compliant compilers (for instance Visual Studio >= 2015) will be required to compile the source code of CM2 but also to compile against its API.
  • Windows XP is deprecated and will be no longer supported in future versions.
  • macOS < 10.9 is deprecated and will be no longer supported in future versions (minimum deployment target will raise to 10.9 Mavericks).

/new features

CM2 SurfRemesh T3, CM2 SurfRemesh Q4

  • New parameters max_gradation_1d (to cap gradations along skeleton lines) and max_gradation_2d (to cap gradations inside patches) replacing old max_gradation.
    Default to 0.5 as before.
  • New force_deep_analyzing_flag (default = false, should normally not be changed) to short-cut the smart patch-finding algorithm into a more brute-force algorithm.
  • New notch_closing_flag (default = true) to allow the closing of notches during the clean-up phase.
    This triggers a specific algorithm to close open nodes (merged to the closest open nodes).


  • meshtools::NASTRAN_input, meshtools::NASTRAN_output now work with:
    • 10-node tetrahedrons (CTETRA, CM2_TETRA10).
    • 13-node and 14-node pyramids (CPYRAM, CM2_PYRAMID13, CM2_PYRAMID14).
    • 15-node and 18-node wedges (CPENTA, CM2_WEDGE15, CM2_WEDGE18).
    • 20-node and 27-node hexahedrons (CHEXA, CM2_HEXA20, CM2_HEXA27).
  • New meshtools::jacobians to compute jacobians (at centroid) of elements (linear elements only).


All meshers with background-mesh

  • Massive speed-ups vs 4.7 (sometimes more than +200%) in some corner cases (when the bgm is filled with high-aspect ratio elements).

CM2 HexaMesh

  • Shape-quality improvements (especially when make_conformal_flag = false).
  • Fewer low-order elements (tetrahedrons and pyramids).
  • Significant speed-ups (between 15% to more than 50% vs 4.7).

CM2 TetraMesh, CM2 TetraMesh Aniso

  • Hard faces/edges/nodes enforcement: faster and fortified.

CM2 Intersect T3

  • Many improvements: faster, more robust, fewer remaining pathologies in hard cases.

CM2 QuadMesh, CM2 QuadMesh Aniso

  • Lower peak memory usage (up to 30% less).

CM2 SurfRemesh T3, CM2 SurfRemesh Q4

  • Very significant speed-ups vs 4.7 especially for models mostly made of flat patches (massive, up to 400% for purely flat surfaces).

CM2 SurfMesh T3, CM2 SurfMesh Q4

  • Massive speed-ups (sometimes more than +200% vs 4.7) in some corner cases due to improvements in background-mesh processing (see above).
  • Significant speed-ups (between 15% to 40% vs 4.7) in regular cases due to improvements in meshtools2d::mesh_surface_param (see below).

CM2 QuadMesh, CM2 QuadMesh Aniso, CM2 SurfRemesh Q4, CM2 SurfMesh Q4

  • Two new transformation patterns in the optimization step.


  • meshtools2d::mesh_surface_param: faster background-mesh generation.
  • Port to Visual Studio 2017.
  • Doc fixes and clarifications.


All meshers (especially CM2 TetraMesh, CM2 TetraMesh Aniso, CM2 HexaMesh)

  • Improved robustness: on very difficult cases, could have generated invalid elements, hang on infinite loop or crash.
  • Could have reserved some excessive amounts of memory with target_metric set, leading sometimes to a failure with CM2_SYSTEM_MEMORY_ERROR.

CM2 HexaMesh

  • Background mesh was discarded in REGULARIZE_MODE.
  • With make_conformal_flag = false, could have generated some non semi-conformities.
    In the default mode (make_conformal_flag = true), the mesher generates only fully conformal T3-T3 and Q4-Q4 joints.
    In the non-conformal mode (make_conformal_flag = false), joints between a Q4 and two T3s (semi-conformal joints) are also allowed giving the mesher much more opportunities to reduce the number of tetrahedrons and pyramids.
    In this mode however, some (few) Q4-Q4 jointed only by three nodes (non semi-conformal joints) could have showed up (now fixed).

CM2 TetraMesh, CM2 TetraMesh Aniso, CM2 HexaMesh

  • Degenerated input hard faces crashed the meshers.
  • Enforcement of constrained edges could take an excessive amount of time with long edges close to many short edges (longer by a magnitude of 20 or more).

CM2 TetraMesh Aniso

  • Mesher failed sometimes during the front-mesh step (failed to enforce all boundary faces) whereas the iso counterpart mesher succeeded.
    Now both flavors of mesher behave similarly with this respect.

CM2 TriaMesh Aniso, CM2 QuadMesh Aniso, CM2 TetraMesh Aniso

  • Some shape quality issues with target_metric.

CM2 Intersect T3

  • The interrupt handler, if any, was never called.

CM2 SurfRemesh T3, CM2 SurfRemesh Q4

  • data_type::interpolate_field was not properly computed on new nodes.
  • data_type::interpolate_field could crash the remeshers.
  • Could have failed to optimize with settings.remesh_flag = false.
  • Strange position for some nodes sometimes (not on the initial surface, causing spurious chordal error).
  • Members data_type::IDs_sorted_by_color_in and data_type::skeleton_IDs_sorted_by_color_in could have failed with settings.initial_cleanup_flag = true.

CM2 SurfMesh T3, CM2 SurfMesh Q4

  • Orientation of faces was erroneously reversed sometimes.


  • meshtools::get_IDs: erroneous indices in inv_IDs in case of duplicates.
    In case of duplicates, the indices in IDs and inv_IDs are now the lowest matching indices.

/breaking changes

All meshers

  • Type operating_mode_type renamed settings_type.
  • Field mode renamed settings.

All meshers (except Intersect and Layers)

  • In strict-constraints mode (settings_type::strict_constraints_flag = true) the meshers no longer raise an error in case of entity located outside the meshed domain.
    They now raise only a CM2_NODE_DISCARDED, CM2_EDGE_DISCARDED or CM2_FACE_DISCARDED warning.
    Missing entities are still reported in unenforced_node_IDs, unenforced_edge_IDs and unenforced_boundary_IDs as before.
    An error is now raised only when an intersection/overlapping is detected (when settings_type::strict_constraints_flag = true).
  • Some warning precedence changes.
  • In CONVEX_HULL_MODE, the edges (and faces in 3D) used to be discarded.
    Only the nodes of data_type::connectB (and data_type::connectE in 3D) were used to triangulate the hull.
    Now when strict_constraints_flag = true (the default), edges and faces intern to the convex hull are also enforced if possible (i.e. when there is no intersection, and no Steiner node required in 3D).
    Unenforced entities are now also reported in data_type::unenforced_boundary_IDs (and data_type::unenforced_edge_IDs in 3D).
    If edges and faces are of no interest to you, you can save CPU time by putting nodes in data_type::isolated_nodes only and clearing data_type::connectB (and data_type::connectE in 3D).

CM2 TriaMesh, CM2 TriaMesh Aniso, CM2 QuadMesh, CM2 QuadMesh Aniso

  • settings_type::target_metric was discarded when settings_type::structured_pattern (resp. settings_type::structured_flag) was set. Now it’s the opposite. Structured meshing is discarded when a valid target metric is set.
    You still cannot force a structured mesh and a target metric altogether.

CM2 SurfRemesh T3, CM2 SurfRemesh Q4

  • The max_gradation parameter is split into max_gradation_1d (to cap gradations along skeleton lines) and max_gradation_2d (to cap gradations inside patches).
    Mesh sizes are linearly interpolated along skeleton lines when max_gradation_1d = 0 and inside patches when max_gradation_2d = 0.
  • The max_gradation parameter was used to smooth the user-defined metrics. This is no longer the case.
    The remesher now follows the user-defined metrics as they are defined. max_gradation_1d is still used to smooth metrics induced by curvature chordal control (induced by max_chordal_error).
    max_gradation_2d is still used to smooth mesh sizes towards target_h (if specified).


  • meshtools::shape_qualities for several connectivity matrices removed (can be replaced simply by appending successively the shape-qualities vector for each connectivity matrix).
  • meshtools::merge: slight change in merging order and in default parameters.