# CM2 FEM® SDK /release 5.5.0 Preview 2

- 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.

### /caveats

- 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.

`fem::solver_static_Newton`

- 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).

`fem::law_beam_StVenant`

- 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.

`fem::DOFs_mgr`

- New members
`fem::DOFs_mgr::nbr_fictitious_DOFs`

and`fem::DOFs_mgr::nbr_fictitious_nodes`

.

`elementary_load`

- Member
`elementary_load::sanity`

is now inline (hence is now exported).

`fem::FEM_states`

, `fem::FEM_Zstates`

- Added missing overloaded
`clear`

members.

`fem::numerical_model_composite`

- New member
`reserve`

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

`fem::law_base`

- New
`reserve_elements`

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

`fem::loads_mgr`

- 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).

`fem::evolution_funcs_mgr`

- 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.

### /improvements

`fem::post_processor_1d`

- 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).

#### Miscellaneous

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

### /fixes

`fem::solver_reactions`

- 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.

`fem::solver_modal`

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

`fem::solver_buckling_Euler`

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

### /breaking changes

`fem::numerical_model_base::set_hard_offsets`

- Parameters order have changed for the beam/rod specific overload (
`pos`

matrix).

`fem::numerical_model_base::set_relaxations`

- Replaced with classes
`fem::hinge_punctual`

and`fem::hinge_line`

.

`fem::hinge`

- Renamed into
`fem::hinge_punctual`

. - Parameter types and order have changed.

`fem::soft_offset`

- 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).

`fem::solver_heat_static_linear`

- Field
`data_type::outputs`

type changed from`fem::FEM_matrix`

to`fem::FEM_states`

.

`fem::solver_heat_dynamic_linear`

- 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).