diff --git a/dumux/decoupled/2p/variableclass2p.hh b/dumux/decoupled/2p/variableclass2p.hh index ec85e7b814a60885c4078082cf9961a60a517964..fcd7fe23f266f4cede5697c53aa66436770890e0 100644 --- a/dumux/decoupled/2p/variableclass2p.hh +++ b/dumux/decoupled/2p/variableclass2p.hh @@ -273,7 +273,7 @@ public: ElementHandleAssign<typename ScalarSolutionType::block_type, ScalarSolutionType, ElementMapper> elementHandle(saturation_, this->elementMapper()); this->gridView().communicate(elementHandle, Dune::InteriorBorder_All_Interface, - Dune::BackwardCommunication); + Dune::ForwardCommunication); #endif } diff --git a/dumux/decoupled/common/gridAdapt.hh b/dumux/decoupled/common/gridAdapt.hh index 3136e7499648235ea5bc790c443ae56ee707e8f3..19b3d8e9656d636ff10b50564e65b44c5023f94d 100644 --- a/dumux/decoupled/common/gridAdapt.hh +++ b/dumux/decoupled/common/gridAdapt.hh @@ -54,8 +54,8 @@ class GridAdapt typedef typename Grid::template Codim<0>::Entity Entity; typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::ScalarSolution ScalarSolutionType; - static const double refinetol = 0.05; - static const double coarsentol = 0.001; + static constexpr double refinetol = 0.05; + static constexpr double coarsentol = 0.001; public: /*! diff --git a/dumux/decoupled/common/variableclass.hh b/dumux/decoupled/common/variableclass.hh index 3249aebdcdd632a0bb139b89a26f60208e4bbef0..5a57acd43880aed1859abf92af269f13057a4697 100644 --- a/dumux/decoupled/common/variableclass.hh +++ b/dumux/decoupled/common/variableclass.hh @@ -238,9 +238,8 @@ public: #if HAVE_MPI ElementHandleAssign<typename ScalarSolutionType::block_type, ScalarSolutionType, ElementMapper> elementHandle(pressure_, elementMapper_); gridView_.communicate(elementHandle, -// Dune::Overlap_All_Interface, - Dune::InteriorBorder_All_Interface, - Dune::BackwardCommunication); + Dune::InteriorBorder_All_Interface, + Dune::ForwardCommunication); #endif } diff --git a/dumux/linear/boxbicgstabilu0solver.hh b/dumux/linear/boxbicgstabilu0solver.hh index e6464ae2de38b83a2fa1b7ccc22fa2874648a5ac..4e5acab45ede8736dcaa2367925f54e361311dce 100644 --- a/dumux/linear/boxbicgstabilu0solver.hh +++ b/dumux/linear/boxbicgstabilu0solver.hh @@ -26,6 +26,7 @@ #ifndef DUMUX_BICGSTAB_ILU0_SOLVER_HH #define DUMUX_BICGSTAB_ILU0_SOLVER_HH +#include <dumux/common/propertysystem.hh> #include <dumux/linear/vertexborderlistfromgrid.hh> #include <dumux/linear/overlappingbcrsmatrix.hh> #include <dumux/linear/overlappingblockvector.hh> @@ -65,7 +66,7 @@ class BoxBiCGStabILU0Solver typedef Dune::BiCGSTABSolver<OverlappingVector> Solver; public: - BoxBiCGStabILU0Solver(const Problem &problem, int overlapSize=3) + BoxBiCGStabILU0Solver(const Problem &problem, int overlapSize=1) : problem_(problem) , overlapSize_(overlapSize) { diff --git a/dumux/linear/domesticoverlapfrombcrsmatrix.hh b/dumux/linear/domesticoverlapfrombcrsmatrix.hh index 3798e52ab9938688c6736473e700210bb03e3359..1cd64366b04c6c773a93620d0b54d7da559f9c9c 100644 --- a/dumux/linear/domesticoverlapfrombcrsmatrix.hh +++ b/dumux/linear/domesticoverlapfrombcrsmatrix.hh @@ -78,8 +78,7 @@ public: typedef std::map<ProcessRank, DomesticOverlapWithPeer> DomesticOverlapByRank; typedef std::vector<std::map<ProcessRank, BorderDistance> > DomesticOverlapByIndex; - typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LocalindexPeerindexPeerrank; - typedef std::list<LocalindexPeerindexPeerrank> BorderList; + typedef std::list<BorderIndex> BorderList; /*! * \brief Constructs the foreign overlap given a BCRS matrix and @@ -390,9 +389,9 @@ protected: IndexDistanceNpeers(globalIndices_.domesticToGlobal(localIdx), borderDistance, numPeers); - + + // send all peer ranks which see the given index peersSendBuff_[peerRank].push_back(new MpiBuffer<int>(2*numPeers)); - typename std::map<ProcessRank, BorderDistance>::const_iterator it = foreignIndexOverlap.begin(); typename std::map<ProcessRank, BorderDistance>::const_iterator endIt = foreignIndexOverlap.end(); for (int j = 0; it != endIt; ++it, ++j) @@ -455,7 +454,7 @@ protected: domesticIdx = globalIndices_.numDomestic(); borderDistance_.resize(domesticIdx + 1, std::numeric_limits<int>::max()); domesticOverlapByIndex_.resize(domesticIdx + 1); - + globalIndices_.addIndex(domesticIdx, globalIdx); domesticOverlapByIndex_[domesticIdx][peerRank] = borderDistance; domesticOverlapWithPeer_[peerRank].insert(domesticIdx); diff --git a/dumux/linear/elementborderlistfromgrid.hh b/dumux/linear/elementborderlistfromgrid.hh index 3921656a239b9476fbedcd31917648955714286f..67b1fd3a01b20ad5b6ac20debe764ed16a296161 100644 --- a/dumux/linear/elementborderlistfromgrid.hh +++ b/dumux/linear/elementborderlistfromgrid.hh @@ -33,6 +33,8 @@ #include <dune/istl/scalarproducts.hh> #include <dune/istl/operators.hh> +#include "borderindex.hh" + #include <algorithm> #include <list> #include <set> @@ -40,6 +42,7 @@ namespace Dumux { + /*! * \brief Uses communication on the grid to find the initial seed list * of indices. @@ -51,14 +54,14 @@ namespace Dumux { */ template <class GridView, class ElementMapper> class ElementBorderListFromGrid : public Dune::CommDataHandleIF<ElementBorderListFromGrid<GridView, ElementMapper>, - int > + int > { typedef int ProcessRank; typedef int Index; + typedef int Distance; typedef Index LocalIndex; typedef Index PeerIndex; - typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LindexPindexRank; - typedef std::list<LindexPindexRank> BorderList; + typedef std::list<BorderIndex> BorderList; public: ElementBorderListFromGrid(const GridView &gv, @@ -92,14 +95,14 @@ public: template<class MessageBufferImp, class EntityType> void scatter(MessageBufferImp &buff, const EntityType &e, size_t n) { - int peerRank; - int peerCellIdx; - - buff.read(peerRank); - buff.read(peerCellIdx); + BorderIndex bIdx; + + bIdx.localIdx = map_.map(e); + buff.read(bIdx.peerRank); + buff.read(bIdx.peerIdx); + bIdx.borderDistance = 1; - int localCellIdx = map_.map(e); - borderList_.push_back(LindexPindexRank(localCellIdx, peerCellIdx, peerRank)); + borderList_.push_back(bIdx); }; // Access to the initial seed list. diff --git a/dumux/linear/foreignoverlapfrombcrsmatrix.hh b/dumux/linear/foreignoverlapfrombcrsmatrix.hh index 03aa2ca8568a27e7f560e66d84be6924de5a3c9b..f07728eef9509239d5e53bf17ad43d18d9841033 100644 --- a/dumux/linear/foreignoverlapfrombcrsmatrix.hh +++ b/dumux/linear/foreignoverlapfrombcrsmatrix.hh @@ -30,6 +30,8 @@ #ifndef DUMUX_FOREIGN_OVERLAP_FROM_BCRS_MATRIX_HH #define DUMUX_FOREIGN_OVERLAP_FROM_BCRS_MATRIX_HH +#include "borderindex.hh" + #include <dune/grid/common/datahandleif.hh> #include <dune/common/fmatrix.hh> #include <dune/istl/bcrsmatrix.hh> @@ -45,7 +47,6 @@ #include <mpi.h> #endif // HAVE_MPI - namespace Dumux { /*! @@ -68,16 +69,16 @@ public: typedef Index PeerIndex; typedef Index LocalIndex; typedef std::pair<LocalIndex, ProcessRank> IndexRank; + typedef std::tuple<LocalIndex, ProcessRank, BorderDistance> IndexRankDist; typedef std::tuple<Index, BorderDistance, int> IndexDistanceNpeers; - typedef std::list<IndexRank> SeedList; + typedef std::list<IndexRankDist> SeedList; typedef std::set<ProcessRank> PeerSet; typedef std::list<IndexDistanceNpeers> ForeignOverlapWithPeer; typedef std::map<ProcessRank, ForeignOverlapWithPeer> ForeignOverlapByRank; typedef std::vector<std::map<ProcessRank, BorderDistance> > ForeignOverlapByIndex; - typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LocalindexPeerindexPeerrank; - typedef std::list<LocalindexPeerindexPeerrank> BorderList; + typedef std::list<BorderIndex> BorderList; /*! * \brief Constructs the foreign overlap given a BCRS matrix and @@ -110,7 +111,7 @@ public: // calculate the foreign overlap for the local partition, // i.e. find the distance of each row from the seed set. foreignOverlapByIndex_.resize(A.N()); - extendForeignOverlap_(A, initialSeedList, 0, overlapSize); + extendForeignOverlap_(A, initialSeedList, overlapSize); // group foreign overlap by peer process rank groupForeignOverlapByRank_(); @@ -369,7 +370,7 @@ protected: SeedList::const_iterator it = seedList.begin(); SeedList::const_iterator endIt = seedList.end(); for (; it != endIt; ++it) - peerSet_.insert(it->second); + peerSet_.insert(std::get<1>(*it)); } // calculate the local border indices given the initial seed list @@ -378,11 +379,11 @@ protected: BorderList::const_iterator it = borderList.begin(); BorderList::const_iterator endIt = borderList.end(); for (; it != endIt; ++it) { - int localIdx = std::get<0>(*it); - int peerRank = std::get<2>(*it); - - initialSeedList.push_back(IndexRank(localIdx, peerRank)); - borderIndices_.insert(localIdx); + initialSeedList.push_back(IndexRankDist(it->localIdx, + it->peerRank, + it->borderDistance)); + if (it->borderDistance == 0) + borderIndices_.insert(it->localIdx); }; }; @@ -390,22 +391,32 @@ protected: // algorithm. void extendForeignOverlap_(const BCRSMatrix &A, SeedList &seedList, - int overlapDistance, int overlapSize) { // add all processes in the seed rows of the current overlap // level + int minOverlapDistance = overlapSize*2; SeedList::const_iterator it = seedList.begin(); SeedList::const_iterator endIt = seedList.end(); for (; it != endIt; ++it) { - if (foreignOverlapByIndex_[it->first].count(it->second) == 0) { - foreignOverlapByIndex_[it->first][it->second] = overlapDistance; + int localIdx = std::get<0>(*it); + int peerRank = std::get<1>(*it); + int distance = std::get<2>(*it); + if (foreignOverlapByIndex_[localIdx].count(peerRank) == 0) { + foreignOverlapByIndex_[localIdx][peerRank] = distance; } + else { + foreignOverlapByIndex_[localIdx][peerRank] = + std::min(distance, + foreignOverlapByIndex_[localIdx][peerRank]); + } + + minOverlapDistance = std::min(minOverlapDistance, distance); } // if we have reached the maximum overlap distance, we're // finished and break the recursion - if (overlapSize <= overlapDistance) + if (minOverlapDistance >= overlapSize) return; // find the seed list for the next overlap level using the @@ -413,10 +424,11 @@ protected: SeedList nextSeedList; it = seedList.begin(); for (; it != endIt; ++it) { - int rowIdx = it->first; - int processIdx = it->second; + int rowIdx = std::get<0>(*it); + int peerRank = std::get<1>(*it); + int borderDist = std::get<2>(*it); - // find all column indices in the row. The indices of the + // find all column indies in the row. The indices of the // columns are the additional indices of the overlap which // we would like to add typedef typename BCRSMatrix::ConstColIterator ColIterator; @@ -427,19 +439,30 @@ protected: // if the process is already is in the overlap of the // column index, ignore this column index! - if (foreignOverlapByIndex_[newIdx].count(processIdx) > 0) + if (foreignOverlapByIndex_[newIdx].count(peerRank) > 0) continue; - - // check whether the new index is already in the next seed list - IndexRank newPair(newIdx, processIdx); - if (std::find(nextSeedList.begin(), - nextSeedList.end(), - newPair) != nextSeedList.end()) - continue; // we already have this pair + + + // check whether the new index is already in the overlap + bool hasIndex = false; + typename SeedList::iterator sIt = nextSeedList.begin(); + typename SeedList::iterator sEndIt = nextSeedList.end(); + for (; sIt != sEndIt; ++sIt) { + if (std::get<0>(*sIt) == newIdx && + std::get<1>(*sIt) == peerRank) + { + hasIndex = true; + std::get<2>(*sIt) = std::min(std::get<2>(*sIt), borderDist + 1); + break; + } + } + if (hasIndex) + continue; // we already have this index // add the current processes to the seed list for the // next overlap level - nextSeedList.push_back(newPair); + IndexRankDist newTuple(newIdx, peerRank, borderDist + 1); + nextSeedList.push_back(newTuple); } } @@ -449,7 +472,6 @@ protected: // Perform the same excercise for the next overlap distance extendForeignOverlap_(A, nextSeedList, - overlapDistance + 1, overlapSize); }; diff --git a/dumux/linear/globalindices.hh b/dumux/linear/globalindices.hh index 3daed8b5d1c4718748861f235f26c8df54d9dfb5..a5acd134dcde6238bfc9cf94b16558efbbc3962c 100644 --- a/dumux/linear/globalindices.hh +++ b/dumux/linear/globalindices.hh @@ -75,8 +75,7 @@ class GlobalIndices typedef std::map<PeerIndex, DomesticIndex> BorderWithPeer; typedef std::map<ProcessRank, BorderWithPeer> DomesticBorder; - typedef std::tuple<DomesticIndex, PeerIndex, ProcessRank> LindexPindexRank; - typedef std::list<LindexPindexRank> BorderList; + typedef std::list<BorderIndex> BorderList; typedef std::map<PeerIndex, DomesticIndex> PeerToDomesticMap; typedef std::map<ProcessRank, PeerToDomesticMap> ForeignToDomesticMap; @@ -163,7 +162,6 @@ public: int sendBuff[2]; sendBuff[0] = peerLocalIdx; sendBuff[1] = domesticToGlobal(domesticIdx); - MPI_Send(sendBuff, // buff 2, // count MPI_INT, // data type @@ -227,7 +225,11 @@ protected: // global index list void buildGlobalIndices_() { +#if HAVE_MPI numDomestic_ = 0; +#else + numDomestic_ = foreignOverlap_.numLocal(); +#endif #if HAVE_MPI if (myRank_ == 0) { @@ -285,11 +287,11 @@ protected: BorderList::const_iterator borderIt = borderList_().begin(); BorderList::const_iterator borderEndIt = borderList_().end(); for (; borderIt != borderEndIt; ++borderIt) { - int borderPeer = std::get<2>(*borderIt); + int borderPeer = borderIt->peerRank; if (borderPeer != peerRank) continue; - - receiveBorderIndex(peerRank); + if (borderIt->borderDistance == 0) + receiveBorderIndex(peerRank); } } @@ -307,17 +309,16 @@ protected: BorderList::const_iterator borderIt = borderList_().begin(); BorderList::const_iterator borderEndIt = borderList_().end(); for (; borderIt != borderEndIt; ++borderIt) { - int borderPeer = std::get<2>(*borderIt); + int borderPeer = borderIt->peerRank; if (borderPeer != peerRank) continue; - int localIdx = std::get<0>(*borderIt); - int peerIdx = std::get<1>(*borderIt); - sendBorderIndex(peerRank, localIdx, peerIdx); + int localIdx = borderIt->localIdx; + int peerIdx = borderIt->peerIdx; + if (borderIt->borderDistance == 0) + sendBorderIndex(peerRank, localIdx, peerIdx); } } -#else // HAVE_MPI - numDomestic_ = foreignOverlap_.numLocal(); #endif // HAVE_MPI } diff --git a/dumux/linear/impetbicgstabilu0solver.hh b/dumux/linear/impetbicgstabilu0solver.hh index d96f20020a26bef11a369e4ce977f1ca6d518628..d371610872ff42b4ef566f755e41dc1734ff5d93 100644 --- a/dumux/linear/impetbicgstabilu0solver.hh +++ b/dumux/linear/impetbicgstabilu0solver.hh @@ -26,6 +26,7 @@ #ifndef DUMUX_BICGSTAB_ILU0_SOLVER_HH #define DUMUX_BICGSTAB_ILU0_SOLVER_HH +#include <dumux/common/propertysystem.hh> #include <dune/istl/solvers.hh> #include <dune/istl/preconditioners.hh> #include <dumux/common/exceptions.hh> @@ -38,6 +39,17 @@ #include <dumux/linear/overlappingoperator.hh> namespace Dumux { +namespace Properties { +NEW_PROP_TAG(Problem); +NEW_PROP_TAG(PressureCoefficientMatrix); +NEW_PROP_TAG(PressureRHSVector); +NEW_PROP_TAG(SolutionTypes); +NEW_PROP_TAG(GridView); +NEW_PROP_TAG(LSVerbosity); +NEW_PROP_TAG(LSMaxIterations); +NEW_PROP_TAG(LSResidualReduction); +NEW_PROP_TAG(PreconditionerRelaxation); +} /*! * \brief Provides a linear solver for the stabilized BiCG method with diff --git a/dumux/linear/overlappingblockvector.hh b/dumux/linear/overlappingblockvector.hh index 7c8b244944eb19f41246aabab863b091a4db57ff..888b7866a7d2087795bbfe038b240e2b0df6df74 100644 --- a/dumux/linear/overlappingblockvector.hh +++ b/dumux/linear/overlappingblockvector.hh @@ -30,6 +30,7 @@ #include <dune/istl/bvector.hh> #include <dumux/parallel/mpibuffer.hh> +#include <dumux/common/valgrind.hh> namespace Dumux { diff --git a/dumux/linear/seqsolverbackend.hh b/dumux/linear/seqsolverbackend.hh index d0f80122f01464da4ffc5d152f7df3f91783325b..c47f1cb3a27b6a5a43d6d830713e2fda6464f4dc 100644 --- a/dumux/linear/seqsolverbackend.hh +++ b/dumux/linear/seqsolverbackend.hh @@ -54,27 +54,27 @@ NEW_PROP_TAG(PreconditionerIterations); SET_PROP_DEFAULT(LSVerbosity) {public: - static const int value = 0; + static constexpr int value = 0; }; SET_PROP_DEFAULT(LSResidualReduction) {public: - static const double value = 1e-6; + static constexpr double value = 1e-6; }; SET_PROP_DEFAULT(LSMaxIterations) {public: - static const int value = 500; + static constexpr int value = 500; }; SET_PROP_DEFAULT(PreconditionerRelaxation) {public: - static const double value = 1.0; + static constexpr double value = 1.0; }; SET_PROP_DEFAULT(PreconditionerIterations) {public: - static const int value = 1; + static constexpr int value = 1; }; } diff --git a/dumux/linear/vertexborderlistfromgrid.hh b/dumux/linear/vertexborderlistfromgrid.hh index efaa913276c82df4b3718a3a1f244c1c659bd0fd..c8c0e712754745e4e33dde613365bedbfbc8f5a9 100644 --- a/dumux/linear/vertexborderlistfromgrid.hh +++ b/dumux/linear/vertexborderlistfromgrid.hh @@ -27,6 +27,8 @@ #ifndef DUMUX_VERTEX_BORDER_LIST_FROM_GRID_HH #define DUMUX_VERTEX_BORDER_LIST_FROM_GRID_HH +#include "borderindex.hh" + #include <dune/grid/common/datahandleif.hh> #include <dune/common/fmatrix.hh> #include <dune/istl/bcrsmatrix.hh> @@ -57,8 +59,7 @@ class VertexBorderListFromGrid : public Dune::CommDataHandleIF<VertexBorderListF typedef int Index; typedef Index LocalIndex; typedef Index PeerIndex; - typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LindexPindexRank; - typedef std::list<LindexPindexRank> BorderList; + typedef std::list<BorderIndex> BorderList; public: VertexBorderListFromGrid(const GridView &gv, @@ -91,14 +92,14 @@ public: template<class MessageBufferImp, class EntityType> void scatter(MessageBufferImp &buff, const EntityType &e, size_t n) { - int peerRank; - int peerVertIdx; - - buff.read(peerRank); - buff.read(peerVertIdx); + BorderIndex bIdx; + + bIdx.localIdx = map_.map(e); + buff.read(bIdx.peerRank); + buff.read(bIdx.peerIdx); + bIdx.borderDistance = 0; - int localVertIdx = map_.map(e); - borderList_.push_back(LindexPindexRank(localVertIdx, peerVertIdx, peerRank)); + borderList_.push_back(bIdx); }; // Access to the initial seed list. diff --git a/dumux/parallel/elementhandles.hh b/dumux/parallel/elementhandles.hh index cabe829b1c9c5dfaea89437ca9ea256ffb069296..66ce7377ca8cc49767f972cf8ba9d9c3a936e6e2 100644 --- a/dumux/parallel/elementhandles.hh +++ b/dumux/parallel/elementhandles.hh @@ -71,7 +71,6 @@ public: void gather(MessageBufferImp &buff, const EntityType &e) const { int elementIdx = mapper_.map(e); - std::cout << "container_[" << elementIdx << "] -> " << container_[elementIdx] << "\n"; buff.write(container_[elementIdx]); } @@ -82,13 +81,6 @@ public: FieldType tmp; buff.read(tmp); - if (e.partitionType() == Dune::InteriorEntity) - std::cout << "interior: "; - else if (e.partitionType() == Dune::GhostEntity) - std::cout << "ghost: "; - else if (e.partitionType() == Dune::OverlapEntity) - std::cout << "overlap: "; - std::cout << "container_[" << elementIdx << "] <- " << tmp << "\n"; container_[elementIdx] = tmp; } diff --git a/test/decoupled/2p/test_impes.cc b/test/decoupled/2p/test_impes.cc index e925d269c42115ca53369e61bcc7bb6575c21e89..5e2e910f73cb6d3b8a9addbb42a5b18b4c9bab61 100644 --- a/test/decoupled/2p/test_impes.cc +++ b/test/decoupled/2p/test_impes.cc @@ -94,8 +94,9 @@ int main(int argc, char** argv) Dune::FieldVector<int,dim> N(6); N[0] = 30; Dune::FieldVector<double ,dim> L(0); Dune::FieldVector<double,dim> H(60); H[0] = 300; - Grid grid(N,L,H); - + Dune::FieldVector<bool,dim> periodic(false); + Grid grid(Dune::MPIHelper::getCommunicator(), H, N, periodic, /*overlap=*/1); + //////////////////////////////////////////////////////////// // instantiate and run the concrete problem //////////////////////////////////////////////////////////// diff --git a/test/decoupled/2p/test_impes_problem.hh b/test/decoupled/2p/test_impes_problem.hh index e65c6803292c80af3614e2ba4b61acdf40ef7d4d..2a619d24cf392b212369f043aadfe351b27dc425 100644 --- a/test/decoupled/2p/test_impes_problem.hh +++ b/test/decoupled/2p/test_impes_problem.hh @@ -38,6 +38,7 @@ #include <dumux/material/fluidsystems/liquidphase.hh> #include <dumux/material/components/simpleh2o.hh> #include <dumux/material/components/oil.hh> +#include <dumux/linear/impetbicgstabilu0solver.hh> #include <dumux/decoupled/2p/impes/impesproblem2p.hh> #include <dumux/decoupled/2p/diffusion/fv/fvvelocity2p.hh> @@ -66,8 +67,8 @@ NEW_TYPE_TAG(IMPESTestProblem, INHERITS_FROM(DecoupledTwoP, MPFAProperties, Tran // Set the grid type SET_PROP(IMPESTestProblem, Grid) { - // typedef Dune::YaspGrid<2> type; - typedef Dune::SGrid<2, 2> type; + typedef Dune::YaspGrid<2> type; + //typedef Dune::SGrid<2, 2> type; }; // Set the problem property @@ -84,6 +85,7 @@ SET_PROP(IMPESTestProblem, TransportModel) }; SET_TYPE_PROP(IMPESTestProblem, DiffusivePart, Dumux::CapillaryDiffusion<TypeTag>); SET_TYPE_PROP(IMPESTestProblem, ConvectivePart, Dumux::GravityPart<TypeTag>); +SET_TYPE_PROP(IMPESTestProblem, LinearSolver, Dumux::IMPETBiCGStabILU0Solver<TypeTag>); SET_PROP(IMPESTestProblem, PressureModel) {