Skip to content

Commit fbac993

Browse files
Decoupled constructors for MultiFieldDistributedFESpaces from
Gridap.MultiField.ConsecutiveMultiFieldStyle
1 parent e60715e commit fbac993

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

src/GridapDistributed.jl

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using Gridap.Geometry
66
using Gridap.FESpaces
77
using Gridap.Arrays
88
using Gridap.Algebra
9+
using Gridap.MultiField
910

1011
using SparseArrays
1112
using MPI

src/MultiFieldDistributedFESpaces.jl

+39-12
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ end
1111

1212
function Gridap.MultiFieldFESpace(test_space::MultiFieldDistributedFESpace{V},
1313
trial_spaces::Vector{<:DistributedFESpace}) where V
14-
spaces = DistributedData(trial_spaces...) do part, spaces_and_gids...
15-
MultiFieldFESpace([s[1] for s in spaces_and_gids])
14+
15+
spaces = DistributedData(test_space.spaces, trial_spaces...) do part, lspace, spaces_and_gids...
16+
MultiFieldFESpace([s[1] for s in spaces_and_gids],MultiFieldStyle(lspace))
1617
end
1718
MultiFieldDistributedFESpace(V, trial_spaces, spaces, test_space.gids)
1819
end
@@ -129,15 +130,44 @@ function Gridap.MultiFieldFESpace(model::DistributedDiscreteModel,
129130
MultiFieldFESpace([s[1] for s in spaces_and_gids])
130131
end
131132

133+
gids=_generate_multifield_gids(model,spaces,distributed_spaces)
134+
135+
MultiFieldDistributedFESpace(get_vector_type(distributed_spaces[1]),
136+
distributed_spaces,
137+
spaces,
138+
gids)
139+
end
140+
141+
142+
function Gridap.MultiFieldFESpace(model::DistributedDiscreteModel,
143+
distributed_spaces::Vector{<:DistributedFESpace},
144+
multifield_style::MultiFieldStyle) where V
145+
146+
spaces = DistributedData(distributed_spaces...) do part, spaces_and_gids...
147+
MultiFieldFESpace([s[1] for s in spaces_and_gids],multifield_style)
148+
end
149+
150+
gids=_generate_multifield_gids(model,spaces,distributed_spaces)
151+
152+
MultiFieldDistributedFESpace(get_vector_type(distributed_spaces[1]),
153+
distributed_spaces,
154+
spaces,
155+
gids)
156+
end
157+
158+
159+
160+
161+
function _generate_multifield_gids(model,spaces,distributed_spaces)
132162
function init_lid_to_owner(part, lspace, spaces_and_gids...)
133163
nlids = num_free_dofs(lspace)
134164
lid_to_owner = zeros(Int, nlids)
135-
current_lid = 1
136-
for current_field_space_gids in spaces_and_gids
165+
mf_lids = [i for i=1:nlids]
166+
for (field_id,current_field_space_gids) in enumerate(spaces_and_gids)
137167
gids = current_field_space_gids[2]
138-
for i = 1:length(gids.lid_to_owner)
139-
lid_to_owner[current_lid] = gids.lid_to_owner[i]
140-
current_lid += 1
168+
sf_lids=Gridap.MultiField.restrict_to_field(lspace,mf_lids,field_id)
169+
for i=1:length(sf_lids)
170+
lid_to_owner[sf_lids[i]]=gids.lid_to_owner[i]
141171
end
142172
end
143173
lid_to_owner
@@ -170,13 +200,10 @@ function Gridap.MultiFieldFESpace(model::DistributedDiscreteModel,
170200
part_to_lid_to_gid,
171201
part_to_lid_to_owner,
172202
ngids)
173-
174-
MultiFieldDistributedFESpace(get_vector_type(distributed_spaces[1]),
175-
distributed_spaces,
176-
spaces,
177-
gids)
178203
end
179204

205+
206+
180207
# FE Function
181208
struct MultiFieldDistributedFEFunction
182209
single_fe_functions::Vector{DistributedFEFunction}

0 commit comments

Comments
 (0)