OGS
BoundaryConditionCollection.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include "BoundaryCondition.h"
10
11namespace ProcessLib
12{
14{
15public:
17 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
18 parameters)
19 : _parameters(parameters)
20 {
21 }
22
23 void setReleaseNodalForces(GlobalVector const* r_neq) const;
24
25 void applyNaturalBC(const double t, std::vector<GlobalVector*> const& x,
26 int const process_id, GlobalMatrix* K, GlobalVector& b,
27 GlobalMatrix* Jac) const;
28
29 std::vector<NumLib::IndexValueVector<GlobalIndexType>> const*
30 getKnownSolutions(double const t, GlobalVector const& x) const
31 {
32 auto const n_bcs = _boundary_conditions.size();
33 for (std::size_t i = 0; i < n_bcs; ++i)
34 {
35 auto const& bc = *_boundary_conditions[i];
36 auto& dirichlet_storage = _dirichlet_bcs[i];
37 bc.getEssentialBCValues(t, x, dirichlet_storage);
38 }
39 return &_dirichlet_bcs;
40 }
41
43 std::vector<std::reference_wrapper<ProcessVariable>> const&
44 process_variables,
45 NumLib::LocalToGlobalIndexMap const& dof_table,
46 unsigned const integration_order, Process const& process,
47 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
48 media);
49
50 void addBoundaryCondition(std::unique_ptr<BoundaryCondition>&& bc)
51 {
52 _boundary_conditions.push_back(std::move(bc));
53 }
54
55 void preTimestep(const double t, std::vector<GlobalVector*> const& x,
56 int const process_id) const
57 {
58 for (auto const& bc_ptr : _boundary_conditions)
59 {
60 bc_ptr->preTimestep(t, x, process_id);
61 }
62 }
63
64 void postTimestep(const double t, std::vector<GlobalVector*> const& x,
65 int const process_id) const
66 {
67 for (auto const& bc_ptr : _boundary_conditions)
68 {
69 bc_ptr->postTimestep(t, x, process_id);
70 }
71 }
72
73private:
74 mutable std::vector<NumLib::IndexValueVector<GlobalIndexType>>
76 std::vector<std::unique_ptr<BoundaryCondition>> _boundary_conditions;
77 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
79};
80
81} // namespace ProcessLib
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
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)