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);
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 io::ResourceIO &resources, 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 io::ResourceIO &resources, const std::string &interp = "");
58
59 void update_displacement(const double t, Eigen::MatrixXd &sol) const;
60 void set_zero(Eigen::MatrixXd &sol) const;
61
62 void clear();
63
64 class Plane;
65 inline const std::vector<Plane> &planes() const { return planes_; };
66
67 void set_units(const Units &units);
68
69 private:
70 void append_mesh(
71 const Eigen::MatrixXd &vertices,
72 const Eigen::VectorXi &codim_vertices,
73 const Eigen::MatrixXi &codim_edges,
74 const Eigen::MatrixXi &faces);
76 const int oid,
77 const json &val,
78 const std::shared_ptr<utils::Interpolation> &interp,
79 const io::ResourceIO &resources);
80
81 int dim_;
82 Eigen::MatrixXd v_;
83 Eigen::VectorXi codim_v_;
84 Eigen::MatrixXi f_;
85 Eigen::MatrixXi e_;
86
87 Eigen::VectorXi in_v_;
88 Eigen::MatrixXi in_f_;
89 Eigen::MatrixXi in_e_;
90
91 std::vector<assembler::TensorBCValue> displacements_;
92
93 std::vector<int> endings_;
94
95 std::vector<Plane> planes_;
96 };
97
99 {
100 public:
102 : dim_(point.size()), point_(point), normal_(normal)
103 {
104 assert(point.size() == normal.size());
105 assert(!normal.isZero());
106 normal_.normalize();
108 }
109
110 inline const VectorNd &point() const { return point_; }
111 inline const VectorNd &normal() const { return normal_; }
112
113 inline const Eigen::MatrixXd &vis_v() const { return vis_v_; }
114 inline const Eigen::MatrixXi &vis_f() const { return vis_f_; }
115 inline const Eigen::MatrixXi &vis_e() const { return vis_e_; }
116
117 protected:
118 void construct_vis_mesh();
119
120 int dim_;
121
124
125 Eigen::MatrixXd vis_v_;
126 Eigen::MatrixXi vis_f_;
127 Eigen::MatrixXi vis_e_;
128 };
129 } // namespace mesh
130} // 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:110
Plane(const VectorNd &point, const VectorNd &normal)
Definition Obstacle.hpp:101
const Eigen::MatrixXd & vis_v() const
Definition Obstacle.hpp:113
const VectorNd & normal() const
Definition Obstacle.hpp:111
const Eigen::MatrixXi & vis_e() const
Definition Obstacle.hpp:115
const Eigen::MatrixXi & vis_f() const
Definition Obstacle.hpp:114
std::vector< Plane > planes_
Definition Obstacle.hpp:95
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:84
Eigen::MatrixXi e_
Definition Obstacle.hpp:85
const Eigen::MatrixXi & get_edge_connectivity() const
Definition Obstacle.hpp:48
const std::vector< Plane > & planes() const
Definition Obstacle.hpp:65
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 >())
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)
Definition Obstacle.cpp:96
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:88
Eigen::MatrixXd v_
Definition Obstacle.hpp:82
void set_zero(Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:244
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:83
const Eigen::MatrixXi & get_face_connectivity() const
Definition Obstacle.hpp:47
void update_displacement(const double t, Eigen::MatrixXd &sol) const
Definition Obstacle.cpp:217
void set_units(const Units &units)
Definition Obstacle.cpp:250
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 in_e_
Definition Obstacle.hpp:89
Eigen::VectorXi in_v_
Definition Obstacle.hpp:87
std::vector< assembler::TensorBCValue > displacements_
Definition Obstacle.hpp:91
const Eigen::MatrixXd & v() const
Definition Obstacle.hpp:42
std::vector< int > endings_
Definition Obstacle.hpp:93
virtual ~Obstacle()=default
const Eigen::VectorXi & codim_v() const
Definition Obstacle.hpp:43
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:49
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:11
nlohmann::json json
Definition Common.hpp:9