CM2 FEM® SDK /release 5.7.0 Preview 2

by | May 13, 2026

  • 5.7.0 Preview 2
  • May 2026.
  • 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.

/caveats

  • Major version. Due to changes in the API, client applications must be recompiled against the new headers.
  • Lib names now end with _57 (Windows®), 5.7.0 with symlinks from 5.7 (Linux®, macOS®).
  • New Visual Studio 2026 builds.
  • Visual Studio 2017 deprecated.
  • Last version with Visual Studio 2010 builds. The Visual Studio 2015 builds shall be the legacy builds for the next series (5.8) and beyond.

/new features

Laws

  • All laws
    • New members (inherited by all child law classes) to manage element-specific (formerly called element-by-element) data: get_data, nbr_specific_data, has_specific_data, remove_specific_data.
      Note that members reserve_elements and set_element_by_element have been deprecated and should be replaced with reserve_specific and set_specific_data (see Breaking Changes below).
  • law_shell_laminated
    • New member get_integrated_elasticity_matrix to retrieve the elasticity matrix integrated through all plies (all ply laws considered in their elastic state).
    • The constructors and initialisation members now accept multipliers on each diagonal term of the elasticity matrix (multipliers vector of size 8).
      Previously only two transverse-shear factors could be specified. Now multipliers can also be specified on the membrane terms and on the bending terms of the elasticity matrix (diagonal terms only).
  • law_shell_solid
    • The constructors and initialisation members now accept multipliers on each diagonal term of the elasticity matrix (multipliers vector of size 8). Same as above for law_shell_laminated.
  • law_solid_uncoupled
    • New law for solids made of three (distinct) scalar laws (any law_scalar elastic or elasto-plastic), one for each direction.
      The elasticity matrix D is diagonal with the first three values defined by the three scalar laws. The shear moduli are constant.
      This kind of law can be useful to model rebars embedded in concrete (or even concrete itself).
      → As any other solid law, this one can also be used in the law_shell_solid adapter to be used in plates/shells/laminates models.

Solvers

  • All solvers
    • New outputs data_type::warning_NM_ID and data_type::warning_FE_ID to return the first dubious model and element IDs encountered.
      When data_type::warning_code = FEM_JACOBIAN_WARNING, these IDs can help pinpoint the elements with null or negative jacobian (only the first one is reported).
      Note that FEM_JACOBIAN_ERROR has been replaced with the new FEM_JACOBIAN_WARNING (see Breaking Changes below).
  • solver_static_Newton
    • New automatic pseudo-time stepping to help convergence in difficult cases (highly non-linear systems), the solver can automatically reduce the pseudo-time increment (settings_type::dt) or on the opposite, increase it when convergence is easy to reach the final time faster.
      The ratios settings_type::dt_cutback_factor (default = 0.25) and settings_type::dt_increase_factor (default = 1.50) together with the bounds settings_type::dt_min and settings_type::dt_max can be used to control the stepping.
      Automatic pseudo-time stepping also works with Displacement-Control.
      To disable automatic pseudo-time stepping and return to equal increments, set the above factors to 1.
    • New data_type::potential_energies array (similar to data_type::elastic_energies) to give the potential energies associated to the solution snapshots.
      Potential energy (usually negative) = elastic energy – work of external forces.
  • elementary_server
    • New Cauchy tensors outputs Cauchy_E (total strains), Cauchy_Ee (elastic strains), Cauchy_Ep (plastic strains) and Cauchy_S (stresses) at each integration points (tensors expressed in the local bases).
      For beams (resp. plates/shells/laminates), these tensors are computed at the points with section (resp. thickness) coordinates specified in the new settings_type::Q matrix (no computed tensor when this Q matrix is left empty).
  • solver_least_squares
    • Now accepts the new physics FEM_NODES_CAUCHY_STRAINS, FEM_NODES_CAUCHY_PLASTIC_STRAINS and
      FEM_NODES_CAUCHY_STRESSES to smooth Cauchy tensors at nodes.
      For beams (resp. plates/shells/laminates), these tensors are computed at the points with section (resp. thickness) coordinates specified in the new settings_type::Q matrix (no computed tensor when this Q matrix is left empty).
      Prefer post_processor_1d for beams which gives exact results on linear beams.
      Should now be used in place of the deprecated Cauchy_stresses which has limitations (stress only, approximative in elasto-plastic models).
  • post_processor_1d
    • New outputs E_loc (resp. E_glob) to give the diagram of the resultant strains in the element (resp. global) basis.
    • New outputs Cauchy_E_loc and Cauchy_S_loc (resp. Cauchy_E_glob and Cauchy_S_glob) to give the 3-D Cauchy tensors in the element basis (resp. in the global XYZ basis).
      These strain/stress tensors are computed at the points with coordinates in section specified in the new settings_type::Q matrix (no computed tensor when this Q matrix is left empty for beams).
      For rods, the tensors are always computed (only one axial component in the local basis) whatever the Q matrix.
    • New p-delta corrections based on an iterative scheme with additional p-delta momentums (products of the axial force with the deflections).
      These p-delta corrections provide a cost-effective way to get some basic non-linear effects even with linear beams.
      But note that they usually don’t respect static equilibrium at the nodes (with other connected beams) and don’t account for all geometric non-linearities.
      For static equilibrium and higher accuracy, use fully non-linear beams (model_beam_gnl), a non-linear solver solver_static_Newton),
      meshed segments (at least two elements along each segment) and preferably high-order elements such as CM2_EDGE4.
      These p-delta corrections are provided (can be disabled) for linear and non-linear beams models. Null for rods.
  • solver_reactions_heat
    • New solver to compute heat flow imbalances (similar to solver_reactions to compute force/momentum imbalances in mechanical problems).

Elasto-plasticity

  • The former Von-Mises laws have been expanded into Drucker-Prager (associated) laws with an additional beta parameter on the hydrostatic/trace part of the stress tensor
    (causing some parameters order changes in the initialisation functions, see Breaking Changes below):
    • scalar laws: law_scalar_ep_perfect, law_scalar_ep_piecewise_linear, law_scalar_ep_power and law_scalar_ep_RambergOsgood.
    • 1-D laws: law_spring_ep_perfect, law_spring_ep_piecewise_linear, law_spring_ep_power and law_spring_ep_RambergOsgood.
    • 3-D laws: law_solid_ep_perfect, law_solid_ep_piecewise_linear, law_solid_ep_power and law_solid_ep_RambergOsgood.

    The Von-Mises behaviour can be retrieved by setting the beta parameters to 0.
    → We recall that on top of solid models, all 3-D laws can be used with axi-3d, axi-torsion, plane-strains and plane-stresses (i.e. plate/shell/laminates) models.

  • New helper functions law_scalar_ep_piecewise_linear::Se_to_Rp (resp. law_scalar_ep_piecewise_linear::Ke_to_Rp) to convert piecewise-linear sigma(eps) curves (resp. stiffness(eps)) into R(p) flow rule curves.
    A plastic flow rule curve R(p) is now required in any piecewise-linear elasto-plastic law (see Breaking Changes below).

Thermal analysis

  • The conductivity/capacity/convection laws (scalar) were considered constant (independent of the temperature).
    Now you can use law_scalar_nl or law_scalar_power as temperature-dependent conductivity laws in model_heat_conduction_1d, model_heat_conduction_2d, model_heat_conduction_3d, as heat capacity laws in model_heat_capacity_1d, model_heat_capacity_2d, model_heat_capacity_3d and as convection laws in model_heat_convection_1d and model_heat_convection_2d.
    Note however that with no thermal non-linear solver available so far, this feature is only useful with successive static linear thermal analyses with updated initial temperature solutions.
  • New solver_reactions_heat to compute heat flow imbalances (similar to solver_reactions to compute force/momentum imbalances in mechanical problems). See above.

Miscellaneous

  • FEM_matrix
    • New range member to get the range (min and max) of values for a given field type and column.

/improvements

Solvers

  • solver_static_Newton
    • Very significant improvements in the convergence speed (number of iterations divided by 2 or more) with elasto-plastic plates/shells/laminates models.

/fixes

Laws

  • All laws
    • law_base::set_element_by_element didn’t work when trying to reset the element’s data to the common data.
  • law_shell_solid, law_shell_laminated
    • Bug with thermal loads.
    • Convergence at local Gauss points could fail.
  • law_beam_StVenant
    • Error on loads when offset in the constitutive law (again).

Solvers

  • elementary_server
    • Errors in the elementary_server::data_type::X matrix (plastic strains and cumulative plasticity).
  • solver_static_linear
    • Failed to solve with a FEM_NUMERIC_ERROR in very specific cases (several load cases + prescribed DOFs + no free DOFs in some load cases).
  • solver_least_squares
    • Smoothing element by element in elasto-plastic models could trigger a quadratic time complexity with respect to the total number of elements in the model (instead of linear complexity).
      Similar to the fix in 5.5.2, but this time specific to models with elasto-plastic constitutive laws.
  • solver_reactions, solver_stress_1d
    • Bug with data_type::load_factors.
  • post_processor_1d
    • Errors in deflection/rotation diagrams on beams with momentums (punctual, uniform, trapeze).
    • Errors in deflection diagram on beams with trapeze loads.
    • Errors on tapered beams with evolution functions or initial thermal stresses.

Miscellaneous

  • As usual, doc fixes, update of the manuals, update of the tutorials.

/breaking changes

Laws

  • All laws
    • Members law_base::reserve_elements and law_base::set_element_by_element have been deprecated and should be replaced with law_base::reserve_specific and law_base::set_specific_data.
  • law_scalar_unsym
    • New scalar law replacing the former law_scalar_ep_perfect_unsym and law_scalar_ep_piecewise_linear_unsym.
      This new law accepts any law_scalar (elastic or elasto-plastic) in each of the two directions (traction and compression).
      You can mix for instance a law_scalar_ep_piecewise_linear in traction and a linear (constant) law_scalar (or none) in compression.
  • All elasto-plastic laws
    • The number of expected parameters (one additional beta parameter for the Drucker-Prager behaviour) and their order have changed in the initialisation functions (constructors and init members).
  • law_scalar_ep_piecewise_linear, law_rod_ep_piecewise_linear, law_solid_ep_piecewise_linear
    • Previously, the constructors/initializers required a stiffness curve (as a pair of ‘Es’ + ‘Ks’ vectors of same size or as a 2-column matrix).
      To cope with Drucker-Prager plasticity, they now require a plasticity flow curve R(p) defined by plasticity thresholds ‘Ps’ and flow values ‘Rs’ (as two vectors or as a 2-column matrix).
      Conversion helpers are provided to convert K(e) and S(e) curves into R(p) curves (Von-Mises only): 

      • int Ke_to_Rp (const DoubleVec& Es, const DoubleVec& Ks, DoubleVec& Ps, DoubleVec& Rs);
      • int Se_to_Rp (const DoubleVec& Es, const DoubleVec& Ss, DoubleVec& Ps, DoubleVec& Rs);

Solvers

  • All solvers
    • FEM_JACOBIAN_ERROR has been replaced with the new FEM_JACOBIAN_WARNING.
      As a result, a bad jacobian in an element no longer aborts immediately the solvers but now only raises this warning (and records the IDs of first such an element).
      However, note that bad jacobian(s) may cause the solvers to fail later on with another error (such as FEM_PIVOT_ERROR or a FEM_CONVERGENCE_ERROR).
  • elementary_server
    • data_type::E (resp. data_type::S) renamed data_type::E_loc (resp. data_type::S_loc) for clarity and consistency with new post_processor_1d::data_type::E_loc.
  • solver_static_Newton
    • The default value for the settings_type::output_period has changed from 1 to 0.
      This implies that the solution is no longer stored at each time step but now only at the _final_ time step.
      Set output_period = 1 to get back the previous behaviour. 
    • The convergence criterion on energy has changed from elastic energy to potential energy and the setting name settings_type::tol_E has been replaced with settings_type::tol_J.
    • The convergence thresholds settings_type::tol_U, settings_type::tol_F and
      settings_type::tol_J (former settings_type::tol_E) have been relaxed from 1E-6 to 1E-5.
      The former values appeared to be unnecessary too stringent (especially when elasto-plasticity is involved).
      For the same reason, the settings_type::min_E value has been relaxed from 1E-12 to 1E-10.
      A few Newton iterations can be saved with these relaxed thresholds (sometimes more when elasto-plasticity is involved).

Elasto-plasticity

  • The number of expected parameters (one additional beta parameter for Drucker-Prager behaviour) and their order have changed in the initialisation functions (constructors and init members).
  • law_scalar_ep_piecewise_linear, law_rod_ep_piecewise_linear, law_solid_ep_piecewise_linear:
    Previously, the constructors/initializers required a stiffness curve (as a pair of Es + Ks vectors of same size or as a 2-column matrix).
    To cope with the new Drucker-Prager plasticity, they now require a plasticity flow curve defined by plasticity thresholds Ps and flow values Rs (also as two vectors or as a 2-column matrix).
    A conversion helper is provided to convert the former into the latter: int PR_curve (const DoubleVec& Es, const DoubleVec& Ks, DoubleVec& Ps, DoubleVec& Rs);

Miscellaneous / Deprecations

  • Cauchy_stresses is now deprecated (stress tensors only, approximative for elasto-plastic models) and should be replaced with the new outputs of elementary_server, solver_least_squares or post_processor_1d.
    The first two solvers can now smooth also the plastic strains at nodes.