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