ebos: introduce a mapper from compressed to cartesian cell indices of the EQUIL grid

this is because the nice opm-core code which does the equil
initialization cannot cope with parallel grids and thus needs to get
a special treatment.
This commit is contained in:
Andreas Lauser
2016-01-17 21:15:18 +01:00
parent 8fc838cff3
commit 99a59c021f
4 changed files with 53 additions and 18 deletions

View File

@@ -66,10 +66,8 @@ public:
private:
typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
typedef Grid* GridPointer;
typedef EquilGrid* EquilGridPointer;
typedef Ewoms::AluCartesianIndexMapper<Grid> CartesianIndexMapper;
typedef CartesianIndexMapper* CartesianIndexMapperPointer;
typedef Dune::CartesianIndexMapper<EquilGrid> EquilCartesianIndexMapper;
static const int dimension = Grid::dimension;
@@ -82,6 +80,7 @@ public:
~EclAluGridManager()
{
delete cartesianIndexMapper_;
delete equilCartesianIndexMapper_;
delete grid_;
delete equilGrid_;
}
@@ -119,6 +118,9 @@ public:
*/
void releaseEquilGrid()
{
delete equilCartesianIndexMapper_;
equilCartesianIndexMapper_ = 0;
delete equilGrid_;
equilGrid_ = 0;
}
@@ -147,6 +149,12 @@ public:
const CartesianIndexMapper& cartesianIndexMapper() const
{ return *cartesianIndexMapper_; }
/*!
* \brief Returns mapper from compressed to cartesian indices for the EQUIL grid
*/
const EquilCartesianIndexMapper& equilCartesianIndexMapper() const
{ return *equilCartesianIndexMapper_; }
protected:
void createGrids_()
{
@@ -167,14 +175,16 @@ protected:
/*clipZ=*/false,
porv);
/////
// create the simulation grid
/////
cartesianCellId_ = equilGrid_->globalCell();
for (unsigned i = 0; i < dimension; ++i)
cartesianDimension_[i] = equilGrid_->logicalCartesianSize()[i];
equilCartesianIndexMapper_ = new EquilCartesianIndexMapper(*equilGrid_);
/////
// create the simulation grid
/////
Dune::FromToGridFactory<Grid> factory;
grid_ = factory.convert(*equilGrid_, cartesianCellId_);
@@ -182,11 +192,12 @@ protected:
new CartesianIndexMapper(*grid_, cartesianDimension_, cartesianCellId_);
}
GridPointer grid_;
EquilGridPointer equilGrid_;
Grid* grid_;
EquilGrid* equilGrid_;
std::vector<int> cartesianCellId_;
std::array<int,dimension> cartesianDimension_;
CartesianIndexMapperPointer cartesianIndexMapper_;
CartesianIndexMapper* cartesianIndexMapper_;
EquilCartesianIndexMapper* equilCartesianIndexMapper_;
};
} // namespace Ewoms

View File

@@ -212,6 +212,21 @@ public:
void cartesianCoordinate(unsigned cellIdx, std::array<int,3>& ijk) const
{ return asImp_().cartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); }
/*!
* \brief Returns the Cartesian cell id given an element index for the grid used for equilibration
*/
unsigned equilCartesianIndex(unsigned compressedEquilCellIdx) const
{ return asImp_().equilCartesianIndexMapper().cartesianIndex(compressedEquilCellIdx); }
/*!
* \brief Extract Cartesian index triplet (i,j,k) of an active cell of the grid used for EQUIL.
*
* \param [in] cellIdx Active cell index.
* \param [out] ijk Cartesian index triplet
*/
void equilCartesianCoordinate(unsigned cellIdx, std::array<int,3>& ijk) const
{ return asImp_().equilCartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); }
private:
Implementation& asImp_()
{ return *static_cast<Implementation*>(this); }

View File

@@ -62,11 +62,7 @@ public:
private:
typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
typedef Grid* GridPointer;
typedef EquilGrid* EquilGridPointer;
typedef Dune::CartesianIndexMapper<Grid> CartesianIndexMapper;
typedef CartesianIndexMapper* CartesianIndexMapperPointer;
public:
/*!
@@ -77,6 +73,7 @@ public:
~EclCpGridManager()
{
delete cartesianIndexMapper_;
delete equilCartesianIndexMapper_;
delete grid_;
delete equilGrid_;
}
@@ -116,6 +113,9 @@ public:
{
delete equilGrid_;
equilGrid_ = 0;
delete equilCartesianIndexMapper_;
equilCartesianIndexMapper_ = 0;
}
/*!
@@ -138,6 +138,12 @@ public:
const CartesianIndexMapper& cartesianIndexMapper() const
{ return *cartesianIndexMapper_; }
/*!
* \brief Returns mapper from compressed to cartesian indices for the EQUIL grid
*/
const CartesianIndexMapper& equilCartesianIndexMapper() const
{ return *equilCartesianIndexMapper_; }
protected:
void createGrids_()
{
@@ -160,11 +166,13 @@ protected:
/*flipNormals=*/false,
/*clipZ=*/false,
porv);
equilCartesianIndexMapper_ = new CartesianIndexMapper(*equilGrid_);
}
GridPointer grid_;
EquilGridPointer equilGrid_;
CartesianIndexMapperPointer cartesianIndexMapper_;
Grid* grid_;
EquilGrid* equilGrid_;
CartesianIndexMapper* cartesianIndexMapper_;
CartesianIndexMapper* equilCartesianIndexMapper_;
};
} // namespace Ewoms

View File

@@ -730,8 +730,9 @@ private:
const std::vector<int>& pvtnumData =
eclState->getIntGridProperty("PVTNUM")->getData();
rockTableIdx_.resize(gridManager.gridView().size(/*codim=*/0));
for (size_t elemIdx = 0; elemIdx < rockTableIdx_.size(); ++ elemIdx) {
unsigned numElem = gridManager.gridView().size(0);
rockTableIdx_.resize(numElem);
for (size_t elemIdx = 0; elemIdx < numElem; ++ elemIdx) {
unsigned cartElemIdx = gridManager.cartesianIndex(elemIdx);
// reminder: Eclipse uses FORTRAN-style indices