Sanders-type cylinder element (bfsccylinder.bfsccylinder_sanders)#
Sanders-type cylinder element (bfsccylinder.bfsccylinder_sanders)
The module provides the single-curvature BFSC element with Sanders-type
kinematics, the class BFSCCylinderSanders, and the functions
update_KC0(), update_KCNL(), update_KG(),
update_KG_constant_stress() and update_M(), that write the
contributions of one element to the linear constitutive stiffness matrix
KC0, the nonlinear stiffness matrix KCNL, the sum of the nonlinear
constitutive and geometric stiffness matrices \(\boldsymbol{K}_{CNL} +
\boldsymbol{K}_{GNL}\), the geometric stiffness matrix KG and the mass matrix M in sparse row, column and value
arrays, starting at the positions given by its init_k_* attributes, and
update_fint(), that adds its internal forces to a global internal
force vector. For a pressure that follows the deformation of the shell,
update_fext_follower() adds the force vector of one element to a
global external force vector and update_KCfollower() writes its load
stiffness matrix KCfollower in sparse arrays, see the Notes. The row, column
and value arrays of the elements can be gathered in a sparse matrix of
coordinate format, e.g. with scipy.sparse.coo_matrix, which sums the
values at repeated positions.
Each of the four nodes has DOF = 10 degrees of freedom, in the order
\(u\), \(u_{,x}\), \(u_{,y}\), \(v\), \(v_{,x}\), \(v_{,y}\), \(w\), \(w_{,x}\), \(w_{,y}\),
\(w_{,xy}\), where \(x\) is the axial and \(y\) the circumferential coordinate,
and \(u\), \(v\) and \(w\) are the axial, circumferential and normal
displacements. Element vectors of size 4*DOF = 40 have the degrees of
freedom of nodes 1, 2, 3 and 4 in sequence.
The module also defines:
KC0_SPARSE_SIZE = 1600,KCNL_SPARSE_SIZE = 1456,KG_SPARSE_SIZE = 784,M_SPARSE_SIZE = 920andKCfollower_SPARSE_SIZE = 1456: number of entries that one element writes in the row, column and value arrays of KC0, KCNL, KG, M and KCfollower. Fornelements the arrays needntimes these sizes;DOUBLE = np.float64: NumPy type of the arrays of values.
The module bfsccylinder.bfsccylinder has the same contents for the
element with Donnell-type kinematics. Compared with it, the curvatures given
by BFSCCylinderSanders.update_Bb() and used in the matrices and in
the internal forces also depend on the \(u\) and \(v\) degrees of freedom, with
terms divided by R; KG also has the entries of the \(v\) degrees of
freedom (784 instead of 256 entries), and KCNL also the entries that couple
the \(v\) degrees of freedom with themselves and with the \(u\) degrees of
freedom (1456 instead of 1024 entries), M also the entries that couple
the \(v\) and \(w\) degrees of freedom (920 instead of 544 entries), and
KCfollower also the entries of the \(v\) degrees of freedom with themselves
(1456 instead of 1312 entries).
Notes#
The element is the one of the Notes of bfsccylinder.bfsccylinder,
with the same geometry, interpolation, constitutive relation, strain energy,
decomposition of the tangent stiffness matrix and quadrature; the
statements made there on the number of integration points nint hold for
this element too. Only the kinematics differ, and with them the rotary
inertia of the mass matrix. Their linear part is
the one of the thin shell theory of Sanders [1] and Koiter [2], with \(w\)
positive outwards: the linear membrane strains \(\boldsymbol{\varepsilon}_L =
\boldsymbol{B}_m\boldsymbol{u}_e\) are those of the Donnell-type kinematics, and the curvatures
also have terms of \(u\) and \(v\) divided by \(R\):
with \(\boldsymbol{B}_b\) the rows Bb of BFSCCylinderSanders.update_Bb().
With the rotations \(\beta_x = -w_{,x}\) and \(\beta_y = -w_{,y} + v/R\), the
nonlinear membrane strains are those of Sanders [3],
where \(v\), \(w_{,x}\) and \(w_{,y}\) are v, w_x and w_y of the
current displacements in update_KCNL() and update_fint(), the
rows of \(\boldsymbol{B}_{NL}\) are BmL1, BmL2 and BmL3 and those of \(\boldsymbol{G}\)
are G1 and G2, such that \(\delta\boldsymbol{\varepsilon}_{NL} =
\boldsymbol{B}_{NL}\delta \boldsymbol{u}_e\) and \(\boldsymbol{G}\boldsymbol{u}_e = \{w_{,x}, w_{,y} - v/R\}^\top =
-\{\beta_x, \beta_y\}^\top\). Only the rotations \(\beta_x\) and \(\beta_y\) of the
normal enter the nonlinear membrane strains; the rotation about the normal,
\((v_{,x} - u_{,y}/R)/2\), enters only the linear twist \(\kappa_{xy}\).
With the terms in \(1/R\), the strains and the curvatures vanish for the
small rigid-body translation \(w = c \cos(y/R)\), \(v = -c \sin(y/R)\), for
which the Donnell-type curvatures do not, and the linear part is not
restricted to displacements that vary over lengths small compared with \(R\).
Because of the term \(-\boldsymbol{S}^v/R\) of \(\boldsymbol{G}\), KG, the matrix of
update_KG_constant_stress() and KCNL also have entries at the
degrees of freedom of \(v\). The rotary inertia of the mass matrix of
update_M() uses the rotations \(\beta_x = -w_{,x}\) and \(\beta_y =
-w_{,y} + v/R\), such that M also couples \(v\) and \(w\).
The follower pressure of update_fext_follower() and
update_KCfollower() is that of the Notes of
bfsccylinder.bfsccylinder, with the Sanders-type rotation \(\beta_y =
-w_{,y} + v/R\): the tangent vector \(\boldsymbol{X}_{,y}\) of the deformed mid-surface has
the component \(w_{,y} - v/R\) along the normal, such that \(\boldsymbol{X}_{,x} \times
\boldsymbol{X}_{,y}\) is the exact area vector, and \(\boldsymbol{a}_1\) has the term \(v/R\) in its
component along \(y\). The skew part of the load stiffness matrix, and the
conditions under which it is symmetric, are those of the Donnell-type
kinematics, the results of Hibbitt [4] and of Schweizerhof and Ramm [5]
for a pressure that depends on the reference coordinates. With a dead
pressure, the rigid rotation \(v\) = constant of a ring under the hoop
prestress \(N_{yy} = p R\) has the energy \(\int_A N_{yy} (v/R)^2 dA\) in KG,
negative under an external pressure, which gives a spurious buckling mode
at a vanishing load whenever \(v\) is free; the follower load stiffness adds
\(-\int_A p v^2/R \, dA\), which cancels it.
References#
Sanders, J. L., An improved first-approximation theory for thin shells, NASA Technical Report R-24, 1959.
Koiter, W. T., A consistent first approximation in the general theory of thin elastic shells, Proceedings of the IUTAM Symposium on the Theory of Thin Elastic Shells, Delft, 1959, North-Holland, Amsterdam, 1960, pp. 12-33.
Sanders, J. L., Nonlinear theories for thin shells, Quarterly of Applied Mathematics, 21(1), 21-36, 1963, doi:10.1090/qam/147023.
Hibbitt, H. D., Some follower forces and load stiffness, International Journal for Numerical Methods in Engineering, 14(6), 937-941, 1979, doi:10.1002/nme.1620140613.
Schweizerhof, K., and Ramm, E., Displacement dependent pressure loads in nonlinear finite element analyses, Computers & Structures, 18(6), 1099-1114, 1984, doi:10.1016/0045-7949(84)90154-8.
- class bfsccylinder.bfsccylinder_sanders.BFSCCylinderSanders#
Single-curvature BFSC element with Sanders-type kinematics.
Nodal connectivity for cylindrical shell element similar to Nastran’s CQUAD4:
^ y (circumferential direction) | 4 ________ 3 | | | | --> x (axial direction) | | |_______| 1 2
The constructor sets
n1, n2, n3, n4andc1, c2, c3, c4to-1,lex,ley,rho,handRto zero, and allocates every array filled with zeros; theinit_k_*positions are zero. Before the functions of this module are called with the element, the caller setsc1, c2, c3, c4, theinit_k_*positions of the matrices being computed,lex,leyandR, the stiffnessesA11, ..., D66, e.g. withbfsccylinder.utils.assign_constant_ABD(), and, forupdate_M(),rho,handR.- Parameters:
- nintint
Number of integration points in each direction: the size of the
pointsandweightsarrays later given to the functions of this module, which read the stiffness arraysA11, ..., D66at the indices[i, j]from0tonint - 1.
- Attributes:
- n1, n2, n3, n4int
Node identification numbers. Not used by the functions of this module.
- c1, c2, c3, c4int
Position of the first degree of freedom of nodes 1, 2, 3 and 4 in the global vectors and matrices. The
DOFdegrees of freedom of node 1 are at the positionsc1toc1 + 9, and likewise for the other nodes, e.g.c1 = DOF*ifor the node of indexi.- init_k_KC0, init_k_KCNL, init_k_KG, init_k_M, init_k_KCfollowerint
Position in the sparse arrays from which
update_KC0(),update_KCNL(),update_KG()orupdate_KG_constant_stress(),update_M()andupdate_KCfollower()write the entries of the element, e.g. the index of the element timesKC0_SPARSE_SIZE,KCNL_SPARSE_SIZE,KG_SPARSE_SIZE,M_SPARSE_SIZEandKCfollower_SPARSE_SIZE.- lex, leydouble
Length of the element along the axial direction \(x\) and along the circumferential direction \(y\), dimension of length.
- rhodouble
Density, mass per unit volume. Used only by
update_M().- hdouble
Thickness, dimension of length. Used only by
update_M().- Rdouble
Radius of the cylinder, dimension of length. Terms of KC0, KCNL and KG, also of
update_KG_constant_stress(), of the internal forces, of the follower pressure, ofBmand ofBbare divided byR, so it must be set to a nonzero value before these are computed. Also used byupdate_M(), through the term \(v/R\) of the Sanders-type rotation of the normal.- A11, A12, A16, A22, A26, A662-D array
Membrane stiffnesses, force per unit length. Shape
(nint, nint), the entry[i, j]being used at the integration pointxi = points[i],eta = points[j].- B11, B12, B16, B22, B26, B662-D array
Membrane-bending coupling stiffnesses, dimension of force. Same shape and use as
A11.- D11, D12, D16, D22, D26, D662-D array
Bending stiffnesses, force times length. Same shape and use as
A11.- Bm2-D array
Shape
(3, 40), rows giving the linear membrane strains at the last point given toupdate_Bm(). Dimension of one over the dimension of each degree of freedom.- Bb2-D array
Shape
(3, 40), rows giving the curvatures at the last point given toupdate_Bb(). Dimension of one over length times one over the dimension of each degree of freedom.- Su, Sv, Sw1-D array
Size
40, rows giving the displacements \(u\), \(v\) and \(w\) at the last point given toupdate_Su(),update_Sv()andupdate_Sw().- Su_x, Sv_x, Sw_x1-D array
Size
40, rows giving \(u_{,x}\), \(v_{,x}\) and \(w_{,x}\) at the last point given toupdate_Su_x(),update_Sv_x()andupdate_Sw_x().- Su_y, Sv_y, Sw_y1-D array
Size
40, rows giving \(u_{,y}\), \(v_{,y}\) and \(w_{,y}\) at the last point given toupdate_Su_y(),update_Sv_y()andupdate_Sw_y().- u1-D array
Size
40, element displacement vector, copied from the global displacement vector byupdate_KCNL(),update_KG()andupdate_fint(). Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).
Notes
The attributes have the meaning given in the Notes of
bfsccylinder.bfsccylinder.BFSCCylinder, withBbthe operator of the Sanders-type curvatures of the Notes ofbfsccylinder.bfsccylinder_sanders.- update_Bb(xi, eta)#
Update
Bbat a natural coordinate pointThe rows of
Bbare computed atxi,etafromlex,leyandR. Their products with an element displacement vector, e.g.u, give at that point the curvatures \(\kappa_{xx}\), \(\kappa_{yy}\) and \(\kappa_{xy}\) for the rows0,1and2, dimension of one over length. Only the entries that are not identically zero are written, the other entries keep the zeros of the constructor: the row0has entries at the degrees of freedom \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) of the nodes, the row1also at \(v\), \(v_{,x}\), \(v_{,y}\), divided byR, and the row2also at \(u\), \(u_{,x}\), \(u_{,y}\) and \(v\), \(v_{,x}\), \(v_{,y}\), divided byR. The functions of this module do not readBb.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
With the rows of the interpolation of the Notes of
bfsccylinder.bfsccylinder, the rows of the Sanders-type curvatures of the Notes ofbfsccylinder.bfsccylinder_sandersare\[\begin{split}\boldsymbol{B}_b = \begin{bmatrix} -\boldsymbol{S}^w_{,xx} \\ -\boldsymbol{S}^w_{,yy} + \boldsymbol{S}^v_{,y}/R \\ -2 \boldsymbol{S}^w_{,xy} + \frac{3}{2R} \boldsymbol{S}^v_{,x} - \frac{1}{2R} \boldsymbol{S}^u_{,y} \end{bmatrix}\end{split}\]those of
bfsccylinder.bfsccylinder.BFSCCylinder.update_Bb()plus the terms in \(1/R\).
- update_Bm(xi, eta)#
Update
Bmat a natural coordinate pointThe rows of
Bmare computed atxi,etafromlex,leyandR. Their products with an element displacement vector, e.g.u, give at that point the linear membrane strains \(\varepsilon_{xx}\), \(\varepsilon_{yy}\) and \(\gamma_{xy}\) for the rows0,1and2, dimensionless. Only the entries that are not identically zero are written, the other entries keep the zeros of the constructor. The functions of this module do not readBm.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The rows are the same as those of the Donnell-type kinematics, see the Notes of
bfsccylinder.bfsccylinder.BFSCCylinder.update_Bm().
- update_Su(xi, eta)#
Update
Suat a natural coordinate pointSuis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the displacement \(u\) at that point, dimension of length. Only the entries at the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) of the nodes, the positions0, 1, 2plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries of node
i, from 1 to 4, at the positions10*(i - 1) + 0,10*(i - 1) + 1and10*(i - 1) + 2, are the Hermite functions \(H_i\), \(H_{xi}\) and \(H_{yi}\) of the Notes ofbfsccylinder.bfsccylinderevaluated atxi,eta, such that \(u = \boldsymbol{S}^u\boldsymbol{u}_e\).
- update_Su_x(xi, eta)#
Update
Su_xat a natural coordinate pointSu_xis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(u_{,x}\) at that point, dimensionless. Only the entries at the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) of the nodes, the positions0, 1, 2plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial x = (2/l_{ex}) \partial/\partial \xi\) of those of
BFSCCylinderSanders.update_Su(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- update_Su_y(xi, eta)#
Update
Su_yat a natural coordinate pointSu_yis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(u_{,y}\) at that point, dimensionless. Only the entries at the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) of the nodes, the positions0, 1, 2plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial y = (2/l_{ey}) \partial/\partial \eta\) of those of
BFSCCylinderSanders.update_Su(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- update_Sv(xi, eta)#
Update
Svat a natural coordinate pointSvis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the displacement \(v\) at that point, dimension of length. Only the entries at the degrees of freedom \(v\), \(v_{,x}\), \(v_{,y}\) of the nodes, the positions3, 4, 5plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries of node
i, from 1 to 4, at the positions10*(i - 1) + 3,10*(i - 1) + 4and10*(i - 1) + 5, are the Hermite functions \(H_i\), \(H_{xi}\) and \(H_{yi}\) of the Notes ofbfsccylinder.bfsccylinderevaluated atxi,eta, such that \(v = \boldsymbol{S}^v\boldsymbol{u}_e\).
- update_Sv_x(xi, eta)#
Update
Sv_xat a natural coordinate pointSv_xis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(v_{,x}\) at that point, dimensionless. Only the entries at the degrees of freedom \(v\), \(v_{,x}\), \(v_{,y}\) of the nodes, the positions3, 4, 5plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial x = (2/l_{ex}) \partial/\partial \xi\) of those of
BFSCCylinderSanders.update_Sv(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- update_Sv_y(xi, eta)#
Update
Sv_yat a natural coordinate pointSv_yis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(v_{,y}\) at that point, dimensionless. Only the entries at the degrees of freedom \(v\), \(v_{,x}\), \(v_{,y}\) of the nodes, the positions3, 4, 5plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial y = (2/l_{ey}) \partial/\partial \eta\) of those of
BFSCCylinderSanders.update_Sv(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- update_Sw(xi, eta)#
Update
Swat a natural coordinate pointSwis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the displacement \(w\) at that point, dimension of length. Only the entries at the degrees of freedom \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) of the nodes, the positions6, 7, 8, 9plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries of node
i, from 1 to 4, at the positions10*(i - 1) + 6to10*(i - 1) + 9, are the Hermite functions \(H_i\), \(H_{xi}\), \(H_{yi}\) and \(H_{xyi}\) of the Notes ofbfsccylinder.bfsccylinderevaluated atxi,eta, such that \(w = \boldsymbol{S}^w\boldsymbol{u}_e\).
- update_Sw_x(xi, eta)#
Update
Sw_xat a natural coordinate pointSw_xis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(w_{,x}\) at that point, dimensionless. Only the entries at the degrees of freedom \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) of the nodes, the positions6, 7, 8, 9plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial x = (2/l_{ex}) \partial/\partial \xi\) of those of
BFSCCylinderSanders.update_Sw(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- update_Sw_y(xi, eta)#
Update
Sw_yat a natural coordinate pointSw_yis computed atxi,etafromlexandley. Its product with an element displacement vector, e.g.u, gives the derivative \(w_{,y}\) at that point, dimensionless. Only the entries at the degrees of freedom \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) of the nodes, the positions6, 7, 8, 9plus0,10,20and30, are written, the other entries keep the zeros of the constructor.- Parameters:
- xi, etadouble
Natural coordinates of the point, dimensionless, from
-1to1over the element,xialong \(x\) andetaalong \(y\).
Notes
The entries are the derivatives \(\partial/\partial y = (2/l_{ey}) \partial/\partial \eta\) of those of
BFSCCylinderSanders.update_Sw(), with the Hermite functions of the Notes ofbfsccylinder.bfsccylinder.
- bfsccylinder.bfsccylinder_sanders.update_KC0(shell, points, weights, KC0r, KC0c, KC0v)#
Update sparse vectors for linear constitutive stiffness matrix KC0
The element matrix, with
40*40entries, is integrated with the integration points and weights given bypointsandweights, fromlex,ley,Rand the stiffnessesA11, ..., D66ofshell. All its entries are written: the global row and column indices toKC0randKC0c, and the values added toKC0v, at the positionsshell.init_k_KC0toshell.init_k_KC0 + KC0_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_KC0,lex,ley,Rand the stiffnesses ofshellmust be set.- Parameters:
- shell
BFSCCylinderSandersobject The cylindrical shell element being added to KC0
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- KC0rnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_KC0 + KC0_SPARSE_SIZE.- KC0cnp.array
Array to store column positions of sparse values Same type and size as
KC0r.- KC0vnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asKC0r. The values are added to the existing ones. Dimension of force per unit length between the displacements \(u\), \(v\), \(w\), multiplied by a length for each of the row and the column that is a first derivative, and by a length squared for each that is \(w_{,xy}\).
- shell
See also
Notes
The matrix of the Notes of
bfsccylinder.bfsccylinder.update_KC0(), with the rows \(\boldsymbol{B}_b\) of the Sanders-type curvatures ofBFSCCylinderSanders.update_Bb().
- bfsccylinder.bfsccylinder_sanders.update_KCNL(u, shell, points, weights, KCNLr, KCNLc, KCNLv)#
Update sparse vectors for nonlinear stiffness matrix KCNL
The element matrix is integrated with the integration points and weights given by
pointsandweights, fromlex,ley,R, the stiffnessesA11, ..., B66ofshell(theDstiffnesses are not used) and the displacements of the nodes of the element, copied fromutoshell.u. The entries for which both the row and the column correspond to the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) are not written. The global row and column indices of the other entries are written toKCNLrandKCNLc, and their values added toKCNLv, at the positionsshell.init_k_KCNLtoshell.init_k_KCNL + KCNL_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_KCNL,lex,ley,Rand the stiffnesses ofshellmust be set. KC0 + KCNL + KG, computed withupdate_KC0(), this function andupdate_KG()with the sameu,pointsandweights, is the tangent stiffness matrix of the internal forces ofupdate_fint().- Parameters:
- unp.array
Global displacement vector 1-D array of
DOUBLEwithDOFentries per node of the model, in the order of the degrees of freedom of a node given in the module documentation. The entries of the nodes ofshellare read at the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).- shell
BFSCCylinderSandersobject The shell element being added to K
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- KCNLrnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_KCNL + KCNL_SPARSE_SIZE.- KCNLcnp.array
Array to store column positions of sparse values Same type and size as
KCNLr.- KCNLvnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asKCNLr. The values are added to the existing ones, with the dimensions given forKC0vinupdate_KC0().
See also
Notes
Assuming that KCNL = KC0L + KCL0 + KCLL + KGNL, that is \(\boldsymbol{K}_{CNL} + \boldsymbol{K}_{GNL}\): the nonlinear constitutive stiffness matrix \(\boldsymbol{K}_{CNL} = \boldsymbol{K}_{C0L} + \boldsymbol{K}_{CL0} + \boldsymbol{K}_{CLL}\) of the terms of \(\boldsymbol{B}_{NL}\) and the geometric stiffness matrix \(\boldsymbol{K}_{GNL}\) of the membrane stress resultants of the nonlinear strains.
The first three groups are the constitutive terms coupling the linear and the nonlinear parts of the membrane strain. KGNL is the geometric term carrying the stress of the nonlinear membrane strain, A*BmL*u/2.
KGNL is geometric rather than constitutive, and would normally sit in update_KG. It is collected here so that update_KG can stay homogeneous of degree one in u, which is what a linear buckling analysis needs. With it here,
KT = KC0 + KCNL(u) + KG(u)
is the exact Jacobian of the vector assembled by update_fint, so a Newton-Raphson built on these three converges quadratically.
The four terms are those of the Notes of
bfsccylinder.bfsccylinder.update_KCNL(), with the Sanders-type \(\boldsymbol{B}_b\), \(\boldsymbol{B}_{NL}\) and \(\boldsymbol{G}\) of the Notes ofbfsccylinder.bfsccylinder_sanders, evaluated at each integration point withv,w_xandw_yof the element displacementsshell.u, and with \(\{N_{NLxx}, N_{NLyy}, N_{NLxy}\}^\top = \boldsymbol{A}\{w_{,x}^2/2, (w_{,y} - v/R)^2/2, w_{,x} (w_{,y} - v/R)\}^\top\). Since \(\boldsymbol{B}_{NL}\) and \(\boldsymbol{G}\) have entries at the degrees of freedom of \(v\) and \(w\), only the block of the degrees of freedom of \(u\) is zero.
- bfsccylinder.bfsccylinder_sanders.update_KCfollower(u, shell, points, weights, p, KCfollowerr, KCfollowerc, KCfollowerv, quadratic=0)#
Update sparse vectors for the load stiffness matrix KCfollower
The load stiffness matrix of a follower pressure, minus the derivative of the force vector of
update_fext_follower()with respect to the element displacements, is integrated with the integration points and weights given bypointsandweights, fromlex,leyandRofshell, the pressurepat the integration points and the displacements of the nodes of the element, copied fromutoshell.u, which enter only withquadratic=1. The matrix is unsymmetric in general and is written in full, it must not be symmetrized. Only the entries that are not identically zero forquadratic=1are written, for both values ofquadratic: those for which the row corresponds to the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) and the column to those of \(v\) or \(w\), and the row to those of \(v\) or \(w\) and the column to any degree of freedom. The entries between the degrees of freedom of \(u\) and \(v\) are zero forquadratic=0. The global row and column indices are written toKCfollowerrandKCfollowerc, and the values added toKCfollowerv, at the positionsshell.init_k_KCfollowertoshell.init_k_KCfollower + KCfollower_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_KCfollower,lex,leyandRofshellmust be set; the stiffnesses are not used. Withquadratic=0the values do not depend onu.- Parameters:
- unp.array
Global displacement vector 1-D array of
DOUBLEwithDOFentries per node of the model, in the order of the degrees of freedom of a node given in the module documentation. The entries of the nodes ofshellare read at the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).- shell
BFSCCylinderSandersobject The shell element being added to KCfollower
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- pnp.array
Pressure at the integration points 2-D array of
DOUBLEof shape(nint, nint), with the meaning, indices, units and sign given inupdate_fext_follower().- KCfollowerrnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_KCfollower + KCfollower_SPARSE_SIZE.- KCfollowercnp.array
Array to store column positions of sparse values Same type and size as
KCfollowerr.- KCfollowervnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asKCfollowerr. The values are added to the existing ones, with the dimensions given forKC0vinupdate_KC0().- quadraticint, optional
0, the default, or1, the truncation of the area vector ofupdate_fext_follower().
See also
Notes
The load stiffness matrix of the Notes of
bfsccylinder.bfsccylinder.update_KCfollower(), with the area vector ofupdate_fext_follower(), \(k_v = 1/R\). The term \(v/R\) of \(a_y\) adds, withquadratic=0, the block \(-(\boldsymbol{S}^v)^\top \boldsymbol{S}^v/R\) per unit \(p\) between \(v\) and \(v\), which cancels the energy of the rigid rotation \(v\) = constant of a ring under the hoop prestress of the pressure inupdate_KG(), and the terms of \(\boldsymbol{a}_2\) in \(v\) are added forquadratic=1.
- bfsccylinder.bfsccylinder_sanders.update_KG(u, shell, points, weights, KGr, KGc, KGv)#
Update sparse vectors for geometric stiffness matrix KG
The element matrix is integrated with the integration points and weights given by
pointsandweights, fromlex,leyandRofshell. At each integration point the membrane stress resultantsNxx,NyyandNxyare computed from the stiffnessesA11, ..., B66ofshelland from the displacements of the nodes of the element, copied fromutoshell.u. Only the entries for which both the row and the column correspond to the degrees of freedom \(v\), \(v_{,x}\), \(v_{,y}\), \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) are written: the global row and column indices toKGrandKGc, and the values added toKGv, at the positionsshell.init_k_KGtoshell.init_k_KG + KG_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_KG,lex,ley,Rand the stiffnesses ofshellmust be set.Nxx,NyyandNxyare those of the linear strains, such that the values are linear inu; the corresponding term of the nonlinear strains is inupdate_KCNL().- Parameters:
- unp.array
Global displacement vector 1-D array of
DOUBLEwithDOFentries per node of the model, in the order of the degrees of freedom of a node given in the module documentation. The entries of the nodes ofshellare read at the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).- shell
BFSCCylinderSandersobject The cylindrical shell element being added to KG
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- KGrnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_KG + KG_SPARSE_SIZE.- KGcnp.array
Array to store column positions of sparse values Same type and size as
KGr.- KGvnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asKGr. The values are added to the existing ones, with the dimensions given forKC0vinupdate_KC0().
See also
Notes
Built from the membrane stress of the LINEAR strain alone, A*Bm*u + B*Bb*u, which keeps KG homogeneous of degree one in u. A linear buckling analysis needs exactly that, so that lambda*KG represents the stress state at load lambda*P.
The geometric term of the nonlinear membrane stress is therefore NOT here; update_KCNL carries it, so that KC0 + KCNL + KG is still the consistent tangent of update_fint.
The matrix is the \(\boldsymbol{K}_G\) of the Notes of
bfsccylinder.bfsccylinder.update_KG(), with the Sanders-type \(\boldsymbol{B}_b\) in the stress resultants and the rows of \(\boldsymbol{G}\) of the Notes ofbfsccylinder.bfsccylinder_sanders, \(\boldsymbol{S}^w_{,x}\) and \(\boldsymbol{S}^w_{,y} - \boldsymbol{S}^v/R\), such that \(\boldsymbol{G}\boldsymbol{u}_e = \{w_{,x}, w_{,y} - v/R\}^\top\).
- bfsccylinder.bfsccylinder_sanders.update_KG_constant_stress(shell, points, weights, KGr, KGc, KGv, Nxx, Nyy, Nxy)#
Update sparse vectors for geometric stiffness matrix KG
The same matrix as
update_KG(), with the membrane stress resultantsNxx,NyyandNxygiven, constant over the element, instead of computed from displacements. It is integrated with the integration points and weights given bypointsandweights, fromlex,leyandRofshell; the stiffnesses andshell.uare not used. The entries are those ofupdate_KG(): the global row and column indices are written toKGrandKGc, and the values added toKGv, at the positionsshell.init_k_KGtoshell.init_k_KG + KG_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_KG,lex,leyandRofshellmust be set.- Parameters:
- shell
BFSCCylinderSandersobject The cylindrical shell element being added to KG
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- KGrnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_KG + KG_SPARSE_SIZE.- KGcnp.array
Array to store column positions of sparse values Same type and size as
KGr.- KGvnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asKGr. The values are added to the existing ones, with the dimensions given forKC0vinupdate_KC0().- Nxx, Nyy, Nxyfloat
Constant membrane stress state Force per unit length, used at every integration point.
- shell
See also
Notes
The matrix is the \(\boldsymbol{K}_G\) of the Notes of
update_KG()with the given \(N_{xx}\), \(N_{yy}\) and \(N_{xy}\);Renters through the row \(\boldsymbol{S}^w_{,y} - \boldsymbol{S}^v/R\) of \(\boldsymbol{G}\). See the Notes ofbfsccylinder.bfsccylinder.update_KG_constant_stress()for its use in a linear buckling analysis.
- bfsccylinder.bfsccylinder_sanders.update_M(shell, Mr, Mc, Mv)#
Update sparse vectors for mass matrix M
The element mass matrix is computed from
lex,ley,rho,handRofshellwith closed-form expressions, without integration points; the stiffnesses are not used. Only the entries that couple the degrees of freedom \(u\), \(u_{,x}\), \(u_{,y}\) with themselves, and \(v\), \(v_{,x}\), \(v_{,y}\), \(w\), \(w_{,x}\), \(w_{,y}\), \(w_{,xy}\) with themselves and with each other are written, except the entries between \(v_{,y}\) and \(w_{,y}\) of the same node, whose integral is zero: the global row and column indices toMrandMc, and the values added toMv, at the positionsshell.init_k_Mtoshell.init_k_M + M_SPARSE_SIZE - 1. Before this function is called,c1, c2, c3, c4,init_k_M,lex,ley,rho,hand a nonzeroRofshellmust be set.- Parameters:
- shell
BFSCCylinderSandersobject The cylindrical shell element being added to M
- Mrnp.array
Array to store row positions of sparse values 1-D array of integers (
INT) of size at leastinit_k_M + M_SPARSE_SIZE.- Mcnp.array
Array to store column positions of sparse values Same type and size as
Mr.- Mvnp.array
Array to store sparse values 1-D array of
DOUBLE, same size asMr. The values are added to the existing ones. Dimension of mass between the displacements \(u\), \(v\), \(w\), multiplied by a length for each of the row and the column that is a first derivative, and by a length squared for each that is \(w_{,xy}\).
- shell
Notes
The consistent mass matrix of the interpolation of the Notes of
bfsccylinder.bfsccylinder, for a density \(\rho\) =rhouniform over the thickness \(h\) =h, with the Kirchhoff-Love displacements of the Sanders-type kinematics at the distance \(z\) from the mid-surface, \(u + z \beta_x\), \(v + z \beta_y\) and \(w\), with the rotations \(\beta_x = -w_{,x}\) and \(\beta_y = -w_{,y} + v/R\) of the Notes ofbfsccylinder.bfsccylinder_sanders:\[\boldsymbol{M} = \int_A \rho \left( h \left( (\boldsymbol{S}^u)^\top \boldsymbol{S}^u + (\boldsymbol{S}^v)^\top \boldsymbol{S}^v + (\boldsymbol{S}^w)^\top \boldsymbol{S}^w \right) + \frac{h^3}{12} \left( (\boldsymbol{S}^w_{,x})^\top \boldsymbol{S}^w_{,x} + \left( \boldsymbol{S}^w_{,y} - \boldsymbol{S}^v/R \right)^\top \left( \boldsymbol{S}^w_{,y} - \boldsymbol{S}^v/R \right) \right) \right) dA\]The terms in \(h^3/12\) are the rotary inertia of \(\beta_x\) and \(\beta_y\); the term \(v/R\) of \(\beta_y\) couples \(v\) and \(w\) and adds \(h^3/(12 R^2) (\boldsymbol{S}^v)^\top \boldsymbol{S}^v\) to the entries of \(v\), which the matrix of
bfsccylinder.bfsccylinder.update_M(), with the rotations of the Donnell-type kinematics, does not have. There is no coupling between \(u\) and the other displacements, which corresponds to a reference surface at the middle of the thickness, and the variation of the area with \(z\), the factor \(1 + z/R\), is neglected, as in a shallow shell. The integrand is a polynomial and the integral is exact.
- bfsccylinder.bfsccylinder_sanders.update_fext_follower(u, shell, points, weights, p, fext, quadratic=0, reference=1)#
Update global external force vector of a follower pressure
The force vector of a pressure that follows the deformation of the element, normal to its deformed mid-surface and acting on its deformed area, is integrated with the integration points and weights given by
pointsandweights, fromlex,leyandRofshell, the pressurepat the integration points and the displacements of the nodes of the element, copied fromutoshell.u. It is added tofextat the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Before this function is called,c1, c2, c3, c4,lex,leyandRofshellmust be set; the stiffnesses are not used.- Parameters:
- unp.array
Global displacement vector 1-D array of
DOUBLEwithDOFentries per node of the model, in the order of the degrees of freedom of a node given in the module documentation. The entries of the nodes ofshellare read at the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).- shell
BFSCCylinderSandersobject The shell element being added to fext
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- pnp.array
Pressure at the integration points 2-D array of
DOUBLEof shape(nint, nint), the entry[i, j]being used at the integration pointxi = points[i],eta = points[j], as the entries ofA11ofshell. Force per unit area of the undeformed mid-surface, already multiplied by the load factor if there is one. A positive pressure pushes along \(+z\), outwards, away from the axis of the cylinder, the direction of a positive \(w\), such that an external pressure is negative.- fextnp.array
Global external force vector 1-D array of
DOUBLEof the same size asu. The values are added to the existing ones. Dimension of force for \(u\), \(v\), \(w\), multiplied by a length for the first derivatives and by a length squared for \(w_{,xy}\).- quadraticint, optional
0, the default, to truncate the area vector of the deformed mid-surface to its terms of order 0 and 1 in the displacement gradients, such that the force vector is affine inu;1to also include its terms of order 2, see the Notes.- referenceint, optional
1, the default, to include the term of order 0 of the area vector, which gives the dead pressure load of the undeformed configuration \(\boldsymbol{F}_p(\boldsymbol{0})\);0to leave it out, which gives \(\boldsymbol{F}_p(\boldsymbol{u}_e) - \boldsymbol{F}_p(\boldsymbol{0})\).
See also
Notes
The force vector of the Notes of
bfsccylinder.bfsccylinder.update_fext_follower(), with \(k_v = 1/R\): the term \(w_{,y} - v/R\) of the tangent vector \(\boldsymbol{X}_{,y}\) is minus the Sanders-type rotation \(\beta_y\) of the Notes ofbfsccylinder.bfsccylinder_sanders, and \(\boldsymbol{X}_{,x} \times \boldsymbol{X}_{,y}\) is the exact area vector of the deformed mid-surface. The area vectorax,ay,azis evaluated at each integration point with the displacement gradientsu_x,u_y,v_x,v_y,v,w,w_xandw_yofu.
- bfsccylinder.bfsccylinder_sanders.update_fint(u, shell, points, weights, fint)#
Update global internal force vector
The internal forces of the element are integrated with the integration points and weights given by
pointsandweights, fromlex,ley,R, the stiffnessesA11, ..., D66ofshelland the displacements of the nodes of the element, copied fromutoshell.u, including the terms nonlinear in the displacements. They are added tofintat the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Before this function is called,c1, c2, c3, c4,lex,ley,Rand the stiffnesses ofshellmust be set.- Parameters:
- unp.array
Global displacement vector 1-D array of
DOUBLEwithDOFentries per node of the model, in the order of the degrees of freedom of a node given in the module documentation. The entries of the nodes ofshellare read at the positionsc1+i,c2+i,c3+iandc4+i, forifrom0to9. Dimension of length for \(u\), \(v\), \(w\), dimensionless for the first derivatives and of one over length for \(w_{,xy}\).- shell
BFSCCylinderSandersobject The shell element being added to fint
- pointsnp.array
Integration poins 1-D array of
DOUBLEof sizenint, thenintgiven to the constructor ofshell, with natural coordinates from-1to1, e.g. frombfsccylinder.quadrature.get_points_weights(). Used in both directions, fornint*nintintegration points.- weightsnp.array
Integration weights 1-D array of
DOUBLEof the same size aspoints.- fintnp.array
Global internal force array 1-D array of
DOUBLEof the same size asu. The values are added to the existing ones. Dimension of force for \(u\), \(v\), \(w\), multiplied by a length for the first derivatives and by a length squared for \(w_{,xy}\).
See also
Notes
The internal forces of the Notes of
bfsccylinder.bfsccylinder.update_fint(), with the Sanders-type \(\boldsymbol{B}_b\) and \(\boldsymbol{B}_{NL}\) of the Notes ofbfsccylinder.bfsccylinder_sanders, evaluated at each integration point withv,w_xandw_y. Their derivative is the sum of the matrices ofupdate_KC0(),update_KCNL()andupdate_KG()of this module.