CM2 MeshTools® Suite /release 5.0.0

by | Aug 12, 2020

  • 5.0.0.
  • August, 2020.
  • 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 _50 for this series (unified with CM2 FEM).
  • The name of several tools have changed:
    • For CM2 TriaMesh Iso, CM2 QuadMesh Iso, CM2 TetraMesh Iso and CM2 HexaMesh Iso: ‘_iso‘ should
      be added now to the include file, the namespace and the lib names.
      For instance, you should now include triamesh_iso.h, use namespace cm2::triamesh_iso,
      link against cm2triamesh_iso_x64_50.lib and run with cm2triamesh_iso_x64_50.dll (for the Win x64 build).
    • For CM2 SurfRemesh T3 and CM2 SurfRemesh Q4: ‘_‘ should be removed between surf and remesh.
      You should include now surfremesh_t3.h, use namespace cm2::surfremesh_t3,
      link against cm2surfremesh_t3_x64_50.lib and run with cm2surfremesh_t3_x64_50.dll (for the x64 build).
    • Same for CM2 SurfMesh T3 and CM2 SurfMesh Q4: ‘_‘ should be removed between surf and mesh.
  • Port to gcc 10 and clang 10 with new builds (Linux 32/64 and macOS).
  • LInux gcc 5.3 builds removed.
  • Visual Studio 2010 and gcc 4.8 are deprecated and will be no longer supported in future versions.

/new features

All meshers

  • Background meshes and target_metric are no longer mutually exclusive.
    The metric sizes of the background mesh will apply on the part covered by the background mesh and the rest of the domain will tend to the target_metric mesh size (with progressive gradation controlled by max_gradation).

CM2 SurfMesh T3/Q4 (still experimental)

  • The mesh sizes along curves are now affected by proximity to other curves making the meshes smoother.
  • The mesh sizes along surfaces are now affected by curvatures of adjacent surfaces making the meshes smoother.
  • Now able to generate quadratic elements (T6, Q8, Q9, Q8T6 and Q9T6).
    This feature is controlled by the new settings_type::high_order_type (defaults to linear elements as before) and settings_type::high_order_mode (defaults to high-order nodes positioned onto the surfaces).
  • The CAD kernel is now wrapped in a single interface making the port to different kernels easier.
    At present only the interface to Open CASCADE® is provided.
  • The generation is now OMP-parallelized (loop over the surfaces).
    This is beneficial for CAD models with more than one surface. A 2x to 4x speed-up can be expected on most models (with several surfaces and a CPU with >= 4 cores).
  • New output data_type::connectE for the edge meshes along the curves.
  • New output data_type::colorsE for the curve IDs associated to the curve edges (similar to data_type::colors for the surface IDs associated to the face elements).
  • Port to Linux and macOS

CM2 SurfRemesh T3/Q4

  • The remeshing step (usually the longest step) is now OMP-parallelized (loop over the patches).
    This is beneficial for models with more than one patch. A 1.5x to 3x speed-up can be expected on most models (with several patches and a CPU with >= 4 cores).
    Note that the partitioning step and the final optimization step are still to be parallelized.


  • New meshtools::eigen_values functions to compute Eigen values only of 2×2 symmetric and 3×3 symmetric matrices.


All meshers

  • Speed-ups and reduced memory consumption in the optimization step for big meshes (more than 1E6 elements).
  • Speed-ups with very numerous subdomains (noticeable when over several hundreds).

CM2 TetraMesh Iso/Aniso

  • Faster hard-constraints enforcement scheme with much fewer Steiner nodes.

CM2 SurfMesh T3/Q4 (still experimental)

  • Mesh quality improvements on periodic surfaces with singularities (spheres, cones…)

CM2 SurfRemesh T3/Q4

  • Some speed-ups on one thread (10 % on average, on top of OMP parallelization).

CM2 SurfRemesh Q4

  • Much fewer quads in all-quad mode on difficult cases.


All meshers

  • Minor fixes (data_type::hard_edges_out, data_type::hard_faces_out, cosmetics…)

CM2 TriaMesh Iso/Aniso, CM2 QuadMesh Iso/Aniso, CM2 TetraMesh Iso/Aniso

  • Repulsive points didn’t work well.

CM2 QuadMesh Iso/Aniso

  • Grid-like (i.e. structured) meshes were generated sometimes where a Delaunay mesh would have been more suitable and conversely.

CM2 SurfMesh T3/Q4 (still experimental)

  • The isotropic chordal control (settings_type::chordal_control_type = 1 or 3) was bogus giving quite bad meshes.

CM2 SurfMesh Q4 (still experimental)

  • Triangles were not gathered at the end of the data_type::connectM matrix but interleaved between quads (when settings_type::all_quad_flag = false).
    Consequently, the member data_type::extract (DoubleMat& pos, UIntMat& connectQ, UIntMat& connectT) was bogus.
  • In all-quad mode: could completely fail on periodic surfaces with singularities (now allows a few triangles and reports a CM2_DEGENERATED_ELEMENT).

CM2 SurfRemesh T3/Q4

  • Flat surfaces could be strangely partitioned leading to bad remeshings (stitches across the surfaces).
  • Problem with user-defined metrics along skeleton lines.
  • Some output skeleton edges could be degenerated or even pathological (IDs equal to -1).

CM2 Layers 2D

  • Fix irregular strange layers in some cases (curved boundaries with shallow convex and shallow concave parts).


  • meshtools::get_node_graph: used to consider each element as a clique (all nodes connected).
    This is valid only for simplex types (edge, triangle, tetrahedron).
    A new parameter element_type FE_type was added to deal properly with non-simplex types.
    Note that you can get back the former behaviour (all nodes connected inside each element) by specifying FE_type = CM2_UNKNOWN_ELEMENT_TYPE.

/breaking changes

All meshers

  • data_type::MODE_ERROR is deprecated. Use data_type::SETTINGS_ERROR instead.

CM2 SurfMesh T3/Q4 (still experimental)

  • data_type::nefs_T3 (resp. nefs_Q4, area_T3, area_Q4) replaced with data_type::nefs_T (resp. nefs_Q, area_T, area_Q).
  • The data_type::failed array changed to cm2::UIntVec (was cm2::UIntMat).

CM2 SurfRemesh T3/Q4

  • The formulas for substitutes to default settings_type::min_h and settings_type::max_h have changed. They now take into account also data_type::metrics.
    We still recommend to overwrite min_h and max_h yourself with sound values instead of leaving the defaults (0 and DBL_MAX).
  • data_type::analysis_time replaced with data_type::partition_time.

CM2 Intersect T3

  • The settings_type::fix_flag (default = true) is renamed settings_type::dry_run_flag (default = false).


  • meshtools1d::mesh_curve_param: the template class Curve now requires members Curve::get_tangents and Curve::get_curvatures instead of Curve::get_local_bases and Curve::get_local_curvatures (just name changes).
  • meshtools2d::mesh_surface_param: the template class Surface now requires members Surface::get_tangents and Surface::get_curvatures instead of Surface::get_local_bases and Surface::get_local_curvatures (just name changes).