Skip to content

Commit 6d776ca

Browse files
committed
FEMatrix now also has tags to identify the blocks (e.g. via Unknowns); some other small improvements
1 parent 9965663 commit 6d776ca

File tree

5 files changed

+50
-22
lines changed

5 files changed

+50
-22
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ExtendableFEMBase"
22
uuid = "12fb9182-3d4c-4424-8fd1-727a0899810c"
33
authors = ["Christian Merdon <[email protected]>"]
4-
version = "0.5"
4+
version = "0.6"
55

66
[deps]
77
DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5"

src/dofmaps.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,9 @@ end
698698
function init_dofmap!(FES::FESpace, DM::Type{<:DofMap})
699699
@debug "Generating dofmap $DM for FESpace $(FES.name)"
700700

701-
if (FES.broken == true) && (DM != CellDofs)
701+
if (FES.broken == true) && DM == CellDofsParent
702+
init_dofmap_from_pattern!(FES, CellDofs)
703+
elseif (FES.broken == true) && (DM != CellDofs)
702704
## dofmap needs to include all (e.g. face) dofs from neighbouring cells
703705
init_broken_dofmap!(FES, DM)
704706
else

src/fematrix.jl

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ an AbstractMatrix (e.g. an ExtendableSparseMatrix) with an additional layer of s
5151
struct FEMatrix{TvM, TiM, TvG, TiG, nbrow, nbcol, nbtotal} <: AbstractSparseMatrix{TvM, TiM}
5252
FEMatrixBlocks::Array{FEMatrixBlock{TvM, TiM, TvG, TiG}, 1}
5353
entries::AbstractSparseMatrix{TvM, TiM}
54+
tags::Matrix{Any}
5455
end
5556

5657
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})
8485
end
8586

8687
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]
8890
Base.getindex(FEB::FEMatrixBlock, i::Int, j::Int) = FEB.entries[FEB.offset+i, FEB.offsetY+j]
8991
Base.getindex(FEB::FEMatrixBlock, i::Any, j::Any) = FEB.entries[FEB.offset.+i, FEB.offsetY.+j]
9092
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
174176
a rectangular block matrix with blocks corresponding to the entries of the FESpace vectors FESX and FESY.
175177
Optionally a name for the matrix can be given.
176178
"""
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...)
179181
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...)
182184
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...)
185187
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...)
188190
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...)
191193
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...)
194196
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...)
197199
end
198200

199201
"""
@@ -203,34 +205,55 @@ FEMatrix{TvM,TiM}(FESX, FESY; name = "auto")
203205
204206
Creates an FEMatrix with blocks coressponding to the ndofs of FESX (rows) and FESY (columns).
205207
"""
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}
207209
ndofsX, ndofsY = 0, 0
208210
for j 1:length(FESX)
209211
ndofsX += FESX[j].ndofs
210212
end
211213
for j 1:length(FESY)
212214
ndofsY += FESY[j].ndofs
213215
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
215221

216-
if name == "auto"
222+
if name === nothing
217223
name = ""
218224
end
219225

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+
220233
Blocks = Array{FEMatrixBlock{TvM, TiM, TvG, TiG}, 1}(undef, length(FESX) * length(FESY))
221234
offset = 0
222235
offsetY = 0
223236
for j 1:length(FESX)
224237
offsetY = 0
225238
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
226244
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)
228246
offsetY += FESY[k].ndofs
229247
end
230248
offset += FESX[j].ndofs
231249
end
232250

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)
234257
end
235258

236259
"""

src/fevector.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ function FEVector{T}(FES::Array{<:FESpace{Tv, Ti}, 1}; entries = nothing, name =
166166
end
167167
if entries === nothing
168168
entries = zeros(T, ndofs)
169+
else
170+
@assert length(entries) == ndofs "length of given entries does not match number of dofs in given FESpace(s)"
169171
end
170172
Blocks = Array{FEVectorBlock{T, Tv, Ti}, 1}(undef, length(FES))
171173
offset = 0

src/finiteelements.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct FESpace{Tv, Ti, FEType<:AbstractFiniteElement,AT<:AssemblyType}
3333
ndofs::Int # total number of dofs
3434
coffset::Int # offset for component dofs
3535
xgrid::ExtendableGrid[Tv,Ti} # link to xgrid
36+
dofgrid::ExtendableGrid{Tv,Ti} # link to (sub) grid used for dof numbering (expected to be equal to or child grid of xgrid)
3637
dofmaps::Dict{Type{<:AbstractGridComponent},Any} # backpack with dofmaps
3738
end
3839
````

0 commit comments

Comments
 (0)