OGS
BoundaryConditionCollection.h
Go to the documentation of this file.
1
11#pragma once
12
13#include "BoundaryCondition.h"
17
18namespace ProcessLib
19{
21{
22public:
24 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
25 parameters)
26 : _parameters(parameters)
27 {
28 }
29
30 void setReleaseNodalForces(GlobalVector const* r_neq) const;
31
32 void applyNaturalBC(const double t, std::vector<GlobalVector*> const& x,
33 int const process_id, GlobalMatrix* K, GlobalVector& b,
34 GlobalMatrix* Jac) const;
35
36 std::vector<NumLib::IndexValueVector<GlobalIndexType>> const*
37 getKnownSolutions(double const t, GlobalVector const& x) const
38 {
39 auto const n_bcs = _boundary_conditions.size();
40 for (std::size_t i = 0; i < n_bcs; ++i)
41 {
42 auto const& bc = *_boundary_conditions[i];
43 auto& dirichlet_storage = _dirichlet_bcs[i];
44 bc.getEssentialBCValues(t, x, dirichlet_storage);
45 }
46 return &_dirichlet_bcs;
47 }
48
50 std::vector<std::reference_wrapper<ProcessVariable>> const&
51 process_variables,
52 NumLib::LocalToGlobalIndexMap const& dof_table,
53 unsigned const integration_order, Process const& process,
54 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
55 media);
56
57 void addBoundaryCondition(std::unique_ptr<BoundaryCondition>&& bc)
58 {
59 _boundary_conditions.push_back(std::move(bc));
60 }
61
62 void preTimestep(const double t, std::vector<GlobalVector*> const& x,
63 int const process_id) const
64 {
65 for (auto const& bc_ptr : _boundary_conditions)
66 {
67 bc_ptr->preTimestep(t, x, process_id);
68 }
69 }
70
71 void postTimestep(const double t, std::vector<GlobalVector*> const& x,
72 int const process_id) const
73 {
74 for (auto const& bc_ptr : _boundary_conditions)
75 {
76 bc_ptr->postTimestep(t, x, process_id);
77 }
78 }
79
80private:
81 mutable std::vector<NumLib::IndexValueVector<GlobalIndexType>>
83 std::vector<std::unique_ptr<BoundaryCondition>> _boundary_conditions;
84 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
86};
87
88} // namespace ProcessLib
Global vector based on Eigen vector.
Definition EigenVector.h:26
std::vector< NumLib::IndexValueVector< GlobalIndexType > > _dirichlet_bcs
std::vector< NumLib::IndexValueVector< GlobalIndexType > > const * getKnownSolutions(double const t, GlobalVector const &x) const
BoundaryConditionCollection(std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
void postTimestep(const double t, std::vector< GlobalVector * > const &x, int const process_id) const
void addBoundaryCondition(std::unique_ptr< BoundaryCondition > &&bc)
std::vector< std::unique_ptr< BoundaryCondition > > _boundary_conditions
void applyNaturalBC(const double t, std::vector< GlobalVector * > const &x, int const process_id, GlobalMatrix *K, GlobalVector &b, GlobalMatrix *Jac) const
std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const & _parameters
void preTimestep(const double t, std::vector< GlobalVector * > const &x, int const process_id) const
void setReleaseNodalForces(GlobalVector const *r_neq) const
void addBCsForProcessVariables(std::vector< std::reference_wrapper< ProcessVariable > > const &process_variables, NumLib::LocalToGlobalIndexMap const &dof_table, unsigned const integration_order, Process const &process, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)