AMDiS 2.11-git
The Adaptive Multi-Dimensional Simulation Toolbox
 
Loading...
Searching...
No Matches
SymmetricDirichletBC.hpp
1#pragma once
2
3#include <amdis/DirichletBC.hpp>
4
5namespace AMDiS {
6
8
32template <class Basis, class Path, class ValueGridFct>
34 : public DirichletBC<Basis, Path, Path, ValueGridFct>
35{
37 using GridView = typename Basis::GridView;
38 using Intersection = typename GridView::Intersection;
39
40public:
41 // inherit constructors
42 using Base::Base;
43
44 template <class B>
45 SymmetricDirichletBC(B&& basis, Path const& path,
46 BoundarySubset<Intersection> boundarySubset,
47 ValueGridFct values)
48 : Base(FWD(basis), path, path, std::move(boundarySubset), std::move(values))
49 {}
50
51 template <class Mat, class Sol, class Rhs>
52 void apply(Mat& matrix, Sol& solution, Rhs& rhs)
53 {
54 if (this->rowIndices_ != this->colIndices_)
55 error_exit("SymmetricDirichletBC requires identical row/col DOF sets.");
56 std::vector<typename Sol::value_type> solutionValues;
57 solutionValues.reserve(this->colIndices_.size());
58
59 {
60 Sol boundarySolution{solution};
61 valueOf(boundarySolution, this->col_).interpolate_noalias(this->valueGridFct_, tag::assign{});
62 boundarySolution.gather(this->colIndices_, solutionValues);
63 }
64
65 solution.scatter(this->colIndices_, solutionValues);
66 solution.finish();
67
68 matrix.zeroRowsColumns(this->rowIndices_, true, solution, rhs);
69
70 rhs.scatter(this->rowIndices_, solutionValues);
71 rhs.finish();
72 }
73
74
75};
76
77template <class B, class Path, class Values, class Basis = Underlying_t<B>,
78 REQUIRES(Concepts::GlobalBasis<Basis>)>
79SymmetricDirichletBC(B const&, Path const&,
82
83} // end namespace AMDiS
Class defining a subset of a domain boundary.
Definition BoundarySubset.hpp:24
Implements a boundary condition of Dirichlet-type.
Definition DirichletBC.hpp:38
Implements a symmetric Dirichlet boundary condition.
Definition SymmetricDirichletBC.hpp:35
Definition SimpleInterpolator.hpp:21