dirichletBoundaryCondition.hpp
1 #ifndef MARIAN_DIRICHLETBOUNDARYCONDITION_H
2 #define MARIAN_DIRICHLETBOUNDARYCONDITION_H
3 
4 
5 #include <vector>
6 #include <FDM/tridiagonalOperator.hpp>
7 #include <FDM/boundaryConditions/boundaryCondition.hpp>
8 
9 namespace marian {
10 
19  template<typename F>
20  class DirichletBoundaryCondition: public DCBoundaryCondition<DirichletBoundaryCondition<F> > {
21  public:
25 
32  side_(side), value_(value) {};
33 
35  void afterExplicitStep(std::vector<double>&, double t) override;
36 
37  void beforeImplicitStep(TridiagonalOperator&, std::vector<double>&, double t) override;
38  void afterImplicitStep(std::vector<double>&, double t) override;
39 
40  std::string info() const override {
41  std::string side;
42  switch(side_) {
43  case BCSide::LOW: side = " low"; break;
44  case BCSide::UPP: side = " up"; break;
45  case BCSide::FREE: side = " free";break;
46  }
47  return "DirichletBC" + side;
48  }
52 
53  private:
54  BCSide side_;
55  F value_;
56  };
57 
58 
64  template<typename F>
66  switch (side_) {
67  case BCSide::LOW:
68  op.setFirstRow(1.0, 0.0);
69  break;
70  case BCSide::UPP:
71  op.setLastRow(0.0, 1.0);
72  break;
73  case BCSide::FREE:
74  break;
75  }
76  }
77 
82  template<typename F>
83  void DirichletBoundaryCondition<F>::afterExplicitStep(std::vector<double>& f, double t) {
84  switch (side_) {
85  case BCSide::LOW:
86  f.front() = value_(t);
87  break;
88  case BCSide::UPP:
89  f.back() = value_(t);
90  break;
91  case BCSide::FREE:
92  break;
93  }
94  }
95 
104  template<typename F>
106  std::vector<double>& f,
107  double t) {
108  switch (side_) {
109  case BCSide::LOW:
110  L.setFirstRow(1.0, 0.0);
111  f.front() = value_(t);
112  break;
113  case BCSide::UPP:
114  L.setLastRow(0.0, 1.0);
115  f.back() = value_(t);
116  break;
117  case BCSide::FREE:
118  break;
119  }
120  }
121 
126  template<typename F>
127  void DirichletBoundaryCondition<F>::afterImplicitStep(std::vector<double>&, double) {
128  }
129 
130 } // namespace marian
131 
132 
133 #endif /* MARIAN_DIRICHLETBOUNDARYCONDITION_H */
Class implements Dirichlet Boundary Condition.
Definition: dirichletBoundaryCondition.hpp:20
void afterExplicitStep(std::vector< double > &, double t) override
Modification of solution after explicit step.
Definition: dirichletBoundaryCondition.hpp:83
F value_
Value on the boundary.
Definition: dirichletBoundaryCondition.hpp:55
void afterImplicitStep(std::vector< double > &, double t) override
Empty method, no modification performed.
Definition: dirichletBoundaryCondition.hpp:127
void setLastRow(double, double)
Set first row.
Definition: tridiagonalOperator.cpp:99
void setFirstRow(double, double)
Set first row.
Definition: tridiagonalOperator.cpp:62
void beforeImplicitStep(TridiagonalOperator &, std::vector< double > &, double t) override
Modification of solution and linear operator before explicit step.
Definition: dirichletBoundaryCondition.hpp:105
DirichletBoundaryCondition(BCSide side, F value)
Constructor.
Definition: dirichletBoundaryCondition.hpp:31
Condition set on lower boundary of FDM grid.
Definition: backwardKolmogorovEq.cpp:5
void beforeExplicitStep(TridiagonalOperator &) override
Modification of tridiagonal matrix before explicit step.
Definition: dirichletBoundaryCondition.hpp:65
BCSide
Types of boundary conditions.
Definition: boundaryCondition.hpp:11
std::string info() const override
Returns the type of boundary condition.
Definition: dirichletBoundaryCondition.hpp:40
DirichletBoundaryCondition()
Default constructor.
Definition: dirichletBoundaryCondition.hpp:24
TridiagonalOperator is used to define differentiating operator for PDE being solved.
Definition: tridiagonalOperator.hpp:35
Deeply copyable BoundaryCondition.
Definition: boundaryCondition.hpp:98
BCSide side_
Side for which boundary condition is set.
Definition: dirichletBoundaryCondition.hpp:51
virtual ~DirichletBoundaryCondition()
Destructor.
Definition: dirichletBoundaryCondition.hpp:51
Condition set on upper boundary of FDM grid.
Free-boundary condition.