CM2 FEM® Engines /release 4.2.0

by | Jun 1, 2016

  • 4.2.0
  • June 2016
  • 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 _42 for this series.
  • Visual Studio 2008 is deprecated and will be no longer supported in future versions.
  • Windows XP is deprecated and will be no longer supported in future versions.

/new features

  • New experimental solver_Z_impedance to compute complex solutions of impedance problems such as Kz U = F where:
    • Kz = K + i * omega * (D + G) - omega2 * M: complex impedance matrix.
    • K, D, M: Stiffness, damping and mass matrices (real and usually symmetric, but here can have skew-symmetric contributions also).
    • G: Gyroscopic damping matrix (real skew-symmetric).

    At present this solver uses a global full square complex matrix (memory usage of O(N2) and factorizing time complexity of O(N3)) limiting the practical size of the problems to below a few hundreds DOFs.

  • New solver_static_linear::operating_mode_type::stabilization_flag to forces the stabilization of the system by replacing null or negative factorization pivots with (arbitrary) positive ones.
    A FEM_PIVOT_WARNING is then issued (instead of a FEM_PIVOT_ERROR). But the solutions usually contain combinations (possibly non reproducible) of rigid-body motion modes.
  • New FEM_Zmatrix similar to FEM_matrix but for std::complex<double>.
    Matrices of this class are used in solver_modal_gyroscopic and solver_Z_impedance.
  • New symmetry parameter in the initialisers of fem:stiffness_sym, fem:mass_sym (similar to damping_sym) to allow for skew-symmetric matrices.
    At present, skew-symmetric matrices are only taken into account by solver_Z_impedance (discarded by other solvers).
  • problem_data: new get_pos_matrix and set_pos_matrix members.
  • New context::set_LLC_size to set manually the last-level cache (LLC) size used by the CM2 solvers. For experimented users only.


  • All solvers:
    • OMP critical sections have been replaced with OMP locks.
      The net effect is that concurrent solvers (working on different intern matrices) are no longer blocked by each other, resulting in better parallel efficiency.
  • solver_stress_nodal:
    • Assemblage is now OMP-parallelized.
  • CM2 FEM (whole library):
    • Port to Intel C++ Composer 16.0, GCC 6.1, clang 3.8.
    • Doc fixes and improvements.


  • All solvers:
    • Potential performance issue when OOC is activated.
  • solver_modal_LDRV:
    • Exited with a FEM_DATA_ERROR when a load case gave no static nor kinetic energy.
  • Doc typos.

/breaking changes

  • FEM_matrix: matrices are now forced to be all in-core (out-of-core management is now disabled for these matrices).
    This could have led to data races or crashes when OOC matrices were accessed concurrently by user.
    A FEM_MEMORY ERROR is now raised when such a matrix could not be stored fully in-core.
    However, solvers still use OOC internally (when enabled by user through context::memory_management).
  • solver_modal_gyroscopic:
    • FEM_matrix D1_modes (resp. damping corrections DD1_modes) replaced with complex FEM_Zmatrix D_modes (resp. damping corrections DD_modes).
      I.e., the former real and imaginary columns are merge into std::complex<double> columns (halving the number of columns).
    • The number of requested modes should be halved in operating_mode_type::nbr_modes with respect to prior versions.
    • The velocities matrix D2_modes is removed (still computed internally but released after the computations).
      If needed, the user can easily compute the velocities multiplying the displacement D_modes with i * omega.
    • The damping correction to velocities matrix DD_modes is removed also.