예제 #1
0
void CCSVWriter::WriteRevProps (std::ostream& os, const CCachedLogInfo& cache)
{
	// header

	os << "ID,Revision,RevPropID,Value\n";

	// content

	const CRevisionIndex& revisions = cache.GetRevisions();
	const CRevisionInfoContainer& logInfo = cache.GetLogInfo();

	// ids will be added on-the-fly

	size_t id = 0;
	for ( revision_t revision = revisions.GetFirstRevision()
		, last = revisions.GetLastRevision()
		; revision < last
		; ++revision)
	{
		index_t index = revisions[revision];
        if (index == NO_INDEX)
            continue;

		typedef CRevisionInfoContainer::CUserRevPropsIterator RI;

		if (  logInfo.GetPresenceFlags (index) 
            & CRevisionInfoContainer::HAS_USERREVPROPS)
		{
			// we actually have a valid (possibly empty) merge list 
			// for this revision

			for ( RI iter = logInfo.GetUserRevPropsBegin (index)
				, end = logInfo.GetUserRevPropsEnd (index)
				; iter != end
				; ++iter)
			{
				std::string value = iter->GetValue();
				Escape (value);

				os << id++ << ',' 
				   << revision << ','
				   << iter->GetNameID()<< ",\""
				   << value.c_str()
				   << "\"\n";
			}
		}
	}
}
예제 #2
0
 CI operator () (
     const W &width, const RI &observer, const RL &light,
     const I &intersection, const CI &incident, const G &
 ) const {
     typedef typename RI::local_coord_type accuracy;
     const accuracy ci = -dot(observer.direction(), intersection.direction());
     const unit_vector< accuracy > ri(
         observer.direction() +
             intersection.direction() * accuracy(2) * ci);
     const accuracy costheta(dot(ri, light.direction()));
     if ( costheta > accuracy() ) {
         return incident * std::pow(costheta, width);
     } else {
         return CI();
     }
 }
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;
        }
    }
}
예제 #4
0
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;
}