Skip to main content
Log in

Variational Framework for FIC Formulations in Continuum Mechanics: High Order Tensor-Derivative Transformations and Invariants

  • Original Paper
  • Published:
Archives of Computational Methods in Engineering Aims and scope Submit manuscript

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.

This is a preview of subscription content, log in via an institution to check access.

Access this article

Price excludes VAT (USA)
Tax calculation will be finalised during checkout.

Instant access to the full article PDF.

Fig. 1
Fig. 2
Fig. 3

Similar content being viewed by others

References

  1. Abrahams R, Marsden JE (1978) Foundations of mechanics. Benjamin Cummins, London

    Google Scholar 

  2. Artin E (1957) Geometric algebra. Interscience Publishers, Geneva

    MATH  Google Scholar 

  3. Beer FP, Johnston ER (1992) Mechanics of materials, 2nd edn. McGraw-Hill, NewYork

    Google Scholar 

  4. Ben-Israel A, Greville TNE (2003) Generalized inverses: theory and applications, 2nd edn. Springer, New York

    MATH  Google Scholar 

  5. Birkhoff G, MacLane SA (1988) A survey of modern algebra, 3rd edn. Chelsea Pub. Co., Chelsea

    MATH  Google Scholar 

  6. Cosserat E, Cosserat F (1909) Théorie des corpes deformables. Hermann et Fils, Paris

    MATH  Google Scholar 

  7. Eringen AC (2002) Nonlocal continuum feld theories. Springer, Berlin

    MATH  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

  9. Felippa CA, Oñate E, Idelsohn SR FIC variational framework for continuum mechanics: variational principles (in preparation)

  10. Finlayson BA (1972) The method of weighted residuals and variational principles, Academic Press, reprinted by SIAM, 2014

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

    Google Scholar 

  12. Fleck NA, Hutchinson JW (2002) A reformulation of strain gradient plasticity. J Mech Phys Solids 42:295–361

    MATH  Google Scholar 

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

    Article  Google Scholar 

  14. Frewer M (2009) More clarity on the concept of frame indifference in classical continuum mechanics. Acta Mech 202:213–246

    Article  Google Scholar 

  15. Grace JH, Young A (1903) The algebra of invariants. Cambridge University Press, Cambridge

    MATH  Google Scholar 

  16. Graham A (1981) Kronecker products and matrix calculus with applications. Ellis Horwood Ltd., Chichester

    MATH  Google Scholar 

  17. Green AE, Rivlin RS (1964) Simple force and stress multipoles. Arch Ration Mech Anal 16:325–353

    Article  MathSciNet  Google Scholar 

  18. Green AE, Rivlin RS (1964) Multipolar continuum mechanics. Arch Ration Mech Anal 17:113–147

    Article  MathSciNet  Google Scholar 

  19. Guggenheimer H (1977) Differential invariants. Dover, New York

    MATH  Google Scholar 

  20. Gurtin ME (2002) A gradient theory of single-crystal viscoplasticity that accounts for geometrically necessary dislocations. J Mech Phys Solids 50:5–32

    Article  MathSciNet  Google Scholar 

  21. Herrmann LR (1965) Elasticity equations for nearly incompressible materials by a variational theorem. AIAA J 3:1896–1900

    Article  MathSciNet  Google Scholar 

  22. Higham NJ (2008) Functions of matrices: theory and computation. SIAM, Philadelphia

    Book  Google Scholar 

  23. Hilbert D (1999) Theory of algebraic invariants, Cambridge University Press, Cambridge; a reprint of Hilbert’s 1897 lectures at Göttingen

  24. Hill R (1950) The mathematical theory of plasticity. Oxford University Press, London

    MATH  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  Google Scholar 

  28. Lubliner J (1990) Plasticity theory. Macmillan Pub. Co., New York; reprinted by Dover, 2008

  29. Maugin GA, Metrikine AV (eds) (2010) Mechanics of generalized continua. Springer, New York

    Google Scholar 

  30. Mindlin RD, Tiersten HF (1962) Effect of coupled-stresses in linear elasticity. Arch Ration Mech Anal 11:415–422

    Article  Google Scholar 

  31. Mindlin RD (1964) Micro-structure in linear elasticity. Arch Ration Mech Anal 16:51–78

    Article  MathSciNet  Google Scholar 

  32. Mindlin RD (1965) Second gradient of strain and surface tension in linear elasticity. Int J Solids Struct 1:417–438

    Article  Google Scholar 

  33. Olver PJ (1993) Applications of lie groups to differential equations. Springer, Berlin

    Book  Google Scholar 

  34. Olver PJ (1999) Classical invariant theory. Cambridge University Press, Cambridge

    Book  Google Scholar 

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

    Article  Google Scholar 

  36. Oñate E, Taylor RE, Zienkiewicz OC, Rojek J (2003) A residual correction method based on finite calculus. Eng Comput 20:629–638

    Article  Google Scholar 

  37. Oñate E (2004) Possibilities of finite calculus in computational mechanics. Int J Numer Methods Eng 60:255–281

    Article  MathSciNet  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

    Article  MathSciNet  Google Scholar 

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

  47. Rao CR, Mitra SK (1971) Generalized inverse of matrices and its applications. Wiley, New York

    MATH  Google Scholar 

  48. Truesdell C, Toupin RA (1960) The classical field theories. In: Flgge S (ed) Handbuch der Physik. III(1). Springer, Berlin, pp 226–790

    Google Scholar 

  49. Truesdell C, Noll W (1965) The nonlinear field theories of mechanics. In: Flgge S (ed) Handbuch der Physik, vol III/3. Springer, Berlin

    Google Scholar 

  50. Toupin RA (1962) Elastic materials with coupled stresses. Arch Ration Mech Anal 11:385–414

    Article  Google Scholar 

  51. Turnbull HW (1929) The theory of determinants, matrices and invariants. Blackie and Sons, London. Expanded reprint by Dover, 1960

  52. Weyl H (1939) The classical groups, their invariants and representations. Princeton University Press, Princeton

    MATH  Google Scholar 

Download references

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

Authors

Corresponding author

Correspondence to Carlos A. Felippa.

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)}\):

$$\begin{aligned} \begin{array}{lll} m &{}\quad {{\mathcal {P}}}({\mathbf {T}}^{(m)}) &{}\quad \hbox {Roots of }\, {{\mathcal {P}}}({\mathbf {T}}^{(m)})=0 \\ 0 &{}\quad 1+\lambda ^2-2\lambda c &{}\quad c\pm js \\ 1 &{}\quad (1-\lambda )^2\, (1+\lambda ^2-2\lambda c_2) &{}\quad 1 (*),\, c_2\pm js_2 \\ 2 &{}\quad (1+\lambda ^2-2\lambda c)^2 \,(1+\lambda ^2-2\lambda c_3) &{}\quad c\pm js\,\hbox {(*)},\, c_3\pm js_3 \\ 3 &{}\quad (1-\lambda )^2\,\, (1+\lambda ^2-2\lambda c_2)^2\, (1+\lambda ^2-2\lambda c_4) &{}\quad 1(*),\, c_2\pm js_2\hbox {(*)},\, c_4\pm js_4 \\ 4 &{}\quad (1+\lambda ^2-2 \lambda c)^2\, (1+\lambda ^2-2 \lambda c_3)^2\, (1+\lambda ^2-2 \lambda c_5) &{}\quad c\pm js\hbox {(*)},\, c_3\pm j s_3\hbox {(*)},\, c_5\pm j s_5 \\ \end{array} \end{aligned}$$
(142)

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

$$\begin{aligned} {\mathbf {T}}_u^{(m)}\,\mathbf {V}_{uR}^{(m)}= \mathbf {V}_{uR}^{(m)}\,\mathbf {S}_u^{(m)},\quad \mathbf {S}_u^{(m)} = \mathbf {V}_L^{(m)}\,{\mathbf {T}}_u^{(m)}\, \mathbf {V}_R^{(m)}, \quad {\mathbf {T}}_u^{(m)} = \mathbf {V}_{uR}^{(m)}\,\mathbf {S}_u^{(m)}\, \mathbf {V}_{uL}^{(m)}, \;\hbox { with }\; \mathbf {V}_R^{(m)}\,\mathbf {V}_L^{(m)}={\mathbf {I}}. \end{aligned}$$
(143)

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:

$$\begin{aligned} \begin{aligned} \mathbf {S}^{(0)}&= \mathbf{diag }[\lambda ^{(0)}_1,\lambda ^{(0)}_2], \\\mathbf {S}^{(1)}&= \mathbf{diag }[1,1,\lambda ^{(1)}_3,\lambda ^{(1)}_4],\\\mathbf {S}^{(2)}&= \mathbf{diag }[\lambda ^{(2)}_1,\lambda ^{(2)}_2,\lambda ^{(2)}_3,\lambda ^{(2)}_4, \lambda ^{(2)}_5,\lambda ^{(2)}_6],\\\mathbf {S}^{(3)}&= \mathbf{diag }[1,1,\lambda ^{(3)}_3,\lambda ^{(3)}_4,\lambda ^{(3)}_5,\lambda ^{(3)}_6, \lambda ^{(3)}_7,\lambda ^{(3)}_8],\\\mathbf {S}^{(4)}&= \mathbf{diag }[\lambda ^{(4)}_1,\lambda ^{(4)}_2,\lambda ^{(4)}_3,\lambda ^{(4)}_4, \lambda ^{(4)}_5,\lambda ^{(4)}_6,\lambda ^{(4)}_7,\lambda ^{(4)}_8, \lambda ^{(4)}_9,\lambda ^{(4)}_{10}]. \end{aligned} \end{aligned}$$
(144)

in which

$$\begin{aligned} \begin{aligned} \lambda ^{(0)}_1&=\cos \varphi -j\sin \varphi ,\quad \lambda ^{(0)}_2=\cos \varphi +j\sin \varphi , \\\lambda ^{(1)}_3&=\cos 2\varphi -j\sin 2\varphi ,\quad \lambda ^{(1)}_4=\cos 2\varphi +j\sin 2\varphi , \\\lambda ^{(2)}_1&=\lambda ^{(2)}_2=\cos 2\varphi -j\sin 2\varphi ,\quad \lambda ^{(2)}_3= \lambda ^{(2)}_4=\cos 2\varphi +j\sin 2\varphi , \\\lambda ^{(3)}_3&=\lambda ^{(3)}_4=\cos 2\varphi +j\sin 2\varphi ,\quad \lambda ^{(3)}_5= \cos 4\varphi -j\sin 4\varphi ,\quad \lambda ^{(3)}_6=\cos 4\varphi +j\sin 4\varphi , \\\lambda ^{(4)}_1&=\lambda ^{(4)}_2=\cos \varphi -j\sin \varphi ,\quad \lambda ^{(4)}_3= \lambda ^{(4)}_4=\cos \varphi +j\sin \varphi ,\quad \lambda ^{(4)}_5= \lambda ^{(4)}_6=\cos 3\varphi -j\sin 3\varphi ,\\\lambda ^{(4)}_7&=\lambda ^{(4)}_8=\cos 3\varphi +j\sin 3\varphi ,\quad \lambda ^{(4)}_9= \cos 5\varphi -j\sin 5\varphi ,\quad \lambda ^{(4)}_{10}=\cos 5\varphi +j\sin 5\varphi .\\\end{aligned} \end{aligned}$$
(145)

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.

$$\begin{aligned} \mathbf {V}_L^{(3)}= \left[ \begin{array}{*{10}l} -j &{}1 \\ j &{}1 \\ \end{array}\right] , \quad \mathbf {V}_R^{(2)}={\textstyle {1\over 2}}\left[ \begin{array}{*{10}l} j &{}-j \\ 1 &{}1 \\ \end{array}\right] , \end{aligned}$$
(146)
$$\begin{aligned} \mathbf {V}_L^{(1)}= \left[ \begin{array}{*{10}l} 1 &{} 0 &{} 0 &{} 1 \\ 0 &{}-1 &{}1 &{} 0 \\ -\,1 &{}-j &{}-j &{} 1 \\ -\,1 &{} j &{} j &{}1 \\ \end{array}\right] , \quad \mathbf {V}_R^{(1)}={\textstyle {1\over 4}}\left[ \begin{array}{*{10}l} 2 &{} 0 &{} -1 &{} -1 \\ 0 &{}-2 &{} j &{}-j \\ 0 &{} 2 &{} j &{}-j \\ 2 &{}0 &{}1 &{}1 \\ \end{array}\right] , \end{aligned}$$
(147)
$$\begin{aligned} \mathbf {V}_L^{(2)}(k)= \left[ \begin{array}{*{15}l} 3 &{} 2j/k &{} 1 &{} j &{} 2/k &{} 3 j \\ -\,1 &{} -2j/k &{} 1 &{} j &{} -2/k &{}-j \\ 3 &{}-2j/k &{} 1 &{} -j &{} 2/k &{}-3 j \\ 1 &{} -2j/k &{} -1 &{} j &{} 2/k &{}-j \\ 1 &{} 2j/k &{}-1 &{} j &{}-2/k &{} -j \\ -\,j &{} -2/k &{} j &{} -1 &{} 2j/k &{} 1 \\ \end{array}\right] , \quad \mathbf {V}_R^{(2)}(k)={\textstyle {1\over 8}}\left[ \begin{array}{*{15}l} 1 &{} 0 &{} 1 &{} 0 &{} 1 &{} j \\ 0 &{} j k &{} 0 &{} j k &{} -j k &{} -k \\ 1 &{} 2 &{} 1 &{}-2 &{}-1 &{} -j \\ -\,j &{} -2j &{} j &{} -2j &{} -j &{} -1 \\ 0 &{}-k &{} 0 &{} k &{}-k &{} -j k \\ -\,j &{} 0 &{} j &{} 0 &{} j &{} 1 \\ \end{array}\right] , \end{aligned}$$
(148)
$$\begin{aligned} \mathbf {V}_L^{(3)}(k)= \left[ \begin{array}{*{10}l} 2 &{} 0 &{} 2/k &{} 0 &{} 0 &{} 2/k &{} 0 &{} 2 \\ 0 &{} 2/k &{} 0 &{} 2 &{} -2 &{} 0 &{} -2/k &{} 0 \\ 4 &{} 6j/k &{} 0 &{} 2j &{} 2j &{} 0 &{} 6j/k &{} -4 \\ -\,2j &{} 4/k &{} 2j/k &{} 0 &{} 0 &{} -2j/k &{} 4/k &{} 2j \\ 4 &{} -6j/k &{} 0 &{} -2j &{} -2j &{} 0 &{} -6j/k &{} -4 \\ 2j &{} 4/k &{} -2j/k &{} 0 &{} 0 &{} 2j/k &{} 4/k &{} -2j \\ 1 &{} 3j/k &{} -3/k &{} -j &{} j &{} -3/k &{} -3j/k &{} 1 \\ 1 &{} -3j/k &{} -3/k &{} j &{} -j &{} -3/k &{} 3j/k &{} 1 \\ \end{array}\right] , \end{aligned}$$
(149)
$$\begin{aligned} \mathbf {V}_R^{(3)}(k)= {1\over 16}\left[ \begin{array}{*{10}l} 3 &{} 0 &{} 1 &{} 0 &{} 1 &{} 0 &{} 1 &{} 1 \\ 0 &{} k &{} 0 &{} k &{} 0 &{} k &{} -j k &{} j k \\ k &{} 0 &{} k &{} -2j k &{} k &{} 2j k &{} -k &{} -k \\ 0 &{} 3 &{} -2j &{} -3 &{} 2j &{} -3 &{} j &{} -j \\ 0 &{} -3 &{} -2j &{} -3 &{} 2j &{} -3 &{} -j &{} j \\ k &{} 0 &{} -k &{} 2j k &{} -k &{} -2j k &{} -k &{} -1 \\ 0 &{} -k &{} 0 &{} k &{} 0 &{} k &{} j k &{} -j k \\ 3 &{} 0 &{} -1 &{} 0 &{} -1 &{} 0 &{} 1 &{} 1 \\ \end{array}\right] , \end{aligned}$$
(150)
$$\begin{aligned} \mathbf {V}_L^{(4)}(k_1,k_2)= \left[ \begin{array}{*{15}l} 2 &{} 0 &{} 4/k_2 &{} 0 &{} 2 &{} 2j &{} 0 &{} 4j/k_2 &{} 0 &{} 2j \\ -\,2j &{} 4/k_1 &{} 0 &{} 4/k_1 &{} 2j &{} -2 &{} -4j/k_1 &{} 0 &{} -4j/k_1 &{} 2 \\ 2 &{} 0 &{} 4/k_2 &{} 0 &{} 2 &{} -2j &{} 0 &{} -4j/k_2 &{} 0 &{} -2j \\ 2j &{} 4/k_1 &{} 0 &{} 4/k_1 &{} -2j &{} -2 &{} 4j/k_1 &{} 0 &{} 4j/k_1 &{} 2 \\ -\,1 &{} -4j/k_1 &{} 6/k_2 &{} 4j/k_1 &{} -1 &{} j &{} -4/k_1 &{} -6j/k_2 &{} 4/k_1 &{} j \\ -\,3j &{} 8/k_1 &{} 6j/k_2 &{} 0 &{} j &{} 1 &{} 0 &{} 6/k_2 &{} 8j/k_1 &{} -3 \\ -\,1 &{} 4j/k_1 &{} 6/k_2 &{} -4j/k_1 &{} -1 &{} -j &{} -4/k_1 &{} 6j/k_2 &{} 4/k_1 &{} -j \\ 3j &{} 8/k_1 &{} -6j/k_2 &{} 0 &{} -j &{} 1 &{} 0 &{} 6/k_2 &{} -8j/k_1 &{} -3 \\ 1 &{} 4j/k_1 &{} -6/k_2 &{} -4j/k_1 &{} 1 &{} j &{} -4/k_1 &{} -6j/k_2 &{} 4/k_1 &{} j \\ j &{} 4/k_1 &{} -6j/k_2 &{} -4/k_1 &{} j &{} 1 &{} -4j/k_1 &{} -6/k_2 &{} 4j/k_1 &{} 1 \\ \end{array}\right] , \end{aligned}$$
(151)
$$\begin{aligned} \mathbf {V}_R^{(4)}(k_1,k_2)= {1\over 32}\left[ \begin{array}{*{15}l} 3 &{} 2j &{} 3 &{} -2j &{} 1 &{} 2j &{} 1 &{} -2j &{} 1 &{} -j \\ 0 &{} k_1 &{} 0 &{} k_1 &{} 0 &{} k_1 &{} 0 &{} k_1 &{} -j k_1 &{} k_1 \\ k_2 &{} 0 &{} k_2 &{} 0 &{} k_2 &{} 0 &{} k_2 &{} 0 &{} -k_2 &{} j k_2 \\ 0 &{} k_1 &{} 0 &{} k_1 &{} -2j k_1 &{} k_1 &{} 2j k_1 &{} k_1 &{} j k_1 &{} -k_1 \\ 3 &{} -2j &{} 3 &{} 2j &{} -3 &{} -2j &{} -3 &{} 2j &{} 1 &{} -j \\ -\,3j &{} -2 &{} 3j &{} -2 &{} -3j &{} 2 &{} 3j &{} 2 &{} -j &{} 1 \\ 0 &{} j k_1 &{} 0 &{} -j k_1 &{} -2 k_1 &{} -j k_1 &{} -2 k_1 &{} j k_1 &{} -k_1 &{} j k_1 \\ -\,j k_2 &{} 0 &{} j k_2 &{} 0 &{} j k_2 &{} 0 &{} -j k_2 &{} 0 &{} j k_2 &{} -k_2 \\ 0 &{} j k_1 &{} 0 &{} -j k_1 &{} 0 &{} -j k_1 &{} 0 &{} j k_1 &{} k_1 &{} -j k_1 \\ -\,3j &{} 2 &{} 3j &{} 2 &{} j &{} -2 &{} -j &{} -2 &{} -j &{} 1 \\ \end{array}\right] . \end{aligned}$$
(152)

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

$$\begin{aligned} {\mathbf {D}}\,\mathbf {Y}^{(m)}\,{\mathbf {D}}-\mathbf {Y}^{(m)}=\mathbf {0}, \quad \hbox {in which } {\mathbf {D}}=\mathbf {S}_\varphi ^{(m)} \,\hbox { and }\, \mathbf {Y}^{(m)}=\big (\mathbf {V}_L^{(m)}\big )^T\,{\mathbf {W}}^{(m)}\,\mathbf {V}_L^{(m)}. \end{aligned}$$
(153)

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

$$\begin{aligned} \begin{aligned} \mathbf {Y}^{(0)}&=\left[ \begin{array}{*{15}l} 0 &{} Y_{12} \\ Y_{12} &{} 0 \\ \end{array}\right] , \quad \mathbf {Y}^{(1)}=\left[ \begin{array}{*{15}l} Y_{11} &{} Y_{12} &{} 0 &{} 0 \\ Y_{12} &{} Y_{22} &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} Y_{34} \\ 0 &{} 0 &{} Y_{34} &{} 0 \\ \end{array}\right] ,\quad \mathbf {Y}^{(2)}=\left[ \begin{array}{*{15}l} 0 &{} 0 &{} Y_{13} &{} Y_{14} &{} 0 &{} 0 \\ 0 &{} 0 &{} Y_{23} &{} Y_{24} &{} 0 &{} 0 \\ Y_{13} &{} Y_{23} &{} 0 &{} 0 &{} 0 &{} 0 \\ Y_{14} &{} Y_{24} &{} 0 &{} 0 &{} 0 &{} 0 \\ , 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{56} \\ 0 &{} 0 &{} 0 &{} 0 &{} Y_{56} &{} 0 \\ \end{array}\right] , \\\mathbf {Y}^{(3)}&=\left[ \begin{array}{*{15}l} Y_{11} &{} Y_{12} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ {}Y_{12} &{} Y_{22} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} Y_{35} &{} Y_{36} &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} Y_{45} &{} Y_{46} &{} 0 &{} 0 \\ 0 &{} 0 &{} Y_{35} &{} Y_{45} &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} Y_{36} &{} Y_{46} &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{78} \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{78} &{} 0\\ \end{array}\right] , \\{}\mathbf {Y}^{(4)}&=\left[ \begin{array}{*{15}l} 0 &{} 0 &{} Y_{13} &{} Y_{14} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} Y_{23} &{} Y_{24} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ Y_{13} &{} Y_{23} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ Y_{14} &{} Y_{24} &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{57} &{} Y_{58} &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{67} &{} Y_{68} &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} Y_{57} &{} Y_{67} &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} Y_{58} &{} Y_{68} &{} 0 &{} 0 &{} 0 &{} 0 \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{9\,10} \\ 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} 0 &{} Y_{9\,10} &{} 0 \\ \end{array}\right] . \end{aligned} \end{aligned}$$
(154)

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

$$ N_{uJ}^{(m)}=2m+2-\hbox {mod}(m,2)=\hbox {floor}\big ((4/3)\times \hbox {floor}(3n/2)\big ). $$
(155)

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

$$ {\mathbf {T}}_\epsilon ^{(m)}=\mathbf {V}^{(m)}_{\epsilon L},{\mathbf {D}}_\epsilon ^{{m}}\,\mathbf {V}^{(m)}_{\epsilon R}, $$
(156)

This is closely linked to that of the displacemnent transformations studied in “Characteristic Polynomials” section, since

$$\begin{aligned} {\mathbf {D}}_\epsilon ^{(m)}={\mathbf {D}}_u^{(m+1)}, \quad \mathbf {V}^{(m)}_{\epsilon L}=\mathbf {V}_{uL}^{(m+1)}\,{\mathbf {T}}^{(m)}_{\epsilon }, \quad \mathbf {V}^{(m)}_{\epsilon R}=\mathbf {V}_{uR}^{(m+1)}\,{\mathbf {T}}^{(m)}_{\epsilon }. \end{aligned}$$
(157)

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

$$\begin{aligned} \mathbf {V}^{(1)}_{\epsilon L}=\left[ \begin{array}{*{15}l} 0 &{}-2 j &{}-2 &{}0 &{}j &{}1 \\ -\,j &{}1 &{}-j &{}1 &{}0 &{}0 \\ 0 &{}2 j &{}-2 &{}0 &{}-j &{}1 \\ j &{}1 &{}j &{}1 &{}0 &{}0 \\ -\,1 &{}-j &{}1 &{}j &{}-j &{}1 \\ -\,1 &{}j &{}1 &{}-j &{}j &{}1 \\ \end{array}\right] , \quad \mathbf {V}^{(1)}_{\epsilon R}=\left[ \begin{array}{*{15}l} 1 &{}3 j &{}1 &{}-3 j &{}-1 &{}-1 \\ j &{}1 &{}-j &{}1 &{}j &{}-j \\ -\,1 &{}j &{}-1 &{}-j &{}1 &{}1 \\ -\,j &{}3 &{}j &{}3 &{}-j &{}j \\ -\,2 j &{}2 &{}2 j &{}2 &{}2 j &{}-2 j \\ 2 &{}2 j &{}2 &{}-2 j &{}2 &{}2 \\ \end{array}\right] . \end{aligned}$$
(158)

For \(m=2\), the reduced strain vector is used:

$$\begin{aligned} \begin{aligned} \mathbf {V}^{(2)}_{\epsilon L}&= \left[ \begin{array}{*{10}l} 0 &{} 1 &{} 0 &{} 0 &{} -1 &{} 0 &{} -1 &{} 0 &{} 1 \\ 0 &{} 0 &{} -2 &{} -2 &{} 0 &{} 0 &{} 0 &{} 1 &{} 0 \\ 1 &{} 0 &{} 1 &{} 1 &{} 0 &{} 1 &{} 0 &{} 0 &{} 0 \\ 0 &{} -1 &{} -2 j &{} 2 j &{} -1 &{} 0 &{} 1 &{} 0 &{} 1 \\ -\,1 &{}-j &{} 1 &{} -1 &{}-j &{} 1 &{} 0 &{} 0 &{} 0 \\ 0 &{} -1 &{} 2 j &{} -2 j &{} -1 &{} 0 &{} 1 &{} 0 &{} 1 \\ -\,1 &{} j &{} 1 &{} -1 &{} j &{} 1 &{} 0 &{} 0 &{} 0 \\ j &{} -1 &{}-j &{}-j &{} 1 &{} j &{} -1 &{}-j &{} 1 \\ -\,j &{} -1 &{} j &{} j &{} 1 &{}-j &{} -1 &{} j &{} 1 \\ \end{array}\right] , \quad \mathbf {V}^{(2)}_{\epsilon R}= {\textstyle {1\over 16}}\left[ \begin{array}{*{10}l} 0 &{} 2 &{} 6 &{} 2 j &{} -4 &{} -2 j &{} -4 &{}-j &{} j \\ 4 &{} 0 &{} 0 &{} 0 &{} 4 j &{} 0 &{} -4 j &{} -2 &{} -2 \\ 0 &{} -2 &{} 2 &{} 2 j &{} 0 &{} -2 j &{} 0 &{} j &{}-j \\ 0 &{} -2 &{} 2 &{} -2 j &{} 0 &{} 2 j &{} 0 &{} j &{}-j \\ -\,4 &{} 0 &{} 0 &{} 0 &{} 4 j &{} 0 &{} -4 j &{} 2 &{} 2 \\ 0 &{} 2 &{} 6 &{} -2 j &{} 4 &{} 2 j &{} 4 &{}-j &{} j \\ -\,4 &{} 0 &{} 0 &{} 4 &{} 4 j &{} 4 &{} -4 j &{} -2 &{} -2 \\ 0 &{} 8 &{} 8 &{} 0 &{} 0 &{} 0 &{} 0 &{} 4 j &{} -4 j \\ 4 &{} 0 &{} 0 &{} 4 &{} 4 j &{} 4 &{} -4 j &{} 2 &{} 2 \\ \end{array}\right] \end{aligned} \end{aligned}$$
(159)

in which

$$\begin{aligned} \begin{aligned} {\mathbf {D}}&=\mathbf{diag }\big [1,\;1,\; c_2- j s_2,\; c_2-j s_2,\;c_2+j s_2,\; c_2+j s_2,\;c_4-j s_4,\;c_4+j s_4\;\big ] \\{}\mathbf {Y}^T&= \left[ \begin{array}{*{10}l} 0 &{} 1 &{} 0 &{} 0 &{} -1 &{} 0 &{} -1 &{} 1 \\ 1 &{} 0 &{} 1 &{} 1 &{} 0 &{} 1 &{} 0 &{} 0 \\ 0 &{} -1 &{} -2 j &{} 2 j &{} -1 &{} 0 &{} 1 &{} 1 \\ -\,1 &{} -j &{} 1 &{} -1 &{} -j &{} 1 &{} 0 &{} 0 \\ 0 &{} -1 &{} 2 j &{} -2 j &{} -1 &{} 0 &{} 1 &{} 1 \\ -\,1 &{} j &{} 1 &{} -1 &{} j &{} 1 &{} 0 &{} 0 \\ j &{} -1 &{} -3 j &{} -3 j &{} 1 &{} j &{} -1 &{} 1 \\ -\,j &{} -1 &{} 3 j &{} 3 j &{} 1 &{} -j &{} -1 &{} 1 \\ \end{array}\right] , \quad \mathbf {X}={\textstyle {1\over 16}}\left[ \begin{array}{*{10}l} 0 &{} 6 &{} 2 j &{} -4 &{} -2 j &{} -4 &{} -j &{} j \\ 4 &{} 0 &{} 0 &{} 4 j &{} 0 &{} -4 j &{} -2 &{} -2 \\ 0 &{} 2 &{} 2 j &{} 0 &{} -2 j &{} 0 &{} j &{} -j \\ 0 &{} 2 &{} -2 j &{} 0 &{} 2 j &{} 0 &{} j &{} -j \\ -\,4 &{} 0 &{} 0 &{} 4 j &{} 0 &{} -4 j &{} 2 &{} 2 \\ 0 &{} 6 &{} -2 j &{} 4 &{} 2 j &{} 4 &{} -j &{} j \\ -\,4 &{} 0 &{} 4 &{} 4 j &{} 4 &{} -4 j &{} -2 &{} -2 \\ 4 &{} 0 &{} 4 &{} 4 j &{} 4 &{} -4 j &{} 2 &{} 2 \\ \end{array}\right] \end{aligned} \end{aligned}$$
(160)

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

$$\begin{aligned} {\mathbf {T}}^{(m)}_{e}=\mathbf {V}_{eL}^{(m)}\,{\mathbf {D}}_{e}^{(m)}\,\mathbf {V}_{eR}^{(m)}, \quad {\mathbf {T}}^{(m)}_p=\mathbf {V}_{pL}^{(m)}\,{\mathbf {D}}_p^{(m)}\,\mathbf {V}_{pR}^{(m)}. \end{aligned}$$
(161)

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:

$$ {\mathbf {D}}^{(1)}= \mathbf{diag }[c-j\,s , c+j\,s], $$
(162)
$$ {\mathbf {D}}^{(2)}= \mathbf{diag }[1 , c_2-j\,s_2 , c_2+j\,s_2], $$
(163)
$$ {\mathbf {D}}^{(3)}= \mathbf{diag }[c-j\,s , c+j\,s , c_3-j\,s_3 , c_3+j\,s_3], $$
(164)

The eigenvectors for the volumetric strain transformation matrices are

$$\begin{aligned} \mathbf {V}_{e L}^{(1)}= \left[ \begin{array}{*{10}l} j &{} -j \\ 1 &{} 1\\ \end{array}\right] ,\quad \mathbf {V}_{e R}^{(1)} = {\textstyle {1\over 2}}\left[ \begin{array}{*{10}l} -j &{} 1 \\ j &{} 1\\ \end{array}\right] , \end{aligned}$$
(165)
$$\begin{aligned} \mathbf {V}_{e L}^{(2)}= \left[ \begin{array}{*{10}l} 1 &{} -1 &{} -1 \\ 0 &{} j g &{} -j\,g \\ 1 &{} 1 &{} 1\\ \end{array}\right] ,\quad \mathbf {V}_{e R}^{(2)} = {\textstyle {1\over 4}}\left[ \begin{array}{*{10}l} 2 &{} 0 &{} 2 \\ -\,1 &{} -2j/g &{} 1 \\ -\,1 &{} 2 j/g &{} 1\\ \end{array}\right] , \end{aligned}$$
(166)
$$\begin{aligned} \mathbf {V}_{e L}^{(3)}= {\textstyle {1\over 3}}\left[ \begin{array}{*{10}l}3j &{} -3j &{} -3j &{} 3j \\ g &{} g &{} -3g &{} -3g \\ j\,g &{} -j\,g &{} 3j\,g &{} -3j\,g \\ 3 &{} 3 &{} 3 &{} 3\\ \end{array}\right] ,\quad \mathbf {V}_{e R}^{(3)}={\textstyle {1\over 8}}\left[ \begin{array}{*{10}l}-3 j &{} 3/g &{} -3j/g &{} 3 \\ 3 j &{} 3/g &{} 3 j/g &{} 3 \\ j &{} -3/g &{} -3j/g &{} 1 \\ -\,j &{} -3/g &{} 3 j/g &{} 1\\ \end{array}\right] , \end{aligned}$$
(167)

The eigenvectors for the pressure transformation matrices are

$$\begin{aligned} \mathbf {V}_{p L}^{(1)}= \left[ \begin{array}{*{10}l}-j &{} -j \\ 1 &{} 1\\ \end{array}\right] ,\quad \mathbf {V}_{p R}^{(1)} ={\textstyle {1\over 2}}\left[ \begin{array}{*{10}l} -j &{} 1 \\ j &{} 1\\ \end{array}\right] , \end{aligned}$$
(168)
$$\begin{aligned} \mathbf {V}_{p L}^{(2)}= \left[ \begin{array}{*{10}l}1 &{} -1 &{} -1 \\ 0 &{} 2 j/g &{} -2j/g \\ 1 &{} 1 &{} 1\\ \end{array}\right] ,\quad \mathbf {V}_{p R}^{(2)} = {\textstyle {1\over 4}}\left[ \begin{array}{*{10}l} 2 &{} 0 &{} 2 \\ -\,1 &{} -j\,g &{} 1 \\ -\,1 &{} j g &{} 1\\ \end{array}\right] , \end{aligned}$$
(169)
$$\begin{aligned} \mathbf {V}_{p L}^{(3)}= \left[ \begin{array}{*{10}l}j &{} -j &{} -j &{} j \\ 1/g &{} 1/g &{} -3/g &{} -3/g \\ j/g &{} -j/g &{} 3 j/g &{} -3j/g \\ 1 &{} 1 &{} 1 &{} 1\\ \end{array}\right] , \quad \mathbf {V}_{p R}^{(3)}={\textstyle {1\over 8}}\left[ \begin{array}{*{10}l}-3 j &{} g &{} -j\,g &{} 3 \\ 3 j &{} g &{} j g &{} 3 \\ j &{} -g &{} -j\,g &{} 1 \\ -\,j &{} -g &{} j g &{} 1\\ \end{array}\right] , \end{aligned}$$
(170)

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

$$ {\texttt {v=FCVector[field]}} $$
(171)

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.

Fig. 4
figure 4

Field C-vector constructor module FCVector, Part 1

Fig. 5
figure 5

Field C-vector constructor module FCVector, Part 2

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

$$ {\texttt {v=SymbVector[letter,n,ib] }} $$
(172)
$${\texttt {S=SymbSquareMatrix[letter,n,mxpat] }} $$
(173)

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.

Table 3 Square matrix entry pattern identifier
Fig. 6
figure 6

Symbolic matrix and vector constructors

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

$${\texttt {v=SquareMatrixEntries[S,mxpat] }} $$
(174)
$${\texttt {v=SquareMatrixSymbols[S,mxpat] }} $$
(175)

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

Fig. 7
figure 7

Module that returns rotated field transformation matrices

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

$$ {\texttt {T=RFTMatrix[field,}}\varphi {\texttt {]}} $$
(176)

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.

Fig. 8
figure 8

Modules that return strain-displacement and C-vector version transformations

The module is invoked as

$$ \texttt {T}=\texttt {SDTMatrix[fieldx]} . $$
(177)

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

$$ {\texttt {H=CVTMatrix[\{\,fld,m,tag,mdcc\,\}]}} $$
(178)
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.

Fig. 9
figure 9

Transformation primitives for displacements and their first 4 derivatives

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.

Fig. 10
figure 10

Transformation primitives for strains and their first 3 derivatives

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.

Fig. 11
figure 11

Transformation primitives for volumetric strain and its first 3 derivatives

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.

Fig. 12
figure 12

Primitive modules for strain-displacement transformation matrices

Fig. 13
figure 13

Primitive modules for displacement-strain transformation matrices

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.

Fig. 14
figure 14

Transformation primitives for H matrices

1.3 Invariant Finders

Three computational processes were implemented to obtain the results presented in the main text:

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

$${\texttt {\{\,v,w,var\,\}=WeightVectorSetup[field]}} $$
(179)
$${\texttt {\{\,v,W,var\,\}=WeightMatrixSetup[field,mxpat]}} $$
(180)

Modules WeightVectorSetup and WeightMatrixSetup set up unknown vectors and matrices used in linear and quadratic invariant calculations, respectively. The arguments are

  1. field

    the 4-item field specification described in “Field Cast Vector” section.

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

  1. v

    The field C-vector returned by FCVector. Its length is nv.

  2. w

    For WeightVectorSetup: the initialized weight vector of length nv.

  3. W

    For WeightMatrixSetup, the initialized weight matrix of order nv.

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

Fig. 15
figure 15

Modules that initialize weight unknowns

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

$$ \{\,\texttt {T,R,eqs}\,\}=\hbox {InvResidualEqs}[\hbox {field},\varphi ,\hbox {Wm}] $$
(181)

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.

Fig. 16
figure 16

Module that sets up invariance constraint equations from appropriate residual

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

$$ {\texttt {Q=InvKernelSolver[field1,field2,mxpat,letter]}} $$
(182)

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.

Fig. 17
figure 17

Module that returns invariant kernel for bilinear and quadratic forms of FIC functionals

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

$$ {\texttt {w=LinInvSolver[field,}}\varphi {\texttt {,pvlist,prt]}} $$
(183)

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.

Fig. 18
figure 18

Module that solves for linear invariants

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

$$ {\texttt {W=QuadInvOnePassSolver[field,}}\varphi ,{\texttt {mxpat,pvlist,prt]}} $$
(184)

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.

Fig. 19
figure 19

Quadratic invariant solver: one pass implementation

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

$$\begin{aligned} {\mathbf {W}}^{(2)}_u=\left[ \begin{array}{*{10}l} W_{14}+W_{22}+W_{23} &{} 0 &{} 0 &{} W_{14} \\ 0 &{} W_{22} &{} W_{23} &{} 0 \\ 0 &{} W_{23} &{} W_{22} &{} 0 \\ W_{14} &{} 0 &{} 0 &{} W_{14}+W_{22}+W_{23} \\ \end{array}\right] , \end{aligned}$$
(185)

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

$$ {\texttt {p}vtab=PVCombs[nv,pvdata]} $$
(186)

where

  1. nv

    The number of weight variables, which is the length of var returned by WeightMatrixSetup.

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

Fig. 20
figure 20

Auxiliary modules for quadratic invariant multipass solver

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

$$ {\texttt {Wbest=QuadInvMultiPassSolver[field,}}\varphi ,\texttt {mxpat,pvdata,prt]} $$
(187)

The argument sequence is identical to that of QuadInvOnePassSolver, described in “Quadratic Invariant One Pass Solver” section. with exception of the last two arguments:

  1. pvdata

    Passive variable stochastic generation data to be passed to PVCombs; see “Auxiliary Modules for Multipass Solver” section.

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

Fig. 21
figure 21

Quadratic invariant solver: multipass implementation

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

$$ {\texttt {\{\,Wc,newvar\,\}=CleanSolution[Ws,mxpat,oldlet,newlet,ib,reord]}} $$
(188)

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

Fig. 22
figure 22

Modules to clean up invariant solutions and reorder free parameters

The cleaned solution in matrix notation is

$$\begin{aligned} {\mathbf {W}}^{(2)}_u=\left[ \begin{array}{*{10}l} \eta _1+\eta _2+\eta _3 &{} 0 &{} 0 &{}\eta _2 \\ 0 &{}\eta _2 &{}\eta _3 &{} 0 \\ 0 &{}\eta _3 &{}\eta _2 &{} 0 \\ \eta _2 &{} 0 &{} 0 &{}\eta _1+\eta _2+\eta _3 \\ \end{array}\right] , \end{aligned}$$
(189)

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

$$ {\texttt {\{\,Wc,newvar\,\}=ReorderFreePars[Wc,oldvar,ib,reord]}} $$
(190)

The arguments are

  1. Wc

    A solution (vector or matrix) already cleaned by CleanSolution.

  2. oldvar

    List of free parameters to be reordered.

  3. ib

    Same as for CleanSolution.

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

$${\texttt {\{\,wc,var\,\}=ShowLinInvariants[field,reord,prt] }} $$
(191)
$${\texttt {\{\,Wc,var\,\}=ShowQuadInvariants[field,pvlist,mpats,reord,prt] } } $$
(192)
$${\texttt {\{\,Wc,var\,\}=ShowBestQuadInvariants[field,pvdata,mpats,reord,prt]} } $$
(193)

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.

Fig. 23
figure 23

Three driver modules that integrate invariant computations

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.

Fig. 24
figure 24

Hierarchical flow diagrams for invariant computations: a linear invariants, b quadratic invariants with one-pass solution, and c quadratic invariants multipass solutions. Box color code: yellow for primitive constructors; beige for interface constructors; blue for processors; green for drivers. \(\boxed {A}\rightarrow \boxed {B}\) means that A calls B. (Color figure online)

Rights and permissions

Reprints and permissions

About this article

Check for updates. Verify currency and authenticity via CrossMark

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

Download citation

  • Received:

  • Accepted:

  • Published:

  • Issue Date:

  • DOI: https://doi.org/10.1007/s11831-017-9245-0

Navigation