Static analysis with inertia relief (pyfe3d.solver.inertia_relief)#

apply_inertia_relief() is the linear static analysis of a structure without supports, e.g. an aircraft or a spacecraft in flight, whose loads need not be balanced: the rigid-body accelerations are computed from the mass matrix, and the displacements relative to a statically determinate reference support from the loads plus the d’Alembert forces of these accelerations. The user guide is Inertia relief.

pyfe3d.solver.inertia_relief.apply_inertia_relief(KC0, M, fext, bref, bfix=None, return_reactions=False, rtol=1e-06, pivot_rtol=1e-13)#

Linear static analysis with inertia relief

Solves the linear static problem of an unsupported structure, whose stiffness matrix KC0 is singular, under loads fext that need not be balanced. The rigid-body modes are computed from KC0 with the reference support bref, the rigid-body accelerations from the mass matrix M, and the displacements relative to the reference support from fext plus the d’Alembert (inertia) forces of these accelerations. The reference support must be statically determinate, which is checked.

Parameters:
KC0sparse_matrix

Stiffness matrix of all the N degrees-of-freedom, shape (N, N), symmetric, without supports, e.g. as assembled by the update_KC0 methods of the elements. Force per unit displacement.

Msparse_matrix or np.ndarray

Mass matrix of the same degrees-of-freedom, shape (N, N), e.g. as assembled by the update_M methods of the elements, consistent or lumped, plus any point masses. Mass, in units consistent with KC0 and fext.

fextnp.ndarray

External force vector, 1-D array of size N. Force.

brefnp.ndarray

Boolean array of size N, True at the reference degrees-of-freedom, a statically determinate support whose displacements are set to zero: as many as the rigid-body modes left by bfix, e.g. six for a free structure in 3D.

bfixnp.ndarray or None, optional

Boolean array of size N, True at the degrees-of-freedom constrained by the model itself, set to zero, e.g. a plane of symmetry of a half model, or the degrees-of-freedom of a model in one or two dimensions that are not used. It must not overlap bref. Default None, no such constraint.

return_reactionsbool, optional

Also return the residual R. Default False.

rtolfloat, optional

Relative tolerance of the check that the columns of Phi are rigid-body modes, max|KC0 @ Phi[:, j]| <= rtol*max|KC0|*max|Phi[:, j]|. Default 1.e-6.

pivot_rtolfloat, optional

KC0uu is taken as singular when the smallest pivot of its factorization is at most pivot_rtol times the largest. Default 1.e-13: a rigid-body mode left free by the supports gives a pivot of the order of the round-off, below 1.e-15 times the largest, whereas the beam models of the tests, up to 200 elements, and the airplane of tests/test_inertia_relief_ha144a.py have ratios above 1.e-7.

Returns:
unp.ndarray

Displacements relative to the reference support, 1-D array of size N, zero at bref and bfix.

accnp.ndarray

Rigid-body accelerations \(\ddot{\boldsymbol{\alpha}}\), 1-D array of size nr = bref.sum(): the accelerations of the reference degrees-of-freedom, in their order in KC0, translational or angular.

Phinp.ndarray

Rigid-body modes, shape (N, nr), with Phi[bref] the identity matrix: column j is the rigid-body motion with a unit displacement at the j-th reference degree-of-freedom and zero at the others. The rigid-body accelerations of all the degrees-of-freedom are Phi @ acc, and the d’Alembert forces -M @ Phi @ acc.

Rnp.ndarray

Only with return_reactions=True. The residual KC0 @ u - fext + M @ Phi @ acc, 1-D array of size N: zero at the free degrees-of-freedom; at bref, the reactions of the reference support, zero up to the round-off; at bfix, the reactions of the constraints of the model.

Raises:
ValueError

When the shapes do not match, when bref is empty or overlaps bfix, or when KC0 is not symmetric, see is_symmetric().

numpy.linalg.LinAlgError

When the reference support does not suppress all the rigid-body modes: KC0uu, the stiffness matrix of the free degrees-of-freedom, has a null row or column, see check_null_rows_cols(), is not positive definite, with the message of linear_static(), or is singular up to the round-off, see pivot_rtol; when the reference support is statically indeterminate, i.e. a column of Phi is not a rigid-body mode, since bref has more degrees-of-freedom than the rigid-body modes; or when Phi.T @ M @ Phi is not positive definite, i.e. a rigid-body mode has no mass.

See also

pyfe3d.solver.static.linear_static

the linear static analysis of a supported structure.

Notes

The degrees-of-freedom are partitioned as in Linear static analyses: the known set \(k\), bk = bref | bfix, with zero displacements, and the free set \(u\), bu = ~bk. The \(n_r\) rigid-body modes, the columns of \(\boldsymbol{\Phi}\), satisfy \(\boldsymbol{K}_{C0} \boldsymbol{\Phi} = \boldsymbol{0}\), and a static solution of \(\boldsymbol{K}_{C0} \boldsymbol{u} = \boldsymbol{F}_{ext}\) exists only for loads with \(\boldsymbol{\Phi}^\top \boldsymbol{F}_{ext} = \boldsymbol{0}\), i.e. without a resultant force or moment [3], [4]. With unit displacements at the reference degrees-of-freedom and zero at those of bfix, the rigid-body modes follow from the stiffness matrix, [1], p. 6, Eq. (19):

\[\begin{split}\boldsymbol{\Phi}_k = \begin{bmatrix} \boldsymbol{I} \\ \boldsymbol{0} \end{bmatrix}, \qquad \boldsymbol{\Phi}_u = -\boldsymbol{K}_{{C0}_{uu}}^{-1} \boldsymbol{K}_{{C0}_{uk}} \boldsymbol{\Phi}_k\end{split}\]

with the rows of bref first and those of bfix second in \(\boldsymbol{\Phi}_k\), where \(\boldsymbol{K}_{{C0}_{uu}}\) is positive definite only when the supports suppress all the rigid-body modes [2], Sec. 8.2.5, pp. 726-727. Under steady loads, the structure deforms elastically and accelerates as a rigid body, \(\ddot{\boldsymbol{u}} = \boldsymbol{\Phi} \ddot{\boldsymbol{\alpha}}\); premultiplying \(\boldsymbol{M} \ddot{\boldsymbol{u}} + \boldsymbol{K}_{C0} \boldsymbol{u} = \boldsymbol{F}_{ext}\) by \(\boldsymbol{\Phi}^\top\) gives the rigid-body accelerations [1], p. 6, Eqs. (21) and (22):

\[\boldsymbol{\Phi}^\top \boldsymbol{M} \boldsymbol{\Phi} \, \ddot{\boldsymbol{\alpha}} = \boldsymbol{\Phi}^\top \boldsymbol{F}_{ext}\]

and the displacements relative to the reference support, \(\boldsymbol{u}_k = \boldsymbol{0}\), are [1], p. 7, Eqs. (23) and (24):

\[\boldsymbol{K}_{{C0}_{uu}} \boldsymbol{u}_u = \boldsymbol{F}_{{ext}_u} - \boldsymbol{M}_u \boldsymbol{\Phi} \ddot{\boldsymbol{\alpha}}\]

the free rows of the linear static system with the d’Alembert forces \(-\boldsymbol{M} \boldsymbol{\Phi} \ddot{\boldsymbol{\alpha}}\), whose sum with \(\boldsymbol{F}_{ext}\) satisfies \(\boldsymbol{\Phi}^\top (\boldsymbol{F}_{ext} - \boldsymbol{M} \boldsymbol{\Phi} \ddot{\boldsymbol{\alpha}}) = \boldsymbol{0}\). The reactions are the residual at the known degrees-of-freedom, as in [2], Sec. 4.2.2, Eq. (4.45). Since the residual is zero at the free degrees-of-freedom and \(\boldsymbol{\Phi}^\top \boldsymbol{K}_{C0} = \boldsymbol{0}\), premultiplying it by \(\boldsymbol{\Phi}^\top\) gives that the reactions of the reference support are zero, and the support does not change the strains and the internal forces: another statically determinate support changes \(\boldsymbol{u}\) by a rigid-body motion \(\boldsymbol{\Phi} \boldsymbol{\alpha}\) only. For balanced loads, \(\ddot{\boldsymbol{\alpha}} = \boldsymbol{0}\) and the reference support is a fictitious support of the singular static problem.

KC0uu is factorized once, as in linear_static(), and the factorization gives both \(\boldsymbol{\Phi}_u\) and \(\boldsymbol{u}_u\). The methods for large singular systems without a reference support, which compute the null space of \(\boldsymbol{K}_{C0}\) during the factorization, are discussed in [3], Secs. 1-4.

References

[1] (1,2,3)

Barnett, A. R., Widrick, T. W. and Ludwiczak, D. R., Closed-Form Static Analysis with Inertia Relief and Displacement-Dependent Loads Using a MSC/NASTRAN DMAP Alter, NASA TM-106836, NASA Lewis Research Center, Cleveland, OH, 1995. https://ntrs.nasa.gov/citations/19950013233

[2] (1,2)

Bathe, K. J., Finite Element Procedures, 2nd ed., K. J. Bathe, Watertown, MA, 2014, ISBN 978-0-9790049-5-7.

[3] (1,2)

Farhat, C. and Géradin, M., On the general solution by a direct method of a large-scale singular system of linear equations: application to the analysis of floating structures, International Journal for Numerical Methods in Engineering, 41(4), 675-696, 1998. https://doi.org/10.1002/%28SICI%291097-0207%2819980228%2941%3A4%3C675%3A%3AAID-NME305%3E3.0.CO%3B2-8

[4]

Cavaliere, F., Zlotnik, S., Sevilla, R., Larráyoz, X. and Díez, P., Nonintrusive reduced order model for parametric solutions of inertia relief problems, International Journal for Numerical Methods in Engineering, 122(16), 4270-4291, 2021, Sec. 3, pp. 4274-4275. https://doi.org/10.1002/nme.6702

Examples

Three point masses along \(x\), m = (1, 2, 3), joined by the springs k1 and k2, with the force F at the third mass and the reference support at the first one: the rigid-body acceleration is F/(m1 + m2 + m3), and the spring forces k1*u[1] = m1*acc and k2*(u[2] - u[1]) = (m1 + m2)*acc accelerate the masses on their left, see Tutorial: static analysis with inertia relief.

>>> import numpy as np
>>> from scipy.sparse import csc_matrix
>>> from pyfe3d.solver import apply_inertia_relief
>>> k1, k2, F = 2000., 500., 12.
>>> KC0 = csc_matrix([[k1, -k1, 0.], [-k1, k1 + k2, -k2], [0., -k2, k2]])
>>> M = csc_matrix(np.diag([1., 2., 3.]))
>>> bref = np.array([True, False, False])
>>> fext = np.array([0., 0., F])
>>> u, acc, Phi = apply_inertia_relief(KC0, M, fext, bref)
>>> print(acc, u, Phi.ravel())
[2.] [0.    0.001 0.013] [1. 1. 1.]