LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
create_mesh.cc
1#include <lf/io/vtk_writer.h>
2#include <lf/mesh/hybrid2d/mesh_factory.h>
3#include <sphere_triag_mesh_builder.h>
4
5#include <iostream>
6#include <sstream>
7
21int main(int arg, char** args) {
22 // prepare needed objects
23 std::unique_ptr<lf::mesh::MeshFactory> factory =
24 std::make_unique<lf::mesh::hybrid2d::MeshFactory>(3);
25
28
29 // read out
30 if (arg != 4 && arg != 5) {
31 std::cerr << "Usage: " << args[0]
32 << "smallest_mesh largest_mesh radius [verbose]" << std::endl;
33 exit(1);
34 }
35
36 double radius;
37 sscanf(args[3], "%lf", &radius);
38 sphere.setRadius(radius);
39
40 int largest_mesh = atoi(args[2]);
41 int smallest_mesh = atoi(args[1]);
42 for (int i = 0; i <= largest_mesh; i++) {
43 // create mesh
44 int refinement_level = i + smallest_mesh;
45
46 sphere.setRefinementLevel(i);
47 const std::shared_ptr<lf::mesh::Mesh> mesh = sphere.Build();
48
49 // check if verbositiy is activated
50 // if so print mesh information of the smallest mesh
51 if (i == 0 && arg == 5 && args[4] == "verbose") {
52 std::cout << "\n\n\nPoint information";
53 for (const lf::mesh::Entity* point : mesh->Entities(2)) {
54 Eigen::MatrixXd vertex = lf::geometry::Corners(*(point->Geometry()));
55 int index = mesh->Index(*point);
56 std::cout << "\n\nPoint " << index << "\n" << vertex;
57 }
58
59 for (const lf::mesh::Entity* cell_p : mesh->Entities(0)) {
60 int global_cell_index = mesh->Index(*cell_p);
61 auto orientations = cell_p->RelativeOrientations();
62 Eigen::MatrixXd vertices = lf::geometry::Corners(*(cell_p->Geometry()));
63 std::cout << "\n\n\nInfo for cell " << global_cell_index << "\n";
64 std::cout << "Corners:\n" << vertices;
65
66 int i = 0;
67 for (const lf::mesh::Entity* edge_p : cell_p->SubEntities(1)) {
68 int global_edge_index = mesh->Index(*edge_p);
69 int sign = lf::mesh::to_sign(orientations[i]);
70 std::cout << "\n\nEdge local " << i << " global " << global_edge_index
71 << " orientation " << sign;
72 i++;
73 }
74 }
75 }
76
77 // write mesh out with refinement_level and radius cut to 6 decimals
78 lf::io::VtkWriter vtk_writer_1(mesh, "meshs/sphere_" + std::to_string(i) +
79 "_" + std::to_string(radius) +
80 ".vtk");
81 }
82}
Write a mesh along with mesh data into a vtk file.
Definition: vtk_writer.h:272
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
virtual nonstd::span< const Entity *const > SubEntities(unsigned rel_codim) const =0
Return all sub entities of this entity that have the given codimension (w.r.t. this entity!...
void setRefinementLevel(lf::base::size_type n)
Set the refinement level.
std::shared_ptr< lf::mesh::Mesh > Build()
Build the mesh.
Eigen::MatrixXd Corners(const Geometry &geo)
The corners of a shape with piecewise smooth boundary.
int to_sign(Orientation o)
Definition: entity.cc:7