Skip to content

Commit 392108e

Browse files
Decoupled the rest of subroutines for MultiFieldDistributedFESpaces from
Gridap.MultiField.ConsecutiveMultiFieldStyle
1 parent fbac993 commit 392108e

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

src/MultiFieldDistributedFESpaces.jl

+13-17
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ function _gen_multifield_distributed_fe_function(dV::MultiFieldDistributedFESpac
3535
funs = DistributedData(get_comm(dV.distributed_spaces[1]),
3636
dV.spaces, single_fe_functions...,) do part, V, fe_functions...
3737
mfv = zero_free_values(V)
38+
mf_lids = [i for i=1:length(mfv)]
3839
current = 1
39-
for fun in fe_functions
40+
for (field_id,fun) in enumerate(fe_functions)
4041
fv = get_free_values(fun)
41-
for i = 1:length(fv)
42-
mfv[current] = fv[i]
42+
sf_lids=Gridap.MultiField.restrict_to_field(V,mf_lids,field_id)
43+
for i = 1:length(sf_lids)
44+
mfv[sf_lids[i]] = fv[i]
4345
current = current + 1
4446
end
4547
end
@@ -59,16 +61,13 @@ function restrict_to_field(dV::MultiFieldDistributedFESpace, x::Vector, field)
5961
dV.distributed_spaces[field].gids)
6062

6163
do_on_parts(dV.spaces, dV.gids, xi, x, dV.distributed_spaces...) do part, mfspace, mfgids, xi, x, fspaces_and_gids...
62-
offset = 0
63-
for i = 1:field - 1
64-
fspace = fspaces_and_gids[i][1]
65-
offset = offset + num_free_dofs(fspace)
66-
end
6764
fspace = fspaces_and_gids[field][1]
6865
fgids = fspaces_and_gids[field][2]
66+
mf_lids = [i for i=1:num_free_dofs(mfspace)]
67+
sf_lids = Gridap.MultiField.restrict_to_field(mfspace,mf_lids,field)
6968
for i = 1:num_free_dofs(fspace)
7069
if fgids.lid_to_owner[i] == part
71-
xi[fgids.lid_to_gid[i]] = x[mfgids.lid_to_gid[offset + i]]
70+
xi[fgids.lid_to_gid[i]] = x[mfgids.lid_to_gid[sf_lids[i]]]
7271
end
7372
end
7473
end
@@ -92,17 +91,14 @@ function restrict_to_field(dV::MultiFieldDistributedFESpace, x::GridapDistribute
9291

9392
mfis_gids = Vector{GridapDistributedPETScWrappers.PetscInt}(undef,length(fis_gids))
9493

95-
do_on_parts(dV.gids, dV.distributed_spaces...) do part, lmfgids, fspaces_and_gids...
96-
offset = 0
97-
for i = 1:field - 1
98-
fspace = fspaces_and_gids[i][1]
99-
offset = offset + num_free_dofs(fspace)
100-
end
94+
do_on_parts(dV.spaces, dV.gids, dV.distributed_spaces...) do part, mfspace, lmfgids, fspaces_and_gids...
95+
mf_lids = [i for i=1:num_free_dofs(mfspace)]
96+
sf_lids = Gridap.MultiField.restrict_to_field(mfspace,mf_lids,field)
10197
fspace = fspaces_and_gids[field][1]
10298
current=1
10399
for i = 1:num_free_dofs(fspace)
104-
if lmfgids.lid_to_owner[offset+i] == part
105-
mfis_gids[current]=mfgids.lid_to_gid_petsc[offset+i]-1
100+
if lmfgids.lid_to_owner[sf_lids[i]] == part
101+
mfis_gids[current]=mfgids.lid_to_gid_petsc[sf_lids[i]]-1
106102
current=current+1
107103
end
108104
end

0 commit comments

Comments
 (0)