LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
create_mesh.cc
1#define _USE_MATH_DEFINES
2#include <lf/io/vtk_writer.h>
3#include <lf/mesh/hybrid2d/mesh_factory.h>
4#include <sphere_triag_mesh_builder.h>
5
6#include <iostream>
7#include <sstream>
8
22int main(int arg, char** args) {
23 // prepare needed objects
24 std::unique_ptr<lf::mesh::MeshFactory> factory =
25 std::make_unique<lf::mesh::hybrid2d::MeshFactory>(3);
26
29
30 // read out
31 if (arg != 4 && arg != 5) {
32 std::cerr << "Usage: " << args[0]
33 << "smallest_mesh largest_mesh radius [verbose]" << std::endl;
34 exit(1);
35 }
36
37 double radius;
38 sscanf(args[3], "%lf", &radius);
39 sphere.setRadius(radius);
40
41 int largest_mesh = atoi(args[2]);
42 int smallest_mesh = atoi(args[1]);
43 for (int i = 0; i <= largest_mesh; i++) {
44 // create mesh
45 int refinement_level = i + smallest_mesh;
46
47 sphere.setRefinementLevel(i);
48 const std::shared_ptr<lf::mesh::Mesh> mesh = sphere.Build();
49
50 // check if verbositiy is activated
51 // if so print mesh information of the smallest mesh
52 if (i == 0 && arg == 5 && args[4] == "verbose") {
53 std::cout << "\n\n\nPoint information";
54 for (const lf::mesh::Entity* point : mesh->Entities(2)) {
55 Eigen::MatrixXd vertex = lf::geometry::Corners(*(point->Geometry()));
56 int index = mesh->Index(*point);
57 std::cout << "\n\nPoint " << index << "\n" << vertex;
58 }
59
60 for (const lf::mesh::Entity* cell_p : mesh->Entities(0)) {
61 int global_cell_index = mesh->Index(*cell_p);
62 auto orientations = cell_p->RelativeOrientations();
63 Eigen::MatrixXd vertices = lf::geometry::Corners(*(cell_p->Geometry()));
64 std::cout << "\n\n\nInfo for cell " << global_cell_index << "\n";
65 std::cout << "Corners:\n" << vertices;
66
67 int i = 0;
68 for (const lf::mesh::Entity* edge_p : cell_p->SubEntities(1)) {
69 int global_edge_index = mesh->Index(*edge_p);
70 int sign = lf::mesh::to_sign(orientations[i]);
71 std::cout << "\n\nEdge local " << i << " global " << global_edge_index
72 << " orientation " << sign;
73 i++;
74 }
75 }
76 }
77
78 // write mesh out with refinement_level and radius cut to 6 decimals
79 lf::io::VtkWriter vtk_writer_1(mesh, "meshs/sphere_" + std::to_string(i) +
80 "_" + std::to_string(radius) +
81 ".vtk");
82 }
83}
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