|
11 | 11 |
|
12 | 12 | function Gridap.MultiFieldFESpace(test_space::MultiFieldDistributedFESpace{V},
|
13 | 13 | 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)) |
16 | 17 | end
|
17 | 18 | MultiFieldDistributedFESpace(V, trial_spaces, spaces, test_space.gids)
|
18 | 19 | end
|
@@ -129,15 +130,44 @@ function Gridap.MultiFieldFESpace(model::DistributedDiscreteModel,
|
129 | 130 | MultiFieldFESpace([s[1] for s in spaces_and_gids])
|
130 | 131 | end
|
131 | 132 |
|
| 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) |
132 | 162 | function init_lid_to_owner(part, lspace, spaces_and_gids...)
|
133 | 163 | nlids = num_free_dofs(lspace)
|
134 | 164 | 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) |
137 | 167 | 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] |
141 | 171 | end
|
142 | 172 | end
|
143 | 173 | lid_to_owner
|
@@ -170,13 +200,10 @@ function Gridap.MultiFieldFESpace(model::DistributedDiscreteModel,
|
170 | 200 | part_to_lid_to_gid,
|
171 | 201 | part_to_lid_to_owner,
|
172 | 202 | ngids)
|
173 |
| - |
174 |
| - MultiFieldDistributedFESpace(get_vector_type(distributed_spaces[1]), |
175 |
| - distributed_spaces, |
176 |
| - spaces, |
177 |
| - gids) |
178 | 203 | end
|
179 | 204 |
|
| 205 | + |
| 206 | + |
180 | 207 | # FE Function
|
181 | 208 | struct MultiFieldDistributedFEFunction
|
182 | 209 | single_fe_functions::Vector{DistributedFEFunction}
|
|
0 commit comments