CM2 FEM® SDK /release 5.5.0 Preview 2

by | Apr 11, 2024

  • 5.5.0 Preview 2
  • April 2024.
  • Major release of the CM2 FEM® SDK.
  • All CM2 FEM® SDK.
  • Due to changes in the API, client applications must be recompiled against the new headers.


  • Major version. Due to changes in the API, client applications must be recompiled against the new headers.
  • Lib names now end with _55 (Windows), 5.5.0 with symlinks from 5.5 (Linux, macOS).
  • Visual Studio 2015 deprecated. Builds no longer provided.

/new features

4-node edge elements

New 4-node edge elements (CM2_EDGE4) with physic models:

  • Mechanical beams: fem::model_beam_lin, fem::model_beam_gnl.
  • Masses: fem::model_beam_mass, fem::model_line_mass.
  • Thermal: fem::model_heat_capacity_1d, fem::model_heat_conduction_1d, fem::model_heat_convection_1d.
  • Special: fem::model_distributed_spring_1d.

Mostly useful for curved elements and for non-linear beams (curved or straight).
We recall that all the non-linear beam formulations in CM2 FEM (2-node, 3-node and this new 4-node) take into account all kinds of non-linearity (large strains, large rotations, all geometric stiffness effects).
However the drawback of the 2-node non-linear formulation (and to a lesser extent also of the 3-node one) is that it needs refined meshes even with small displacements/rotations (i.e. when linear Euler-Bernoulli/Timoshenko solutions are expected).
These new 4-node edge formulations (linear and non-linear) have no such drawback.
When displacements/rotations are small, they give similar results and are as accurate as the 2-node linear formulation (i.e. they don’t need refined meshes).
Note however that, with large strains and large rotations (and with modal and buckling analyses), refined meshes are still needed whatever the formulation (2-, 3- or 4-node).

2-node edge semi non-linear beam mechanical model

The new fem::model_beam_gnls model is intermediate between fem::model_beam_lin (linear but with a simple geometric stiffness matrix for Euler buckling analysis) and fem::model_beam_gnl (fully non-linear).
It has a large-strains model (Green-Lagrange strain tensor) but a small-transformation model (small displacements and small rotations).
It has a non-linear tangent stiffness matrix which is the sum of the initial stiffness matrix (constant) and the simple geometric stiffness matrix of the linear model.

Generalized hard offsets

fem::numerical_model_base::set_hard_offsets has been overhauled and now works for any kind of mechanical model defined on a mesh (rod, beam, plate, shell, solid). Used to work on rods/beams only.
In addition, it has been simplified (faster and smaller memory usage).
But note that parameters order has changed for the overload specific to beams/rods (see Breaking Changes below).

Relaxations along lines

The new fem::hinge_line is mostly useful for boundaries of plates/shells but works for any kind of mechanical model defined on a mesh (rod, beam, plate, shell, solid).
To be expressed in the global frame only and along a line.

Punctual contact with friction

The new fem::contact_friction_punctual class models a contact between two nodes along a specific direction (one-way or bidirectional) and with friction restraint (DISPLACEMENT or ROTATION) in the perpendicular directions.
This model uses the Pure Penalty Method (the Augmented Lagrange Method defaults to PPM at present for this model).

fem::solver_modal, fem::solver_buckling_Euler

  • New settings_type::max_subspace_size_ratio (experts only) to limits the size of the iteration subspace (hence the computational time) in cases of finite search ranges. See Fixes below.


  • New fem::solver_static_Newton::settings_type::min_iters_per_step to force a minimum number of iterations in each step (even when convergence is granted).


  • With the new axial_code, the beam can resist only traction (axial_code > 0), only compression (axial_code < 0) or both (axial_code = 0, i.e. the regular behaviour).
    This on/off behaviour is based on the sign of the axial strain.


  • New members fem::DOFs_mgr::nbr_fictitious_DOFs and fem::DOFs_mgr::nbr_fictitious_nodes.


  • Member elementary_load::sanity is now inline (hence is now exported).

fem::FEM_states, fem::FEM_Zstates

  • Added missing overloaded clear members.


  • New member reserve to reserve space in the composite for numerical models (to avoid reallocations and memory fragmentation).
  • New constructor with one model.


  • New reserve_elements (inherited) to reserve space in the law for element-by-element data (to avoid reallocations and memory fragmentation).


  • New members reserve_NM_Neumann_loads, reserve_node_Neumann_loads and reserve_node_Dirichlet_loads to reserve space in the manager for loads (to avoid reallocations and memory fragmentation).


  • New reserve to reserve space in the manager for evolution functions (to avoid reallocations and memory fragmentation).

fem::spring_directional, fem::link_directional, fem::link_directional_gnl

  • New constructors and init members with fewer default values.



  • The displacement/rotation diagram now takes into account the transverse shear effects (Timoshenko theory) and the variations of sections/inertias (linear variations only). It used to neglect the transverse shear effects and approximate the sections/inertias to the averaged values.
    The diagrams are now exact under these assumptions (uniform or linear variations of sections/inertias). The displacements/rotations at nodes remain exact under the same assumptions.
  • Distributed momentums (axial or not, uniform or trapeze, on constant or linearly varying sections/inertias) are now fully supported.

fem::model_beam_lin with CM2_EDGE2 elements

  • Now exact results (were approximated) with distributed momentums (axial or not, uniform or trapeze, constant or linearly varying sections/inertias).
  • Rewritten geometric stiffness matrix (used with fem::solver_buckling_Euler) with slightly more accurate bending and transverse shear effects (and slight speed-ups in the assembly times).


  • Improvements in documentation, update of the manuals, update of the tutorials.



  • Loads on fem::numerical_model_load_only weren’t taken into account.
  • Lagrange multipliers are now stored in the fem::FEM_states solutions (alongside with other data such as elasto-plastic constitutive law parameters, penalty factors…) and taken into account by fem::solver_reactions.
    Note that Lagrange multipliers are produced by some solvers (at present fem::solver_static_linear, fem::solver_static_Newton,
    fem::solver_condensation_static and solver_heat_static_linear) when Augmented Lagrange Method is used settings.method_code > 0).

fem::solver_modal, fem::solver_buckling_Euler

  • A high number of modes in finite search ranges could seriously slow down the iteration process (which is quadratic wrt the number of modes).
    The new settings_type::max_subspace_size_ratio (see New features above) caps the dimension of the iteration subspace, hence limits the resolution time (but with the risk of a FEM_MISSING_MODES_WARNING because of some missing extreme modes in the range).

fem::solver_modal, fem::solver_buckling_Euler, fem::solver_static_Newton

  • Spurious FEM_PIVOT_WARNING could be raised.


  • Convergence issues on free-free models (when no restraint).


  • Crashed on empty problems (when the number of DOFs equals zero).

/breaking changes


  • Parameters order have changed for the beam/rod specific overload (pos matrix).


  • Replaced with classes fem::hinge_punctual and fem::hinge_line.


  • Renamed into fem::hinge_punctual.
  • Parameter types and order have changed.


  • Renamed into fem::soft_offsets_punctual.
  • Parameter types and order have changed.

fem::law_spring, fem::law_spring_nl, law_spring_ep_perfect, law_spring_ep_piecewise_linear, law_spring_ep_power, law_spring_ep_RambergOsgood

  • Deprecated.
    Use fem::law_rod, fem::law_rod_nl, law_rod_ep_perfect, law_rod_ep_piecewise_linear, law_rod_ep_power, law_rod_ep_RambergOsgood now.
    Typedefs to the old names have been added for backward compatibility.

fem::distributed_spring_1d, fem::distributed_spring_2d

  • Now use fem::law_scalar instead of law_spring (or the new law_rod).

fem::model_beam_lin::set_simplified_Kg_flag (resp. get_simplified_Kg_flag)

  • Renamed fem::model_beam_lin::set_Kg_code (resp. get_Kg_code). Same for fem::model_beam_gnl.
    The former boolean flag is replaced with an unsigned code allowing more choices (the default value is now 2 with same effects as the previous default false):

    • 0 : The geometric stiffness matrix is considered null.
    • 1 : The geometric stiffness matrix due to axial force only (no effects due to the bending momentums or transverse shear forces).
    • 2+: The geometric stiffness matrix due to all resultant forces and momentums (axial force, bending momentums and transverse shear forces).


  • Field data_type::outputs type changed from fem::FEM_matrix to fem::FEM_states.


  • Field data_type::initial type changed from fem::FEM_matrix to fem::FEM_states.

fem::rigid_body_lin, fem::rigid_body_gnl

  • Member init with two arguments (one with default) replaced with a three-argument version (nodes, thermal expansion ratio and R-coupling flag).