@@ -51,6 +51,7 @@ an AbstractMatrix (e.g. an ExtendableSparseMatrix) with an additional layer of s
51
51
struct FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} <: AbstractSparseMatrix{TvM, TiM}
52
52
FEMatrixBlocks:: Array{FEMatrixBlock{TvM, TiM, TvG, TiG}, 1}
53
53
entries:: AbstractSparseMatrix{TvM, TiM}
54
+ tags:: Matrix{Any}
54
55
end
55
56
56
57
function Base. copy (FEV:: FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} ) where {TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal}
@@ -84,7 +85,8 @@ function apply_nonzero_pattern!(B::FEMatrixBlock, AT::Type{<:AssemblyType})
84
85
end
85
86
86
87
Base. getindex (FEF:: FEMatrix , i) = FEF. FEMatrixBlocks[i]
87
- Base. getindex (FEF:: FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} , i, j) where {TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} = FEF. FEMatrixBlocks[(i- 1 )* nbcol+ j]
88
+ Base. getindex (FEF:: FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} , tagX, tagY) where {TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} = (index = findfirst (== ((tagX,tagY)), FEF. tags); return FEF. FEMatrixBlocks[(index[1 ]- 1 )* nbcol+ index[2 ]] )
89
+ Base. getindex (FEF:: FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} , i:: Int , j:: Int ) where {TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} = FEF. FEMatrixBlocks[(i- 1 )* nbcol+ j]
88
90
Base. getindex (FEB:: FEMatrixBlock , i:: Int , j:: Int ) = FEB. entries[FEB. offset+ i, FEB. offsetY+ j]
89
91
Base. getindex (FEB:: FEMatrixBlock , i:: Any , j:: Any ) = FEB. entries[FEB. offset.+ i, FEB. offsetY.+ j]
90
92
Base. setindex! (FEB:: FEMatrixBlock , v, i:: Int , j:: Int ) = setindex! (FEB. entries, v, FEB. offset + i, FEB. offsetY + j)
@@ -174,26 +176,26 @@ Creates FEMatrix with one rectangular block (FESX,FESY) if FESX and FESY are sin
174
176
a rectangular block matrix with blocks corresponding to the entries of the FESpace vectors FESX and FESY.
175
177
Optionally a name for the matrix can be given.
176
178
"""
177
- function FEMatrix (FESX:: FESpace , FESY:: FESpace ; name = " auto " )
178
- return FEMatrix {Float64, Int64} (FESX, FESY; name = name )
179
+ function FEMatrix (FESX:: FESpace , FESY:: FESpace ; kwargs ... )
180
+ return FEMatrix {Float64, Int64} (FESX, FESY; kwargs ... )
179
181
end
180
- function FEMatrix (FESX:: Vector{<:FESpace} , FESY:: Vector{<:FESpace} ; name = " auto " )
181
- return FEMatrix {Float64, Int64} (FESX, FESY; name = name )
182
+ function FEMatrix (FESX:: Vector{<:FESpace} , FESY:: Vector{<:FESpace} ; kwargs ... )
183
+ return FEMatrix {Float64, Int64} (FESX, FESY; kwargs ... )
182
184
end
183
- function FEMatrix {TvM} (FESX:: FESpace , FESY:: FESpace ; name = " auto " ) where {TvM}
184
- return FEMatrix {TvM, Int64} (FESX, FESY; name = name )
185
+ function FEMatrix {TvM} (FESX:: FESpace , FESY:: FESpace ; kwargs ... ) where {TvM}
186
+ return FEMatrix {TvM, Int64} (FESX, FESY; kwargs ... )
185
187
end
186
- function FEMatrix {TvM, TiM} (FESX:: FESpace , FESY:: FESpace ; name = " auto " ) where {TvM, TiM}
187
- return FEMatrix {TvM, TiM} ([FESX], [FESY]; name = name )
188
+ function FEMatrix {TvM, TiM} (FESX:: FESpace , FESY:: FESpace ; kwargs ... ) where {TvM, TiM}
189
+ return FEMatrix {TvM, TiM} ([FESX], [FESY]; kwargs ... )
188
190
end
189
- function FEMatrix (FES:: Array{<:FESpace{TvG, TiG}, 1} ; name = " auto " ) where {TvG, TiG}
190
- return FEMatrix {Float64, Int64} (FES; name = name )
191
+ function FEMatrix (FES:: Array{<:FESpace{TvG, TiG}, 1} ; kwargs ... ) where {TvG, TiG}
192
+ return FEMatrix {Float64, Int64} (FES; kwargs ... )
191
193
end
192
- function FEMatrix {TvM} (FES:: Array{<:FESpace{TvG, TiG}, 1} ; name = " auto " ) where {TvM, TvG, TiG}
193
- return FEMatrix {TvM, Int64} (FES, FES; name = name )
194
+ function FEMatrix {TvM} (FES:: Array{<:FESpace{TvG, TiG}, 1} ; kwargs ... ) where {TvM, TvG, TiG}
195
+ return FEMatrix {TvM, Int64} (FES, FES; kwargs ... )
194
196
end
195
- function FEMatrix {TvM, TiM} (FES:: Array{<:FESpace{TvG, TiG}, 1} ; name = " auto " ) where {TvM, TiM, TvG, TiG}
196
- return FEMatrix {TvM, TiM} (FES, FES; name = name )
197
+ function FEMatrix {TvM, TiM} (FES:: Array{<:FESpace{TvG, TiG}, 1} ; kwargs ... ) where {TvM, TiM, TvG, TiG}
198
+ return FEMatrix {TvM, TiM} (FES, FES; kwargs ... )
197
199
end
198
200
199
201
"""
@@ -203,34 +205,55 @@ FEMatrix{TvM,TiM}(FESX, FESY; name = "auto")
203
205
204
206
Creates an FEMatrix with blocks coressponding to the ndofs of FESX (rows) and FESY (columns).
205
207
"""
206
- function FEMatrix {TvM, TiM} (FESX:: Array{<:FESpace{TvG, TiG}, 1} , FESY:: Array{<:FESpace{TvG, TiG}, 1} ; name = " auto " ) where {TvM, TiM, TvG, TiG}
208
+ function FEMatrix {TvM, TiM} (FESX:: Array{<:FESpace{TvG, TiG}, 1} , FESY:: Array{<:FESpace{TvG, TiG}, 1} ; entries = nothing , name = nothing , tags = nothing , tagsX = tags, tagsY = tagsX, kwargs ... ) where {TvM, TiM, TvG, TiG}
207
209
ndofsX, ndofsY = 0 , 0
208
210
for j ∈ 1 : length (FESX)
209
211
ndofsX += FESX[j]. ndofs
210
212
end
211
213
for j ∈ 1 : length (FESY)
212
214
ndofsY += FESY[j]. ndofs
213
215
end
214
- entries = ExtendableSparseMatrix {TvM, TiM} (ndofsX, ndofsY)
216
+ if entries === nothing
217
+ entries = ExtendableSparseMatrix {TvM, TiM} (ndofsX, ndofsY)
218
+ else
219
+ @assert size (entries) == (ndofsX, ndofsY) " size of given entries not matching number of dofs in given FE space(s)"
220
+ end
215
221
216
- if name == " auto "
222
+ if name === nothing
217
223
name = " "
218
224
end
219
225
226
+ if tagsX != = nothing
227
+ @assert length (tagsX) == length (FESX)
228
+ end
229
+ if tagsY != = nothing
230
+ @assert length (tagsY) == length (FESY)
231
+ end
232
+
220
233
Blocks = Array {FEMatrixBlock{TvM, TiM, TvG, TiG}, 1} (undef, length (FESX) * length (FESY))
221
234
offset = 0
222
235
offsetY = 0
223
236
for j ∈ 1 : length (FESX)
224
237
offsetY = 0
225
238
for k ∈ 1 : length (FESY)
239
+ if (tagsX != = nothing ) && (tagsY != = nothing )
240
+ blockname = name * " [$(tagsX[j]) ,$(tagsY[k]) "
241
+ else
242
+ blockname = name * " [$j ,$k ]"
243
+ end
226
244
Blocks[(j- 1 )* length (FESY)+ k] =
227
- FEMatrixBlock {TvM, TiM, TvG, TiG, eltype(FESX[j]), eltype(FESY[k]), assemblytype(FESX[j]), assemblytype(FESY[k])} (name * " [ $j , $k ] " , FESX[j], FESY[k], offset, offsetY, offset + FESX[j]. ndofs, offsetY + FESY[k]. ndofs, entries)
245
+ FEMatrixBlock {TvM, TiM, TvG, TiG, eltype(FESX[j]), eltype(FESY[k]), assemblytype(FESX[j]), assemblytype(FESY[k])} (blockname , FESX[j], FESY[k], offset, offsetY, offset + FESX[j]. ndofs, offsetY + FESY[k]. ndofs, entries)
228
246
offsetY += FESY[k]. ndofs
229
247
end
230
248
offset += FESX[j]. ndofs
231
249
end
232
250
233
- return FEMatrix {TvM, TiM, TvG, TiG, length(FESX), length(FESY), length(FESX) * length(FESY)} (Blocks, entries)
251
+ if (tagsX != = nothing ) && (tagsY != = nothing )
252
+ tagmatrix = [(j, k) for j in tagsX, k in tagsY]
253
+ else
254
+ tagmatrix = zeros (Int,0 ,0 )
255
+ end
256
+ return FEMatrix {TvM, TiM, TvG, TiG, length(FESX), length(FESY), length(FESX) * length(FESY)} (Blocks, entries, tagmatrix)
234
257
end
235
258
236
259
"""
0 commit comments