void run_test(const Opm::parameter::ParameterGroup& param) { int N=100; int procs, rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &procs); int n = N/procs; // number of unknowns per process int bigger = N%procs; // number of process with n+1 unknows int start, end, istart, iend; // Compute owner region if(rank<bigger) { start = rank*(n+1); end = start+(n+1); }else{ start = bigger*(n+1) + (rank-bigger) * n; end = start+n; } // Compute owner region if(rank<bigger) { istart = rank*(n+1); iend = start+(n+1); }else{ istart = bigger*(n+1) + (rank-bigger) * n; iend = start+n; } // Compute overlap region if(istart>0) start = istart - 1; else start = istart; if(iend<N) end = iend + 1; else end = iend; Opm::ParallelISTLInformation comm(MPI_COMM_WORLD); auto mat = create1DLaplacian(*comm.indexSet(), N, start, end, istart, iend); std::vector<double> x(end-start), b(end-start); createRandomVectors(comm, end-start, x, b, *mat); std::vector<double> exact(x); std::fill(x.begin(), x.end(), 0.0); Opm::LinearSolverFactory ls(param); boost::any anyComm(comm); ls.solve(b.size(), mat->data.size(), &(mat->rowStart[0]), &(mat->colIndex[0]), &(mat->data[0]), &(b[0]), &(x[0]), anyComm); }
void run_test(const Opm::parameter::ParameterGroup& param) { int N=100; int start, end, istart, iend; std::tie(start,istart,iend,end) = computeRegions(N); Opm::ParallelISTLInformation comm(MPI_COMM_WORLD); auto mat = create1DLaplacian(*comm.indexSet(), N, start, end, istart, iend); std::vector<double> x(end-start), b(end-start); createRandomVectors(comm, end-start, x, b, *mat); std::vector<double> exact(x); std::fill(x.begin(), x.end(), 0.0); Opm::LinearSolverFactory ls(param); boost::any anyComm(comm); ls.solve(b.size(), mat->data.size(), &(mat->rowStart[0]), &(mat->colIndex[0]), &(mat->data[0]), &(b[0]), &(x[0]), anyComm); }
void runSumMaxMinTest(const int offset) { const int N=100; int start, end, istart, iend; std::tie(start,istart,iend,end) = computeRegions(N); Opm::ParallelISTLInformation comm(MPI_COMM_WORLD); auto mat = create1DLaplacian(*comm.indexSet(), N, start, end, istart, iend); std::vector<int> x(end-start); assert(comm.indexSet()->size()==x.size()); for(auto i=comm.indexSet()->begin(), iend=comm.indexSet()->end(); i!=iend; ++i) x[i->local()]=i->global()+offset; auto containers = std::make_tuple(x, x, x); auto operators = std::make_tuple(Opm::Reduction::makeGlobalSumFunctor<int>(), Opm::Reduction::makeGlobalMaxFunctor<int>(), Opm::Reduction::makeGlobalMinFunctor<int>()); auto values = std::make_tuple(0,0,100000); auto oldvalues = values; comm.computeReduction(containers,operators,values); BOOST_CHECK(std::get<0>(values)==std::get<0>(oldvalues)+((N-1+2*offset)*N)/2); BOOST_CHECK(std::get<1>(values)==std::max(N+offset-1, std::get<1>(oldvalues))); BOOST_CHECK(std::get<2>(values)==std::min(offset, std::get<2>(oldvalues))); }