DirichletBC.hpp 2.69 KB
 Praetorius, Simon committed Mar 13, 2016 1 2 3 4 5 6 #pragma once #include #include #include  Praetorius, Simon committed Nov 13, 2017 7 #include  Praetorius, Simon committed Mar 13, 2016 8   Praetorius, Simon committed Sep 19, 2016 9 #include  Praetorius, Simon committed Mar 19, 2016 10   Praetorius, Simon committed Mar 13, 2016 11 12 namespace AMDiS {  Praetorius, Simon committed May 07, 2016 13 14  /// Implements a boundary condition of Dirichlet-type. /**  Praetorius, Simon committed Sep 19, 2016 15  * By calling the methods \ref init() and \ref finish before and after  Praetorius, Simon committed May 07, 2016 16  * assembling the system-matrix, respectively, dirichlet boundary conditions  Praetorius, Simon committed Nov 19, 2017 17  * can be applied to the matrix and system vector. Therefore, a predicate  Praetorius, Simon committed May 07, 2016 18  * functions indicates the DOFs where values should be enforced and a second  Praetorius, Simon committed Sep 19, 2016 19  * functor provided in the constructor is responsible for determining the  Praetorius, Simon committed May 07, 2016 20  * values to be set at the DOFs.  Praetorius, Simon committed Sep 19, 2016 21 22 23 24  * * In the \ref finish method the matrix is called with \ref applyDirichletBC * to erase the corresponding rows and columns for the DOF indices. This * application of boundary conditions can be symmetric if the matrix does  Praetorius, Simon committed May 07, 2016 25 26 27  * support this symmetric modification. As a result, this method returns a list * of columns values, that should be subtracted from the rhs. **/  Praetorius, Simon committed Mar 13, 2016 28 29 30 31 32  template class DirichletBC { public: template && Concepts::Functor) >  Praetorius, Simon committed Mar 13, 2016 35 36  DirichletBC(Predicate&& predicate, Values&& values) : predicate(std::forward(predicate))  Praetorius, Simon committed Mar 13, 2016 37  , values(std::forward(values))  Praetorius, Simon committed Mar 13, 2016 38  {}  Praetorius, Simon committed Sep 19, 2016 39 40   Praetorius, Simon committed Nov 19, 2017 41 42 43  /// Prepare the matrix, rhs and solution block for assembling dirichlet /// boundary conditions, e.g. collect the corresponding indices of boundary /// DOFS for later elimination in \ref finish.  Praetorius, Simon committed Mar 20, 2016 44  template  Praetorius, Simon committed Sep 19, 2016 45  void init(bool apply,  Praetorius, Simon committed Nov 08, 2017 46 47 48  Matrix& matrix, VectorX& rhs, VectorB& solution);  Praetorius, Simon committed Sep 19, 2016 49 50   Praetorius, Simon committed Nov 19, 2017 51 52 53 54 55 56 57  /// \brief Apply dirichlet BC to matrix and vector, i.e., add a unit-row /// to the matrix and optionally delete the corresponding matrix-column. /** If DBC is set for matrix block {R,C}, then \p apply_row means that * the block-row R is assembled, and \p apply_col means that the block-col C * is assembled. The \p matrix, \p rhs, and \p solution correspond to the * currently visited blocks of system-matrix and system-vector. **/  Praetorius, Simon committed Mar 20, 2016 58  template  Praetorius, Simon committed Nov 19, 2017 59 60  void finish(bool apply_row, bool apply_col,  Praetorius, Simon committed Nov 08, 2017 61 62 63  Matrix& matrix, VectorX& rhs, VectorB& solution);  Praetorius, Simon committed Sep 19, 2016 64   Praetorius, Simon committed Mar 13, 2016 65 66 67  private: std::function predicate; std::function values;  Praetorius, Simon committed Sep 19, 2016 68   Praetorius, Simon committed Mar 13, 2016 69 70 71 72 73 74 75  bool initialized = false; std::vector dirichletNodes; }; } // end namespace AMDiS #include "DirichletBC.inc.hpp"