Developer Documentation
Loading...
Searching...
No Matches
Tetmesh.hpp
1#pragma once
2
3#include <boost/spirit/include/qi.hpp>
4
5#include <boost/bind.hpp>
6
7#include "../MeshGenerator.hpp"
8
9#include <iostream>
10
11namespace qi = boost::spirit::qi;
12namespace spirit = boost::spirit;
13
14template <typename Iterator>
15class tetmesh_grammar : public qi::grammar<Iterator, qi::space_type> {
16public:
17 explicit tetmesh_grammar(MeshGenerator& _generator) :
18 tetmesh_grammar::base_type(content),
19 generator_(_generator)
20 {}
21
22private:
23
24 MeshGenerator& generator_;
25
26 using Rule = qi::rule<Iterator, qi::space_type>;
27 Rule node_section_header {spirit::lit("Vertices") >> qi::int_};
28 Rule element_section_header {spirit::lit("Tetrahedra") >>
29 qi::int_[boost::bind(&MeshGenerator::set_num_cells, &generator_, ::_1)]};
30 Rule node {qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
31 qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
32 qi::double_[boost::bind(&MeshGenerator::add_vertex_component, &generator_, ::_1)] >>
33 qi::double_};
34 Rule element {qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
35 qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
36 qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)] >>
37 qi::int_[boost::bind(&MeshGenerator::add_cell_vertex, &generator_, ::_1)]};
38 Rule content {node_section_header >> *node >> element_section_header >> *element};
39};