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
KC0is singular, under loadsfextthat need not be balanced. The rigid-body modes are computed fromKC0with the reference supportbref, the rigid-body accelerations from the mass matrixM, and the displacements relative to the reference support fromfextplus 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
Ndegrees-of-freedom, shape(N, N), symmetric, without supports, e.g. as assembled by theupdate_KC0methods 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 theupdate_Mmethods of the elements, consistent or lumped, plus any point masses. Mass, in units consistent withKC0andfext.- fextnp.ndarray
External force vector, 1-D array of size
N. Force.- brefnp.ndarray
Boolean array of size
N,Trueat the reference degrees-of-freedom, a statically determinate support whose displacements are set to zero: as many as the rigid-body modes left bybfix, e.g. six for a free structure in 3D.- bfixnp.ndarray or None, optional
Boolean array of size
N,Trueat 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 overlapbref. DefaultNone, no such constraint.- return_reactionsbool, optional
Also return the residual
R. DefaultFalse.- rtolfloat, optional
Relative tolerance of the check that the columns of
Phiare rigid-body modes,max|KC0 @ Phi[:, j]| <= rtol*max|KC0|*max|Phi[:, j]|. Default1.e-6.- pivot_rtolfloat, optional
KC0uuis taken as singular when the smallest pivot of its factorization is at mostpivot_rtoltimes the largest. Default1.e-13: a rigid-body mode left free by the supports gives a pivot of the order of the round-off, below1.e-15times the largest, whereas the beam models of the tests, up to 200 elements, and the airplane oftests/test_inertia_relief_ha144a.pyhave ratios above1.e-7.
- Returns:
- unp.ndarray
Displacements relative to the reference support, 1-D array of size
N, zero atbrefandbfix.- 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 inKC0, translational or angular.- Phinp.ndarray
Rigid-body modes, shape
(N, nr), withPhi[bref]the identity matrix: columnjis the rigid-body motion with a unit displacement at thej-th reference degree-of-freedom and zero at the others. The rigid-body accelerations of all the degrees-of-freedom arePhi @ acc, and the d’Alembert forces-M @ Phi @ acc.- Rnp.ndarray
Only with
return_reactions=True. The residualKC0 @ u - fext + M @ Phi @ acc, 1-D array of sizeN: zero at the free degrees-of-freedom; atbref, the reactions of the reference support, zero up to the round-off; atbfix, the reactions of the constraints of the model.
- Raises:
- ValueError
When the shapes do not match, when
brefis empty or overlapsbfix, or whenKC0is not symmetric, seeis_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, seecheck_null_rows_cols(), is not positive definite, with the message oflinear_static(), or is singular up to the round-off, seepivot_rtol; when the reference support is statically indeterminate, i.e. a column ofPhiis not a rigid-body mode, sincebrefhas more degrees-of-freedom than the rigid-body modes; or whenPhi.T @ M @ Phiis not positive definite, i.e. a rigid-body mode has no mass.
See also
pyfe3d.solver.static.linear_staticthe 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 ofbfix, 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
breffirst and those ofbfixsecond 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.
KC0uuis factorized once, as inlinear_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 springsk1andk2, with the forceFat the third mass and the reference support at the first one: the rigid-body acceleration isF/(m1 + m2 + m3), and the spring forcesk1*u[1] = m1*accandk2*(u[2] - u[1]) = (m1 + m2)*accaccelerate 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.]