Skip to content
Snippets Groups Projects
Commit 6aba9157 authored by graeser's avatar graeser
Browse files

Proper boundary handling

parent 3a8242e7
Branches
No related tags found
No related merge requests found
...@@ -190,36 +190,50 @@ int main(int argc, char** argv) ...@@ -190,36 +190,50 @@ int main(int argc, char** argv)
using Basis = typename Dune::Functions::LagrangeBasis<GridView,4>; using Basis = typename Dune::Functions::LagrangeBasis<GridView,4>;
Basis basis(gridView); Basis basis(gridView);
std::vector<bool> isBoundary;
isBoundary.resize(basis.size(), false);
computeBoundaryVertices(gridView, isBoundary, basis);
assemblePoissonProblem(gridView, A, rhs, rhsFunction, basis); assemblePoissonProblem(gridView, A, rhs, rhsFunction, basis);
x.resize(basis.size(), 0); x.resize(basis.size());
x = 0;
auto dirichletFunction = [](auto x) { auto dirichletFunction = [](auto x) {
return sin(x[0] * 2.0*M_PI)*.1; return sin(x[0] * 2.0*M_PI)*.1;
}; };
Dune::Functions::interpolate(basis, x, dirichletFunction); Dune::Functions::interpolate(basis, x, dirichletFunction, isBoundary);
std::vector<bool> isBoundary; A.mmv(x, rhs);
isBoundary.resize(basis.size(), false); for (std::size_t row=0; row<A.N(); row++) {
computeBoundaryVertices(gridView, isBoundary, basis); if (isBoundary[row]) {
rhs[row] = x[row];
for(std::size_t i=0; i<rhs.size(); ++i) // loop over nonzero matrix entries in current row
{ auto columnIt = A[row].begin();
if (isBoundary[i]) auto columnEndIt = A[row].end();
{ for (; columnIt!=columnEndIt; ++columnIt)
for(auto& entry: A[i]) if (row==columnIt.index())
entry = 0; *columnIt = 1.0;
A[i][i] = 1; else
rhs[i] = x[i]; *columnIt = 0.0;
}
else {
// loop over nonzero matrix entries in current row
auto columnIt = A[row].begin();
auto columnEndIt = A[row].end();
for (; columnIt!=columnEndIt; ++columnIt)
if (isBoundary[columnIt.index()])
*columnIt = 0;
} }
} }
Dune::MatrixAdapter<Matrix,Vector,Vector> op(A); Dune::MatrixAdapter<Matrix,Vector,Vector> op(A);
Dune::SeqILU0<Matrix,Vector,Vector> ilu0(A,1.0);
Dune::SeqSSOR<Matrix,Vector,Vector> preconditioner(A,1,1.0); Dune::SeqSSOR<Matrix,Vector,Vector> preconditioner(A,1,1.0);
// Dune::SeqILDL<Matrix,Vector,Vector> preconditioner(A,1.0);
Dune::CGSolver<Vector> cg(op, Dune::CGSolver<Vector> cg(op,
preconditioner, // preconditione preconditioner, // preconditione
1e-4, // desired residual reduction factor 1e-10, // desired residual reduction factor
200, // maximum number of iterations 200, // maximum number of iterations
2); // verbosity of the solver 2); // verbosity of the solver
...@@ -236,7 +250,7 @@ int main(int argc, char** argv) ...@@ -236,7 +250,7 @@ int main(int argc, char** argv)
vtkWriter.addVertexData(xFunction, Dune::VTK::FieldInfo("solution", Dune::VTK::FieldInfo::Type::scalar, 1)); vtkWriter.addVertexData(xFunction, Dune::VTK::FieldInfo("solution", Dune::VTK::FieldInfo::Type::scalar, 1));
vtkWriter.write("07-solution"); vtkWriter.write("07-solution");
} { } {
Dune::SubsamplingVTKWriter<GridView> vtkWriter(gridView,4); Dune::SubsamplingVTKWriter<GridView> vtkWriter(gridView,Dune::refinementLevels(4));
vtkWriter.addVertexData(xFunction, Dune::VTK::FieldInfo("solution", Dune::VTK::FieldInfo::Type::scalar, 1)); vtkWriter.addVertexData(xFunction, Dune::VTK::FieldInfo("solution", Dune::VTK::FieldInfo::Type::scalar, 1));
vtkWriter.write("07-solution-subsampled"); vtkWriter.write("07-solution-subsampled");
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment