74 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
91 auto newton = [
this, n](Real & f, Real & df,
const Real & alpha)
93 f = (1. -
std::pow(alpha, n + 1)) / (1. - alpha) -
95 df = (-(n + 1) * (1 - alpha) *
std::pow(alpha, n) + (1. -
std::pow(alpha, n + 1))) /
96 (1. - alpha) / (1. - alpha);
101 newton(f, df, alpha);
103 while (std::abs(f) > 1.e-9 && num_iter <= 25)
108 newton(f, df, alpha);
114 mooseError(
"Newton iteration failed to converge (more than 25 iterations).");
125 std::vector<std::vector<Node *>> ring_nodes(
_num_rings);
132 unsigned int current_node_id = 0;
142 ring_nodes[r][n] =
mesh->add_point(Point(
radius * std::cos(theta),
radius * std::sin(theta)),
154 for (std::size_t r = 0; r <
_num_rings - 1; ++r)
165 Elem * elem =
mesh->add_elem(
new Tri3);
166 elem->set_node(0, ring_nodes[r][n]);
167 elem->set_node(1, ring_nodes[r + 1][n]);
168 elem->set_node(2, ring_nodes[r][np1]);
180 Elem * elem =
mesh->add_elem(
new Tri3);
181 elem->set_node(0, ring_nodes[r + 1][n]);
182 elem->set_node(1, ring_nodes[r + 1][np1]);
183 elem->set_node(2, ring_nodes[r][np1]);
199 Elem * elem =
mesh->add_elem(
new Tri3);
200 elem->set_node(0, ring_nodes[r][n]);
201 elem->set_node(1, ring_nodes[r + 1][np1]);
202 elem->set_node(2, ring_nodes[r][np1]);
210 Elem * elem =
mesh->add_elem(
new Tri3);
211 elem->set_node(0, ring_nodes[r + 1][n]);
212 elem->set_node(1, ring_nodes[r + 1][np1]);
213 elem->set_node(2, ring_nodes[r][n]);
226 for (
const auto & elem :
mesh->element_ptr_range())
228 Point cp = (elem->point(1) - elem->point(0)).cross(elem->point(2) - elem->point(0));
230 mooseError(
"Invalid elem found with negative area");
238 mesh->prepare_for_use();
242 mesh->all_second_order(
true);
243 std::vector<unsigned int> nos;
249 for (
const auto & elem :
mesh->element_ptr_range())
252 libmesh_assert(elem->n_vertices() == 3);
255 Real radii[3] = {elem->point(0).norm(), elem->point(1).norm(), elem->point(2).norm()};
259 Real dr[3] = {std::abs(radii[0] - radii[1]),
260 std::abs(radii[1] - radii[2]),
261 std::abs(radii[2] - radii[0])};
264 auto index = std::distance(std::begin(dr), std::min_element(std::begin(dr), std::end(dr)));
267 if (dr[index] > TOLERANCE)
268 mooseError(
"Error: element had no sides with nodes on same radius.");
273 nos = elem->nodes_on_side(index);
276 Real theta0 = std::atan2(elem->point(nos[0])(1), elem->point(nos[0])(0)),
277 theta1 = std::atan2(elem->point(nos[1])(1), elem->point(nos[1])(0));
287 Real new_theta = 0.5 * (theta0 + theta1);
293 if ((theta0 * theta1 < 0) && (std::abs(theta0) > 0.5 *
libMesh::pi) &&
295 new_theta = 0.5 * (theta0 + theta1 + 2 *
libMesh::pi);
298 Real new_r = elem->point(nos[0]).norm();
301 elem->point(nos[2]) = Point(new_r * std::cos(new_theta), new_r * std::sin(new_theta), 0.);
305 return dynamic_pointer_cast<MeshBase>(
mesh);