Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NodeCompositeParametrizations.cpp
Go to the documentation of this file.
2
4#include <map>
5#include <polyfem/State.hpp>
6
7namespace polyfem::solver
8{
9 VariableToNodes::VariableToNodes(const State &state, const std::vector<int> &active_dimensions) : active_dimensions_(active_dimensions)
10 {
11 dim = state.mesh->dimension();
12 if (active_dimensions_.size() == 0)
13 for (int d = 0; d < dim; d++)
14 active_dimensions_.push_back(d);
15 }
16
17 void VariableToNodes::set_output_indexing(const std::vector<int> &node_ids)
18 {
19 output_indexing_.resize(node_ids.size() * active_dimensions_.size());
20 for (int i = 0; i < node_ids.size(); ++i)
21 for (int k = 0; k < active_dimensions_.size(); k++)
22 output_indexing_(i * active_dimensions_.size() + k) = node_ids[i] * dim + active_dimensions_[k];
23 }
24
25 VariableToInteriorNodes::VariableToInteriorNodes(const State &state, const std::vector<int> &active_dimensions, const std::vector<int> &volume_selection) : VariableToNodes(state, active_dimensions)
26 {
27 const auto &mesh = state.mesh;
28
29 std::set<int> node_ids;
30 for (int e = 0; e < mesh->n_elements(); e++)
31 {
32 const int body_id = mesh->get_body_id(e);
33 if (volume_selection.size() == 0 || std::find(volume_selection.begin(), volume_selection.end(), body_id) != volume_selection.end())
34 {
35 for (int i = 0; i < mesh->dimension() + 1; i++)
36 {
37 const int vid = mesh->element_vertex(e, i);
38 if (!mesh->is_boundary_vertex(vid))
39 node_ids.insert(vid);
40 }
41 }
42 }
43
44 set_output_indexing(std::vector(node_ids.begin(), node_ids.end()));
45 }
46
47 VariableToBoundaryNodes::VariableToBoundaryNodes(const State &state, const std::vector<int> &active_dimensions, const std::vector<int> &surface_selection) : VariableToNodes(state, active_dimensions)
48 {
49 const auto &mesh = state.mesh;
50 const auto &bases = state.bases;
51 const auto &gbases = state.geom_bases();
52
53 std::set<int> node_ids;
54 for (const auto &lb : state.total_local_boundary)
55 {
56 const int e = lb.element_id();
57 for (int i = 0; i < lb.size(); ++i)
58 {
59 const int primitive_global_id = lb.global_primitive_id(i);
60 const int boundary_id = mesh->get_boundary_id(primitive_global_id);
61
62 if (surface_selection.size() == 0 || std::find(surface_selection.begin(), surface_selection.end(), boundary_id) != surface_selection.end())
63 for (long n = 0; n < mesh->dimension(); ++n)
64 node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
65 }
66 }
67
68 set_output_indexing(std::vector(node_ids.begin(), node_ids.end()));
69 }
70
71 VariableToBoundaryNodesExclusive::VariableToBoundaryNodesExclusive(const State &state, const std::vector<int> &active_dimensions, const std::vector<int> &exclude_surface_selections) : VariableToNodes(state, active_dimensions)
72 {
73 const auto &mesh = state.mesh;
74 const auto &bases = state.bases;
75 const auto &gbases = state.geom_bases();
76
77 if (!mesh->is_simplicial())
78 log_and_throw_adjoint_error("VariableToBoundaryNodesExclusive only supports simplices!");
79
80 std::set<int> excluded_node_ids;
81 std::set<int> all_node_ids;
82 for (const auto &lb : state.total_local_boundary)
83 {
84 const int e = lb.element_id();
85 for (int i = 0; i < lb.size(); ++i)
86 {
87 const int primitive_global_id = lb.global_primitive_id(i);
88 const int boundary_id = mesh->get_boundary_id(primitive_global_id);
89
90 assert(mesh->is_simplex(e));
91 if (std::count(exclude_surface_selections.begin(), exclude_surface_selections.end(), boundary_id))
92 for (long n = 0; n < mesh->dimension(); ++n)
93 excluded_node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
94 for (long n = 0; n < mesh->dimension(); ++n)
95 all_node_ids.insert(mesh->boundary_element_vertex(primitive_global_id, n));
96 }
97 }
98
99 std::vector<int> node_ids;
100 std::set_difference(all_node_ids.begin(), all_node_ids.end(), excluded_node_ids.begin(), excluded_node_ids.end(), std::back_inserter(node_ids));
101
102 set_output_indexing(node_ids);
103 }
104}
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:471
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:436
VariableToBoundaryNodesExclusive(const State &state, const std::vector< int > &active_dimensions, const std::vector< int > &exclude_surface_selections)
VariableToBoundaryNodes(const State &state, const std::vector< int > &active_dimensions, const std::vector< int > &surface_selection)
VariableToInteriorNodes(const State &state, const std::vector< int > &active_dimensions, const std::vector< int > &volume_selection)
VariableToNodes(const State &state, const std::vector< int > &active_dimensions)
virtual void set_output_indexing(const std::vector< int > &node_ids) final
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79