void assign_permeability(RI& r, int nc, double k) { typedef typename RI::SharedPermTensor Tensor; for (int c = 0; c < nc; ++c) { Tensor K = r.permeabilityModifiable(c); for (int i = 0; i < dim; ++i) { K(i,i) = k; } } }
int main(int argc, char** argv) { typedef Dune::GridInterfaceEuler<CpGrid> GI; typedef GI ::CellIterator CI; typedef CI ::FaceIterator FI; typedef Dune::BasicBoundaryConditions<true, false> BCs; typedef Dune::ReservoirPropertyCapillary<3> RI; typedef Dune::IncompFlowSolverHybrid<GI, RI, BCs, Dune::MimeticIPEvaluator> FlowSolver; Opm::parameter::ParameterGroup param(argc, argv); CpGrid grid; grid.init(param); //grid.setUniqueBoundaryIds(true); GridInterfaceEuler<CpGrid> g(grid); typedef Dune::FlowBC BC; BCs flow_bc(7); #define BCDIR 4 #if BCDIR == 1 flow_bc.flowCond(1) = BC(BC::Dirichlet, 1.0*Opm::unit::barsa); flow_bc.flowCond(2) = BC(BC::Dirichlet, 0.0*Opm::unit::barsa); #elif BCDIR == 2 flow_bc.flowCond(3) = BC(BC::Dirichlet, 1.0*Opm::unit::barsa); flow_bc.flowCond(4) = BC(BC::Dirichlet, 0.0*Opm::unit::barsa); #elif BCDIR == 3 flow_bc.flowCond(5) = BC(BC::Dirichlet, 1.0*Opm::unit::barsa); flow_bc.flowCond(6) = BC(BC::Dirichlet, 0.0*Opm::unit::barsa); #elif BCDIR == 4 flow_bc.flowCond(5) = BC(BC::Dirichlet, 1.0*Opm::unit::barsa); #endif RI r; r.init(g.numberOfCells()); std::vector<double> permdata; fill_perm(permdata); ASSERT (int(permdata.size()) == 3 * 60 * 220 * 85); Dune::SharedFortranMatrix Perm(60 * 220 * 85, 3, &permdata[0]); const int imin = param.get<int>("imin"); const int jmin = param.get<int>("jmin"); const int kmin = param.get<int>("kmin"); for (int c = 0; c < g.numberOfCells(); ++c) { boost::array<int,3> ijk; grid.getIJK(c, ijk); ijk[0] += imin; ijk[1] += jmin; ijk[2] += kmin; const int gc = ijk[0] + 60*(ijk[1] + 220*ijk[2]); RI::SharedPermTensor K = r.permeabilityModifiable(c); K(0,0) = 0*0.1*Opm::unit::darcy + 1*Perm(gc,0); K(1,1) = 0*0.1*Opm::unit::darcy + 1*Perm(gc,1); K(2,2) = 0*0.1*Opm::unit::darcy + 1*Perm(gc,2); } #if 1 CI::Vector gravity; gravity[0] = gravity[1] = gravity[2] = 0.0; #if 1 gravity[2] = Opm::unit::gravity; gravity[2] = 10; //Opm::unit::gravity; #endif #endif FlowSolver solver; solver.init(g, r, gravity, flow_bc); #if 1 std::vector<double> src(g.numberOfCells(), 0.0); std::vector<double> sat(g.numberOfCells(), 0.0); #if 0 const int nx = param.get<int>("nx"); const int ny = param.get<int>("ny"); const int nz = param.get<int>("nz"); const int i = 0 + nz*(nx/2 + nx*ny/2 ), p1 = 0 + nz*(0 + nx*0 ), p2 = 0 + nz*((nx-1) + nx*0 ), p3 = 0 + nz*(0 + nx*(ny-1)), p4 = 0 + nz*((nx-1) + nx*(ny-1)); const double bbl = 0.159 * unit::cubic(unit::meter); const double irate = 1.0e4 * bbl / unit::day; for (int z = 0; z < nz; ++z) { src[i + z] = irate / nz; src[p1 + z] = -(irate / nz) / 4; src[p2 + z] = -(irate / nz) / 4; src[p3 + z] = -(irate / nz) / 4; src[p4 + z] = -(irate / nz) / 4; } #endif solver.solve(r, sat, flow_bc, src, 5.0e-8, 3); #endif #if 1 std::vector<GI::Vector> cell_velocity; estimateCellVelocity(cell_velocity, g, solver.getSolution()); // 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, solver.getSolution()); Dune::VTKWriter<CpGrid::LeafGridView> vtkwriter(grid.leafView()); vtkwriter.addCellData(cell_velocity_flat, "velocity", 3); vtkwriter.addCellData(cell_pressure, "pressure"); vtkwriter.write("spe10_test_output", Dune::VTKOptions::ascii); #endif return 0; }