PolyFEM
Loading...
Searching...
No Matches
Problem.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Units.hpp>
4
9
10namespace polyfem
11{
12 namespace assembler
13 {
14 enum class BoundaryKind
15 {
18 };
19
20 class Problem
21 {
22 public:
23 Problem(const std::string &name);
24 virtual void set_units(const assembler::Assembler &assembler, const Units &units) {}
25
26 virtual ~Problem() {}
27
28 virtual void init(const mesh::Mesh &mesh) {}
29 inline const std::string &name() const { return name_; }
30
31 virtual bool is_scalar() const = 0;
32
33 virtual void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const = 0;
34 virtual bool is_rhs_zero() const = 0;
35
36 virtual void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const = 0;
37 virtual void neumann_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val) const {}
38 virtual void pressure_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val) const {}
39 virtual double pressure_cavity_bc(const int boundary_id, const double t) const { return 0; }
40
41 virtual bool is_boundary_pressure(const int boundary_id) const { return std::find(pressure_boundary_ids_.begin(), pressure_boundary_ids_.end(), boundary_id) != pressure_boundary_ids_.end(); }
42
43 virtual void dirichlet_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const double t, Eigen::MatrixXd &val) const {}
44 virtual void neumann_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const Eigen::MatrixXd &normal, const double t, Eigen::MatrixXd &val) const {}
45 virtual bool is_nodal_dirichlet_boundary(const int n_id, const int tag) { return false; }
46 virtual bool is_nodal_neumann_boundary(const int n_id, const int tag) { return false; }
47 virtual bool has_nodal_dirichlet() { return false; }
48 virtual bool has_nodal_neumann() { return false; }
49
50 virtual bool has_exact_sol() const = 0;
51 virtual void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const {};
52 virtual void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const {};
53
54 virtual void clear() {}
55
56 virtual bool is_time_dependent() const { return false; }
57 virtual bool is_constant_in_time() const { return true; }
58
59 virtual void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const {}
60 virtual void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const {}
61 virtual void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const {}
62 virtual void initial_density(const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const {}
63
64 virtual void set_parameters(const json &params, const std::string &root_path) {}
65
66 virtual bool might_have_no_dirichlet() { return false; }
67 virtual bool is_dimension_dirichet(const int tag, const int dim) const { return true; }
68 virtual bool is_nodal_dimension_dirichlet(const int n_id, const int tag, const int dim) const { return true; }
69
70 virtual bool all_dimensions_dirichlet() const { return true; } // here for efficiency reasons
71
72 // Selects local boundary primitives for a BC kind. boundary_nodes contains
73 // constrained DOF ids only for Dirichlet.
75 const mesh::Mesh &mesh,
76 const BoundaryKind kind,
77 const int fe_space_id,
78 const std::vector<basis::ElementBases> &bases,
79 const std::vector<mesh::LocalBoundary> &local_boundary,
80 std::vector<mesh::LocalBoundary> &selected_local_boundary,
81 std::vector<int> &boundary_nodes);
82
83 // Cavity BCs are grouped by boundary tag, so they keep a separate API from
84 // ordinary Dirichlet/Neumann boundary selection.
86 const mesh::Mesh &mesh,
87 const int fe_space_id,
88 const std::vector<mesh::LocalBoundary> &local_boundary,
89 std::unordered_map<int, std::vector<mesh::LocalBoundary>> &local_pressure_cavity);
90
91 // Returns nodal BC node ids, not constrained DOF ids.
92 void setup_nodal_bc(
93 const mesh::Mesh &mesh,
94 const BoundaryKind kind,
95 const int fe_space_id,
96 const int n_bases,
97 std::vector<int> &nodes);
98
101 void setup_bc(const mesh::Mesh &mesh,
102 const int n_bases, const std::vector<basis::ElementBases> &bases, const std::vector<basis::ElementBases> &geom_bases, const std::vector<basis::ElementBases> &pressure_bases,
103 std::vector<mesh::LocalBoundary> &local_boundary, std::vector<int> &boundary_nodes,
104 std::vector<mesh::LocalBoundary> &local_neumann_boundary,
105 std::vector<mesh::LocalBoundary> &local_pressure_boundary,
106 std::unordered_map<int, std::vector<mesh::LocalBoundary>> &local_pressure_cavity,
107 std::vector<int> &pressure_boundary_nodes,
108 std::vector<int> &dirichlet_nodes, std::vector<int> &neumann_nodes);
109
110 virtual void update_nodes(const Eigen::VectorXi &in_node_to_node) {}
111
112 protected:
113 std::vector<int> boundary_ids_;
114 std::vector<int> neumann_boundary_ids_;
116 std::vector<int> pressure_boundary_ids_;
117 std::vector<int> pressure_cavity_ids_;
119
121
122 private:
123 bool has_boundary(const BoundaryKind kind, const int tag);
124
125 std::string name_;
126 };
127 } // namespace assembler
128} // namespace polyfem
double val
Definition Assembler.cpp:86
virtual void neumann_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:37
void setup_bc(const mesh::Mesh &mesh, const int n_bases, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &geom_bases, const std::vector< basis::ElementBases > &pressure_bases, std::vector< mesh::LocalBoundary > &local_boundary, std::vector< int > &boundary_nodes, std::vector< mesh::LocalBoundary > &local_neumann_boundary, std::vector< mesh::LocalBoundary > &local_pressure_boundary, std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, std::vector< int > &pressure_boundary_nodes, std::vector< int > &dirichlet_nodes, std::vector< int > &neumann_nodes)
bool has_boundary(const BoundaryKind kind, const int tag)
Definition Problem.cpp:16
virtual bool has_nodal_neumann()
Definition Problem.hpp:48
void setup_bc(const mesh::Mesh &mesh, const BoundaryKind kind, const int fe_space_id, const std::vector< basis::ElementBases > &bases, const std::vector< mesh::LocalBoundary > &local_boundary, std::vector< mesh::LocalBoundary > &selected_local_boundary, std::vector< int > &boundary_nodes)
virtual void pressure_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:38
virtual bool is_rhs_zero() const =0
const std::string & name() const
Definition Problem.hpp:29
std::vector< int > normal_aligned_neumann_boundary_ids_
Definition Problem.hpp:115
virtual void neumann_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const Eigen::MatrixXd &normal, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:44
virtual bool is_dimension_dirichet(const int tag, const int dim) const
Definition Problem.hpp:67
virtual void set_parameters(const json &params, const std::string &root_path)
Definition Problem.hpp:64
virtual bool all_dimensions_dirichlet() const
Definition Problem.hpp:70
void setup_pressure_cavity_bc(const mesh::Mesh &mesh, const int fe_space_id, const std::vector< mesh::LocalBoundary > &local_boundary, std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity)
Definition Problem.cpp:101
virtual void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:52
virtual void initial_density(const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const
Definition Problem.hpp:62
virtual double pressure_cavity_bc(const int boundary_id, const double t) const
Definition Problem.hpp:39
virtual void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const
Definition Problem.hpp:61
virtual bool is_scalar() const =0
virtual void set_units(const assembler::Assembler &assembler, const Units &units)
Definition Problem.hpp:24
virtual void update_nodes(const Eigen::VectorXi &in_node_to_node)
Definition Problem.hpp:110
std::vector< int > pressure_boundary_ids_
Definition Problem.hpp:116
virtual bool has_exact_sol() const =0
virtual void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const =0
virtual bool is_nodal_neumann_boundary(const int n_id, const int tag)
Definition Problem.hpp:46
virtual bool might_have_no_dirichlet()
Definition Problem.hpp:66
virtual void dirichlet_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:43
std::vector< int > splitting_pressure_boundary_ids_
Definition Problem.hpp:118
virtual void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const
Definition Problem.hpp:60
std::vector< int > boundary_ids_
Definition Problem.hpp:113
virtual bool is_constant_in_time() const
Definition Problem.hpp:57
virtual void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:51
virtual bool is_nodal_dirichlet_boundary(const int n_id, const int tag)
Definition Problem.hpp:45
virtual bool is_nodal_dimension_dirichlet(const int n_id, const int tag, const int dim) const
Definition Problem.hpp:68
virtual bool is_boundary_pressure(const int boundary_id) const
Definition Problem.hpp:41
virtual bool is_time_dependent() const
Definition Problem.hpp:56
void setup_nodal_bc(const mesh::Mesh &mesh, const BoundaryKind kind, const int fe_space_id, const int n_bases, std::vector< int > &nodes)
Definition Problem.cpp:128
virtual void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const
Definition Problem.hpp:59
virtual void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const =0
virtual void init(const mesh::Mesh &mesh)
Definition Problem.hpp:28
std::vector< int > neumann_boundary_ids_
Definition Problem.hpp:114
std::vector< int > pressure_cavity_ids_
Definition Problem.hpp:117
virtual bool has_nodal_dirichlet()
Definition Problem.hpp:47
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:41
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13