@@ -35,11 +35,13 @@ function _gen_multifield_distributed_fe_function(dV::MultiFieldDistributedFESpac
35
35
funs = DistributedData (get_comm (dV. distributed_spaces[1 ]),
36
36
dV. spaces, single_fe_functions... ,) do part, V, fe_functions...
37
37
mfv = zero_free_values (V)
38
+ mf_lids = [i for i= 1 : length (mfv)]
38
39
current = 1
39
- for fun in fe_functions
40
+ for (field_id, fun) in enumerate ( fe_functions)
40
41
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]
43
45
current = current + 1
44
46
end
45
47
end
@@ -59,16 +61,13 @@ function restrict_to_field(dV::MultiFieldDistributedFESpace, x::Vector, field)
59
61
dV. distributed_spaces[field]. gids)
60
62
61
63
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
67
64
fspace = fspaces_and_gids[field][1 ]
68
65
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)
69
68
for i = 1 : num_free_dofs (fspace)
70
69
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] ]]
72
71
end
73
72
end
74
73
end
@@ -92,17 +91,14 @@ function restrict_to_field(dV::MultiFieldDistributedFESpace, x::GridapDistribute
92
91
93
92
mfis_gids = Vector {GridapDistributedPETScWrappers.PetscInt} (undef,length (fis_gids))
94
93
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)
101
97
fspace = fspaces_and_gids[field][1 ]
102
98
current= 1
103
99
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
106
102
current= current+ 1
107
103
end
108
104
end
0 commit comments