xref: /libCEED/julia/LibCEED.jl/src/Misc.jl (revision 06988bf74cc6ac18eacafe7930f080803395ba29)
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