Skip to content

Commit 16d35d1

Browse files
committed
Minor
1 parent eff4a23 commit 16d35d1

3 files changed

Lines changed: 86 additions & 5 deletions

File tree

src/FESpaces.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,8 @@ function _compute_new_distributed_fixedval(
880880
return c
881881
end
882882

883+
# Constant FESpace
884+
883885
"""
884886
ConstantFESpace(
885887
model::DistributedDiscreteModel;
@@ -927,3 +929,24 @@ function FESpaces.ConstantFESpace(
927929
vector_type = _find_vector_type(spaces,gids)
928930
return DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
929931
end
932+
933+
# Polytopal FESpaces
934+
935+
function FESpaces.PolytopalFESpace(
936+
_trian::DistributedTriangulation,args...;kwargs...
937+
)
938+
trian = add_ghost_cells(_trian)
939+
spaces = map(local_views(trian)) do t
940+
FESpaces.PolytopalFESpace(t,args...;kwargs...)
941+
end
942+
gids = generate_gids(trian,spaces)
943+
vector_type = _find_vector_type(spaces,gids)
944+
return DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
945+
end
946+
947+
function FESpaces.PolytopalFESpace(
948+
model::DistributedDiscreteModel,args...;kwargs...
949+
)
950+
trian = Triangulation(with_ghost,model)
951+
FESpaces.PolytopalFESpace(trian,args...;kwargs...)
952+
end

src/MultiField.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ MultiField.MultiFieldStyle(a::DistributedMultiFieldFESpace) = MultiField.MultiFi
9090

9191
local_views(a::DistributedMultiFieldFESpace) = a.part_fe_space
9292
MultiField.num_fields(m::DistributedMultiFieldFESpace) = length(m.field_fe_space)
93+
MultiField.num_fields(m::DistributedFESpace) = 1 # Default for single-field
9394
Base.iterate(m::DistributedMultiFieldFESpace) = iterate(m.field_fe_space)
9495
Base.iterate(m::DistributedMultiFieldFESpace,state) = iterate(m.field_fe_space,state)
9596
Base.getindex(m::DistributedMultiFieldFESpace,field_id::Integer) = m.field_fe_space[field_id]
@@ -103,6 +104,24 @@ function FESpaces.get_free_dof_ids(fs::DistributedMultiFieldFESpace)
103104
fs.gids
104105
end
105106

107+
function BlockArrays.blocks(f::DistributedMultiFieldFESpace{<:BlockMultiFieldStyle})
108+
block_gids = blocks(get_free_dof_ids(f))
109+
block_ranges = MultiField.get_block_ranges(MultiField.get_block_parameters(MultiFieldStyle(f))...)
110+
block_spaces = map(block_ranges,block_gids) do range, gids
111+
if (length(range) == 1)
112+
space = f[range[1]]
113+
else
114+
global_sf_spaces = f.field_fe_space[range]
115+
local_sf_spaces = to_parray_of_arrays(map(local_views,global_sf_spaces))
116+
local_mf_spaces = map(MultiFieldFESpace,local_sf_spaces)
117+
vector_type = _find_vector_type(local_mf_spaces,gids)
118+
space = DistributedMultiFieldFESpace(global_sf_spaces,local_mf_spaces,gids,vector_type)
119+
end
120+
space
121+
end
122+
return block_spaces
123+
end
124+
106125
function MultiField.restrict_to_field(
107126
f::DistributedMultiFieldFESpace,free_values::AbstractVector,field::Integer
108127
)

src/PatchAssemblers.jl

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ function Geometry.PatchTopology(model::DistributedDiscreteModel;kwargs...)
4545
Geometry.PatchTopology(ReferenceFE{D},model;kwargs...)
4646
end
4747

48+
function Geometry.get_patch_cells(ptopo::DistributedPatchTopology)
49+
map(Geometry.get_patch_cells,local_views(ptopo))
50+
end
51+
4852
# PatchTriangulation
4953

5054
function Geometry.PatchTriangulation(model::DistributedDiscreteModel,ptopo::DistributedPatchTopology;kwargs...)
@@ -127,13 +131,19 @@ function Arrays.evaluate!(
127131
)
128132
n_fields = num_fields(v)
129133
mf_fields = map(evaluate,local_views(k),local_views(v))
130-
sf_fields = map(1:n_fields) do field
131-
sf_fields = map(f -> f[field], mf_fields)
132-
trians = map(get_triangulation,sf_fields)
134+
if eltype(mf_fields) <: MultiField.MultiFieldCellField
135+
sf_fields = map(1:n_fields) do field
136+
sf_fields = map(f -> f[field], mf_fields)
137+
trians = map(get_triangulation,sf_fields)
138+
trian = DistributedTriangulation(trians,k.model)
139+
DistributedCellField(sf_fields,trian)
140+
end
141+
return DistributedMultiFieldCellField(sf_fields, mf_fields)
142+
else
143+
trians = map(get_triangulation,mf_fields)
133144
trian = DistributedTriangulation(trians,k.model)
134-
DistributedCellField(sf_fields,trian)
145+
return DistributedCellField(mf_fields,trian)
135146
end
136-
return DistributedMultiFieldCellField(sf_fields, mf_fields)
137147
end
138148

139149
# Patch assembly
@@ -231,6 +241,35 @@ end
231241

232242
# merge_assembly_data
233243

244+
function merge_assembly_data(data::AbstractArray...)
245+
map(FESpaces.merge_assembly_data,data...)
246+
end
247+
234248
function FESpaces.merge_assembly_matvec_data(data::AbstractArray...)
235249
map(FESpaces.merge_assembly_matvec_data,data...)
236250
end
251+
252+
253+
function FESpaces.collect_and_merge_cell_matrix(assem::DistributedPatchAssembler,contributions...)
254+
data = ()
255+
for c in contributions
256+
data = (data..., FESpaces.collect_patch_cell_matrix(assem,c...))
257+
end
258+
FESpaces.merge_assembly_data(data...)
259+
end
260+
261+
function FESpaces.collect_and_merge_cell_vector(assem::DistributedPatchAssembler,contributions...)
262+
data = ()
263+
for c in contributions
264+
data = (data..., FESpaces.collect_patch_cell_vector(assem,c...))
265+
end
266+
FESpaces.merge_assembly_data(data...)
267+
end
268+
269+
function FESpaces.collect_and_merge_cell_matrix_and_vector(assem::DistributedPatchAssembler,contributions...)
270+
data = ()
271+
for c in contributions
272+
data = (data..., FESpaces.collect_patch_cell_matrix_and_vector(assem,c...))
273+
end
274+
FESpaces.merge_assembly_matvec_data(data...)
275+
end

0 commit comments

Comments
 (0)