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);
29 const std::vector<Eigen::MatrixXd> &vertices,
30 const Eigen::VectorXi &codim_vertices,
31 const Eigen::MatrixXi &codim_edges,
32 const Eigen::MatrixXi &faces,
33 const int fps);
34 void append_plane(const VectorNd &point, const VectorNd &normal);
35
36 inline int n_vertices() const { return v_.rows(); }
37 inline int n_edges() const { return e_.rows(); }
38 inline int n_faces() const { return f_.rows(); }
39 inline int dim() const { return dim_; }
40 inline int ndof() const { return n_vertices() * dim(); }
41 inline const Eigen::MatrixXd &v() const { return v_; }
42 inline const Eigen::VectorXi &codim_v() const { return codim_v_; }
43 inline const Eigen::MatrixXi &f() const { return f_; }
44 inline const Eigen::MatrixXi &e() const { return e_; }
45
46 inline const Eigen::MatrixXi &get_face_connectivity() const { return in_f_; }
47 inline const Eigen::MatrixXi &get_edge_connectivity() const { return in_e_; }
48 inline const Eigen::VectorXi &get_vertex_connectivity() const { return in_v_; }
49
50 void change_displacement(const int oid, const Eigen::RowVector3d &val, const std::shared_ptr<utils::Interpolation> &interp = std::make_shared<utils::NoInterpolation>());
51 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>());
52 void change_displacement(const int oid, const json &val, const std::shared_ptr<utils::Interpolation> &interp = std::make_shared<utils::NoInterpolation>());
53
54 void change_displacement(const int oid, const Eigen::RowVector3d &val, const std::string &interp = "");
55 void change_displacement(const int oid, const std::function<Eigen::MatrixXd(double x, double y, double z, double t)> &func, const std::string &interp = "");
56 void change_displacement(const int oid, const json &val, const std::string &interp = "");
57
58 void update_displacement(const double t, Eigen::MatrixXd &sol) const;
59 void set_zero(Eigen::MatrixXd &sol) const;
60
61 void clear();
62
63 class Plane;
64 inline const std::vector<Plane> &planes() const { return planes_; };
65
66 void set_units(const Units &units);
67
68 private:
69 void append_mesh(
70 const Eigen::MatrixXd &vertices,
71 const Eigen::VectorXi &codim_vertices,
72 const Eigen::MatrixXi &codim_edges,
73 const Eigen::MatrixXi &faces);
74
75 int dim_;
76 Eigen::MatrixXd v_;
77 Eigen::VectorXi codim_v_;
78 Eigen::MatrixXi f_;
79 Eigen::MatrixXi e_;
80
81 Eigen::VectorXi in_v_;
82 Eigen::MatrixXi in_f_;
83 Eigen::MatrixXi in_e_;
84
85 std::vector<assembler::TensorBCValue> displacements_;
86
87 std::vector<int> endings_;
88
89 std::vector<Plane> planes_;
90 };
91
93 {
94 public:
96 : dim_(point.size()), point_(point), normal_(normal)
97 {
98 assert(point.size() == normal.size());
99 assert(!normal.isZero());
100 normal_.normalize();
102 }
103
104 inline const VectorNd &point() const { return point_; }
105 inline const VectorNd &normal() const { return normal_; }
106
107 inline const Eigen::MatrixXd &vis_v() const { return vis_v_; }
108 inline const Eigen::MatrixXi &vis_f() const { return vis_f_; }
109 inline const Eigen::MatrixXi &vis_e() const { return vis_e_; }
110
111 protected:
112 void construct_vis_mesh();
113
114 int dim_;
115
118
119 Eigen::MatrixXd vis_v_;
120 Eigen::MatrixXi vis_f_;
121 Eigen::MatrixXi vis_e_;
122 };
123 } // namespace mesh
124} // 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:104
Plane(const VectorNd &point, const VectorNd &normal)
Definition Obstacle.hpp:95
const Eigen::MatrixXd & vis_v() const
Definition Obstacle.hpp:107
const VectorNd & normal() const
Definition Obstacle.hpp:105
const Eigen::MatrixXi & vis_e() const
Definition Obstacle.hpp:109
const Eigen::MatrixXi & vis_f() const
Definition Obstacle.hpp:108
std::vector< Plane > planes_
Definition Obstacle.hpp:89
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:78
Eigen::MatrixXi e_
Definition Obstacle.hpp:79
const Eigen::MatrixXi & get_edge_connectivity() const
Definition Obstacle.hpp:47
const std::vector< Plane > & planes() const
Definition Obstacle.hpp:64
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:44
void append_plane(const VectorNd &point, const VectorNd &normal)
Definition Obstacle.cpp:163
Eigen::MatrixXi in_f_
Definition Obstacle.hpp:82
Eigen::MatrixXd v_
Definition Obstacle.hpp:76
void set_zero(Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:239
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:124
const Eigen::MatrixXi & f() const
Definition Obstacle.hpp:43
Eigen::VectorXi codim_v_
Definition Obstacle.hpp:77
const Eigen::MatrixXi & get_face_connectivity() const
Definition Obstacle.hpp:46
void update_displacement(const double t, Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:212
void append_mesh(const Eigen::MatrixXd &vertices, const Eigen::VectorXi &codim_vertices, const Eigen::MatrixXi &codim_edges, const Eigen::MatrixXi &faces, const json &displacement)
Definition Obstacle.cpp:96
void set_units(const Units &units)
Definition Obstacle.cpp:245
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:83
Eigen::VectorXi in_v_
Definition Obstacle.hpp:81
std::vector< assembler::TensorBCValue > displacements_
Definition Obstacle.hpp:85
const Eigen::MatrixXd & v() const
Definition Obstacle.hpp:41
std::vector< int > endings_
Definition Obstacle.hpp:87
virtual ~Obstacle()=default
const Eigen::VectorXi & codim_v() const
Definition Obstacle.hpp:42
const Eigen::VectorXi & get_vertex_connectivity() const
Definition Obstacle.hpp:48
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:9
nlohmann::json json
Definition Common.hpp:9