24#ifndef OPM_ALUGRID_CARTESIAN_INDEX_MAPPER_HPP
25#define OPM_ALUGRID_CARTESIAN_INDEX_MAPPER_HPP
27#include <dune/alugrid/grid.hh>
28#include <dune/alugrid/3d/gridview.hh>
29#include <opm/grid/common/CartesianIndexMapper.hpp>
30#include <dune/grid/common/datahandleif.hh>
31#include <dune/grid/utility/persistentcontainer.hh>
53 using Grid = Dune::ALUGrid<3, 3, Dune::cube, Dune::nonconforming, Dune::ALUGridMPIComm>;
55 using Grid = Dune::ALUGrid<3, 3, Dune::cube, Dune::nonconforming, Dune::ALUGridNoComm>;
59 template <
class Gr
idView>
60 class GlobalIndexDataHandle :
public Dune::CommDataHandleIF<GlobalIndexDataHandle<GridView>, int>
70 GlobalCellIndex& operator=(
const int index)
83 using GlobalIndexContainer =
typename Dune::PersistentContainer<Grid, GlobalCellIndex>;
87 GlobalIndexDataHandle(
const GridView& gridView,
88 std::vector<int>& cartesianIndex)
90 , globalIndex_(gridView.grid(), 0)
91 , cartesianIndex_(cartesianIndex)
93 globalIndex_.resize();
98 GlobalIndexDataHandle(
const GlobalIndexDataHandle& other) = delete ;
101 ~GlobalIndexDataHandle()
104 bool contains(
int ,
int codim)
const
105 {
return codim == 0; }
107 bool fixedsize(
int ,
int )
const
112 template<
class MessageBufferImp,
class EntityType>
113 void gather(MessageBufferImp& buff,
const EntityType& element)
const
115 int globalIdx = globalIndex_[element].index();
116 buff.write(globalIdx);
121 template<
class MessageBufferImp,
class EntityType>
122 void scatter(MessageBufferImp& buff,
const EntityType& element, std::size_t )
125 buff.read(globalIdx);
128 globalIndex_.resize();
129 globalIndex_[element] = globalIdx;
135 template<
class EntityType>
136 std::size_t
size(
const EntityType& )
const
143 auto idx = cartesianIndex_.begin();
144 auto it = gridView_.template begin<0>();
145 const auto& endIt = gridView_.template end<0>();
147 for (; it != endIt; ++it, ++idx)
148 globalIndex_[*it] = *idx;
154 std::vector<int> newIndex ;
155 newIndex.reserve(gridView_.indexSet().size(0));
157 auto it = gridView_.template begin<0>();
158 const auto& endIt = gridView_.template end<0>();
159 for (; it != endIt; ++it)
160 newIndex.push_back(globalIndex_[*it].index()) ;
162 cartesianIndex_.swap(newIndex);
166 GlobalIndexContainer globalIndex_;
167 std::vector<int>& cartesianIndex_;
172 static constexpr int dimension = Grid::dimension ;
176 const std::array<int, dimension>& cartDims,
177 const std::vector<int>& cartesianIndex)
179 , cartesianDimensions_(cartDims)
180 , cartesianIndex_(cartesianIndex)
181 , cartesianSize_(computeCartesianSize())
186 {
return cartesianDimensions_; }
190 {
return cartesianSize_; }
194 {
return cartesianIndex_.size(); }
198 {
return cartesianIndex_.size(); }
203 assert(compressedElementIndex < compressedSize());
204 return cartesianIndex_[compressedElementIndex];
210 int cartIndex = coords[0];
211 int factor = cartesianDimensions()[0];
212 for (
int i=1; i < dimension; ++i) {
213 cartIndex += coords[i] * factor;
214 factor *= cartesianDimensions()[i];
223 int gc = cartesianIndex(compressedElementIndex);
224 if constexpr (dimension == 3) {
225 coords[0] = gc % cartesianDimensions()[0];
226 gc /= cartesianDimensions()[0];
227 coords[1] = gc % cartesianDimensions()[1];
228 coords[2] = gc / cartesianDimensions()[1];
230 else if constexpr (dimension == 2) {
231 coords[0] = gc % cartesianDimensions()[0];
232 coords[1] = gc / cartesianDimensions()[0];
234 else if constexpr (dimension == 1)
237 throw std::invalid_argument(
"cartesianCoordinate not implemented for dimension " + std::to_string(dimension));
244 throw std::invalid_argument(
"Invalid level.\n");
246 cartesianCoordinate(compressedElementIndex, coords);
249 template <
class Gr
idView>
250 std::unique_ptr<GlobalIndexDataHandle<GridView> > dataHandle(
const GridView& gridView)
252 using DataHandle = GlobalIndexDataHandle<GridView>;
253 assert(&grid_ == &gridView.grid());
254 return std::make_unique<DataHandle>(gridView, cartesianIndex_);
258 int computeCartesianSize()
const
260 int size = cartesianDimensions()[0];
261 for (
int d=1; d<dimension; ++d)
262 size *= cartesianDimensions()[d];
267 const std::array<int, dimension> cartesianDimensions_;
268 std::vector<int> cartesianIndex_;
269 const int cartesianSize_ ;
void gather(MessageBufferImp &buff, const EntityType &element) const
loop over all internal data handlers and call gather for given entity
Definition AluGridCartesianIndexMapper.hpp:113
std::size_t size(const EntityType &) const
loop over all internal data handlers and return sum of data size of given entity
Definition AluGridCartesianIndexMapper.hpp:136
void scatter(MessageBufferImp &buff, const EntityType &element, std::size_t)
loop over all internal data handlers and call scatter for given entity
Definition AluGridCartesianIndexMapper.hpp:122
Definition CollectDataOnIORank.hpp:51