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 {
17 Neumann,
18 NormalAlignedNeumann, // Follower traction from pressure_boundary.
20 };
21
22 class Problem
23 {
24 public:
25 Problem(const std::string &name);
26 virtual void set_units(const assembler::Assembler &assembler, const Units &units) {}
27
28 virtual ~Problem() {}
29
30 virtual void init(const mesh::Mesh &mesh) {}
31 inline const std::string &name() const { return name_; }
32
33 virtual bool is_scalar() const = 0;
34
35 virtual void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id = -1) const = 0;
36 virtual void rhs(const assembler::Assembler &assembler, const mesh::Mesh &mesh, const int element_id, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id = -1) const
37 {
38 (void)mesh;
39 (void)element_id;
40 rhs(assembler, pts, t, val, fe_space_id);
41 }
42 virtual bool is_rhs_zero(const int fe_space_id = -1) const = 0;
43
44 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 int fe_space_id = -1) const = 0;
45 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 int fe_space_id = -1) const {}
46 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 {}
47 virtual double pressure_cavity_bc(const int boundary_id, const double t) const { return 0; }
48
49 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(); }
50
51 virtual void dirichlet_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const double t, Eigen::MatrixXd &val, const int fe_space_id = -1) const {}
52 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 int fe_space_id = -1) const {}
53 virtual bool is_nodal_dirichlet_boundary(const int n_id, const int tag, const int fe_space_id = -1) { return false; }
54 virtual bool is_nodal_neumann_boundary(const int n_id, const int tag, const int fe_space_id = -1) { return false; }
55 virtual bool has_nodal_dirichlet(const int fe_space_id = -1) { return false; }
56 virtual bool has_nodal_neumann(const int fe_space_id = -1) { return false; }
57
58 virtual bool has_exact_sol() const = 0;
59 virtual void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const {};
60 virtual void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const {};
61
62 virtual void clear() {}
63
64 virtual bool is_time_dependent() const { return false; }
65 virtual bool is_constant_in_time() const { return true; }
66
67 virtual void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id = -1) const {}
68 virtual void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id = -1) const {}
69 virtual void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id = -1) const {}
70 virtual void initial_density(const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const {}
71
72 virtual void set_parameters(const json &params, const io::ResourceIO &resources) {}
73
74 virtual bool might_have_no_dirichlet() { return false; }
75 virtual bool is_dimension_dirichet(const int tag, const int dim, const int fe_space_id = -1) const { return true; }
76 virtual bool is_nodal_dimension_dirichlet(const int n_id, const int tag, const int dim, const int fe_space_id = -1) const { return true; }
77
78 virtual bool all_dimensions_dirichlet(const int fe_space_id) const
79 {
80 (void)fe_space_id;
81 return true;
82 } // here for efficiency reasons
83
84 // Selects local boundary primitives for a BC kind and FE space.
86 const mesh::Mesh &mesh,
87 const BoundaryKind kind,
88 const int fe_space_id,
89 const std::vector<mesh::LocalBoundary> &local_boundary,
90 std::vector<mesh::LocalBoundary> &selected_local_boundary);
91
92 // Also collects constrained DOF ids for Dirichlet conditions.
94 const mesh::Mesh &mesh,
95 const BoundaryKind kind,
96 const int fe_space_id,
97 const std::vector<basis::ElementBases> &bases,
98 const std::vector<mesh::LocalBoundary> &local_boundary,
99 std::vector<mesh::LocalBoundary> &selected_local_boundary,
100 std::vector<int> &boundary_nodes,
101 const int value_dim = -1);
102
103 // Groups selected primitives by boundary tag, e.g. for cavity pressure.
105 const mesh::Mesh &mesh,
106 const BoundaryKind kind,
107 const int fe_space_id,
108 const std::vector<mesh::LocalBoundary> &local_boundary,
109 std::unordered_map<int, std::vector<mesh::LocalBoundary>> &selected_by_tag);
110
111 // Returns nodal BC node ids, not constrained DOF ids.
112 void setup_nodal_bc(
113 const mesh::Mesh &mesh,
114 const BoundaryKind kind,
115 const int fe_space_id,
116 const int n_bases,
117 std::vector<int> &nodes);
118
119 virtual void update_nodes(const Eigen::VectorXi &in_node_to_node) {}
120
121 protected:
122 virtual bool has_boundary(const BoundaryKind kind, const int tag, const int fe_space_id);
123
124 std::vector<int> boundary_ids_;
125 std::vector<int> neumann_boundary_ids_;
127 std::vector<int> pressure_boundary_ids_;
128 std::vector<int> pressure_cavity_ids_;
129
131
132 std::string name_;
133 };
134 } // namespace assembler
135} // namespace polyfem
double val
Definition Assembler.cpp:90
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:46
virtual bool all_dimensions_dirichlet(const int fe_space_id) const
Definition Problem.hpp:78
virtual void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id=-1) const
Definition Problem.hpp:68
const std::string & name() const
Definition Problem.hpp:31
virtual bool is_dimension_dirichet(const int tag, const int dim, const int fe_space_id=-1) const
Definition Problem.hpp:75
std::vector< int > normal_aligned_neumann_boundary_ids_
Definition Problem.hpp:126
virtual bool has_boundary(const BoundaryKind kind, const int tag, const int fe_space_id)
Definition Problem.cpp:16
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 int fe_space_id=-1) const =0
virtual void set_parameters(const json &params, const io::ResourceIO &resources)
Definition Problem.hpp:72
virtual void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const =0
virtual void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:60
virtual void initial_density(const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const
Definition Problem.hpp:70
virtual void dirichlet_nodal_value(const mesh::Mesh &mesh, const int node_id, const RowVectorNd &pt, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const
Definition Problem.hpp:51
virtual double pressure_cavity_bc(const int boundary_id, const double t) const
Definition Problem.hpp:47
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, const int value_dim=-1)
virtual void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id=-1) const
Definition Problem.hpp:67
virtual bool is_scalar() const =0
virtual void set_units(const assembler::Assembler &assembler, const Units &units)
Definition Problem.hpp:26
virtual void update_nodes(const Eigen::VectorXi &in_node_to_node)
Definition Problem.hpp:119
std::vector< int > pressure_boundary_ids_
Definition Problem.hpp:127
virtual bool has_exact_sol() const =0
virtual bool has_nodal_dirichlet(const int fe_space_id=-1)
Definition Problem.hpp:55
virtual bool is_nodal_dimension_dirichlet(const int n_id, const int tag, const int dim, const int fe_space_id=-1) const
Definition Problem.hpp:76
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 int fe_space_id=-1) const
Definition Problem.hpp:45
virtual bool might_have_no_dirichlet()
Definition Problem.hpp:74
virtual void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val, const int fe_space_id=-1) const
Definition Problem.hpp:69
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 int fe_space_id=-1) const
Definition Problem.hpp:52
virtual void rhs(const assembler::Assembler &assembler, const mesh::Mesh &mesh, const int element_id, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const
Definition Problem.hpp:36
virtual bool has_nodal_neumann(const int fe_space_id=-1)
Definition Problem.hpp:56
virtual bool is_rhs_zero(const int fe_space_id=-1) const =0
std::vector< int > boundary_ids_
Definition Problem.hpp:124
virtual bool is_constant_in_time() const
Definition Problem.hpp:65
virtual void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
Definition Problem.hpp:59
virtual bool is_boundary_pressure(const int boundary_id) const
Definition Problem.hpp:49
virtual bool is_time_dependent() const
Definition Problem.hpp:64
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:139
void setup_bc(const mesh::Mesh &mesh, const BoundaryKind kind, const int fe_space_id, const std::vector< mesh::LocalBoundary > &local_boundary, std::vector< mesh::LocalBoundary > &selected_local_boundary)
virtual bool is_nodal_neumann_boundary(const int n_id, const int tag, const int fe_space_id=-1)
Definition Problem.hpp:54
virtual void init(const mesh::Mesh &mesh)
Definition Problem.hpp:30
void setup_bc(const mesh::Mesh &mesh, const BoundaryKind kind, const int fe_space_id, const std::vector< mesh::LocalBoundary > &local_boundary, std::unordered_map< int, std::vector< mesh::LocalBoundary > > &selected_by_tag)
std::vector< int > neumann_boundary_ids_
Definition Problem.hpp:125
std::vector< int > pressure_cavity_ids_
Definition Problem.hpp:128
virtual bool is_nodal_dirichlet_boundary(const int n_id, const int tag, const int fe_space_id=-1)
Definition Problem.hpp:53
Read-only interface to a hierarchical collection of simulation resources.
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:50
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13