void test_flowsolver(const GI& g, const RI& r) { typedef typename GI::CellIterator CI; typedef typename CI::FaceIterator FI; typedef Opm::BasicBoundaryConditions<true, false> FBC; typedef Opm::IncompFlowSolverHybrid<GI, RI, FBC, Opm::MimeticIPAnisoRelpermEvaluator> FlowSolver; FlowSolver solver; typedef Opm::FlowBC BC; FBC flow_bc(7); //flow_bc.flowCond(1) = BC(BC::Dirichlet, 1.0*Opm::unit::barsa); //flow_bc.flowCond(2) = BC(BC::Dirichlet, 0.0*Opm::unit::barsa); flow_bc.flowCond(5) = BC(BC::Dirichlet, 100.0*Opm::unit::barsa); typename CI::Vector gravity; gravity[0] = gravity[1] = 0.0; gravity[2] = Opm::unit::gravity; solver.init(g, r, gravity, flow_bc); // solver.printStats(std::cout); //solver.assembleStatic(g, r); //solver.printIP(std::cout); std::vector<double> src(g.numberOfCells(), 0.0); std::vector<double> sat(g.numberOfCells(), 0.0); #if 0 if (g.numberOfCells() > 1) { src[0] = 1.0; src.back() = -1.0; } #endif solver.solve(r, sat, flow_bc, src); #if 0 solver.printSystem("system"); typedef typename FlowSolver::SolutionType FlowSolution; FlowSolution soln = solver.getSolution(); std::cout << "Cell Pressure:\n" << std::scientific << std::setprecision(15); for (CI c = g.cellbegin(); c != g.cellend(); ++c) { std::cout << '\t' << soln.pressure(c) << '\n'; } std::cout << "Cell (Out) Fluxes:\n"; std::cout << "flux = [\n"; for (CI c = g.cellbegin(); c != g.cellend(); ++c) { for (FI f = c->facebegin(); f != c->faceend(); ++f) { std::cout << soln.outflux(f) << ' '; } std::cout << "\b\n"; } std::cout << "]\n"; #endif }
void test_flowsolver(const GI& g, const RI& r) { typedef typename GI::CellIterator CI; typedef typename CI::FaceIterator FI; typedef Opm::BasicBoundaryConditions<true, false> FBC; typedef Opm::IncompFlowSolverHybrid<GI, RI, FBC, Opm::MimeticIPEvaluator> FlowSolver; FlowSolver solver; typedef Opm::FlowBC BC; FBC flow_bc(7); #if !USE_ALUGRID flow_bc.flowCond(5) = BC(BC::Dirichlet, 100.0*Opm::unit::barsa); flow_bc.flowCond(6) = BC(BC::Dirichlet, 0.0*Opm::unit::barsa); #endif typename CI::Vector gravity(0.0); // gravity[2] = Dune::unit::gravity; solver.init(g, r, gravity, flow_bc); std::vector<double> src(g.numberOfCells(), 0.0); std::vector<double> sat(g.numberOfCells(), 0.0); // if (g.numberOfCells() > 1) { // src[0] = 1.0; // src.back() = -1.0; // } solver.solve(r, sat, flow_bc, src, 5e-9, 3, 1); #if 1 typedef typename FlowSolver::SolutionType FlowSolution; FlowSolution soln = solver.getSolution(); std::vector<typename GI::Vector> cell_velocity; estimateCellVelocity(cell_velocity, g, soln); // Dune's vtk writer wants multi-component data to be flattened. std::vector<double> cell_velocity_flat(&*cell_velocity.front().begin(), &*cell_velocity.back().end()); std::vector<double> cell_pressure; getCellPressure(cell_pressure, g, soln); Dune::VTKWriter<typename GI::GridType::LeafGridView> vtkwriter(g.grid().leafView()); vtkwriter.addCellData(cell_velocity_flat, "velocity", dim); vtkwriter.addCellData(cell_pressure, "pressure"); vtkwriter.write("testsolution-" + boost::lexical_cast<std::string>(0), Dune::VTKOptions::ascii); #else solver.printSystem("system"); typedef typename FlowSolver::SolutionType FlowSolution; FlowSolution soln = solver.getSolution(); std::cout << "Cell Pressure:\n" << std::scientific << std::setprecision(15); for (CI c = g.cellbegin(); c != g.cellend(); ++c) { std::cout << '\t' << soln.pressure(c) << '\n'; } std::cout << "Cell (Out) Fluxes:\n"; std::cout << "flux = [\n"; for (CI c = g.cellbegin(); c != g.cellend(); ++c) { for (FI f = c->facebegin(); f != c->faceend(); ++f) { std::cout << soln.outflux(f) << ' '; } std::cout << "\b\n"; } std::cout << "]\n"; #endif }