DirichletBC.hpp 2.69 KB
Newer Older
1
2
3
4
5
6
#pragma once

#include <functional>
#include <type_traits>
#include <vector>

7
#include <dune/amdis/common/Concepts.hpp>
8

9
#include <dune/amdis/Output.hpp>
10

11
12
namespace AMDiS
{
13
14
  /// Implements a boundary condition of Dirichlet-type.
  /**
15
   * By calling the methods \ref init() and \ref finish before and after
16
   * assembling the system-matrix, respectively, dirichlet boundary conditions
17
   * can be applied to the matrix and system vector. Therefore, a predicate
18
   * functions indicates the DOFs where values should be enforced and a second
19
   * functor provided in the constructor is responsible for determining the
20
   * values to be set at the DOFs.
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
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.
   **/
28
29
30
31
32
  template <class WorldVector>
  class DirichletBC
  {
  public:
    template <class Predicate, class Values,
33
34
      REQUIRES(Concepts::Functor<Predicate, bool(WorldVector)> &&
				       Concepts::Functor<Values,  double(WorldVector)>) >
35
36
    DirichletBC(Predicate&& predicate, Values&& values)
      : predicate(std::forward<Predicate>(predicate))
37
      , values(std::forward<Values>(values))
38
    {}
39
40


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.
44
    template <class Matrix, class VectorX, class VectorB>
45
    void init(bool apply,
46
47
48
              Matrix& matrix,
              VectorX& rhs,
              VectorB& solution);
49
50


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.
      **/
58
    template <class Matrix, class VectorX, class VectorB>
59
60
    void finish(bool apply_row,
                bool apply_col,
61
62
63
                Matrix& matrix,
                VectorX& rhs,
                VectorB& solution);
64

65
66
67
  private:
    std::function<bool(WorldVector)> predicate;
    std::function<double(WorldVector)> values;
68

69
70
71
72
73
74
75
    bool initialized = false;
    std::vector<char> dirichletNodes;
  };

} // end namespace AMDiS

#include "DirichletBC.inc.hpp"