1*44554ea0SWill Paznerimport LinearAlgebra: det 2*44554ea0SWill Pazner 3*44554ea0SWill Pazner""" 4*44554ea0SWill Pazner CeedDim(dim) 5*44554ea0SWill Pazner 6*44554ea0SWill PaznerThe singleton object of type `CeedDim{dim}`, used for dispatch to linear algebra operations 7*44554ea0SWill Paznerspecialized for small matrices (1, 2, or 3 dimensions). 8*44554ea0SWill Pazner""" 9*44554ea0SWill Paznerstruct CeedDim{dim} end 10*44554ea0SWill Pazner@inline CeedDim(dim) = CeedDim{Int(dim)}() 11*44554ea0SWill Pazner 12*44554ea0SWill Pazner""" 13*44554ea0SWill Pazner det(J, ::CeedDim{dim}) 14*44554ea0SWill Pazner 15*44554ea0SWill PaznerSpecialized determinant calculations for matrices of size 1, 2, or 3. 16*44554ea0SWill Pazner""" 17*44554ea0SWill Pazner@inline det(J, ::CeedDim{1}) = @inbounds J[1] 18*44554ea0SWill Pazner@inline det(J, ::CeedDim{2}) = @inbounds J[1]*J[4] - J[3]*J[2] 19*44554ea0SWill Pazner#! format: off 20*44554ea0SWill Pazner@inline det(J, ::CeedDim{3}) = @inbounds ( 21*44554ea0SWill Pazner J[1]*(J[5]*J[9] - J[6]*J[8]) - 22*44554ea0SWill Pazner J[2]*(J[4]*J[9] - J[6]*J[7]) + 23*44554ea0SWill Pazner J[3]*(J[4]*J[8] - J[5]*J[7]) 24*44554ea0SWill Pazner) 25*44554ea0SWill Pazner#! format: on 26*44554ea0SWill Pazner 27*44554ea0SWill Pazner""" 28*44554ea0SWill Pazner setvoigt(J::StaticArray{Tuple{D,D},T,2}) 29*44554ea0SWill Pazner setvoigt(J, ::CeedDim{dim}) 30*44554ea0SWill Pazner 31*44554ea0SWill PaznerGiven a symmetric matrix `J`, return a `SVector` that encodes `J` using the [Voigt 32*44554ea0SWill Paznerconvention](https://en.wikipedia.org/wiki/Voigt_notation). 33*44554ea0SWill Pazner 34*44554ea0SWill PaznerThe size of the symmetric matrix `J` must be known statically, either specified using 35*44554ea0SWill Pazner[`CeedDim`](@ref) or `StaticArray`. 36*44554ea0SWill Pazner""" 37*44554ea0SWill Pazner@inline setvoigt(J::StaticArray{Tuple{D,D}}) where {D} = setvoigt(J, CeedDim(D)) 38*44554ea0SWill Pazner@inline setvoigt(J, ::CeedDim{1}) = @inbounds @SVector [J[1]] 39*44554ea0SWill Pazner@inline setvoigt(J, ::CeedDim{2}) = @inbounds @SVector [J[1], J[4], J[2]] 40*44554ea0SWill Pazner@inline setvoigt(J, ::CeedDim{3}) = @inbounds @SVector [J[1], J[5], J[9], J[6], J[3], J[2]] 41*44554ea0SWill Pazner 42*44554ea0SWill Pazner@inline function setvoigt!(V, J, ::CeedDim{1}) 43*44554ea0SWill Pazner @inbounds V[1] = J[1] 44*44554ea0SWill Paznerend 45*44554ea0SWill Pazner 46*44554ea0SWill Pazner@inline function setvoigt!(V, J, ::CeedDim{2}) 47*44554ea0SWill Pazner @inbounds begin 48*44554ea0SWill Pazner V[1] = J[1] 49*44554ea0SWill Pazner V[2] = J[4] 50*44554ea0SWill Pazner V[3] = J[2] 51*44554ea0SWill Pazner end 52*44554ea0SWill Paznerend 53*44554ea0SWill Pazner 54*44554ea0SWill Pazner@inline function setvoigt!(V, J, ::CeedDim{3}) 55*44554ea0SWill Pazner @inbounds begin 56*44554ea0SWill Pazner V[1] = J[1] 57*44554ea0SWill Pazner V[2] = J[5] 58*44554ea0SWill Pazner V[3] = J[9] 59*44554ea0SWill Pazner V[4] = J[6] 60*44554ea0SWill Pazner V[5] = J[3] 61*44554ea0SWill Pazner V[6] = J[2] 62*44554ea0SWill Pazner end 63*44554ea0SWill Paznerend 64*44554ea0SWill Pazner 65*44554ea0SWill Pazner""" 66*44554ea0SWill Pazner getvoigt(V, ::CeedDim{dim}) 67*44554ea0SWill Pazner 68*44554ea0SWill PaznerGiven a vector `V` that encodes a symmetric matrix using the [Voigt 69*44554ea0SWill Paznerconvention](https://en.wikipedia.org/wiki/Voigt_notation), return the corresponding 70*44554ea0SWill Pazner`SMatrix`. 71*44554ea0SWill Pazner""" 72*44554ea0SWill Pazner@inline getvoigt(V, ::CeedDim{1}) = @inbounds @SMatrix [V[1]] 73*44554ea0SWill Pazner@inline getvoigt(V, ::CeedDim{2}) = @inbounds @SMatrix [V[1] V[3]; V[3] V[2]] 74*44554ea0SWill Pazner@inline getvoigt(V, ::CeedDim{3}) = @inbounds @SMatrix [ 75*44554ea0SWill Pazner V[1] V[6] V[5] 76*44554ea0SWill Pazner V[6] V[2] V[4] 77*44554ea0SWill Pazner V[5] V[4] V[3] 78*44554ea0SWill Pazner] 79*44554ea0SWill Pazner@inline getvoigt(V::StaticArray{Tuple{1}}) = getvoigt(V, CeedDim(1)) 80*44554ea0SWill Pazner@inline getvoigt(V::StaticArray{Tuple{3}}) = getvoigt(V, CeedDim(2)) 81*44554ea0SWill Pazner@inline getvoigt(V::StaticArray{Tuple{6}}) = getvoigt(V, CeedDim(3)) 82*44554ea0SWill Pazner 83*44554ea0SWill Pazner@inline function getvoigt!(J, V, ::CeedDim{1}) 84*44554ea0SWill Pazner @inbounds J[1, 1] = V[1] 85*44554ea0SWill Paznerend 86*44554ea0SWill Pazner 87*44554ea0SWill Pazner@inline function getvoigt!(J, V, ::CeedDim{2}) 88*44554ea0SWill Pazner @inbounds begin 89*44554ea0SWill Pazner #! format: off 90*44554ea0SWill Pazner J[1,1] = V[1] ; J[1,2] = V[3] 91*44554ea0SWill Pazner J[2,1] = V[3] ; J[2,2] = V[2] 92*44554ea0SWill Pazner #! format: on 93*44554ea0SWill Pazner end 94*44554ea0SWill Paznerend 95*44554ea0SWill Pazner 96*44554ea0SWill Pazner@inline function getvoigt!(J, V, ::CeedDim{3}) 97*44554ea0SWill Pazner @inbounds begin 98*44554ea0SWill Pazner #! format: off 99*44554ea0SWill Pazner J[1,1] = V[1] ; J[1,2] = V[6] ; J[1,3] = V[5] 100*44554ea0SWill Pazner J[2,1] = V[6] ; J[2,2] = V[2] ; J[2,3] = V[4] 101*44554ea0SWill Pazner J[3,1] = V[5] ; J[3,2] = V[4] ; J[3,3] = V[3] 102*44554ea0SWill Pazner #! format: on 103*44554ea0SWill Pazner end 104*44554ea0SWill Paznerend 105*44554ea0SWill Pazner 106*44554ea0SWill Paznerfunction tmp_view(obj, view_fn) 107*44554ea0SWill Pazner str = mktemp() do fname, f 108*44554ea0SWill Pazner cf = Libc.FILE(f) 109*44554ea0SWill Pazner er = view_fn(obj, cf.ptr) 110*44554ea0SWill Pazner ccall(:fflush, Cint, (Ptr{Cvoid},), cf) 111*44554ea0SWill Pazner seek(f, 0) 112*44554ea0SWill Pazner read(f, String) 113*44554ea0SWill Pazner end 114*44554ea0SWill Pazner chomp(str) 115*44554ea0SWill Paznerend 116*44554ea0SWill Pazner 117*44554ea0SWill Paznerfunction ceed_show(io::IO, obj, view_fn) 118*44554ea0SWill Pazner print(io, tmp_view(obj[], view_fn)) 119*44554ea0SWill Paznerend 120