CM2 FEM® Engines /release 4.3.0

by | Dec 28, 2017

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


  • Lib names suffix is _43 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


  • Can now be initialized also with a mid-surface offset (init with 16 parameters, to be consistent with fem::law_shell_StVenant).

contact_contact, contact_cylinder, contact_sphere

  • New optional penalty parameter En (default = DBL_MAX) to reduce the penalty parameter (the smallest value between En and the default context penalty is used).

contact_cylinder, contact_sphere

  • New optional stabilize_flag (default = true) to remove the geometric stiffness when negative (happens only with radius > 0).


  • New optional context parameter (used to get the max number of threads among others).
    This enables (partial) parallelization of the solver.

solver_Newmark (formerly solver_Newmark_linear)

  • New settings_type::K_update_period to allow updates of the stiffness matrix (useful only when the stiffness is non-linear with respect to the current solution or when the model is evolving with time).
    As the computation and the factorization of the global stiffness matrix K usually outweighs all other computation times, it can be judicious not to update at every time step but only when the current solution has evolved enough to have a significant impact on the stiffness matrix.
    The default is K_update_period = 0 (compute and factorize K only at time = t0 and keep this matrix for all the time steps, as in prior versions of CM2 FEM).


  • New output vector data_type::elastic_energies for elastic energies after each step.

FEM_matrix, FEM_Zmatrix

  • New member set_vector.


  • RTTI enabled (except Math1 vector and matrix classes).
  • Mechanical model classes: default constructors added.


All solvers

  • Better usage of multi-core CPUs when solving multiple right-hand sides.
    This gives very significant speed-ups when the number of DOFs is greater than 100k on the modal solvers (fem::solver_modal, fem::solver_modal_LDRV, fem::solver_buckling_Euler) and on fem::solver_static_linear with multiple RHS.
  • Parallelization of forward-reduction and backward-substitution (i.e. resolution after factorization) for one RHS.
    This gives also some noticeable speed-ups in modal solvers (and to a lower extent to all other solvers).
  • Some noticeable speed-ups in the assembly step in all solvers.
  • The DOFs numbering scheme is now reproducible (i.e. gives the same sequences across platforms/compilers).

Modal solvers (solver_modal, solver_modal_LDRV, solver_buckling_Euler)

  • Better parallelization.

solver_response_spectrum, solver_condensation_static

  • Partial parallelization.


  • Port to Visual Studio 2017.
  • Doc clarifications.


All solvers

  • Degenerated elements in a mesh caused a crash. Now a FEM_MESH_ERROR is raised.
  • Doc fixes.

All solvers with an initial data field

  • Considering a computation near a data_type::initial (assumed equilibrated) displacement solution (such as a modal vibration analysis near an initial solution) and a non-linear model. The initial solution could have been the result of a previous (static) analysis with thermal stresses. In such a case, the solvers didn’t take into account the thermal stresses used to compute the initial solution.
    This non-equilibrated initial solution led to invalid results (in the cases of non-linear models).
    All these solvers are now equipped with a new data_type::initial_stress field. The initial state now takes into account the data_type::initial displacement vector and this new data_type::initial_stress.


  • Fatal errors with out-of-core management (CM2_SYSTEM_MEMORY_ERROR or crash).
  • Erroneous data_type::G_requested_memory upon exit (was always equal to data_type::M_requested_memory).
  • Erroneous data_type::G_assemble_time upon exit (was always equal to data_type::M_assemble_time).

/breaking changes

All solvers

  • Type operating_mode_type renamed settings_type.
  • Field mode renamed settings.
  • data_type::K_assemble_time (and similar) renamed data_type::K_assembly_time.


  • solver_Newmark_linear renamed solver_Newmark as it now allows updates of the stiffness matrix (useful only in the non-linear cases).
    See below.


  • New parameters for the watch_handler_type:
    • double E_energy (current elastic energy).
    • double P_energy (current potential energy).
    • double duNorm (max norm of the increment solution).
    • double fNorm (max norm of the residual).
    • double dE (change of elastic energy).

FEM_matrix, FEM_Zmatrix

  • Parameter the_DOFs_mgr removed from members get_vector and get_vectors (was not used indeed).


  • The default number of threads for each CM2 solver is now set to the number of _physical_ processors, or the omp_get_max_threads value whatever the lowest.
    See cm2::context::set_max_threads.