LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
annulus_triag_mesh_builder.cc
1#include "annulus_triag_mesh_builder.h"
2
3#include <lf/base/base.h>
4#include <lf/base/span.h>
5#include <lf/geometry/geometry.h>
6
7#include <array>
8#include <cmath>
9#include <vector>
10
12
13std::shared_ptr<lf::mesh::Mesh> AnnulusTriagMeshBuilder::Build() {
14 const lf::base::size_type vertex_count =
16 const double r = inner_radius_;
17 const double R = outer_radius_;
18 const double dr = (R - r) / num_radial_cells_;
19 const double dphi = 2 * M_PI / num_angular_cells_;
20 auto node_position = [&](lf::base::size_type r_idx,
21 lf::base::size_type phi_idx) {
22 Eigen::Vector2d pos;
23 const double pos_r = r + r_idx * dr;
24 const double pos_phi = phi_idx * dphi;
25 pos << pos_r * std::cos(pos_phi), pos_r * std::sin(pos_phi);
26 return pos;
27 };
28
29 // Add all vertices to the mesh
30 std::vector<lf::base::size_type> v_idx(vertex_count);
31 lf::base::size_type node_count = 0;
32 for (lf::base::size_type r_idx = 0; r_idx < num_radial_cells_ + 1; ++r_idx) {
33 for (lf::base::size_type phi_idx = 0; phi_idx < num_angular_cells_;
34 ++phi_idx) {
35 v_idx[node_count++] =
36 mesh_factory_->AddPoint(node_position(r_idx, phi_idx));
37 }
38 }
39
40 // Construct the triangles
42 for (lf::base::size_type r_idx = 0; r_idx < num_radial_cells_; ++r_idx) {
43 for (lf::base::size_type phi_idx = 0; phi_idx < num_angular_cells_;
44 ++phi_idx) {
45 const lf::base::size_type v1 =
46 v_idx[num_angular_cells_ * r_idx + phi_idx];
47 const lf::base::size_type v2 =
48 v_idx[num_angular_cells_ * (r_idx + 1) + phi_idx];
49 const lf::base::size_type v3 =
50 v_idx[num_angular_cells_ * (r_idx + 1) +
51 ((phi_idx + 1) % num_angular_cells_)];
52 const lf::base::size_type v4 =
53 v_idx[num_angular_cells_ * r_idx +
54 ((phi_idx + 1) % num_angular_cells_)];
55 const std::array<lf::base::size_type, 3> trig1 = {v1, v2, v4};
56 const std::array<lf::base::size_type, 3> trig2 = {v2, v3, v4};
57 Eigen::Matrix<double, 2, 3> verts1;
58 Eigen::Matrix<double, 2, 3> verts2;
59 verts1 << node_position(r_idx, phi_idx),
60 node_position(r_idx + 1, phi_idx),
61 node_position(r_idx, (phi_idx + 1) % num_angular_cells_);
62 verts2 << node_position(r_idx + 1, phi_idx),
63 node_position(r_idx + 1, (phi_idx + 1) % num_angular_cells_),
64 node_position(r_idx, (phi_idx + 1) % num_angular_cells_);
65 std::unique_ptr<lf::geometry::Geometry> geom1 =
66 std::make_unique<lf::geometry::TriaO1>(verts1);
67 std::unique_ptr<lf::geometry::Geometry> geom2 =
68 std::make_unique<lf::geometry::TriaO1>(verts2);
69 mesh_factory_->AddEntity(ref_el, nonstd::span(trig1.data(), 3),
70 std::move(geom1));
71 mesh_factory_->AddEntity(ref_el, nonstd::span(trig2.data(), 3),
72 std::move(geom2));
73 }
74 }
75
76 return mesh_factory_->Build();
77}
78
79} // end namespace projects::ipdg_stokes::mesh
Represents a reference element with all its properties.
Definition: ref_el.h:106
static constexpr RefEl kTria()
Returns the reference triangle.
Definition: ref_el.h:158
std::shared_ptr< lf::mesh::Mesh > Build()
Build the mesh.
std::unique_ptr< lf::mesh::MeshFactory > mesh_factory_
unsigned int size_type
general type for variables related to size of arrays
Definition: base.h:24