Abstract
This is part of an article series on a variational framework for continuum mechanics based on the Finite Increment Calculus (FIC). The formulation utilizes high order derivatives of the classical fields of continuum mechanics integrated over control regions to construct stabilizing modification terms. Fields may include displacements, body forces, strains, stresses, pressure and volumetric strains. To support observer-invariant FIC formulations, we have catalogued field transformation equations as well as sets of linear and quadratic invariants of fields and of their derivatives up to appropriate order. Attention is focused on the two-dimensional case of a body in plane strain under the drilling-rotation transformation group. Results are presented for displacement and body-force derivatives of orders up to 4, and for stress, strain, pressure and volumetric strain derivatives of order up to 3. The material assembled here is self-contained because this catalog is believed to be useful beyond FIC applications; for example gradient-based, nonlocal constitutive models of multiscale mechanics and physics that involve finite characteristic dimensions analogous to FIC steplengths.
Similar content being viewed by others
References
Abrahams R, Marsden JE (1978) Foundations of mechanics. Benjamin Cummins, London
Artin E (1957) Geometric algebra. Interscience Publishers, Geneva
Beer FP, Johnston ER (1992) Mechanics of materials, 2nd edn. McGraw-Hill, NewYork
Ben-Israel A, Greville TNE (2003) Generalized inverses: theory and applications, 2nd edn. Springer, New York
Birkhoff G, MacLane SA (1988) A survey of modern algebra, 3rd edn. Chelsea Pub. Co., Chelsea
Cosserat E, Cosserat F (1909) Théorie des corpes deformables. Hermann et Fils, Paris
Eringen AC (2002) Nonlocal continuum feld theories. Springer, Berlin
Felippa CA, Oñate E (2007) Nodally exact Ritz discretizations of 1D diffusion-absorption and Helmholtz equations by variational FIC and modified equation methods. Comput Mech 39:91–112
Felippa CA, Oñate E, Idelsohn SR FIC variational framework for continuum mechanics: variational principles (in preparation)
Finlayson BA (1972) The method of weighted residuals and variational principles, Academic Press, reprinted by SIAM, 2014
Fleck NA, Hutchinson JW (1997) Strain gradient plasticity. In: Hutchinson JW, Wu TY (eds) Advances in applied mechanics, vol 33. Academic Press, London, pp 296–361
Fleck NA, Hutchinson JW (2002) A reformulation of strain gradient plasticity. J Mech Phys Solids 42:295–361
Franci A, Oñate E, Carbonell JM (2006) Unified Lagrangian formulation for fluid and solid mechanics and FSI problems. Comput Methods Appl Mech Eng 298:520–547
Frewer M (2009) More clarity on the concept of frame indifference in classical continuum mechanics. Acta Mech 202:213–246
Grace JH, Young A (1903) The algebra of invariants. Cambridge University Press, Cambridge
Graham A (1981) Kronecker products and matrix calculus with applications. Ellis Horwood Ltd., Chichester
Green AE, Rivlin RS (1964) Simple force and stress multipoles. Arch Ration Mech Anal 16:325–353
Green AE, Rivlin RS (1964) Multipolar continuum mechanics. Arch Ration Mech Anal 17:113–147
Guggenheimer H (1977) Differential invariants. Dover, New York
Gurtin ME (2002) A gradient theory of single-crystal viscoplasticity that accounts for geometrically necessary dislocations. J Mech Phys Solids 50:5–32
Herrmann LR (1965) Elasticity equations for nearly incompressible materials by a variational theorem. AIAA J 3:1896–1900
Higham NJ (2008) Functions of matrices: theory and computation. SIAM, Philadelphia
Hilbert D (1999) Theory of algebraic invariants, Cambridge University Press, Cambridge; a reprint of Hilbert’s 1897 lectures at Göttingen
Hill R (1950) The mathematical theory of plasticity. Oxford University Press, London
Idelsohn SR, Oñate E, Del Pin F (2004) The particle finite element method: a powerful tool to solve incompressible flows with free surfaces and breaking waves. Int J Numer Methods Eng 61:964–989
Idelsohn SR, Del Pin F, Rossi R, Oñate E (2009) Fluid–structure interaction problems with strong added-mass effect. Int J Numer Methods Eng 10:1261–1294
Kouhi M, Oñate E (2014) A stabilized finite element method for high-speed inviscid compressible flows using finite calculus. Int J Numer Methods Fluids 12:872–897
Lubliner J (1990) Plasticity theory. Macmillan Pub. Co., New York; reprinted by Dover, 2008
Maugin GA, Metrikine AV (eds) (2010) Mechanics of generalized continua. Springer, New York
Mindlin RD, Tiersten HF (1962) Effect of coupled-stresses in linear elasticity. Arch Ration Mech Anal 11:415–422
Mindlin RD (1964) Micro-structure in linear elasticity. Arch Ration Mech Anal 16:51–78
Mindlin RD (1965) Second gradient of strain and surface tension in linear elasticity. Int J Solids Struct 1:417–438
Olver PJ (1993) Applications of lie groups to differential equations. Springer, Berlin
Olver PJ (1999) Classical invariant theory. Cambridge University Press, Cambridge
Oñate E (1998) Derivation of the stabilization equations for advective–diffusive fluid transport and fluid flow problems. Comput Methods Appl Mech Eng 151:233–267
Oñate E, Taylor RE, Zienkiewicz OC, Rojek J (2003) A residual correction method based on finite calculus. Eng Comput 20:629–638
Oñate E (2004) Possibilities of finite calculus in computational mechanics. Int J Numer Methods Eng 60:255–281
Oñate E, Rojek J, Taylor RL, Zienkiewicz OC (2004) Finite calculus formulation for incompressible solids using linear triangles and tetrahedra. Int J Numer Methods Eng 59:1473–1500
Oñate E, Zarate F, Idelsohn SR (2006) Finite element formulation for the convective–diffusive problem with sharp gradients using finite calculus. Comput Methods Appl Mech Eng 195:1793–1825
Oñate E, Miquel J, Hauke G (2006) A stabilized finite element method for the one-dimensional advection diffusion–absorption equation using finite calculus. Comput Methods Appl Mech Eng 195:3926–3946
Oñate E, Valls A, Garcia J (2007) Modeling incompressible flows at low and high Reynolds numbers via a finite calculus-finite element approach. J Comput Phys 224:332–351
Oñate E, Idelsohn SR, Celigueta M, Rossi R (2008) Advances in the particle finite element method for the analysis of fluid-multibody interaction problems and bed erosion in free surface flows. Comput Methods Appl Mech Eng 197:1777–1800
Oñate E, Idelsohn SR, Felippa CA (2011) Consistent pressure Laplacian stabilization for incompressible continua via higher-order finite calculus. Int J Numer Methods Eng 87:171–195
Oñate E, Nadukandi P, Idelsohn SR, Felippa CA (2011) A family of residual-based stabilized finite element methods for Stokes flow. Int J Numer Methods Eng 65:106–134
Oñate E, Franci A, Carbonell J (2014) Lagrangian formulation for finite element analysis of quasi-incompressible fluids with reduced mass losses. Int J Numer Methods Fluids 74:699–731
Oñate E (2016) Finite Increment Calculus (FIC): a framework for deriving enhanced computational methods in mechanics. Adv Model Simul Eng Sci 3:14. doi:10.1186/s40323-016-0065-9
Rao CR, Mitra SK (1971) Generalized inverse of matrices and its applications. Wiley, New York
Truesdell C, Toupin RA (1960) The classical field theories. In: Flgge S (ed) Handbuch der Physik. III(1). Springer, Berlin, pp 226–790
Truesdell C, Noll W (1965) The nonlinear field theories of mechanics. In: Flgge S (ed) Handbuch der Physik, vol III/3. Springer, Berlin
Toupin RA (1962) Elastic materials with coupled stresses. Arch Ration Mech Anal 11:385–414
Turnbull HW (1929) The theory of determinants, matrices and invariants. Blackie and Sons, London. Expanded reprint by Dover, 1960
Weyl H (1939) The classical groups, their invariants and representations. Princeton University Press, Princeton
Acknowledgements
The preparation of this paper was facilitated by the kind hospitality provided to the first author by the Centro Internacional de Métodos Numéricos en Ingeniería (CIMNE) at the Universidad Politécnica de Cataluña (UPC) during the summer periods of 2013 through 2016.
Author information
Authors and Affiliations
Corresponding author
Ethics declarations
Conflict of interest
The authors declare that they have no conflict of interest.
Appendices
Appendix 1: Spectral Properties
This Appendix present information on eigenvalues and eigenvectors of tensor field transformations. The results are useful in providing understanding regarding invariance properties of those transformations.
1.1 Displacements and Body Forces
1.1.1 Characteristic Polynomials
Denote \({{\mathcal {P}}}({\mathbf {T}}^{(m)}) = \det \big ({\mathbf {T}}^{(m)}-\lambda \,{\mathbf {I}}_{2m+2}\big )\), \(j=\sqrt{-1}\), and use tag (*) to flag a multiplicity-2 root pair. Formulas tabulated below apply equally to \({\mathbf {T}}_u^{(m)}\) and \({\mathbf {T}}_b^{(m)}\):
Because of (29), all expressions are MDCC independent.
1.1.2 Spectral Decompositions
Three equivalent forms of the spectral decomposition of displacement transformation matrices are
Here \(\mathbf {S}^{(m)}\) is the diagonal matrix of eigenvalues of \({\widehat{{\mathbf {T}}}}_u^{(m)}\), \(\mathbf {V}_{uR}^{(m)}\) the matrix of right eigenvectors stored as columns, and \(\mathbf {V}_{uL}^{(m)}\) the matrix of left eigenvectors stored as rows. The diagonal entries of \(\mathbf {S}^{(m)}\) are the characteristic polynomial roots listed in (142). Since stacking order is important, they are specified in further detail next:
in which
The eigenvector matrices listed below were obtained through Mathematica. Their vectors are not normalized. Two linearly independent vectors are shown for eigenvalues of multiplicity two; any linear combination of which is also an eigenvector. For \(m\in [2,4]\) arbitrary MDCC are allowed.
It is remarkable that the only dependence on \(\varphi \) is through the eigenvalues listed in (144).
Eigenvectors corresponding to complex eigenvalues have the property that the dot product with itself is zero. Such vectors are called isotropic, and are important in the study of symplectic spaces; see [1, 2].
1.1.3 Spectral Form of Quadratic Invariants
Substituting \({\mathbf {T}}_u^{(m)}=\mathbf {V}_L^{(m)}\,\mathbf {S}_\varphi ^{(m)}\, \mathbf {V}_R^{(m)}\), in which \(\mathbf {V}_R^{(m)}= \big (\mathbf {V}_L^{(m)}\big )^{-1}\), premultiplying by \((\mathbf {V}_L^{(m)})^T\) and postmultiplying by \((\mathbf {V}_R^{(m)})^T\), yields the spectral form of (44):
The only dependence on \(\varphi \) is through the diagonal matrix \({\mathbf {D}}\), which stacks the eigenvalues listed in (144). We seek nontrivial solutions \(\mathbf {Y}^{(m)}\ne \mathbf {0}\), that are symmetric but not necessarily real. Symbolically processing the matrix equations for \(m=[0,4]\) through Mathematica yields
The pattern of nonzero elements, dictated by the eigenvalue configuration in \(\mathbf {S}^{(m)}_\varphi \), continues through higher orders. From inspection the number of free parameters is
The physical weighting matrix of (154) may be recovered as \({\mathbf {W}}_u^{(m)}=\mathbf {V}_R^T\,\mathbf {Y}_u^{(m)}\,\mathbf {V}_R\).
Comparison of the Mathematica performance in using (44) versus (153) for invariant computations indicates that use of (44) is preferable. Transforming the spectral solutions back to physical field values runs into serious complications: matrices \(\mathbf {V}_R\) and \(\mathbf {V}_L\) have complex entries, and the occurrence of multiple eigenvalues for \(m\ge 1\) disrupts the uniqueness of the eigenvector basis. The spectral solutions (154) have the visual advantage, however, that their pattern is readily visualized for any derivative order.
1.2 Strains and Stresses
1.2.1 Spectral Decomposition
The triple product (89) for \(m>0\) is a similarity transformation. Consequently
-
1.
\({\mathbf {T}}^{(m)}_{\epsilon \varphi }\) and \({\mathbf {T}}_{u\,\varphi }^{(m+1)}\) have the same eigenvalues, which were studied in “Spectral Decompositions” section
-
2.
The right eigenvectors of \({\mathbf {T}}_{u\,\varphi }^{(m+1)}\) are rotated by \({\mathbf {T}}_{\epsilon \,u}^{(m)}\).
For \(m=0\) an extra zero eigenvalue, associated with the infinitesimal rigid rotation, is introduced.
The spectral decompostion of \({\mathbf {T}}^{(m)}\) is denoted as
This is closely linked to that of the displacemnent transformations studied in “Characteristic Polynomials” section, since
Since the eigenvalues repeat, except for the adjustment of m, those need not be given. The eigenvector matrices are listed below for \(m=1,2\).
For \(m=2\), the reduced strain vector is used:
in which
1.3 Volumetric Strain and Pressure
1.3.1 Spectral Decomposition
The spectral decomposition of \({\mathbf {T}}_{e}^{(m)}\) and \({\mathbf {T}}^{(m)}_p\) are denoted as
Here \({\mathbf {D}}^{(m)}\) is the diagonal matrix of eigenvalues, whereas \(\mathbf {V}_{*L}^{(m)}\) and \(\mathbf {V}_{*R}^{(m)}\) are matrices of left and right eigenvectors, respectively. The eigenvalues of \({\mathbf {T}}^{(m)}_{e}\) and \({\mathbf {T}}^{(m)}_p\) are the same:
The eigenvectors for the volumetric strain transformation matrices are
The eigenvectors for the pressure transformation matrices are
Appendix 2: Mathematica Implementation
The Appendix presents a Mathematica implementation for obtaining invariance results reported in the main body of the paper. This implementation may be of interest as departing point for extending those calculations to three dimensional fields, a task that will likely require use of computer algebra on a high performance computer.
1.1 Constructors
Constructors generate objects, typically matrices and vectors, which are later manipulated by computational modules called processors. They return only one object, thus fitting the classical definition of function. Two types are distinguished: primitive and interface. Primitive constructors are self-contained. Interface constructors provide covers to lower level primitives. Constructrs should never be changed except to correct mistakes or streamline some operations.
1.1.1 Field Cast Vector
Primitive constructor FCVector, listed in Figs. 4 and 5, returns a symbolic cast vector (C-vector) for a specified 2D field as well as its spatial derivatives up to the implemented order. The module is invoked as
Argument field is a 4-item list: { fld,m,tag,mdcc }, which defines the field as follows:
- fld :
-
A one-character string that specifies the field type. "u": displacements, "b": body forces, "\(\epsilon \)": strains, "\(\sigma \)": stresses, "e": volumetric strain, or "p": pressure.
- m :
-
Field derivative order: up to 4 for displacements and body forces; up to 3 for strains, stresses, volumetric strains and pressures. If m=0, the field proper is returned.
- tag :
-
A one character string that distinguishes C vector variants for strains and stresses:
"a": augmented strains or stresses (used for m=0).
"r": reduced strains or stresses (used for m=2,3),
"c": conjugate strains or stresses (used for m=2,3).
Ignored for fields other than strains or stresses, in which case " " is recommended.
- mdcc :
-
The mixed-derivative casting coefficient(s) (MDCC) to be used for m=2,3,4. If m=2,3 there is only one coefficient and this argument is a scalar, such as mdcc=k for displacements and body forces, or mdcc=g for strains, stresses, volumetric strain or pressure. If m=4, which is only pertinent for displacements and body forces, a 2-entry list must be provided: mdcc={ k1,k2 }. Coefficients may be numeric or symbolic. This argument is ignored if m=0,1, but a dummy argument (such as 0 or 1) must appear.
The function returns the C-vector with symbolic components assigned standard names. For example,
v=CVector[{ "u",2," ",k }] returns v={ u111,k*u112,u122,u211,k*u212,u222 }
v=CVector[{ "p",3," ",g }] returns v={ p111,(3/g)*p112,(3/g)*p122,p222 }
If fld is "p" or "e", and m=0, a one-entry vector is returned although the field is scalar. If one or more items are incorrect or not implemented, the function returns Null. All symbolic components of the returned C-vector are globally initialized inside the module; thus FCVector should be called only before actual processing starts.
1.1.2 Symbolic Array Constructors
Figure 6 lists two primitives: SymbVector and SymbSquareMatrix, which construct symbolic vectors and square matrices, respectively. They are referenced as
The arguments are:
- letter :
-
The first letter (Roman or Greek) of the generated entry names.
- n :
-
Vector or matrix order.
- ib :
-
For SymbVector, entry index base. Usually 0. (\(-1\) is OK.) See example below.
- mxpat :
-
For SymbMatrixOrder, a character string whose first character specifies the entry pattern. See Table 3. The second character is ignored by this module.
The function returns the constructed vector or matrix. Generated matrix entries have two integers: row and column index, which follow the specified letter. The exemptions are patterns that generated diagonal or anti-diagonal matrices, in which case only the row index is appended to the letter.
Examples. SymbVector["w",4,0] returns { w1,w2,w3,w4 } whereas SymbVector["w",4,2] returns { w3,w4,w5,w6 }. The call SymbSquareMatrix["A",2,"S"] returns the symmetric matrix { { A11,A12 },{ A12,A22 } }.
Figure 6 lists two companion modules, which are referenced as
The arguments for both are
- S :
-
A square matrix, usually symbolic.
- mxpat :
-
The matrix entry pattern identifier defined in Table 3.
Module SquareMatrixEntries returns a list of matrix entries from the unique portion of the matrix; for example the upper triangle if maxpat="S". Module SquareMatrixSymbols returns only unique symbolic entries (that is, entries with Symbol head, while eliminating any duplicates.
Example: suppose W is the bisymmetric matrix { { W11,0,W13 },{ 0,W22,0 },{ W13,0,W11 } }. Then SquareMatrixSymbols[W,"B"] returns { W11,W13,W22 }.
1.1.3 Rotated Field Transformation Matrix
Field transformation matrices that depend on the rotation angle \(\varphi \) may be obtained by calling the interface constructor module RFTMatrix, which is listed in Fig. 7. (RFT is the acronym for Rotated Field Transformation.) The module is invoked as
The arguments are:
- field :
-
A 4-item list that specifies the field. See “Field Cast Vector” section
- \(\varphi \) :
-
The rotation angle, which may be numeric or symbolic.
The function returns the appropriate transformation matrix. Examples:
Tu=TMatrix["u",2," ",k,\(\varphi \)] returns the matrix (24).
T \(\epsilon \) =TMatrix["\(\epsilon \)",3," ",g,\(\varphi \)] returns the matrix (95).
If one or more arguments are incorrect or unimplemented, the function returns Null.
1.1.4 Strain-Displacement Transformation Matrix
The interface module SDTMatrix listed in Fig. 8 constructs transformation matrices that relate strains and displacements, as well as their derivatives up to an implemented order.
As described in Sect. 5.4, strains derivatives of order m can be linked to displacement derivatives of order m+1. The present SDTMatrix implementation covers the strain derivative range m=0,1,2,3, which corresponds to the displacement derivative range m=1,2,3,4, respectively.
Both strain-displacement matrices as well as their displacement-strain inverses may be requested. If the strain-displacement matrix is square, so is its inverse. But if it is rectangular, the returned inverse transformation is its pseudoinverse (the so-called Moore-Penrose inverse), which is also rectangular. This topic is discussed in Sect. 5.4.
The module is invoked as
The only argument is a 5-item list similar to (but not identical) to that of FCVector described in “Field Cast Vector” section. It is configured as { fld,m,tag,mdcc \(\epsilon \),mdccu }, in which
- fld :
-
A two-character string that specifies the fields to be connected:
"\(\epsilon \) u": Get matrix linking strains or strain derivatives to displacement derivatives
"u \(\epsilon \)": Get matrix linking displacements derivatives to strains or strain derivatives.
- m :
-
Strain derivative order: 0 to 3. Note that displacement derivative order is m+1
- tag :
-
A one character string that distinguishes C-vector variants for strains. The effect depends on the value of m:
If m=0 and tag="a" use augmented strain C-vector; if tag=" " use standard vector.
If m=2,3 and tag="r" use reduced strain C-vector to get the transformation matrix, but if tag=" " use the complete strain C-vector.
- mdcc \(\epsilon \) :
-
Specifies the MDCC value g to be used for strains if m=2,3. Ignored if m=0,1, but a dummy argument must be supplied.
- mdccu :
-
Specifies the MDCC value(s) to be used for displacements if m=1,2,3. Ignored if m=0. If m=1,2 this argument is the scalar k whereas if m=3 it is the 2-entry list { k1,k2 }.
Example: the call T \(\epsilon \) u1=SDTMatrix[" \(\epsilon \) u",1," "," "," "] returns the \(4\times 4\) matrix (83).
1.1.5 C-Vector Version Transformation Matrix
Module CVTMatrix, also listed in Fig. 8, returns the matrix that link two different versions of C-vectors for the same field. These are identified as \(\mathbf {H}\) matrices in the text. The current implementation is restricted to strains. The module is invoked as
- fld :
-
This must be the one-character string "\(\epsilon \)".
- m :
-
Strain derivative order: 2 or 3, else ignored.
- tag :
-
If "r": return the matrix that links the reduced strain C-vector to the complete one.
If "c": return the matrix that links the complete strain C-vector to the reduced one.
- mdcc :
-
Specifies the MDCC value g to be used for the strain C-vectors.
The function returns the rectangular H matrix that transforms the complete to the reduced strain C-vector, or its pseudoinverse.
Example: H \(\epsilon \) r2=CVTMatrix[" \(\epsilon \) ",2,"c",g] returns the \(9\times 8\) matrix \(\mathbf {H}^{(2)}_{\epsilon r}\) given in (71).
1.2 Transformation Primitives
Constructors RFTMatrix, SDTMatrix and CVTMatrix are interface modules that call lower level primitives that return the specified matrices. Since it is occasionally convenient to invoke those primitives directly, they are briefly described in the following subsections.
1.2.1 Displacement Transformation Primitives
Figure 9 lists primitive modules that return transformation matrices for displacement and their derivatives up to order 4, stored as C-vectors.
There are five of them: TuD0 through TuD4. They take care of derivative orders 0 through 4, respectively, Orders 0 and 1 have only one argument: the rotation angle \(\varphi \). Orders 2 through 4 have two arguments: the rotation angle \(\varphi \) followed by the MDCC specification. The latter is the scalar k for m=2,3, or the 2-entry list {k1,k2} for m=4. Each module returns one object: the transformation matrix. Arguments may be numeric or symbolic.
Transformation matrices for body forces and their derivatives are derived from these primitives by reversing the angle and taking the transpose. See the code of RFTMatrix listed in Fig. 7.
1.2.2 Strain Transformation Primitives
Figure 10 lists primitive modules that return transformation matrices for strains and their derivatives up to order 3, stored as C-vectors.
Five modules are provided: T \(\epsilon \) aD0, T \(\epsilon \) D0, T \(\epsilon \) D1, T \(\epsilon \) rD2, and T \(\epsilon \) rD3. The last character of the name is the order m. Orders 0 and 1 have only one argument: the rotation angle \(\varphi \). Orders 2 and 3 have two arguments: the rotation angle \(\varphi \) followed by the MDCC argument g. Each module returns one function value: the transformation matrix. Arguments may be numeric or symbolic.
Two versions for m=0 are provided: T \(\epsilon \) aD0 works with the augmented, 4-component strain C-vector (63) whereas T \(\epsilon \) D0 works with the standard, 3-component strain C-vector (54). The letter r in T \(\epsilon \) rD2 and T \(\epsilon \) rD3 indicates that the reduced strain C-vectors (68) and (69) are used.
Transformation matrices for stresses and their derivatives are derived from these primitives by reversing the angle and taking the transpose. See the code of RFTMatrix listed in Fig. 7.
The listing of Fig. 10 also shows less important modules that return auxiliary matrices \(\mathbf {H}\) that can be used to recover the complete strain C-vector from the reduced ones.
1.2.3 Volumetric Strain Transformation Primitives
Figure 11 lists primitive modules that return transformation matrices for the volumetric strains and its derivatives up to order 3. There are four of them: TeD0 through TeD3, which take care of orders 0 through 3, respectively, Orders 0 and 1 have only one argument: the rotation angle \(\varphi \). Orders 2 and 3 have two arguments: the rotation angle \(\varphi \) followed by the MDCC argument g. Each module returns one function value: the transformation matrix. Arguments may be numeric or symbolic.
Transformation matrices for pressure and its derivatives are derived from these primitives by reversing the angle and taking the transpose. See the code of RFTMatrix listed in Fig. 7.
1.2.4 Strain Displacement Transformation Primitives
Figures 12 and 13 lists the primitive constructors used by SDTMatrix. They are often used directly bypassing the interface.
1.2.5 C-Vector Variants Transformation Primitives
Figure 14 lists the primitive constructors used by CVTMatrix. Again these may be called directly for convenience.
1.3 Invariant Finders
Three computational processes were implemented to obtain the results presented in the main text:
-
1.
Formulation of rotated and interfield transformations using straightforward pattern matching. Symbolic outputs were inlined using InputForm to equip the primitive constructor modules listed in the previous subsections.
-
2.
Determination of the spectral decomposition of rotation transformation matrices. This relied largely on built in functions to get eigenvalues and eigenvectors of symbolic matrices.
-
3.
Finding linear, bilinear and quadratic invariants.
Only the software for invariant determination is presented below, since its logic is less trivial than for the other two tasks. This implementation may serve as guide for future extensions to 3D.
1.3.1 Weight Array Initialization
Figure 15 lists two modules that initialize vectors and/or matrices for subsequent processing. They are invoked as
Modules WeightVectorSetup and WeightMatrixSetup set up unknown vectors and matrices used in linear and quadratic invariant calculations, respectively. The arguments are
-
field
the 4-item field specification described in “Field Cast Vector” section.
-
mxpat
For WeightMatrixSetup: the matrix entry pattern identifier defined in Table 3. This matrix is always symmetric (mxpat="S"). If the field is displacement or body force, it is convenient to split it as the sum of two matrices with (mxpat="B") and (mxpat="X", respectively. In addition a “custom” pattern may be set by WeightMatrixSetup for certain fields if the second character of of mxpat is "C"; see code listing.
The returned objects are
-
v
The field C-vector returned by FCVector. Its length is nv.
-
w
For WeightVectorSetup: the initialized weight vector of length nv.
-
W
For WeightMatrixSetup, the initialized weight matrix of order nv.
-
var
For WeightVectorSetup, a copy of w to allow its manipulation without touching w.
For WeightMatrixSetup, a list of independent entries in W built by SquareMatrixEntries, which was described in “Symbolic Array Constructors” section.
Entries in w and W are generated by the constructors SymbVector and SymbSquareMatrix, respectively, described in “Symbolic Array Constructors” section.
Example 1: field={ "u",2," ",2 } specifies displacement second derivatives with k=2. Then
WeightVectorSetup[field] returns { { u111,2*u112,u122,u211,2*u212,u222 },
{ w1,w2,w3,w4,w5,w6 },{ w1,w2,w3,w4,w5,w6 } }. Here var=w.
Example 2: field={ "p",2," ",g } specifies pressure second derivatives with symbolic g. Then
WeightMatrixSetup[field,"BE"] returns { { p11,(2/g)*p12,p22 },{ { W11,0,W13 },
{ 0,W22,0 },{ W13,0,W11 } },{ W11,W13,W22 } }. Here var \(\ne \) W.
1.3.2 Invariance Residual Equations
Module InvResidualEqs, listed in Fig. 16, receives information required to set up and return the invariance equations for both linear and quadratic problems. The module is invoked as
The arguments are
- field :
-
A 4-item list that specifies the field. See “Field Cast Vector” section.
- \(\varphi \) :
-
The rotation angle symbol.
- Wm :
-
For the linear invariant problem, the vector w of unknown weights set up by WeightVectorSetup via (179). For the quadratic problem, the matrix W of unknown weights set up by WeightMatrixSetup via (180).
The function return is
- T :
-
The rotated field transformation matrix. (Null if an error is detected.)
- R :
-
The residual formed by either \(\mathbf {R}={\mathbf {w}}^T\,{\mathbf {T}}-{\mathbf {w}}\) or \(\mathbf {R}={\mathbf {T}}^T\,{\mathbf {W}}\,{\mathbf {T}}-{\mathbf {W}}\) for the linear or quadratic problem, respectively. Note the use of TrigReduce to express all sines and cosines in R as multiples of \(\varphi \).
- eqs :
-
A list of equations suitable for subsequent use of Solve. They follow from the condition that each residual component must vanish for any \(\varphi \). Duplicates (such as { w1-w2==0,-w1+w2==0 }) and trivial conditions (such as 0==0) are weeded out. If the number of nontrivial equations happens to be zero, the empty list is returned.
Note: as implemented, InvResidualEqs assumes that the largest angle multiple that may appear in sines and cosines is 10* \(\varphi \), which occurs for displacement and body force fourth derivatives. To change this value, adjust nmax in the local variable list.
Example: for field={ "p",2," ",1 } and w=}w1,w2,w3 }, the residual is
R={ (-w1+w3+(w1-w2)*Cos[2* \(\varphi \) ]-2*w2*Sin[2* \(\varphi \) ])/2,(-2*w2+2*w2*Cos[2* \(\varphi \) ]
-(w1-w3)*Sin[2* \(\varphi \) ])/2,(w1-w3+(-w1+w3)*Cos[2* \(\varphi \) ]-2*w2*Sin[2* \(\varphi \) ])/2 }.
The invariance equations are eqs={ -w1+w3==0,-2*w2==0 }.
1.3.3 Invariant Kernel Solver
One variation of InvResidualEqs is worth describing here. Module InvKernelSolver, listed in Fig. 17. This one returns an invariant kernel matrix to be used in stabilization forms of FIC functionals. as covered in a previous section. The module is invoked as
The arguments are
- field1 :
-
4-item list identifying the premultiplication field
- field2 :
-
4-item list identifying the postmultiplication field
- \(\varphi \) :
-
The rotation angle symbol
- mxpat :
-
The desired kernel matrix pattern, e.g., "S" for symmetric or "D" for diagonal
- letter :
-
The letter used to label matrix entries
The only output is
- Q :
-
Kernel matrix that meets invariant conditions if nonzero. A returned null matrix means that those conditions cannot be met by the specified pattern.
The output matrix may be subsequently processed by the cleaning module of “Solution Cleanup” section if desirable.
1.3.4 Linear Invariant Solver
Module LinInvSolver, listed in Fig. 18, solves for the linear invariants of a specified field under inplane rotations. The module is invoked as
The arguments are
- field :
-
4-item list defining the field to be investigated for invariants. See “Field Cast Vector” section
- \(\varphi \) :
-
The rotation angle symbol.
- pvlist :
-
Optionally, a position list of passive variables to be removed from var. Must be formatted as expected by the Delete function. Example: if var={ w1,w2,w3,w4 } and pvlist={ { 2 },{ 4 } },w2 and w4 are dropped so the variable list passed to Solve is { w1,w3 }. Note that pvlist={ 2,4 } would be an error. Ignored if an empty list.
- prt :
-
A list of internal print requests specified as character strings: "w": print unknown weight vector, "T": print transformation matrix, "R": print residual vector, "eqs": print constraint equations, "neq": print number of constraint equations, "var": print list of active weight variables, "rep": print invariant residual equation solution as replacement list. These may appear in any order. If prt is the empty list, nothing is printed.
The function returns
- w:
-
The linear invariant weight vector \({\mathbf {w}}\) if not identically null. If the null vector, no linear invariant was found.
If w is nonzero, the generic invariant is the dot product w.v. See Sect. 4.8 regarding instance retrieval.
The implementation is straightforward. Module WeightVectorSetup is called to get the field C-vector \(\mathbf {v}\) in v and the weight unknown list \({\mathbf {w}}\) in w, which is copied to var. Selected var entries (the so-called passive variables) may be dropped as per argument pvlist. Module InvResidualEqs is called to get the equations in eqs. (T and R are returned only to be optionally printed.) The built-in solver function Solve is called with eqs and var as arguments, and the solution placed in sol. If the result is not null, w is replaced by the solution and returned as function value.
Example 1. Find the linear invariants of pressure second derivatives. Use g=1 (flat C-vector) and request printing of equations, variables and solution:
Clear[\(\varphi \)]; field={ "p",2," ",1 }; prt={ "eqs","var","sol" }; letter=pvlist={ }; w=LinInvSolver[field, \(\varphi \) ,letter,pvlist,prt];
Output shows variables var={ w1,w2,w3 }, equations eqs={ (-w1+w3)/2==0,w2==0,w2/2==0 }, and solution sol={ { w1->w3,w2->0 } }. The module returns w=var/.sol[[1]]={ w3,0,w3 }. The field C-vector is v=FCVector[field]={ p11,p12,p22 }. The dot product v.w yields the generic invariant (p11+p22)w3, which has only one free parameter. Setting w3=1 we find that the Hessian trace (the pressure Laplacian) p11+p22, or \(p_{,11}+p_{,22}\), is the only linear invariant.
The call is now changed to w=LinInvSolver[field, \(\varphi \) ,pvlist,prt], in which pvlist={ { 1 } } is nonempty. Passive variable w1 is dropped so var={ w2,w3 } but w is not changed. This causes w1 to survive in the replacement list returned by Solve, which is sol={ { w3->w1,w2->0 } }, and the module returns w={ w1,0,w1 }. Here this is a cosmetic change. But the ability to specify passive variables becomes important for the multipass quadratic invariant analysis described in “Quadratic Invariant Multipass Solver” section.
Example 2. Find the linear invariants of displacement second derivatives. Use flat C-vector, no passive variables and no internal printing:
Clear[ \(\varphi \) ]; field={ "u",2," ",1 }; w=LinInvSolver[field,\(\varphi \),{ },{ }];
This returns the null 6-vector w={ 0,0,0,0,0,0 }. Consequently there are no linear invariants.
1.3.5 Quadratic Invariant One Pass Solver
Module QuadInvOnePassSolver, listed in Fig. 19, solves for the quadratic invariants of a specified field under plane rotations. It is a one pass solver as opposed to that described in “Quadratic Invariant Multipass Solver” section. The module is invoked as
The argument sequence is quite similar to that of LinInvSolver, described in “Linear Invariant Solver” section, whence only the differences are noted below.
- field, \(\varphi \) :
-
Same as in “Linear Invariant Solver” section.
- mxpat :
-
A list of matrix entry patterns that defines the initial weight matrix and set of original variables; see “Weight Array Initialization” section and Table 3. For instance, { "S" } specifies the "S" (full symmetric) pattern, which is the most general one. On the other hand, { "B","X" } specifies the weight matrix split as the sum of two sparser patterns: "B" and "X".
- pvlist :
-
A position list of passive variables to be removed from var. The order of these variables may be observed by printing "var" in a trial run. Ignored if empty. Note: if the optimal set of passsive variables is obtained from previous runs using QuadInvMultiPassSolver, it may be specified here to save time.
- prt :
-
As in “Linear Invariant Solver” section, except that "W" requests print of the initial weight matrix W.
The function return is
- W :
-
The quadratic invariant weight matrix.
The logic is virtually identical to that of LinInvSolver. The main difference occurs in the residual evaluation within the subordinate module InvResidualEqs.
Example. Find quadratic invariants of displacement derivatives, constraining \({\mathbf {W}}\) to be bisymmetric:
Clear[\(\varphi \)]; f={ "u",1," ",0 }; W=QuadInvOnePassSolver[f, \(\varphi \),{ "B" },{ }]; This returns the matrix W={ { W14+W22+W23,0,0,W14 },{ 0,W22,W23,0 },{ 0,W23,W22,0 },
{ W14,0,0,W14+W22+W23 } }, which has 3 free parameters: { W14,W22,W23 }. This result in matrix notation reads
which is bisymmetric. The field C-vector is v={ u11,u12,u21,u22 }, and the generic invariant may be obtained by forming v.W.v.
1.3.6 Auxiliary Modules for Multipass Solver
A difficulty with a result such as (185) is that \({\mathbf {W}}\) is not unique: any linear combination of rows (or columns) that maintains rank and pattern is a valid solution. The number of such admissible \({\mathbf {W}}\) grows rapidly as the length of the C-vector increases. This poses two challenges: (i) characterize the “best” \({\mathbf {W}}\), and (ii) find it in reasonable computer time.
To answer (i) we rate each \({\mathbf {W}}\) solution with a “matrix score,” which is a positive integer. Like in golf, a lower score is better. That of a candidate solution matrix W is taken to be 10 \(^{\mathtt {6}}\) *Nnz+LeafCount[W], in which Nnz is the number of nonzero entries of W, whereas LeafCount is a Mathematica integer measure of the number of operations needed to evaluate a symbolic matrix (more precisely, the number of subexpressions in the matrix evaluation “tree”). The latter is obtained through an eponymous function: LeafCount[W]. The score evaluation can be implemented as a one-line internal function:
MxScore[W_]:=10ˆ6*Length[DeleteCases[Flatten[W],0]]+LeafCount[W]
(Another matrix score measure tried was 10ˆ6*Nnz+LeafCount[v.W.v] in which v is the field C-vector; this one did not work too well.)
To answer (ii) a reasonable number of passive variable combinations are generated by a statistical sampling process implemented in the module PVCombs, which is listed in Fig. 20. It is invoked as
where
-
nv
The number of weight variables, which is the length of var returned by WeightMatrixSetup.
-
pvdata
A five integer list: { npv1,npv2,ncmax,ntrials,seed }. Here npv1 and npv2 specify the range of number of variables to delete, nc is a generation bound; ntrial is the maximum number of combinations to try for each variable grouping, and seed is the initial seed for the built-in random generator. For procedural details the code logic should be studied.
Combinations are built and filtered by the primitive constructor PVC, which is listed in Fig. 20. The module returns distinct passive variable combinations produced by the random generator.
1.3.7 Quadratic Invariant Multipass Solver
Module QuadInvOnePassSolver, listed in Fig. 21, solves for the quadratic invariants of a specified field under plane rotations. It is a multipass solver that computes a large number of solution weight matrices, and returns that with best score. The module is invoked as
The argument sequence is identical to that of QuadInvOnePassSolver, described in “Quadratic Invariant One Pass Solver” section. with exception of the last two arguments:
-
pvdata
Passive variable stochastic generation data to be passed to PVCombs; see “Auxiliary Modules for Multipass Solver” section.
-
prt
Same options as for the one-pass solver in “Quadratic Invariant One Pass Solver” section, with an addition: "sco" prints best matrix score updates while cycling over passive variable combinations.
The function return is
- Wbest :
-
The weight matrix solution with best score.
1.3.8 Solution Cleanup
Module CleanSolution, listed in Fig. 22, beautifies the solution (vector or matrix) provided by an invariant solver. This action facilitates visualization of the free parameters as well as transfer to a typeset manuscript. The module is invoked as
The arguments are
- Ws:
-
The solution (vector or matrix) to be cleaned.
- mxpat:
-
If Ws is a matrix solution, the entry pattern identifier. Ignored if a vector.
- oldlet:
-
The character string used as first letter of the entries of Ws.
- newlet:
-
The character string to be substituted as first letter of the cleaned solution entries.
- ib:
-
The index base for the cleaned solution entries. Usually 0.
- reord:
-
See description of last argument of ReorderPar below.
The output is the list { Wc,newvar }, in which Wc is the cleaned solution and newvar is the sorted list of renamed variables. To illustrate the effect, suppose that Ws is the matrix (185). Then CleanSolution[Ws,"BE","W"," \(\eta \) ",0,{ }] returns Wc as { { \(\eta \) 1+ \(\eta \) 2+ \(\eta \) 3,0,0, \(\eta \) 2 },{ 0, \(\eta \) 2, \(\eta \) 3,0 },{ 0, \(\eta \) 3, \(\eta \) 2,0 },{ \(\eta \) 1,0,0, \(\eta \) 1+ \(\eta \) 2+ \(\eta \) 3 } } whereas the exit newvar is { \(\eta \) 1, \(\eta \) 2, \(\eta \) 3 }.
The cleaned solution in matrix notation is
Here the three free parameters are easier to discern at a glance.
Figure 22 lists also the subordinate module ReorderFreePars, which is called by CleanSolution to reorder the free parameter list indices as specified through argument reord. The module is invoked as
The arguments are
-
Wc
A solution (vector or matrix) already cleaned by CleanSolution.
-
oldvar
List of free parameters to be reordered.
-
ib
Same as for CleanSolution.
-
reord
An integer list that reorders the free parameter indices as shown by an example. Suppose that oldlet and newlet are "w" and "\(\eta \)", respectively, and that Ws on entry is { w1,w2,w3 }. The default replacement is { w1 \({\rightarrow }\eta \) 1,w2 \({\rightarrow }\eta \) 2,w3 \({\rightarrow }\eta 3\) }. But if reord is { 3,1,2 }, it will be changed to { w1 \({\rightarrow }\eta \) 3,w2 \({\rightarrow }\eta \) 1,w3 \({\rightarrow }\eta 2\) }. If the length of reord does not match the number of different nonzero entries in Ws, no change is made. Since that number is typically unknown before a solution is obtained, this argument is normally set a posteriori.
1.3.9 Solve-and-Clean Drivers
To expedite scripting, it is convenient to get-it-and-clean-it invariant solutions in one shot. This is facilitated by the three “show me” driver modules listed in Fig. 23. These are invoked as
The listed drivers are used to run LinInvSolver,QuadInvOnePassSolver, and QuadBestInvSolver, respectively, followed by invoking CleanSolution. The arguments are those previously described for those modules, and need not be restated here. The only exception is
- prt :
-
Controls printout of the pertinent solver as described previously. In addition two more specs may be entered: "inv" to print individual invariants, and "chk" to print a zero-residual check.
Each driver returns a 2-item list: the clean solution Wc and the list of free parameters var. Note: if mpats contains multiple patterns for the quadratic invariant solvers—for example mpats={ "B","X" }—the output Wc is the sum of the solutions obtained for each pattern while var is their union.
Example. Find linear invariants of pressure and its derivatives for \(m\le 3\) using flat C-vectors. Type For [m=0,m \(\mathtt {<}\) =3,m++,Print[ShowLinInvariants[{ "p",m," ",1 }, \(\varphi \),{ },{ "sol" }]]]; in an input cell and execute.
Figure 24 displays the hierar chical organization of software capped by the foregoing three drivers. Some modules previously described are not present in those diagrams. Those are used for other tasks such as the first two listed at the start of “Invariant Finders” section.
Rights and permissions
About this article
Cite this article
Felippa, C.A., Oñate, E. & Idelsohn, S.R. Variational Framework for FIC Formulations in Continuum Mechanics: High Order Tensor-Derivative Transformations and Invariants. Arch Computat Methods Eng 25, 919–963 (2018). https://doi.org/10.1007/s11831-017-9245-0
Received:
Accepted:
Published:
Issue Date:
DOI: https://doi.org/10.1007/s11831-017-9245-0