source: issm/trunk-jpl/src/jl/core/toolkits.jl@ 26731

Last change on this file since 26731 was 26731, checked in by Mathieu Morlighem, 3 years ago

CHG: done with transient

File size: 2.9 KB
Line 
1
2#Toolkit #1: serial sparse arrays
3using SparseArrays
4
5#Matrix
6mutable struct IssmMatrix #{{{
7 M::Int64
8 N::Int64
9 rows::Vector{Int64}
10 cols::Vector{Int64}
11 vals::Vector{Float64}
12 matrix::SparseMatrixCSC{Float64,Int64}
13end #}}}
14function IssmMatrix(M::Int64,N::Int64)#{{{
15 return IssmMatrix(M, N, Vector{Int64}(undef,0), Vector{Int64}(undef,0), Vector{Float64}(undef,0), spzeros(0,0))
16end#}}}
17function AddValues!(matrix::IssmMatrix,m::Int64,midx::Vector{Int64},n::Int64,nidx::Vector{Int64},values::Matrix{Float64})#{{{
18
19 #This is inefficient now, but it will work
20 for i in 1:m
21 if(midx[i]==-1) continue end
22 for j in 1:n
23 if(nidx[j]==-1) continue end
24 push!(matrix.rows, midx[i])
25 push!(matrix.cols, nidx[j])
26 push!(matrix.vals, values[i,j])
27 end
28 end
29
30end#}}}
31function GetSize(matrix::IssmMatrix)#{{{
32
33 return size(matrix.matrix)
34
35end#}}}
36function Assemble!(matrix::IssmMatrix)#{{{
37
38 matrix.matrix = sparse(matrix.rows, matrix.cols, matrix.vals, matrix.M, matrix.N)
39
40end#}}}
41
42#Vector
43mutable struct IssmVector #{{{
44 vector::Vector{Float64}
45end #}}}
46function IssmVector(M::Int64)#{{{
47 return IssmVector(zeros(M))
48end#}}}
49function GetSize(vector::IssmVector)#{{{
50
51 return length(vector.vector)
52
53end#}}}
54function AddValues!(vector::IssmVector,m::Int64,midx::Vector{Int64},values::Vector{Float64})#{{{
55
56 #This is inefficient now, but it will work
57 for i in 1:m
58 if(midx[i]==-1) continue end
59 vector.vector[midx[i]] += values[i]
60 end
61
62end#}}}
63function SetValues!(vector::IssmVector,m::Int64,midx::Vector{Int64},values::Vector{Float64})#{{{
64
65 #This is inefficient now, but it will work
66 for i in 1:m
67 if(midx[i]==-1) continue end
68 vector.vector[midx[i]] = values[i]
69 end
70
71end#}}}
72function IsEmpty(vector::IssmVector)#{{{
73
74 return GetSize(vector)==0
75
76end#}}}
77function Duplicate(vector::IssmVector)#{{{
78
79 #Copy data structure
80 M=GetSize(vector)
81 return IssmVector(M)
82
83end#}}}
84function VecCopy!(x::IssmVector,y::IssmVector)#{{{
85
86 y.vector = x.vector
87
88end#}}}
89function Assemble!(vector::IssmVector)#{{{
90
91 #Nothing to do for this toolkit
92
93end#}}}
94function Norm(x::IssmVector,type::Int64)#{{{
95
96 norm = 0
97
98 if type==2
99 for i in 1:length(x.vector)
100 norm += x.vector[i]^2
101 end
102 norm = sqrt(norm)
103 elseif type==3
104 #Infinite norm
105 for i in 1:length(x.vector)
106 if(abs(x.vector[i])>norm) norm = abs(x.vector[i]) end
107 end
108 else
109 error("type ",type," not supported yet")
110 end
111
112 return norm
113
114end#}}}
115
116#Operations
117function MatMult!(A::IssmMatrix,x::IssmVector,y::IssmVector) #{{{
118
119 y.vector = A.matrix*x.vector
120
121end#}}}
122function AXPY!(y::IssmVector,alpha::Float64,x::IssmVector) #{{{
123
124 y.vector = alpha*x.vector + y.vector
125
126end#}}}
127function Solverx(A::IssmMatrix, b::IssmVector, xold::IssmVector) #{{{
128
129 #Initialize output
130 #x = IssmVector(GetSize(xold))
131
132 return Solverx(A, b)
133
134end#}}}
135function Solverx(A::IssmMatrix, b::IssmVector) #{{{
136
137 #Initialize output
138 x = IssmVector(0)
139
140 #Solve linear system
141 x.vector = A.matrix\b.vector
142
143 return x
144
145end#}}}
Note: See TracBrowser for help on using the repository browser.