PolyFEM
Loading...
Searching...
No Matches
NodeCompositeParametrizations.cpp
Go to the documentation of this file.
2
4#include <map>
5#include <polyfem/State.hpp>
6
7namespace polyfem::solver
8{
10 {
11 dim = state.mesh->dimension();
12 }
13
14 void VariableToNodes::set_output_indexing(const std::vector<int> node_ids)
15 {
16 output_indexing_.resize(node_ids.size() * dim);
17 for (int i = 0; i < node_ids.size(); ++i)
18 for (int k = 0; k < dim; ++k)
19 output_indexing_(i * dim + k) = node_ids[i] * dim + k;
20 }
21
22 VariableToInteriorNodes::VariableToInteriorNodes(const State &state, const int volume_selection) : VariableToNodes(state)
23 {
24 const auto &mesh = state.mesh;
25 const auto &bases = state.bases;
26 const auto &gbases = state.geom_bases();
27
28 std::set<int> node_ids;
29 for (int e = 0; e < mesh->n_elements(); e++)
30 {
31 const int body_id = mesh->get_body_id(e);
32 if (volume_selection == body_id)
33 {
34 for (int i = 0; i < mesh->dimension() + 1; i++)
35 {
36 const int vid = mesh->element_vertex(e, i);
37 if (!mesh->is_boundary_vertex(vid))
38 node_ids.insert(vid);
39 }
40 }
41 }
42
43 set_output_indexing(std::vector(node_ids.begin(), node_ids.end()));
44 }
45
46 VariableToBoundaryNodes::VariableToBoundaryNodes(const State &state, const int surface_selection) : VariableToNodes(state)
47 {
48 const auto &mesh = state.mesh;
49 const auto &bases = state.bases;
50 const auto &gbases = state.geom_bases();
51
52 std::set<int> node_ids;
53 for (const auto &lb : state.total_local_boundary)
54 {
55 const int e = lb.element_id();
56 for (int i = 0; i < lb.size(); ++i)
57 {
58 const int primitive_global_id = lb.global_primitive_id(i);
59 const int boundary_id = mesh->get_boundary_id(primitive_global_id);
60
61 if (surface_selection == boundary_id)
62 for (long n = 0; n < mesh->dimension(); ++n)
63 node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
64 }
65 }
66
67 set_output_indexing(std::vector(node_ids.begin(), node_ids.end()));
68 }
69
70 VariableToBoundaryNodesExclusive::VariableToBoundaryNodesExclusive(const State &state, const std::vector<int> &exclude_surface_selections) : VariableToNodes(state)
71 {
72 const auto &mesh = state.mesh;
73 const auto &bases = state.bases;
74 const auto &gbases = state.geom_bases();
75
76 std::set<int> excluded_node_ids;
77 std::set<int> all_node_ids;
78 for (const auto &lb : state.total_local_boundary)
79 {
80 const int e = lb.element_id();
81 for (int i = 0; i < lb.size(); ++i)
82 {
83 const int primitive_global_id = lb.global_primitive_id(i);
84 const int boundary_id = mesh->get_boundary_id(primitive_global_id);
85
86 if (std::count(exclude_surface_selections.begin(), exclude_surface_selections.end(), boundary_id))
87 for (long n = 0; n < mesh->dimension(); ++n)
88 excluded_node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
89 for (long n = 0; n < mesh->dimension(); ++n)
90 all_node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
91 }
92 }
93
94 std::vector<int> node_ids;
95 std::set_difference(all_node_ids.begin(), all_node_ids.end(), excluded_node_ids.begin(), excluded_node_ids.end(), std::back_inserter(node_ids));
96
97 set_output_indexing(node_ids);
98 }
99}
main class that contains the polyfem solver and all its state
Definition State.hpp:79
const std::vector< basis::ElementBases > & geom_bases() const
Get a constant reference to the geometry mapping bases.
Definition State.hpp:223
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
Definition State.hpp:466
std::vector< basis::ElementBases > bases
FE bases, the size is #elements.
Definition State.hpp:171
std::vector< mesh::LocalBoundary > total_local_boundary
mapping from elements to nodes for all mesh
Definition State.hpp:431
VariableToBoundaryNodesExclusive(const State &state, const std::vector< int > &exclude_surface_selections)
VariableToBoundaryNodes(const State &state, const int surface_selection)
VariableToInteriorNodes(const State &state, const int volume_selection)
virtual void set_output_indexing(const std::vector< int > node_ids) final