85 if (is_broken())
return;
87 if (map_dim <= 0)
return;
91 for (
const_iterator iter_S = begin(sid_dim), last_S = end(sid_dim); iter_S != last_S; ++iter_S) {
93 S.
set_master (0, std::numeric_limits<size_type>::max());
94 S.
set_master (1, std::numeric_limits<size_type>::max());
97 distributor is_ownership = _gs.ownership_by_dimension[map_dim-1];
98 std::array<index_set, reference_element::max_variant> ext_isv_set;
100 for (
const_iterator iter_K = begin(map_dim), last_K = end(map_dim); iter_K != last_K; ++iter_K) {
102 for (
size_type loc_is = 0, loc_ns = K.
n_subgeo(sid_dim); loc_is < loc_ns; ++loc_is) {
103 size_type dis_is = (map_dim == 1) ? K[loc_is] : ((map_dim == 2) ? K.
edge(loc_is) : K.
face(loc_is));
104 if (is_ownership.
is_owned (dis_is))
continue;
107 size_type dis_isv = _gs.dis_ige2dis_igev_by_dimension (sid_dim, dis_is, variant);
108 ext_isv_set [variant] += dis_isv;
109 ext_is_set += dis_is;
118 _geo_element [variant].append_dis_indexes (ext_isv_set [variant]);
122 distributor vertex_ownership = sizes().ownership_by_dimension[0];
124 for (
const_iterator iter = begin(map_dim), last = end(map_dim); iter != last; ++iter) {
128 for (
size_type loc_inod = 0, loc_nnod = K.
size(); loc_inod < loc_nnod; loc_inod++) {
130 size_type dis_iv = dis_inod2dis_iv (dis_inod);
131 ball.dis_entry (dis_iv) += dis_ie_set;
134 ball.dis_entry_assembly();
136 add_ball_externals (*
this, ball);
138 distributor ie_ownership = _gs.ownership_by_dimension[map_dim];
141 std::array<index_set, reference_element::max_variant> ext_igev_set;
145 side_marked.set_dis_indexes (ext_is_set);
146 for (
const_iterator iter_K = begin(map_dim), last_K = end(map_dim); iter_K != last_K; ++iter_K) {
148 for (
size_type loc_is = 0, loc_ns = K.
n_subgeo(sid_dim); loc_is < loc_ns; ++loc_is) {
149 size_type dis_is = (sid_dim == 0) ? K[loc_is] : ((sid_dim == 1) ? K.
edge(loc_is) : K.
face(loc_is));
150 if (side_marked.dis_at (dis_is))
continue;
151 side_marked.dis_entry (dis_is) = 1;
152 const geo_element& S = dis_get_geo_element (sid_dim, dis_is);
153 size_type dis_iv0 = dis_inod2dis_iv (S[0]);
154 index_set ball_intersect = ball.dis_at (dis_iv0);
155 for (
size_type loc_iv = 1, loc_nv = S.
size(); loc_iv < loc_nv; loc_iv++) {
156 size_type dis_iv = dis_inod2dis_iv (S[loc_iv]);
159 switch (ball_intersect.size()) {
161 index_set::const_iterator iter = ball_intersect.begin();
164 S.
set_master (1, std::numeric_limits<size_type>::max());
168 index_set::const_iterator iter = ball_intersect.begin();
173 if (! ie_ownership.
is_owned (dis_ie1)) std::swap (dis_ie1, dis_ie2);
174 if (! ie_ownership.
is_owned (dis_ie2)) {
177 size_type dis_igev2 = _gs.dis_ige2dis_igev_by_dimension (map_dim, dis_ie2, variant2);
178 ext_igev_set [variant2] += dis_igev2;
179 ext_ie_set += dis_ie2;
185 const geo_element& K1 = get_geo_element (map_dim, ie1);
187 if (orient < 0) std::swap (dis_ie1, dis_ie2);
193 error_macro (
"neighbour: side #"<< ball_intersect.size()<<
" connectivity problem");
202 _geo_element [variant].update_dis_entries();
210 _geo_element [variant].append_dis_indexes (ext_igev_set [variant]);
213 for (index_set::const_iterator iter = ext_ie_set.begin(), last = ext_ie_set.end(); iter != last; ++iter) {
215 const geo_element& K = dis_get_geo_element (map_dim, dis_ie);
216 for (
size_type loc_inod = 0, loc_nnod = K.
n_node(); loc_inod < loc_nnod; loc_inod++) {
218 if (! inod_ownership.
is_owned (dis_inod)) {
219 ext_inod_set += dis_inod;
223 _node.append_dis_indexes (ext_inod_set);