138 new_omega._version = 4;
139 new_omega._have_connectivity =
true;
140 new_omega._name = old_omega.name() +
"-P" + std::to_string(nsub);
141 new_omega._dimension = old_omega.dimension();
142 new_omega._gs._map_dimension = old_omega.map_dimension();
143 new_omega._sys_coord = old_omega.coordinate_system();
144 new_omega._serial_number = 0;
152 new_omega._node = old_Xh_sub.get_xdofs();
153 new_omega._gs.ownership_by_variant[0]
154 = new_omega._gs.ownership_by_dimension[0]
155 = new_omega._gs.node_ownership
156 = new_omega._node.ownership();
160 size_type map_d = old_omega.map_dimension();
162 std::array<size_type, reference_element::max_variant> size_by_variant;
163 std::fill (size_by_variant.begin(), size_by_variant.end(), 0);
164 for (size_type
d = 1;
d <= map_d; ++
d) {
167 size_type loc_nge =
pow(nsub,
d);
168 size_type old_nge = old_omega.sizes().ownership_by_variant [variant].size();
169 size_by_variant[variant] = loc_nge*old_nge;
172 size_type loc_nedg = 3*nsub*(nsub-1)/2;
178 for (size_type
d = 1;
d <= map_d; ++
d) {
179 size_type ne = 0, dis_ne = 0;
183 new_omega._gs.ownership_by_variant [variant].resize (
distributor::decide, comm, size_by_variant[variant]);
184 new_omega._geo_element [variant].resize (new_omega._gs.ownership_by_variant [variant], param);
185 ne += size_by_variant[variant];
192 std::array<size_type, reference_element::max_variant> count_by_variant;
193 std::fill (count_by_variant.begin(), count_by_variant.end(), 0);
194 std::vector<size_type> dis_inod;
195 for (size_type
d = 1;
d <= map_d; ++
d) {
196 for (size_type ie = 0, ne = old_omega.size(
d); ie < ne; ++ie) {
197 const geo_element& old_K = old_omega.get_geo_element (
d, ie);
198 old_Xh_sub.dis_idof (old_K, dis_inod);
199 size_type variant = old_K.
variant();
200 build_element (old_K, dis_inod, nsub, new_omega._geo_element, count_by_variant);
207 new_omega._geo_element [
reference_element::p].resize (new_omega._gs.ownership_by_dimension[0], param);
208 size_type first_iv = new_omega._gs.ownership_by_dimension[0].first_index();
211 for (
auto iter = new_omega.begin(0), last = new_omega.end(0); iter != last; iter++, iv++) {
213 P[0] = first_iv + iv;
221 if (new_omega._gs._map_dimension > 0) {
223 for (size_type side_dim = new_omega._gs._map_dimension - 1; side_dim >= 1; side_dim--) {
225 size_type nsid = new_omega._gs.ownership_by_dimension[side_dim].dis_size();
226 new_omega._gs.ownership_by_dimension [side_dim] =
distributor (nsid, new_omega.comm(), nsid);
229 for (
typename geo_rep<T,M>::iterator iter = new_omega.begin(side_dim), last = new_omega.end(side_dim); iter != last; iter++, isid++) {
239 for (size_type
d = 0;
d <= map_d; ++
d) {
240 size_type first_dis_ie = new_omega._gs.ownership_by_dimension[
d].first_index();
241 for (size_type ie = 0, ne = new_omega.size(
d); ie < ne; ++ie) {
252 vector<index_set> ball [4];
254 while (dom.get (ips, *
this, ball)) {
255 base::_domains.push_back (dom);
261 new_omega.set_element_side_index (1);
262 new_omega.set_element_side_index (2);
266 new_omega.compute_bbox();
the finite element boundary domain