DUNE PDELab (git)

recipe-linear-system-solution-istl.cc

See explanation at Solving a linear system using ISTL

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <dune/pdelab.hh>
template<typename GV, typename RF>
{
typedef Dune::PDELab::ConvectionDiffusionBoundaryConditions::Type BCType;
public:
static constexpr bool permeabilityIsConstantPerCell()
{
return true;
}
A (const typename Traits::ElementType& e, const typename Traits::DomainType& xlocal) const
{
for (std::size_t i=0; i<Traits::dimDomain; i++)
for (std::size_t j=0; j<Traits::dimDomain; j++)
I[i][j] = (i==j) ? 1 : 0;
return I;
}
b (const typename Traits::ElementType& e, const typename Traits::DomainType& xlocal) const
{
typename Traits::RangeType v(0.0);
return v;
}
c (const typename Traits::ElementType& e, const typename Traits::DomainType& xlocal) const
{
return 0.0;
}
f (const typename Traits::ElementType& e, const typename Traits::DomainType& xlocal) const
{
return 0.0;
}
/* return Dune::PDELab::ConvectionDiffusionBoundaryConditions::Dirichlet for Dirichlet boundary conditions
* return Dune::PDELab::ConvectionDiffusionBoundaryConditions::Neumann for flux boundary conditions
* return Dune::PDELab::ConvectionDiffusionBoundaryConditions::Outflow for outflow boundary conditions
*/
BCType
bctype (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& xlocal) const
{
return Dune::PDELab::ConvectionDiffusionBoundaryConditions::Dirichlet;
}
g (const typename Traits::ElementType& e, const typename Traits::DomainType& xlocal) const
{
typename Traits::DomainType x = e.geometry().global(xlocal);
if (x[0] < 0.5)
return 1.0;
return 0.0;
}
j (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& xlocal) const
{
return 0.0;
}
o (const typename Traits::IntersectionType& is, const typename Traits::IntersectionDomainType& xlocal) const
{
return 0.0;
}
};
int main(int argc, char **argv)
{
// initialize MPI, finalize is done automatically on exit
// define parameters
typedef double NumberType;
// need a grid in order to test grid functions
constexpr unsigned int dim = 1;
constexpr unsigned int degree = 1;
constexpr std::size_t nonzeros = Dune::power(2*degree+1,dim);
std::array<int,dim> N(Dune::filledArray<dim,int>(5));
typedef Dune::YaspGrid<dim> Grid;
Grid grid(L,N);
// make grid
typedef Dune::YaspGrid<dim> GM;
// make problem parameters
Problem problem;
BCType bctype(grid.leafGridView(),problem);
typedef typename GM::ctype DF;
FEM fem(grid.leafGridView());
typedef Dune::PDELab::GridFunctionSpace<GM::LeafGridView,FEM,
Dune::PDELab::ISTL::VectorBackend<Dune::PDELab::ISTL::Blocking::fixed,1>> GFS;
GFS gfs(grid.leafGridView(),fem);
typedef typename GFS::template ConstraintsContainer<NumberType>::Type CC;
CC cc;
Dune::PDELab::constraints(bctype,gfs,cc);
// local operator for finite elemenent problem
LOP lop(problem);
// [Grid operator]
auto go = GO(gfs,cc,gfs,cc,lop,MBE(nonzeros));
// [Make degree of freedom vector]
typedef Dune::PDELab::Backend::Vector<GFS,NumberType> X;
X x(gfs,0.0);
// [Set it to match boundary conditions]
G g(grid.leafGridView(),problem);
// [Assemble residual]
X d(gfs,0.0);
go.residual(x,d);
// [Assemble matrix]
typedef GO::Jacobian M;
M A(go);
go.jacobian(x,A);
// [Extract ISTL types]
typedef Dune::PDELab::Backend::Native<M> ISTLM;
typedef Dune::PDELab::Backend::Native<X> ISTLX;
// [Access to ISTL objects]
using Dune::PDELab::Backend::native;
// [Define operator]
Operator matrixop(native(A));
// [Define preconditioner and solver]
Dune::SeqJac<ISTLM,ISTLX,ISTLX> preconditioner(native(A), 1, .5);
Dune::CGSolver<ISTLX> solver(matrixop, preconditioner, 1e-3, 10, 2);
// [Run solver]
X v(gfs,0.0);
solver.apply(native(v), native(d), res);
// [Subtract defect correction]
x -= v;
// [Solution output]
Dune::printvector(std::cout, native(x), "Solution", "");
}
conjugate gradient method
Definition: solvers.hh:193
vector space out of a tensor product of fields.
Definition: fvector.hh:91
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:252
Adapter to turn a matrix into a linear operator.
Definition: operators.hh:135
Dirichlet Constraints construction.
Definition: conforming.hh:38
Definition: convectiondiffusionparameter.hh:221
Definition: convectiondiffusionparameter.hh:325
Definition: convectiondiffusionfem.hh:47
A grid function space.
Definition: gridfunctionspace.hh:191
Standard grid operator implementation.
Definition: gridoperator.hh:36
The sequential jacobian preconditioner.
Definition: preconditioners.hh:413
[ provides Dune::Grid ]
Definition: yaspgrid.hh:166
Definition: recipe-geometry-grid.cc:44
Traits::RangeFieldType o(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &xlocal) const
outflow boundary condition
Definition: recipe-geometry-grid.cc:116
Traits::PermTensorType A(const typename Traits::ElementType &e, const typename Traits::DomainType &xlocal) const
tensor diffusion coefficient
Definition: recipe-geometry-grid.cc:58
BCType bctype(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &xlocal) const
boundary condition type function
Definition: recipe-geometry-grid.cc:95
static constexpr bool permeabilityIsConstantPerCell()
tensor diffusion constant per cell? return false if you want more than one evaluation of A per cell.
Definition: recipe-geometry-grid.cc:51
Traits::RangeType b(const typename Traits::ElementType &e, const typename Traits::DomainType &xlocal) const
velocity field
Definition: recipe-geometry-grid.cc:69
Traits::RangeFieldType c(const typename Traits::ElementType &e, const typename Traits::DomainType &xlocal) const
sink term
Definition: recipe-geometry-grid.cc:77
Traits::RangeFieldType g(const typename Traits::ElementType &e, const typename Traits::DomainType &xlocal) const
Dirichlet boundary condition value.
Definition: recipe-geometry-grid.cc:102
Traits::RangeFieldType j(const typename Traits::IntersectionType &is, const typename Traits::IntersectionDomainType &xlocal) const
flux boundary condition
Definition: recipe-geometry-grid.cc:109
Traits::RangeFieldType f(const typename Traits::ElementType &e, const typename Traits::DomainType &xlocal) const
source term
Definition: recipe-geometry-grid.cc:84
Utility to generate an array with a certain value.
void constraints(const GFS &gfs, CG &cg, const bool verbose=false)
construct constraints
Definition: constraints.hh:749
void interpolate(const F &f, const GFS &gfs, XG &xg)
interpolation from a given grid function
Definition: interpolate.hh:177
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition: io.hh:89
std::size_t degree(const Node &node)
Returns the degree of node as run time information.
Definition: nodeinterface.hh:79
Helpers for dealing with MPI.
constexpr Base power(Base m, Exponent p)
Power method for integer exponents.
Definition: math.hh:75
Statistics about the application of an inverse operator.
Definition: solver.hh:50
Traits class for convection diffusion parameters.
Definition: convectiondiffusionparameter.hh:76
Dune::FieldVector< DomainFieldType, dimDomain-1 > IntersectionDomainType
domain type
Definition: convectiondiffusionparameter.hh:93
@ dimDomain
dimension of the domain
Definition: convectiondiffusionparameter.hh:83
Dune::FieldMatrix< RangeFieldType, dimDomain, dimDomain > PermTensorType
permeability tensor type
Definition: convectiondiffusionparameter.hh:102
Dune::FieldVector< RF, GV::dimensionworld > RangeType
range type
Definition: convectiondiffusionparameter.hh:99
GV::Traits::template Codim< 0 >::Entity ElementType
grid types
Definition: convectiondiffusionparameter.hh:105
RF RangeFieldType
Export type for range field.
Definition: convectiondiffusionparameter.hh:96
Dune::FieldVector< DomainFieldType, dimDomain > DomainType
domain type
Definition: convectiondiffusionparameter.hh:90
Backend using (possibly nested) ISTL BCRSMatrices.
Definition: bcrsmatrixbackend.hh:188
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 12, 23:30, 2024)