Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PeriodicBoundary.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
5
6#include <vector>
7
8namespace polyfem
9{
10 namespace basis
11 {
12 class ElementBases;
13 }
14
15 namespace mesh
16 {
17 class Mesh;
18 class MeshNodes;
19 class LocalBoundary;
20 }
21}
22
23namespace polyfem::utils
24{
26 {
27 public:
29 const bool is_scalar,
30 const int n_bases,
31 const std::vector<basis::ElementBases> &bases,
32 const std::shared_ptr<mesh::MeshNodes> &mesh_nodes,
33 const Eigen::MatrixXd &affine_matrix,
34 const double tol);
35
37 Eigen::MatrixXd full_to_periodic(const Eigen::MatrixXd &b, bool accumulate) const;
38 std::vector<int> full_to_periodic(const std::vector<int> &boundary_nodes) const;
39
40 inline int dim() const { return problem_dim_; }
41 inline int n_periodic_dof() const { return full_to_periodic_map_.maxCoeff() + 1; }
42 inline bool is_periodic_dof(const int idx) const { return periodic_mask_[idx]; }
43
44 Eigen::MatrixXd periodic_to_full(const int ndofs, const Eigen::MatrixXd &x_periodic) const;
45
46 bool all_direction_periodic() const;
47 bool has_periodic_bc() const;
48
49 int n_constraints() const { return constraint_list_.size(); }
50 std::array<int, 2> constraint(const int idx) const { return constraint_list_[idx]; }
51 const Eigen::VectorXi& index_map() const { return index_map_; }
52
53 Eigen::MatrixXd get_affine_matrix() const { return affine_matrix_; }
54
55 private:
57 Eigen::VectorXi index_map_;
58 Eigen::VectorXi dependent_map_;
59 Eigen::VectorXi full_to_periodic_map_;
60 Eigen::VectorXi periodic_mask_;
61 std::vector<std::array<int, 2>> constraint_list_;
62
63 Eigen::MatrixXd affine_matrix_; // each column is one periodic direction
64 };
65}
Stores the basis functions for a given element in a mesh (facet in 2d, cell in 3d).
Boundary primitive IDs for a single element.
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:39
std::vector< std::array< int, 2 > > constraint_list_
const Eigen::VectorXi & index_map() const
Eigen::MatrixXd get_affine_matrix() const
Eigen::MatrixXd periodic_to_full(const int ndofs, const Eigen::MatrixXd &x_periodic) const
std::array< int, 2 > constraint(const int idx) const
int full_to_periodic(StiffnessMatrix &A) const
bool is_periodic_dof(const int idx) const
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:22