Commit ac426f91 authored by Timo Koch's avatar Timo Koch
Browse files

[solver] Remove TypeTag dependency of linear solver

This patch reduces dependencies and makes usage of linear solvers more flexible, i.e. for two problems with different typetag

* Linear solvers don't need type tag anymore, in fact they don't need any template params
* the preconditioner block size is now provided for the solve method (see e.g. staggered newton controller)
* the amg has a convencience alias using a TypeTag but is "independent" through indirection via the traits
parent 6257432d
......@@ -19,21 +19,23 @@
/*!
* \file
* \ingroup Linear
* \brief Provides a linear solver based on the ISTL AMG preconditioner
* \brief Provides a parallel linear solver based on the ISTL AMG preconditioner
* and the ISTL BiCGSTAB solver.
*/
#ifndef DUMUX_AMGBACKEND_HH
#define DUMUX_AMGBACKEND_HH
#ifndef DUMUX_PARALLEL_AMGBACKEND_HH
#define DUMUX_PARALLEL_AMGBACKEND_HH
#include <memory>
#include <dune/common/exceptions.hh>
#include <dune/common/parallel/indexset.hh>
#include <dune/common/parallel/mpicollectivecommunication.hh>
#include <dune/grid/common/capabilities.hh>
#include <dune/istl/paamg/amg.hh>
#include <dune/istl/paamg/pinfo.hh>
#include <dune/istl/solvers.hh>
#include <dumux/common/properties.hh>
#include <dumux/linear/solver.hh>
#include <dumux/linear/amgtraits.hh>
#include <dumux/linear/amgparallelhelpers.hh>
namespace Dumux {
......@@ -74,12 +76,10 @@ void scaleLinearSystem(Matrix& matrix, Vector& rhs)
* \brief A linear solver based on the ISTL AMG preconditioner
* and the ISTL BiCGSTAB solver.
*/
template <class TypeTag>
class AMGBackend : public LinearSolver<TypeTag>
template <class GridView, class AmgTraits>
class ParallelAMGBackend : public LinearSolver
{
using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
using Grid = typename GET_PROP_TYPE(TypeTag, Grid);
using AmgTraits = Dumux::AmgTraits<TypeTag>;
using Grid = typename GridView::Grid;
enum { numEq = AmgTraits::numEq };
using LinearOperator = typename AmgTraits::LinearOperator;
using ScalarProduct = typename AmgTraits::ScalarProduct;
......@@ -91,15 +91,32 @@ class AMGBackend : public LinearSolver<TypeTag>
using DofMapper = typename AmgTraits::DofMapper;
public:
/*!
* \brief Construct the backend.
* \brief Construct the backend for the sequential case only
*
* \param gridView the grid view on which we are performing the multi-grid
* \param dofMapper an index mapper for dof entities
* \param paramGroup the parameter group for parameter lookup
*/
AMGBackend(const GridView& gridView, const DofMapper& dofMapper)
: gridView_(gridView)
, dofMapper_(dofMapper)
, phelper_(gridView, dofMapper)
ParallelAMGBackend(const std::string& paramGroup = "")
: LinearSolver(paramGroup)
, firstCall_(true)
{
if (Dune::MPIHelper::getCollectiveCommunication().size() > 1)
DUNE_THROW(Dune::InvalidStateException, "Using sequential constructor for parallel run. Use signature with gridView and dofMapper!");
}
/*!
* \brief Construct the backend for parallel or sequential runs
*
* \param gridView the grid view on which we are performing the multi-grid
* \param dofMapper an index mapper for dof entities
* \param paramGroup the parameter group for parameter lookup
*/
ParallelAMGBackend(const GridView& gridView,
const DofMapper& dofMapper,
const std::string& paramGroup = "")
: LinearSolver(paramGroup)
, phelper_(std::make_shared<ParallelISTLHelper<GridView, AmgTraits>>(gridView, dofMapper))
, firstCall_(true)
{}
......@@ -184,19 +201,32 @@ private:
std::shared_ptr<LinearOperator>& fop,
std::shared_ptr<ScalarProduct>& sp)
{
LinearAlgebraPreparator<TypeTag, isParallel>
LinearAlgebraPreparator<GridView, AmgTraits, isParallel>
::prepareLinearAlgebra(A, b, rank, comm, fop, sp,
gridView_, dofMapper_, phelper_, firstCall_);
*phelper_, firstCall_);
}
GridView gridView_;
DofMapper dofMapper_;
ParallelISTLHelper<TypeTag> phelper_;
std::shared_ptr<ParallelISTLHelper<GridView, AmgTraits>> phelper_;
Dune::InverseOperatorResult result_;
bool firstCall_;
};
} // namespace Dumux
#include <dumux/common/properties.hh>
#include <dumux/linear/amgtraits.hh>
namespace Dumux {
/*!
* \ingroup Linear
* \brief A linear solver based on the ISTL AMG preconditioner
* and the ISTL BiCGSTAB solver.
* \note This is an adaptor using a TypeTag
*/
template<class TypeTag>
using AMGBackend = ParallelAMGBackend<typename GET_PROP_TYPE(TypeTag, GridView), AmgTraits<TypeTag>>;
} // namespace Dumux
#endif // DUMUX_AMGBACKEND_HH
......@@ -30,8 +30,6 @@
#include <dune/grid/common/partitionset.hh>
#include <dune/istl/owneroverlapcopy.hh>
#include <dune/istl/paamg/pinfo.hh>
#include <dumux/common/properties.hh>
#include <dumux/linear/amgtraits.hh>
namespace Dumux {
......@@ -41,13 +39,10 @@ namespace Dumux {
* decomposition of all degrees of freedom
*/
// operator that resets result to zero at constrained DOFS
template<class TypeTag>
template<class GridView, class AmgTraits>
class ParallelISTLHelper
{
using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
using AmgTraits = Dumux::AmgTraits<TypeTag>;
using DofMapper = typename AmgTraits::DofMapper;
enum { dofCodim = AmgTraits::dofCodim };
class BaseGatherScatter
......@@ -462,6 +457,14 @@ public:
void createIndexSetAndProjectForAMG(MatrixType& m, Comm& c);
#endif
//! Return the dofMapper
const DofMapper& dofMapper() const
{ return mapper_; }
//! Return the gridView
const GridView& gridView() const
{ return gridView_; }
private:
const GridView gridView_; //!< the grid view
const DofMapper& mapper_; //!< the dof mapper
......@@ -475,17 +478,13 @@ private:
/*!
* \ingroup Linear
* \brief Helper class for adding up matrix entries on border.
* \tparam GridOperator The grid operator to work on.
* \tparam MatrixType The MatrixType.
* \tparam GridView The grid view to work on
* \tparam AmgTraits traits class
*/
template<class TypeTag>
template<class GridView, class AmgTraits>
class EntityExchanger
{
using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
using AmgTraits = Dumux::AmgTraits<TypeTag>;
enum { numEq = AmgTraits::numEq };
using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<Scalar,numEq,numEq> >;
using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
using Matrix = typename AmgTraits::MType;
enum { dim = GridView::dimension };
enum { dofCodim = AmgTraits::dofCodim };
using Grid = typename GridView::Traits::Grid;
......@@ -563,7 +562,7 @@ public:
MatPatternExchange (const DofMapper& mapper,
const std::map<IdType,int>& g2i,
const std::map<int,IdType>& i2g, Matrix& A,
const ParallelISTLHelper<TypeTag>& helper)
const ParallelISTLHelper<GridView, AmgTraits>& helper)
: mapper_(mapper), gid2Index_(g2i), index2GID_(i2g),
sparsity_(A.N()), A_(A), helper_(helper)
{}
......@@ -648,7 +647,7 @@ public:
const std::map<int,IdType>& index2GID_;
std::vector<std::set<int> > sparsity_;
Matrix& A_;
const ParallelISTLHelper<TypeTag>& helper_;
const ParallelISTLHelper<GridView, AmgTraits>& helper_;
}; // class MatPatternExchange
......@@ -759,7 +758,7 @@ public:
\param A Matrix to operate on.
\param helper ParallelelISTLHelper.
*/
void getExtendedMatrix (Matrix& A, const ParallelISTLHelper<TypeTag>& helper)
void getExtendedMatrix (Matrix& A, const ParallelISTLHelper<GridView, AmgTraits>& helper)
{
if (gridView_.comm().size() > 1)
{
......@@ -833,8 +832,8 @@ private:
// methods that only exist if MPI is available
#if HAVE_MPI
template<class TypeTag>
void EntityExchanger<TypeTag>::getExtendedMatrix (Matrix& A) const
template<class GridView, class AmgTraits>
void EntityExchanger<GridView, AmgTraits>::getExtendedMatrix (Matrix& A) const
{
if (gridView_.comm().size() > 1)
{
......@@ -878,9 +877,9 @@ void EntityExchanger<TypeTag>::getExtendedMatrix (Matrix& A) const
} // EntityExchanger::getExtendedMatrix
template<class TypeTag>
template<class GridView, class AmgTraits>
template<typename MatrixType, typename Comm>
void ParallelISTLHelper<TypeTag>::createIndexSetAndProjectForAMG(MatrixType& m, Comm& comm)
void ParallelISTLHelper<GridView, AmgTraits>::createIndexSetAndProjectForAMG(MatrixType& m, Comm& comm)
{
if(!initialized_)
{
......@@ -1002,13 +1001,11 @@ void ParallelISTLHelper<TypeTag>::createIndexSetAndProjectForAMG(MatrixType& m,
*
* \tparam isParallel decides if the setting is parallel or sequential
*/
template<class TypeTag, bool isParallel>
template<class GridView, class AmgTraits, bool isParallel>
struct LinearAlgebraPreparator
{
using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
using AmgTraits = Dumux::AmgTraits<TypeTag>;
using DofMapper = typename AmgTraits::DofMapper;
using ParallelHelper = ParallelISTLHelper<TypeTag>;
using ParallelHelper = ParallelISTLHelper<GridView, AmgTraits>;
using Comm = typename AmgTraits::Comm;
using LinearOperator = typename AmgTraits::LinearOperator;
using ScalarProduct = typename AmgTraits::ScalarProduct;
......@@ -1019,8 +1016,6 @@ struct LinearAlgebraPreparator
std::shared_ptr<Comm>& comm,
std::shared_ptr<LinearOperator>& fop,
std::shared_ptr<ScalarProduct>& sp,
const GridView& gridView,
const DofMapper& mapper,
ParallelHelper& pHelper,
const bool firstCall)
{
......@@ -1034,13 +1029,11 @@ struct LinearAlgebraPreparator
/*!
* \brief Specialization for the parallel case.
*/
template<class TypeTag>
struct LinearAlgebraPreparator<TypeTag, true>
template<class GridView, class AmgTraits>
struct LinearAlgebraPreparator<GridView, AmgTraits, true>
{
using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
using AmgTraits = Dumux::AmgTraits<TypeTag>;
using DofMapper = typename AmgTraits::DofMapper;
using ParallelHelper = ParallelISTLHelper<TypeTag>;
using ParallelHelper = ParallelISTLHelper<GridView, AmgTraits>;
using Comm = typename AmgTraits::Comm;
using LinearOperator = typename AmgTraits::LinearOperator;
using ScalarProduct = typename AmgTraits::ScalarProduct;
......@@ -1051,8 +1044,6 @@ struct LinearAlgebraPreparator<TypeTag, true>
std::shared_ptr<Comm>& comm,
std::shared_ptr<LinearOperator>& fop,
std::shared_ptr<ScalarProduct>& sp,
const GridView& gridView,
const DofMapper& mapper,
ParallelHelper& pHelper,
const bool firstCall)
{
......@@ -1064,12 +1055,12 @@ struct LinearAlgebraPreparator<TypeTag, true>
pHelper.initGhostsAndOwners();
}
comm = std::make_shared<Comm>(gridView.comm(), category);
comm = std::make_shared<Comm>(pHelper.gridView().comm(), category);
if(AmgTraits::isNonOverlapping)
{
// extend the matrix pattern such that it is usable for AMG
EntityExchanger<TypeTag> exchanger(gridView, mapper);
EntityExchanger<GridView, AmgTraits> exchanger(pHelper.gridView(), pHelper.dofMapper());
exchanger.getExtendedMatrix(A, pHelper);
exchanger.sumEntries(A);
}
......
......@@ -37,9 +37,6 @@
namespace Dumux {
// Forward declaration for the property definitions
template <class TypeTag> class AMGBackend;
//! The implementation is specialized for the different discretizations
template<class TypeTag, DiscretizationMethods DM> struct AmgTraitsImpl;
......
......@@ -45,38 +45,38 @@ using LinearSolverAcceptsMultiTypeMatrix = LinearSolverAcceptsMultiTypeMatrixImp
//! And the direct solvers that have BCRS Matrix hardcoded
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnBiCGSTABBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnBiCGSTABBackend>
{ static constexpr bool value = false; };
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnCGBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnCGBackend>
{ static constexpr bool value = false; };
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0BiCGSTABBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0BiCGSTABBackend>
{ static constexpr bool value = false; };
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0CGBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0CGBackend>
{ static constexpr bool value = false; };
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0RestartedGMResBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILU0RestartedGMResBackend>
{ static constexpr bool value = false; };
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnRestartedGMResBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, ILUnRestartedGMResBackend>
{ static constexpr bool value = false; };
#if HAVE_SUPERLU
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, SuperLUBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, SuperLUBackend>
{ static constexpr bool value = false; };
#endif // HAVE_SUPERLU
#if HAVE_UMFPACK
template<typename TypeTag>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, UMFPackBackend<TypeTag>>
struct LinearSolverAcceptsMultiTypeMatrixImpl<TypeTag, UMFPackBackend>
{ static constexpr bool value = false; };
#endif // HAVE_UMFPACK
......
This diff is collapsed.
......@@ -26,7 +26,6 @@
#include <dune/common/exceptions.hh>
#include <dumux/common/parameters.hh>
#include <dumux/common/properties.hh>
namespace Dumux
{
......@@ -35,12 +34,12 @@ namespace Dumux
* \ingroup Linear
* \brief Base class for linear solvers
*/
template <class TypeTag>
class LinearSolver
{
public:
//! export scalar type (might be needed to set parameters from output)
using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
//! export Scalar type (might be needed to set parameters from output)
//! TODO: Do we need this?
using Scalar = double;
/*!
* \brief Contruct the solver
......@@ -51,14 +50,14 @@ public:
* - LinearSolver.PreconditionerRelaxation precondition relaxation
* - LinearSolver.PreconditionerIterations the number of preconditioner iterations
*/
LinearSolver()
LinearSolver(const std::string& paramGroup = "")
: paramGroup_(paramGroup)
{
static const std::string modelParamGroup = GET_PROP_VALUE(TypeTag, ModelParameterGroup);
verbosity_ = getParamFromGroup<int>(modelParamGroup, "LinearSolver.Verbosity");
maxIter_ = getParamFromGroup<int>(modelParamGroup, "LinearSolver.MaxIterations");
residReduction_ = getParamFromGroup<Scalar>(modelParamGroup, "LinearSolver.ResidualReduction");
relaxation_ = getParamFromGroup<Scalar>(modelParamGroup, "LinearSolver.PreconditionerRelaxation");
precondIter_ = getParamFromGroup<int>(modelParamGroup, "LinearSolver.PreconditionerIterations");
verbosity_ = getParamFromGroup<int>(paramGroup, "LinearSolver.Verbosity");
maxIter_ = getParamFromGroup<int>(paramGroup, "LinearSolver.MaxIterations");
residReduction_ = getParamFromGroup<double>(paramGroup, "LinearSolver.ResidualReduction");
relaxation_ = getParamFromGroup<double>(paramGroup, "LinearSolver.PreconditionerRelaxation");
precondIter_ = getParamFromGroup<int>(paramGroup, "LinearSolver.PreconditionerIterations");
}
/*!
......@@ -75,6 +74,10 @@ public:
std::string name() const
{ return "unknown solver"; }
//! the parameter group for getting parameter from the parameter tree
const std::string& paramGroup() const
{ return paramGroup_; }
//! the verbosity level
int verbosity() const
{ return verbosity_; }
......@@ -92,19 +95,19 @@ public:
{ maxIter_ = i; }
//! the linear solver residual reduction
Scalar residReduction() const
double residReduction() const
{ return residReduction_; }
//! set the linear solver residual reduction
void setResidualReduction(Scalar r)
void setResidualReduction(double r)
{ residReduction_ = r; }
//! the linear solver relaxation factor
Scalar relaxation() const
double relaxation() const
{ return relaxation_; }
//! set the linear solver relaxation factor
void setRelaxation(Scalar r)
void setRelaxation(double r)
{ relaxation_ = r; }
//! the number of preconditioner iterations
......@@ -118,9 +121,10 @@ public:
private:
int verbosity_;
int maxIter_;
Scalar residReduction_;
Scalar relaxation_;
double residReduction_;
double relaxation_;
int precondIter_;
const std::string paramGroup_;
};
} // end namespace Dumux
......
......@@ -99,7 +99,7 @@ public:
BlockVector y(numRows);
// solve
const bool converged = ls.solve(M, y, bTmp);
const bool converged = ls.template solve</*precondBlockLevel=*/2>(M, y, bTmp);
// copy back the result y into x
VectorConverter<SolutionVector>::retrieveValues(x, y);
......
......@@ -96,7 +96,7 @@ public:
SET_TYPE_PROP(Pressure, PressureSolutionVector, typename GET_PROP(TypeTag, SolutionTypes)::ScalarSolution);
// use the stabilized BiCG solver preconditioned by the ILU-0 by default
SET_TYPE_PROP(Pressure, LinearSolver, ILU0BiCGSTABBackend<TypeTag> );
SET_TYPE_PROP(Pressure, LinearSolver, ILU0BiCGSTABBackend );
SET_TYPE_PROP( Pressure, Velocity, FVVelocityDefault<TypeTag>);
......
......@@ -172,7 +172,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -170,7 +170,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -167,7 +167,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -154,7 +154,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -153,7 +153,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -169,7 +169,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -168,7 +168,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -167,7 +167,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = Dumux::UMFPackBackend<TypeTag>;
using LinearSolver = Dumux::UMFPackBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -126,7 +126,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop);
// the linear solver
using LinearSolver = ILU0BiCGSTABBackend<TypeTag>;
using LinearSolver = ILU0BiCGSTABBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -111,7 +111,7 @@ int main(int argc, char** argv) try
auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
// the linear solver
using LinearSolver = ILU0BiCGSTABBackend<TypeTag>;
using LinearSolver = ILU0BiCGSTABBackend;
auto linearSolver = std::make_shared<LinearSolver>();
// the non-linear solver
......
......@@ -120,7 +120,7 @@ int main(int argc, char** argv) try
// solve the linear system
Dune::Timer solverTimer;
using LinearSolver = SSORCGBackend<TypeTag>;
using LinearSolver = SSORCGBackend;
auto linearSolver = std::make_shared<LinearSolver>();
if (mpiHelper.rank() == 0) std::cout << "Solving linear system using " + linearSolver->name() + "..." << std::flush;
......
......@@ -99,8 +99,8 @@ SET_PROP(FVVelocity2PTestProblem, FluidSystem)
// set the types for the MPFA-O FV method
NEW_TYPE_TAG(FVMPFAOVelocity2PTestProblem, INHERITS_FROM(FvMpfaO2dPressureTwoP, TestDiffusionSpatialParams));
//SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, LinearSolver, ILUnBiCGSTABBackend<TypeTag>);
SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, LinearSolver, SSORBiCGSTABBackend<TypeTag>);
//SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, LinearSolver, ILUnBiCGSTABBackend);
SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, LinearSolver, SSORBiCGSTABBackend);
SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, Problem, TestDiffusionProblem<TypeTag>);
// Set the grid type
SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, Grid, Dune::YaspGrid<2>);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment