26#ifndef PROPS_CENTROIDS_DATAHANDLE_HPP
27#define PROPS_CENTROIDS_DATAHANDLE_HPP
31#include <opm/input/eclipse/EclipseState/Grid/FieldData.hpp>
33#include <opm/simulators/utils/ParallelEclipseState.hpp>
34#include <opm/simulators/utils/ParallelRestart.hpp>
35#include <dune/grid/common/datahandleif.hh>
36#include <dune/grid/common/mcmgmapper.hh>
37#include <dune/grid/common/partitionset.hh>
38#include <dune/common/parallel/mpihelper.hh>
39#include <unordered_map>
51class PropsCentroidsDataHandle
52 :
public Dune::CommDataHandleIF< PropsCentroidsDataHandle<Grid>, double>
56 using DataType = std::pair<double, unsigned char>;
67 PropsCentroidsDataHandle(
const Grid& grid, ParallelEclipseState& eclState,
68 const EclipseGrid* eclGridOnRoot,
69 std::vector<double>& centroids,
72 m_distributed_fieldProps(eclState.m_fieldProps),
73 m_centroids(centroids)
76 const Parallel::Communication comm = m_grid.comm();
79 const FieldPropsManager& globalProps = eclState.globalFieldProps();
80 m_intKeys = globalProps.keys<
int>();
81 m_doubleKeys = globalProps.keys<
double>();
82 m_distributed_fieldProps.copyTran(globalProps);
85 EclMpiSerializer ser(comm);
88 m_no_data = m_intKeys.size() + m_doubleKeys.size() + Grid::dimensionworld;
90 if (comm.rank() == 0) {
91 const FieldPropsManager& globalProps = eclState.globalFieldProps();
92 const auto& idSet = m_grid.localIdSet();
93 const auto& gridView = m_grid.levelGridView(0);
95 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
96 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
98 for (
const auto &element : elements(gridView, Dune::Partitions::interiorBorder))
100 const auto&
id = idSet.id(element);
101 auto index = elemMapper.index(element);
102 auto& data = elementData_[id];
103 data.reserve(m_no_data);
105 for (
const auto& intKey : m_intKeys)
107 const auto& fieldData = globalProps.get_int_field_data(intKey);
108 data.emplace_back(fieldData.data[index],
109 static_cast<unsigned char>(fieldData.value_status[index]));
112 for (
const auto& doubleKey : m_doubleKeys)
116 const auto& fieldData = globalProps.get_double_field_data(doubleKey,
118 data.emplace_back(fieldData.data[index],
119 static_cast<unsigned char>(fieldData.value_status[index]));
122 auto cartIndex = cartMapper.cartesianIndex(index);
123 const auto& center = eclGridOnRoot->getCellCenter(cartIndex);
124 for (
int dim = 0; dim < Grid::dimensionworld; ++dim)
125 data.emplace_back(center[dim],
'1');
130 ~PropsCentroidsDataHandle()
133 for (
const auto& intKey : m_intKeys)
135 m_distributed_fieldProps.m_intProps[intKey].data.resize(m_grid.size(0));
136 m_distributed_fieldProps.m_intProps[intKey].value_status.resize(m_grid.size(0));
139 for (
const auto& doubleKey : m_doubleKeys)
141 m_distributed_fieldProps.m_doubleProps[doubleKey].data.resize(m_grid.size(0));
142 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status.resize(m_grid.size(0));
145 m_centroids.resize(m_grid.size(0) * Grid::dimensionworld);
148 const auto& idSet = m_grid.localIdSet();
149 const auto& gridView = m_grid.levelGridView(0);
150 using ElementMapper =
151 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
152 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
154 for (
const auto &element : elements( gridView, Dune::Partitions::all))
156 std::size_t counter{};
157 const auto&
id = idSet.id(element);
158 auto index = elemMapper.index(element);
159 auto data = elementData_.find(
id);
160 assert(data != elementData_.end());
162 for (
const auto& intKey : m_intKeys)
164 const auto& pair = data->second[counter++];
165 m_distributed_fieldProps.m_intProps[intKey].data[index] =
static_cast<int>(pair.first);
166 m_distributed_fieldProps.m_intProps[intKey].value_status[index] =
static_cast<value::status
>(pair.second);
169 for (
const auto& doubleKey : m_doubleKeys)
171 const auto& pair = data->second[counter++];
172 m_distributed_fieldProps.m_doubleProps[doubleKey].data[index] = pair.first;
173 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status[index] =
static_cast<value::status
>(pair.second);
176 auto centroidIter = m_centroids.begin() + Grid::dimensionworld * index;
177 auto centroidIterEnd = centroidIter + Grid::dimensionworld;
178 for ( ; centroidIter != centroidIterEnd; ++centroidIter )
179 *centroidIter = data->second[counter++].first;
183 bool contains(
int ,
int codim)
188 bool fixedsize(
int ,
int )
192 bool fixedSize(
int ,
int )
197 template<
class EntityType>
198 std::size_t size(
const EntityType )
203 template<
class BufferType,
class EntityType>
204 void gather(BufferType& buffer,
const EntityType& e)
const
206 auto iter = elementData_.find(m_grid.localIdSet().id(e));
207 assert(iter != elementData_.end());
208 for (
const auto& data : iter->second)
214 template<
class BufferType,
class EntityType>
215 void scatter(BufferType& buffer,
const EntityType& e, std::size_t n)
217 assert(n == m_no_data);
218 auto& array = elementData_[m_grid.localIdSet().id(e)];
220 for (
auto& data : array)
226 template<
class Serializer>
227 void serializeOp(Serializer& serializer)
229 serializer(m_intKeys);
230 serializer(m_doubleKeys);
231 m_distributed_fieldProps.serializeOp(serializer);
235 using LocalIdSet =
typename Grid::LocalIdSet;
238 ParallelFieldPropsManager& m_distributed_fieldProps;
240 std::vector<std::string> m_intKeys;
242 std::vector<std::string> m_doubleKeys;
246 std::unordered_map<typename LocalIdSet::IdType, std::vector<std::pair<double,unsigned char> > > elementData_;
248 std::vector<double>& m_centroids;
250 std::size_t m_no_data;
Definition findOverlapRowsAndColumns.hpp:29
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition BlackoilPhases.hpp:27