Other operators
Base.LinAlg.cross
Base.LinAlg.det
Base.LinAlg.eig
Base.LinAlg.norm
Base.LinAlg.trace
Base.inv
Base.transpose
Tensors.dev
Tensors.dotdot
Tensors.dott
Tensors.majorsymmetric
Tensors.majortranspose
Tensors.minorsymmetric
Tensors.minortranspose
Tensors.rotate
Tensors.skew
Tensors.symmetric
Tensors.tdot
Transpose-dot
The dot product between the transpose of a tensor with itself. Results in a symmetric tensor.
Tensors.tdot
— Function.tdot(::SecondOrderTensor)
Computes the transpose-dot of a second order tensor with itself. Returns a SymmetricTensor
.
Example:
julia> A = rand(Tensor{2,3})
3×3 Tensors.Tensor{2,3,Float64,9}:
0.590845 0.460085 0.200586
0.766797 0.794026 0.298614
0.566237 0.854147 0.246837
julia> tdot(A)
3×3 Tensors.SymmetricTensor{2,3,Float64,6}:
1.2577 1.36435 0.48726
1.36435 1.57172 0.540229
0.48726 0.540229 0.190334
Tensors.dott
— Function.dott(::SecondOrderTensor)
Computes the dot-transpose of a second order tensor with itself. Returns a SymmetricTensor
.
Example:
julia> A = rand(Tensor{2,3})
3×3 Tensors.Tensor{2,3,Float64,9}:
0.590845 0.460085 0.200586
0.766797 0.794026 0.298614
0.566237 0.854147 0.246837
julia> dott(A)
3×3 Tensors.SymmetricTensor{2,3,Float64,6}:
0.601011 0.878275 0.777051
0.878275 1.30763 1.18611
0.777051 1.18611 1.11112
Norm
The (2)-norm of a tensor is defined for a vector, second order tensor and fourth order tensor as
Base.LinAlg.norm
— Function.norm(::Vec)
norm(::SecondOrderTensor)
norm(::FourthOrderTensor)
Computes the norm of a tensor.
Example:
julia> A = rand(Tensor{2,3})
3×3 Tensors.Tensor{2,3,Float64,9}:
0.590845 0.460085 0.200586
0.766797 0.794026 0.298614
0.566237 0.854147 0.246837
julia> norm(A)
1.7377443667834922
Trace
The trace for a second order tensor is defined as the sum of the diagonal elements. This can be written as
Base.LinAlg.trace
— Function.trace(::SecondOrderTensor)
Computes the trace of a second order tensor. The synonym vol
can also be used.
Example:
julia> A = rand(SymmetricTensor{2,3})
3×3 Tensors.SymmetricTensor{2,3,Float64,6}:
0.590845 0.766797 0.566237
0.766797 0.460085 0.794026
0.566237 0.794026 0.854147
julia> trace(A)
1.9050765715072775
Determinant
Determinant for a second order tensor.
Base.LinAlg.det
— Function.det(::SecondOrderTensor)
Computes the determinant of a second order tensor.
Example:
julia> A = rand(SymmetricTensor{2,3})
3×3 Tensors.SymmetricTensor{2,3,Float64,6}:
0.590845 0.766797 0.566237
0.766797 0.460085 0.794026
0.566237 0.794026 0.854147
julia> det(A)
-0.1005427219925894
Inverse
Inverse of a second order tensor such that
where $\mathbf{I}$ is the second order identitiy tensor.
Base.inv
— Function.inv(::SecondOrderTensor)
Computes the inverse of a second order tensor.
Example:
julia> A = rand(Tensor{2,3})
3×3 Tensors.Tensor{2,3,Float64,9}:
0.590845 0.460085 0.200586
0.766797 0.794026 0.298614
0.566237 0.854147 0.246837
julia> inv(A)
3×3 Tensors.Tensor{2,3,Float64,9}:
19.7146 -19.2802 7.30384
6.73809 -10.7687 7.55198
-68.541 81.4917 -38.8361
Transpose
Transpose of tensors is defined by changing the order of the tensor's "legs". The transpose of a vector/symmetric tensor is the vector/tensor itself. The transpose of a second order tensor can be written as:
and for a fourth order tensor the minor transpose can be written as
and the major transpose as
Base.transpose
— Function.transpose(::Vec)
transpose(::SecondOrderTensor)
transpose(::FourthOrderTensor)
Computes the transpose of a tensor. For a fourth order tensor, the transpose is the minor transpose.
Example:
julia> A = rand(Tensor{2,2})
2×2 Tensors.Tensor{2,2,Float64,4}:
0.590845 0.566237
0.766797 0.460085
julia> A'
2×2 Tensors.Tensor{2,2,Float64,4}:
0.590845 0.766797
0.566237 0.460085
Tensors.minortranspose
— Function.minortranspose(::FourthOrderTensor)
Computes the minor transpose of a fourth order tensor.
Tensors.majortranspose
— Function.majortranspose(::FourthOrderTensor)
Computes the major transpose of a fourth order tensor.
Symmetric
The symmetric part of a second and fourth order tensor is defined by:
Tensors.symmetric
— Function.symmetric(::SecondOrderTensor)
symmetric(::FourthOrderTensor)
Computes the symmetric part of a second or fourth order tensor. For a fourth order tensor, the symmetric part is the same as the minor symmetric part. Returns a SymmetricTensor
.
Example:
julia> A = rand(Tensor{2,2})
2×2 Tensors.Tensor{2,2,Float64,4}:
0.590845 0.566237
0.766797 0.460085
julia> symmetric(A)
2×2 Tensors.SymmetricTensor{2,2,Float64,3}:
0.590845 0.666517
0.666517 0.460085
Tensors.minorsymmetric
— Function.minorsymmetric(::FourthOrderTensor)
Computes the minor symmetric part of a fourth order tensor, returns a SymmetricTensor{4}
.
Tensors.majorsymmetric
— Function.majorsymmetric(::FourthOrderTensor)
Computes the major symmetric part of a fourth order tensor, returns a Tensor{4}
.
Skew symmetric
The skew symmetric part of a second order tensor is defined by
The skew symmetric part of a symmetric tensor is zero.
Tensors.skew
— Function.skew(::SecondOrderTensor)
Computes the skew-symmetric (anti-symmetric) part of a second order tensor, returns a Tensor{2}
.
Deviator
The deviatoric part of a second order tensor is defined by
Tensors.dev
— Function.dev(::SecondOrderTensor)
Computes the deviatoric part of a second order tensor.
Example:
julia> A = rand(Tensor{2,3});
julia> dev(A)
3×3 Tensors.Tensor{2,3,Float64,9}:
0.0469421 0.460085 0.200586
0.766797 0.250123 0.298614
0.566237 0.854147 -0.297065
julia> trace(dev(A))
0.0
Cross product
The cross product between two vectors is defined as
Base.LinAlg.cross
— Function.cross(::Vec, ::Vec)
Computes the cross product between two Vec
vectors, returns a Vec{3}
. For dimensions 1 and 2 the Vec
's are expanded to 3D first. The infix operator ×
(written \times
) can also be used.
Example:
julia> a = rand(Vec{3})
3-element Tensors.Tensor{1,3,Float64,3}:
0.590845
0.766797
0.566237
julia> b = rand(Vec{3})
3-element Tensors.Tensor{1,3,Float64,3}:
0.460085
0.794026
0.854147
julia> a × b
3-element Tensors.Tensor{1,3,Float64,3}:
0.20535
-0.24415
0.116354
Eigenvalues and eigenvectors
The eigenvalues and eigenvectors of a (symmetric) second order tensor, $\mathbf{A}$ can be solved from the eigenvalue problem
where $\lambda_i$ are the eigenvalues and $\mathbf{v}_i$ are the corresponding eigenvectors.
Base.LinAlg.eig
— Function.eig(::SymmetricSecondOrderTensor)
Computes the eigenvalues and eigenvectors of a symmetric second order tensor.
Example:
julia> A = rand(SymmetricTensor{2,3})
3×3 Tensors.SymmetricTensor{2,3,Float64,6}:
0.590845 0.766797 0.566237
0.766797 0.460085 0.794026
0.566237 0.794026 0.854147
julia> Λ, Φ = eig(A);
julia> Λ
3-element Tensors.Tensor{1,3,Float64,3}:
-0.312033
0.15636
2.06075
julia> Φ
3×3 Tensors.Tensor{2,3,Float64,9}:
0.492843 -0.684993 0.536554
-0.811724 -0.139855 0.567049
0.313385 0.715 0.624952
julia> Φ ⋅ diagm(Tensor{2,3}, Λ) ⋅ inv(Φ) # Same as A
3×3 Tensors.Tensor{2,3,Float64,9}:
0.590845 0.766797 0.566237
0.766797 0.460085 0.794026
0.566237 0.794026 0.854147
Rotations
Tensors.rotate
— Function.Rotate a three dimensional vector x
around another vector u
a total of θ
radians.
rotate(x::Vec{3}, u::Vec{3}, θ::Number)
Example:
julia> x = Vec{3}((0.0, 0.0, 1.0))
3-element Tensors.Tensor{1,3,Float64,3}:
0.0
0.0
1.0
julia> u = Vec{3}((0.0, 1.0, 0.0))
3-element Tensors.Tensor{1,3,Float64,3}:
0.0
1.0
0.0
julia> rotate(x, u, π/2)
3-element Tensors.Tensor{1,3,Float64,3}:
1.0
0.0
6.12323e-17
Special operations
For computing a special dot product between two vectors $\mathbf{a}$ and $\mathbf{b}$ with a fourth order symmetric tensor $\mathbf{C}$ such that $a_k C_{ikjl} b_l$ there is dotdot(a, C, b)
. This function is useful because it is the expression for the tangent matrix in continuum mechanics when the displacements are approximated by scalar shape functions.
Tensors.dotdot
— Function.dotdot(::Vec, ::SymmetricFourthOrderTensor, ::Vec)
Computes a special dot product between two vectors and a symmetric fourth order tensor such that $a_k C_{ikjl} b_l$.