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

Proper boundary handling

parent 3a8242e7
No related branches found
No related tags found
No related merge requests found
......@@ -190,36 +190,50 @@ int main(int argc, char** argv)
using Basis = typename Dune::Functions::LagrangeBasis<GridView,4>;
Basis basis(gridView);
std::vector<bool> isBoundary;
isBoundary.resize(basis.size(), false);
computeBoundaryVertices(gridView, isBoundary, basis);
assemblePoissonProblem(gridView, A, rhs, rhsFunction, basis);
x.resize(basis.size(), 0);
x.resize(basis.size());
x = 0;
auto dirichletFunction = [](auto x) {
return sin(x[0] * 2.0*M_PI)*.1;
};
Dune::Functions::interpolate(basis, x, dirichletFunction);
std::vector<bool> isBoundary;
isBoundary.resize(basis.size(), false);
computeBoundaryVertices(gridView, isBoundary, basis);
for(std::size_t i=0; i<rhs.size(); ++i)
{
if (isBoundary[i])
{
for(auto& entry: A[i])
entry = 0;
A[i][i] = 1;
rhs[i] = x[i];
Dune::Functions::interpolate(basis, x, dirichletFunction, isBoundary);
A.mmv(x, rhs);
for (std::size_t row=0; row<A.N(); row++) {
if (isBoundary[row]) {
rhs[row] = x[row];
// loop over nonzero matrix entries in current row
auto columnIt = A[row].begin();
auto columnEndIt = A[row].end();
for (; columnIt!=columnEndIt; ++columnIt)
if (row==columnIt.index())
*columnIt = 1.0;
else
*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::SeqILU0<Matrix,Vector,Vector> ilu0(A,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,
preconditioner, // preconditione
1e-4, // desired residual reduction factor
1e-10, // desired residual reduction factor
200, // maximum number of iterations
2); // verbosity of the solver
......@@ -236,7 +250,7 @@ int main(int argc, char** argv)
vtkWriter.addVertexData(xFunction, Dune::VTK::FieldInfo("solution", Dune::VTK::FieldInfo::Type::scalar, 1));
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.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