169 std::vector<Real> ring_radii,
170 const std::vector<unsigned int> ring_layers,
171 const std::vector<Real> ring_radial_biases,
174 std::vector<Real> ducts_center_dist,
175 const std::vector<unsigned int> ducts_layers,
176 const std::vector<Real> duct_radial_biases,
180 const unsigned int num_sectors_per_side,
181 const unsigned int background_intervals,
182 const Real background_radial_bias,
185 dof_id_type & node_id_background_meta,
186 const Real virtual_side_number,
187 const unsigned int side_index,
188 const std::vector<Real> azimuthal_tangent,
189 const subdomain_id_type block_id_shift,
190 const bool quad_center_elements,
191 const Real center_quad_factor,
192 const bool create_inward_interface_boundaries,
193 const bool create_outward_interface_boundaries,
194 const boundary_id_type boundary_id_shift,
195 const Real pitch_scale_factor,
196 const bool generate_side_specific_boundaries,
204 ", an incompatible elements type combination is used when calling "
205 "PolygonMeshGeneratorBase::buildSlice().");
211 std::vector<unsigned int> mod_ring_layers(ring_layers);
213 mod_ring_layers.begin(), mod_ring_layers.end(), [&order](
unsigned int & n) { n *= order; });
216 std::vector<Real> mod_ring_radial_biases(ring_radial_biases);
217 std::for_each(mod_ring_radial_biases.begin(),
218 mod_ring_radial_biases.end(),
219 [&order](Real & n) { n = std::pow(n, 1.0 / order); });
221 std::vector<unsigned int> mod_ducts_layers(ducts_layers);
223 mod_ducts_layers.begin(), mod_ducts_layers.end(), [&order](
unsigned int & n) { n *= order; });
225 std::vector<Real> mod_duct_radial_biases(duct_radial_biases);
226 std::for_each(mod_duct_radial_biases.begin(),
227 mod_duct_radial_biases.end(),
228 [&order](Real & n) { n = std::pow(n, 1.0 / order); });
230 const unsigned int mod_num_sectors_per_side = num_sectors_per_side * order;
231 const unsigned int mod_background_intervals = background_intervals * order;
233 const Real mod_background_radial_bias = std::pow(background_radial_bias, 1.0 / order);
235 const auto mod_ring_inner_boundary_layer_params =
237 const auto mod_ring_outer_boundary_layer_params =
239 const auto mod_duct_inner_boundary_layer_params =
241 const auto mod_duct_outer_boundary_layer_params =
244 const auto mod_background_inner_boundary_layer_params =
246 const auto mod_background_outer_boundary_layer_params =
251 std::vector<Real> mod_ducts_center_dist(ducts_center_dist);
252 std::vector<Real> mod_ring_radii(ring_radii);
253 bool has_rings(ring_radii.size());
254 bool has_ducts(ducts_center_dist.size());
255 bool has_background(background_intervals);
260 const auto main_background_bias_terms =
262 const auto inner_background_bias_terms =
264 background_inner_boundary_layer_params.
intervals);
265 const auto outer_background_bias_terms =
267 background_outer_boundary_layer_params.
intervals);
270 ring_inner_boundary_layer_params,
271 ring_outer_boundary_layer_params);
274 duct_inner_boundary_layer_params,
275 duct_outer_boundary_layer_params);
277 const auto mod_main_background_bias_terms =
279 const auto mod_inner_background_bias_terms =
281 mod_background_inner_boundary_layer_params.intervals);
282 const auto mod_outer_background_bias_terms =
284 mod_background_outer_boundary_layer_params.intervals);
287 mod_ring_inner_boundary_layer_params,
288 mod_ring_outer_boundary_layer_params);
291 mod_duct_inner_boundary_layer_params,
292 mod_duct_outer_boundary_layer_params);
294 std::vector<unsigned int> total_ring_layers;
295 for (
unsigned int i = 0; i < ring_layers.size(); i++)
296 total_ring_layers.push_back(ring_layers[i] + ring_inner_boundary_layer_params.
intervals[i] +
297 ring_outer_boundary_layer_params.
intervals[i]);
299 if (background_inner_boundary_layer_params.
intervals)
301 total_ring_layers.push_back(background_inner_boundary_layer_params.
intervals);
302 rings_bias_terms.push_back(inner_background_bias_terms);
303 ring_radii.push_back((ring_radii.empty() ? 0.0 : ring_radii.back()) +
304 background_inner_boundary_layer_params.
width);
307 std::vector<unsigned int> mod_total_ring_layers;
308 for (
unsigned int i = 0; i < mod_ring_layers.size(); i++)
309 mod_total_ring_layers.push_back(mod_ring_layers[i] +
310 mod_ring_inner_boundary_layer_params.intervals[i] +
311 mod_ring_outer_boundary_layer_params.intervals[i]);
313 if (mod_background_inner_boundary_layer_params.intervals)
315 mod_total_ring_layers.push_back(mod_background_inner_boundary_layer_params.intervals);
316 mod_rings_bias_terms.push_back(mod_inner_background_bias_terms);
317 mod_ring_radii.push_back((mod_ring_radii.empty() ? 0.0 : mod_ring_radii.back()) +
318 mod_background_inner_boundary_layer_params.width);
322 std::vector<unsigned int> total_ducts_layers;
323 if (background_outer_boundary_layer_params.
intervals)
325 total_ducts_layers.push_back(background_outer_boundary_layer_params.
intervals);
326 duct_bias_terms.insert(duct_bias_terms.begin(), outer_background_bias_terms);
327 ducts_center_dist.insert(ducts_center_dist.begin(),
328 (ducts_center_dist.empty()
329 ? pitch / 2.0 / std::cos(M_PI / virtual_side_number)
330 : ducts_center_dist.front()) -
331 background_outer_boundary_layer_params.
width);
334 for (
unsigned int i = 0; i < ducts_layers.size(); i++)
335 total_ducts_layers.push_back(ducts_layers[i] + duct_inner_boundary_layer_params.
intervals[i] +
336 duct_outer_boundary_layer_params.
intervals[i]);
338 std::vector<unsigned int> mod_total_ducts_layers;
339 if (mod_background_outer_boundary_layer_params.intervals)
341 mod_total_ducts_layers.push_back(mod_background_outer_boundary_layer_params.intervals);
342 mod_duct_bias_terms.insert(mod_duct_bias_terms.begin(), mod_outer_background_bias_terms);
343 mod_ducts_center_dist.insert(mod_ducts_center_dist.begin(),
344 (mod_ducts_center_dist.empty()
345 ? pitch / 2.0 / std::cos(M_PI / virtual_side_number)
346 : mod_ducts_center_dist.front()) -
347 mod_background_outer_boundary_layer_params.width);
350 for (
unsigned int i = 0; i < mod_ducts_layers.size(); i++)
351 mod_total_ducts_layers.push_back(mod_ducts_layers[i] +
352 mod_duct_inner_boundary_layer_params.intervals[i] +
353 mod_duct_outer_boundary_layer_params.intervals[i]);
355 unsigned int angle_number = azimuthal_tangent.size() == 0
356 ? num_sectors_per_side
357 : ((azimuthal_tangent.size() - 1) / order);
358 unsigned int mod_angle_number =
359 azimuthal_tangent.size() == 0 ? mod_num_sectors_per_side : (azimuthal_tangent.size() - 1);
362 const Real corner_to_corner =
363 pitch / std::cos(M_PI / virtual_side_number);
364 const Real corner_p[2][2] = {
365 {0.0, 0.5 * corner_to_corner},
366 {0.5 * corner_to_corner * pitch_scale_factor * std::sin(2.0 * M_PI / virtual_side_number),
367 0.5 * corner_to_corner * pitch_scale_factor * std::cos(2.0 * M_PI / virtual_side_number)}};
368 const unsigned int div_num = angle_number / 2 + 1;
369 const unsigned int mod_div_num = mod_angle_number / 2 + 1;
372 std::vector<std::vector<Node *>> nodes(mod_div_num, std::vector<Node *>(mod_div_num));
373 if (quad_center_elements)
378 ring_radii_0 = ring_radii.front() * mod_rings_bias_terms.front()[order - 1];
380 ring_radii_0 = mod_ducts_center_dist.front() * std::cos(M_PI / virtual_side_number) *
381 mod_main_background_bias_terms[order - 1];
383 ring_radii_0 = pitch / 2.0 * mod_main_background_bias_terms[order - 1];
388 center_quad_factor == 0.0 ? (((Real)div_num - 1.0) / (Real)div_num) : center_quad_factor;
390 centerNodes(*
mesh, virtual_side_number, mod_div_num, ring_radii_0, nodes);
393 mesh->add_point(Point(0.0, 0.0, 0.0));
399 mod_total_ring_layers,
400 mod_rings_bias_terms,
401 mod_num_sectors_per_side,
411 Real background_corner_radial_interval_length;
412 Real background_corner_distance;
416 background_in = ring_radii.back();
422 background_out = mod_ducts_center_dist.front();
423 background_corner_distance =
424 mod_ducts_center_dist
429 background_out = 0.5 * corner_to_corner;
430 background_corner_distance =
431 0.5 * corner_to_corner;
434 background_corner_radial_interval_length =
435 (background_out - background_in) / mod_background_intervals;
437 node_id_background_meta =
mesh->n_nodes();
441 mod_num_sectors_per_side,
442 mod_background_intervals,
443 mod_main_background_bias_terms,
444 background_corner_distance,
445 background_corner_radial_interval_length,
455 &mod_ducts_center_dist,
456 mod_total_ducts_layers,
458 mod_num_sectors_per_side,
474 bool is_central_region_independent;
475 if (ring_layers.empty())
476 is_central_region_independent = mod_background_inner_boundary_layer_params.intervals +
477 mod_background_intervals +
478 mod_background_outer_boundary_layer_params.intervals ==
481 is_central_region_independent = mod_ring_layers[0] +
482 mod_ring_inner_boundary_layer_params.intervals[0] +
483 mod_ring_outer_boundary_layer_params.intervals[0] ==
489 if (quad_center_elements)
493 create_outward_interface_boundaries && is_central_region_independent,
496 (!has_rings) && (!has_ducts) && (background_intervals == 1),
501 generate_side_specific_boundaries,
506 num_sectors_per_side,
509 create_outward_interface_boundaries && is_central_region_independent,
511 ((!has_rings) && (!has_ducts) && (background_intervals == 1)) ||
512 ((!has_background) &&
513 (std::accumulate(total_ring_layers.begin(), total_ring_layers.end(), 0) == 1)),
517 generate_side_specific_boundaries,
525 std::vector<unsigned int> subdomain_rings;
528 subdomain_rings = total_ring_layers;
529 subdomain_rings.front() -= 1;
530 if (background_inner_boundary_layer_params.
intervals)
532 subdomain_rings.back() =
533 background_inner_boundary_layer_params.
intervals + background_intervals +
534 background_outer_boundary_layer_params.
intervals;
535 if (ring_radii.size() == 1)
536 subdomain_rings.back() -= 1;
538 else if (has_background)
539 subdomain_rings.push_back(background_inner_boundary_layer_params.
intervals +
540 background_intervals +
541 background_outer_boundary_layer_params.
intervals);
545 subdomain_rings.push_back(
546 background_inner_boundary_layer_params.
intervals + background_intervals +
547 background_outer_boundary_layer_params.
intervals);
548 subdomain_rings[0] -= 1;
552 for (
unsigned int i = (background_outer_boundary_layer_params.
intervals > 0);
553 i < total_ducts_layers.size();
555 subdomain_rings.push_back(total_ducts_layers[i]);
558 num_sectors_per_side,
563 quad_center_elements ? (mod_div_num * mod_div_num - 1) : 0,
564 create_inward_interface_boundaries,
565 create_outward_interface_boundaries,
567 generate_side_specific_boundaries,
570 mesh->remove_orphaned_nodes();
719 const unsigned int num_sectors_per_side,
720 const unsigned int background_intervals,
721 const std::vector<Real> biased_terms,
722 const Real background_corner_distance,
723 const Real background_corner_radial_interval_length,
724 const Real corner_p[2][2],
725 const Real corner_to_corner,
726 const Real background_in,
727 const std::vector<Real> azimuthal_tangent)
const
729 unsigned int angle_number =
730 azimuthal_tangent.size() == 0 ? num_sectors_per_side : (azimuthal_tangent.size() - 1);
731 for (
unsigned int k = 0; k < (background_intervals); k++)
733 const Real background_corner_p_x =
734 background_corner_distance / (0.5 * corner_to_corner) * corner_p[0][0] *
736 biased_terms[k] * background_intervals * background_corner_radial_interval_length) /
737 background_corner_distance;
738 const Real background_corner_p_y =
739 background_corner_distance / (0.5 * corner_to_corner) * corner_p[0][1] *
741 biased_terms[k] * background_intervals * background_corner_radial_interval_length) /
742 background_corner_distance;
746 mesh.add_point(Point(background_corner_p_x, background_corner_p_y, 0.0));
748 for (
unsigned int j = 1; j <= angle_number; j++)
750 const Real cell_boundary_p_x =
751 background_corner_distance / (0.5 * corner_to_corner) *
752 (corner_p[0][0] + (corner_p[1][0] - corner_p[0][0]) *
753 (azimuthal_tangent.size() == 0 ? ((Real)j / (Real)angle_number)
754 : (azimuthal_tangent[j] / 2.0)));
755 const Real cell_boundary_p_y =
756 background_corner_distance / (0.5 * corner_to_corner) *
757 (corner_p[0][1] + (corner_p[1][1] - corner_p[0][1]) *
758 (azimuthal_tangent.size() == 0 ? ((Real)j / (Real)angle_number)
759 : (azimuthal_tangent[j] / 2.0)));
762 const Real pin_boundary_p_x =
763 cell_boundary_p_x * background_in /
764 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
765 const Real pin_boundary_p_y =
766 cell_boundary_p_y * background_in /
767 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
770 const Real background_radial_interval =
771 std::sqrt(Utility::pow<2>(cell_boundary_p_x - pin_boundary_p_x) +
772 Utility::pow<2>(cell_boundary_p_y - pin_boundary_p_y)) /
773 background_intervals;
774 const Real background_azimuthal_p_x =
776 (background_in + biased_terms[k] * background_intervals * background_radial_interval) /
777 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
778 const Real background_azimuthal_p_y =
780 (background_in + biased_terms[k] * background_intervals * background_radial_interval) /
781 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
784 mesh.add_point(Point(background_azimuthal_p_x, background_azimuthal_p_y, 0.0));
852 const unsigned int div_num,
853 const subdomain_id_type block_id_shift,
854 const bool create_outward_interface_boundaries,
855 const boundary_id_type boundary_id_shift,
856 std::vector<std::vector<Node *>> & nodes,
857 const bool assign_external_boundary,
858 const unsigned int side_index,
859 const bool generate_side_specific_boundaries,
863 BoundaryInfo & boundary_info =
mesh.get_boundary_info();
866 for (
unsigned int i = 0; i < div_num - 1; i++)
868 unsigned int id_x = 0;
869 unsigned int id_y = i;
870 for (
unsigned int j = 0; j < 2 * i + 1; j++)
872 std::unique_ptr<Elem> new_elem;
875 new_elem = std::make_unique<Quad4>();
876 new_elem->set_node(0, nodes[id_x][id_y]);
877 new_elem->set_node(3, nodes[id_x][id_y + 1]);
878 new_elem->set_node(2, nodes[id_x + 1][id_y + 1]);
879 new_elem->set_node(1, nodes[id_x + 1][id_y]);
880 new_elem->subdomain_id() = 1 + block_id_shift;
884 new_elem = std::make_unique<Quad8>();
887 new_elem = std::make_unique<Quad9>();
888 new_elem->set_node(8, nodes[id_x * 2 + 1][id_y * 2 + 1]);
890 new_elem->set_node(0, nodes[id_x * 2][id_y * 2]);
891 new_elem->set_node(3, nodes[id_x * 2][id_y * 2 + 2]);
892 new_elem->set_node(2, nodes[id_x * 2 + 2][id_y * 2 + 2]);
893 new_elem->set_node(1, nodes[id_x * 2 + 2][id_y * 2]);
894 new_elem->set_node(4, nodes[id_x * 2 + 1][id_y * 2]);
895 new_elem->set_node(5, nodes[id_x * 2 + 2][id_y * 2 + 1]);
896 new_elem->set_node(6, nodes[id_x * 2 + 1][id_y * 2 + 2]);
897 new_elem->set_node(7, nodes[id_x * 2][id_y * 2 + 1]);
898 new_elem->subdomain_id() = 1 + block_id_shift;
900 Elem * elem_Quad =
mesh.add_elem(std::move(new_elem));
905 boundary_info.add_side(elem_Quad, 0,
SLICE_END);
913 for (
unsigned int i = (div_num - 1) * (div_num - 1); i < div_num * div_num - 1; i++)
915 std::unique_ptr<Elem> new_elem;
918 new_elem = std::make_unique<Quad4>();
919 new_elem->set_node(0,
mesh.node_ptr(i));
920 new_elem->set_node(3,
mesh.node_ptr(i + 2 * div_num - 1));
921 new_elem->set_node(2,
mesh.node_ptr(i + 2 * div_num));
922 new_elem->set_node(1,
mesh.node_ptr(i + 1));
926 new_elem = std::make_unique<Quad8>();
929 new_elem = std::make_unique<Quad9>();
930 new_elem->set_node(8,
931 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
932 (i - (div_num - 1) * (div_num - 1)) * 2 + 1 +
933 ((div_num - 1) * 4 + 1)));
935 new_elem->set_node(0,
936 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
937 (i - (div_num - 1) * (div_num - 1)) * 2));
938 new_elem->set_node(3,
939 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
940 (i - (div_num - 1) * (div_num - 1)) * 2 +
941 ((div_num - 1) * 4 + 1) * 2));
942 new_elem->set_node(2,
943 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
944 (i - (div_num - 1) * (div_num - 1)) * 2 + 2 +
945 ((div_num - 1) * 4 + 1) * 2));
946 new_elem->set_node(1,
947 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
948 (i - (div_num - 1) * (div_num - 1)) * 2 + 2));
949 new_elem->set_node(4,
950 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
951 (i - (div_num - 1) * (div_num - 1)) * 2 + 1));
952 new_elem->set_node(5,
953 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
954 (i - (div_num - 1) * (div_num - 1)) * 2 + 2 +
955 ((div_num - 1) * 4 + 1)));
956 new_elem->set_node(6,
957 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
958 (i - (div_num - 1) * (div_num - 1)) * 2 + 1 +
959 ((div_num - 1) * 4 + 1) * 2));
960 new_elem->set_node(7,
961 mesh.node_ptr((div_num - 1) * (div_num - 1) * 4 +
962 (i - (div_num - 1) * (div_num - 1)) * 2 +
963 ((div_num - 1) * 4 + 1)));
966 Elem * elem_Quad =
mesh.add_elem(std::move(new_elem));
967 elem_Quad->subdomain_id() = 1 + block_id_shift;
968 if (create_outward_interface_boundaries)
969 boundary_info.add_side(elem_Quad, 2, 1 + boundary_id_shift);
970 if (i == (div_num - 1) * (div_num - 1))
972 if (i == div_num * div_num - 2)
973 boundary_info.add_side(elem_Quad, 1,
SLICE_END);
974 if (assign_external_boundary)
977 if (generate_side_specific_boundaries)
978 boundary_info.add_side(
1052 const unsigned int num_sectors_per_side,
1053 const std::vector<unsigned int> subdomain_rings,
1054 const unsigned int side_index,
1055 const std::vector<Real> azimuthal_tangent,
1056 const subdomain_id_type block_id_shift,
1057 const dof_id_type nodeid_shift,
1058 const bool create_inward_interface_boundaries,
1059 const bool create_outward_interface_boundaries,
1060 const boundary_id_type boundary_id_shift,
1061 const bool generate_side_specific_boundaries,
1065 unsigned int angle_number = azimuthal_tangent.size() == 0
1066 ? num_sectors_per_side
1067 : ((azimuthal_tangent.size() - 1) / order);
1069 BoundaryInfo & boundary_info =
mesh.get_boundary_info();
1071 for (
unsigned int k = 0; k < (subdomain_rings.size()); k++)
1073 for (
unsigned int m = 0; m < subdomain_rings[k]; m++)
1075 for (
unsigned int i = 1; i <= angle_number; i++)
1077 std::unique_ptr<Elem> new_elem;
1080 new_elem = std::make_unique<Quad4>();
1081 new_elem->set_node(0,
mesh.node_ptr(nodeid_shift + i + (angle_number + 1) * j));
1082 new_elem->set_node(1,
mesh.node_ptr(nodeid_shift + i + 1 + (angle_number + 1) * j));
1083 new_elem->set_node(2,
mesh.node_ptr(nodeid_shift + i + (angle_number + 1) * (j + 1) + 1));
1084 new_elem->set_node(3,
mesh.node_ptr(nodeid_shift + i + (angle_number + 1) * (j + 1)));
1088 new_elem = std::make_unique<Quad8>();
1091 new_elem = std::make_unique<Quad9>();
1093 8,
mesh.node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (j * 2 + 2)));
1097 mesh.node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 1)));
1099 1,
mesh.node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 1)));
1101 2,
mesh.node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 3)));
1104 mesh.node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 3)));
1106 4,
mesh.node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (j * 2 + 1)));
1108 5,
mesh.node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 2)));
1110 6,
mesh.node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (j * 2 + 3)));
1113 mesh.node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (j * 2 + 2)));
1115 Elem * elem =
mesh.add_elem(std::move(new_elem));
1118 if (i == angle_number)
1119 boundary_info.add_side(elem, 1,
SLICE_END);
1121 if (subdomain_rings[0] == 0)
1122 elem->subdomain_id() = k + 1 + block_id_shift;
1124 elem->subdomain_id() = k + 2 + block_id_shift;
1126 if (m == 0 && create_inward_interface_boundaries && k > 0)
1127 boundary_info.add_side(elem, 0, k * 2 + boundary_id_shift);
1128 if (m == (subdomain_rings[k] - 1))
1130 if (k == (subdomain_rings.size() - 1))
1133 if (generate_side_specific_boundaries)
1135 if (i <= angle_number / 2)
1141 else if (create_outward_interface_boundaries)
1142 boundary_info.add_side(elem, 2, k * 2 + 1 + boundary_id_shift);
1152 const unsigned int num_sectors_per_side,
1153 const unsigned int peripheral_invervals,
1154 const std::vector<std::pair<Real, Real>> & positions_inner,
1155 const std::vector<std::pair<Real, Real>> & d_positions_outer,
1156 const subdomain_id_type id_shift,
1158 const bool create_inward_interface_boundaries,
1159 const bool create_outward_interface_boundaries)
1162 std::pair<Real, Real> positions_p;
1165 for (
unsigned int i = 0; i <= peripheral_invervals; i++)
1167 for (
unsigned int j = 0; j <= num_sectors_per_side / 2; j++)
1170 positions_inner[0].second,
1171 d_positions_outer[0].first,
1172 d_positions_outer[0].second,
1173 positions_inner[1].first,
1174 positions_inner[1].second,
1175 d_positions_outer[1].first,
1176 d_positions_outer[1].second,
1179 num_sectors_per_side,
1180 peripheral_invervals);
1181 mesh->add_point(Point(positions_p.first, positions_p.second, 0.0));
1183 for (
unsigned int j = 1; j <= num_sectors_per_side / 2; j++)
1186 positions_inner[1].second,
1187 d_positions_outer[1].first,
1188 d_positions_outer[1].second,
1189 positions_inner[2].first,
1190 positions_inner[2].second,
1191 d_positions_outer[2].first,
1192 d_positions_outer[2].second,
1195 num_sectors_per_side,
1196 peripheral_invervals);
1197 mesh->add_point(Point(positions_p.first, positions_p.second, 0.0));
1202 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
1204 for (
unsigned int i = 0; i < peripheral_invervals; i++)
1206 for (
unsigned int j = 0; j < num_sectors_per_side; j++)
1208 std::unique_ptr<Elem> new_elem;
1210 new_elem = std::make_unique<Quad4>();
1211 new_elem->set_node(0,
mesh->node_ptr(j + (num_sectors_per_side + 1) * (i)));
1212 new_elem->set_node(1,
mesh->node_ptr(j + 1 + (num_sectors_per_side + 1) * (i)));
1213 new_elem->set_node(2,
mesh->node_ptr(j + 1 + (num_sectors_per_side + 1) * (i + 1)));
1214 new_elem->set_node(3,
mesh->node_ptr(j + (num_sectors_per_side + 1) * (i + 1)));
1216 Elem * elem =
mesh->add_elem(std::move(new_elem));
1223 if (create_inward_interface_boundaries)
1224 boundary_info.add_side(elem, 0,
SLICE_ALT + id_shift * 2);
1226 if (i == peripheral_invervals - 1)
1229 if (create_outward_interface_boundaries)
1230 boundary_info.add_side(elem, 2,
SLICE_ALT + id_shift * 2 + 1);
1234 if (j == num_sectors_per_side - 1)
1244 mesh->all_second_order(full_ordered);