PolyFEM
Loading...
Searching...
No Matches
Obstacle.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
7
9
10#include <Eigen/Dense>
11
12namespace polyfem
13{
14 namespace mesh
15 {
17 {
18 public:
19 Obstacle();
20 virtual ~Obstacle() = default;
21
22 void append_mesh(
23 const Eigen::MatrixXd &vertices,
24 const Eigen::VectorXi &codim_vertices,
25 const Eigen::MatrixXi &codim_edges,
26 const Eigen::MatrixXi &faces,
27 const json &displacement,
28 const std::string &root_path);
30 const std::vector<Eigen::MatrixXd> &vertices,
31 const Eigen::VectorXi &codim_vertices,
32 const Eigen::MatrixXi &codim_edges,
33 const Eigen::MatrixXi &faces,
34 const int fps);
35 void append_plane(const VectorNd &point, const VectorNd &normal);
36
37 inline int n_vertices() const { return v_.rows(); }
38 inline int n_edges() const { return e_.rows(); }
39 inline int n_faces() const { return f_.rows(); }
40 inline int dim() const { return dim_; }
41 inline int ndof() const { return n_vertices() * dim(); }
42 inline const Eigen::MatrixXd &v() const { return v_; }
43 inline const Eigen::VectorXi &codim_v() const { return codim_v_; }
44 inline const Eigen::MatrixXi &f() const { return f_; }
45 inline const Eigen::MatrixXi &e() const { return e_; }
46
47 inline const Eigen::MatrixXi &get_face_connectivity() const { return in_f_; }
48 inline const Eigen::MatrixXi &get_edge_connectivity() const { return in_e_; }
49 inline const Eigen::VectorXi &get_vertex_connectivity() const { return in_v_; }
50
51 void change_displacement(const int oid, const Eigen::RowVector3d &val, const std::shared_ptr<utils::Interpolation> &interp = std::make_shared<utils::NoInterpolation>());
52 void change_displacement(const int oid, const std::function<Eigen::MatrixXd(double x, double y, double z, double t)> &func, const std::shared_ptr<utils::Interpolation> &interp = std::make_shared<utils::NoInterpolation>());
53 void change_displacement(const int oid, const json &val, const std::shared_ptr<utils::Interpolation> &interp = std::make_shared<utils::NoInterpolation>());
54
55 void change_displacement(const int oid, const Eigen::RowVector3d &val, const std::string &interp = "");
56 void change_displacement(const int oid, const std::function<Eigen::MatrixXd(double x, double y, double z, double t)> &func, const std::string &interp = "");
57 void change_displacement(const int oid, const json &val, const std::string &interp = "");
58 void change_displacement(const int oid, const json &val, const std::string &root_path, const std::string &interp);
59
60 void update_displacement(const double t, Eigen::MatrixXd &sol) const;
61 void set_zero(Eigen::MatrixXd &sol) const;
62
63 void clear();
64
65 class Plane;
66 inline const std::vector<Plane> &planes() const { return planes_; };
67
68 void set_units(const Units &units);
69
70 private:
71 void append_mesh(
72 const Eigen::MatrixXd &vertices,
73 const Eigen::VectorXi &codim_vertices,
74 const Eigen::MatrixXi &codim_edges,
75 const Eigen::MatrixXi &faces);
77 const int oid,
78 const json &val,
79 const std::shared_ptr<utils::Interpolation> &interp,
80 const std::string &root_path);
81
82 int dim_;
83 Eigen::MatrixXd v_;
84 Eigen::VectorXi codim_v_;
85 Eigen::MatrixXi f_;
86 Eigen::MatrixXi e_;
87
88 Eigen::VectorXi in_v_;
89 Eigen::MatrixXi in_f_;
90 Eigen::MatrixXi in_e_;
91
92 std::vector<assembler::TensorBCValue> displacements_;
93
94 std::vector<int> endings_;
95
96 std::vector<Plane> planes_;
97 };
98
100 {
101 public:
103 : dim_(point.size()), point_(point), normal_(normal)
104 {
105 assert(point.size() == normal.size());
106 assert(!normal.isZero());
107 normal_.normalize();
109 }
110
111 inline const VectorNd &point() const { return point_; }
112 inline const VectorNd &normal() const { return normal_; }
113
114 inline const Eigen::MatrixXd &vis_v() const { return vis_v_; }
115 inline const Eigen::MatrixXi &vis_f() const { return vis_f_; }
116 inline const Eigen::MatrixXi &vis_e() const { return vis_e_; }
117
118 protected:
119 void construct_vis_mesh();
120
121 int dim_;
122
125
126 Eigen::MatrixXd vis_v_;
127 Eigen::MatrixXi vis_f_;
128 Eigen::MatrixXi vis_e_;
129 };
130 } // namespace mesh
131} // namespace polyfem
double val
Definition Assembler.cpp:86
std::vector< Eigen::VectorXi > faces
int y
int z
int x
const VectorNd & point() const
Definition Obstacle.hpp:111
Plane(const VectorNd &point, const VectorNd &normal)
Definition Obstacle.hpp:102
const Eigen::MatrixXd & vis_v() const
Definition Obstacle.hpp:114
const VectorNd & normal() const
Definition Obstacle.hpp:112
const Eigen::MatrixXi & vis_e() const
Definition Obstacle.hpp:116
const Eigen::MatrixXi & vis_f() const
Definition Obstacle.hpp:115
std::vector< Plane > planes_
Definition Obstacle.hpp:96
void change_displacement(const int oid, const Eigen::RowVector3d &val, const std::shared_ptr< utils::Interpolation > &interp=std::make_shared< utils::NoInterpolation >())
Eigen::MatrixXi f_
Definition Obstacle.hpp:85
void append_mesh(const Eigen::MatrixXd &vertices, const Eigen::VectorXi &codim_vertices, const Eigen::MatrixXi &codim_edges, const Eigen::MatrixXi &faces, const json &displacement, const std::string &root_path)
Definition Obstacle.cpp:96
Eigen::MatrixXi e_
Definition Obstacle.hpp:86
const Eigen::MatrixXi & get_edge_connectivity() const
Definition Obstacle.hpp:48
const std::vector< Plane > & planes() const
Definition Obstacle.hpp:66
void change_displacement(const int oid, const std::function< Eigen::MatrixXd(double x, double y, double z, double t)> &func, const std::shared_ptr< utils::Interpolation > &interp=std::make_shared< utils::NoInterpolation >())
const Eigen::MatrixXi & e() const
Definition Obstacle.hpp:45
void append_plane(const VectorNd &point, const VectorNd &normal)
Definition Obstacle.cpp:164
Eigen::MatrixXi in_f_
Definition Obstacle.hpp:89
Eigen::MatrixXd v_
Definition Obstacle.hpp:83
void set_zero(Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:248
void append_mesh_sequence(const std::vector< Eigen::MatrixXd > &vertices, const Eigen::VectorXi &codim_vertices, const Eigen::MatrixXi &codim_edges, const Eigen::MatrixXi &faces, const int fps)
Definition Obstacle.cpp:125
const Eigen::MatrixXi & f() const
Definition Obstacle.hpp:44
Eigen::VectorXi codim_v_
Definition Obstacle.hpp:84
const Eigen::MatrixXi & get_face_connectivity() const
Definition Obstacle.hpp:47
void update_displacement(const double t, Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:221
void set_units(const Units &units)
Definition Obstacle.cpp:254
void change_displacement(const int oid, const json &val, const std::shared_ptr< utils::Interpolation > &interp=std::make_shared< utils::NoInterpolation >())
Eigen::MatrixXi in_e_
Definition Obstacle.hpp:90
Eigen::VectorXi in_v_
Definition Obstacle.hpp:88
void change_displacement(const int oid, const json &val, const std::shared_ptr< utils::Interpolation > &interp, const std::string &root_path)
std::vector< assembler::TensorBCValue > displacements_
Definition Obstacle.hpp:92
const Eigen::MatrixXd & v() const
Definition Obstacle.hpp:42
std::vector< int > endings_
Definition Obstacle.hpp:94
virtual ~Obstacle()=default
const Eigen::VectorXi & codim_v() const
Definition Obstacle.hpp:43
const Eigen::VectorXi & get_vertex_connectivity() const
Definition Obstacle.hpp:49
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:11
nlohmann::json json
Definition Common.hpp:9