Skip to content

simeonschaub/CoolTensors.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CoolTensors

Dev Build Status Coverage

The easiest way to create Tensor objects is using IndexPos objects. They can easily created with the custom T"..." string literal. ' denotes contravariant indices and , covariant indices:

julia> x = T"'"[2, 1]
2-element Tensor{Float64,1,T"'",Array{Float64,1}}:
 1.4142135623730951
 1.0

julia> Λ(ψ) = T"',"[cosh(ψ) -sinh(ψ); -sinh(ψ) cosh(ψ)]
Λ (generic function with 1 method)

julia> using LinearAlgebra

julia> g = T",,"(Diagonal([1, -1]))
2×2 Tensor{Int64,2,T",,",Diagonal{Int64,Array{Int64,1}}}:
 1   0
 0  -1

lower and raise lower and raise indices: (The metric is assumed to be euclidian.)

julia> lower(x, 1)
2-element Tensor{Float64,1,T",",Array{Float64,1}}:
 1.4142135623730951
 1.0

julia> 𝔤 = raise(g, 1, 2)
2×2 Tensor{Int64,2,T"''",Diagonal{Int64,Array{Int64,1}}}:
 1   0
 0  -1

Indexing can be done just like a regular array, using TIndex, which stores an additional IndexPos in the type parameter, or by using hvcat syntax. When using the latter, indices are separated by either whitespace or ;, ; switches the contra-/covariance of the following indices, whitespace means an index has the same contra-/covariance as the last index. To specify that the first index is covariant, write \; before the first index.

julia> x[1]
1.4142135623730951

julia> lower(x, 1)[\; 1]
1.4142135623730951

julia> Λ(.5)[1; 2]
-0.5210953054937474

julia> g[\; 2 2]
-1

julia> g[1; 2]
ERROR: ArgumentError: Index positions T"'," don't match indices of Tensor T",,"
Stacktrace:
[...]

Tensors can be called with vectors and covectors. The rightmost index is always contracted first. If called with multiple (co-)vectors, the first (co-)vector is contracted with the last index of the tensor, the second with the second-last index, and so on. : can be used to skip the contraction of an index.

julia> Λ(.5)(x)
2-element Tensor{Float64,1,T"'",Array{Float64,1}}:
 1.073608627785168
 0.3906859168881719

julia> Λ(.5)(lower(x, 1))
ERROR: ArgumentError: Tensor indices don't match
Stacktrace:
[...]

julia> Λ(.5)(:, lower(x, 1))
2-element Tensor{Float64,1,T",",Array{Float64,1}}:
 1.073608627785168
 0.3906859168881719

julia> lower(x, 1)(x)
3.0000000000000004

Let's prove that g(x, x) is Lorentz invariant!

julia> g(x, x)
1.0000000000000004

julia> g(Λ(.5)(x), Λ(.5)(x))
0.9999999999999998

QED.

(\otimes) from TensorCore.jl is overloaded and exported to calculate the tensor product of two Tensors:

julia> x  lower(x, 1)
2×2 Tensor{Float64,2,T"',",Array{Float64,2}}:
 2.0      1.41421
 1.41421  1.0

Disclaimer: This is currently only a prototype. It is still missing a lot of features. Performance should be pretty bad. There will be bugs. Don't use this for any productive work.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages