26#ifndef PROPS_CENTROIDS_DATAHANDLE_HPP
27#define PROPS_CENTROIDS_DATAHANDLE_HPP
30#include <opm/simulators/utils/ParallelEclipseState.hpp>
31#include <opm/simulators/utils/ParallelRestart.hpp>
32#include <dune/grid/common/datahandleif.hh>
33#include <dune/grid/common/mcmgmapper.hh>
34#include <dune/grid/common/partitionset.hh>
35#include <dune/common/parallel/mpihelper.hh>
36#include <unordered_map>
48class PropsCentroidsDataHandle
49 :
public Dune::CommDataHandleIF< PropsCentroidsDataHandle<Grid>, double>
53 using DataType = std::pair<double, unsigned char>;
64 PropsCentroidsDataHandle(
const Grid& grid, ParallelEclipseState& eclState,
65 const EclipseGrid* eclGridOnRoot,
66 std::vector<double>& centroids,
69 m_distributed_fieldProps(eclState.m_fieldProps),
70 m_centroids(centroids)
73 const Parallel::Communication comm = m_grid.comm();
76 const FieldPropsManager& globalProps = eclState.globalFieldProps();
77 m_intKeys = globalProps.keys<
int>();
78 m_doubleKeys = globalProps.keys<
double>();
79 m_distributed_fieldProps.copyTran(globalProps);
82 EclMpiSerializer ser(comm);
85 m_no_data = m_intKeys.size() + m_doubleKeys.size() + Grid::dimensionworld;
87 if (comm.rank() == 0) {
88 const FieldPropsManager& globalProps = eclState.globalFieldProps();
89 const auto& idSet = m_grid.localIdSet();
90 const auto& gridView = m_grid.levelGridView(0);
92 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
93 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
95 for (
const auto &element : elements(gridView, Dune::Partitions::interiorBorder))
97 const auto&
id = idSet.id(element);
98 auto index = elemMapper.index(element);
99 auto& data = elementData_[id];
100 data.reserve(m_no_data);
102 for (
const auto& intKey : m_intKeys)
104 const auto& fieldData = globalProps.get_int_field_data(intKey);
105 data.emplace_back(fieldData.data[index],
106 static_cast<unsigned char>(fieldData.value_status[index]));
109 for (
const auto& doubleKey : m_doubleKeys)
113 const auto& fieldData = globalProps.get_double_field_data(doubleKey,
115 data.emplace_back(fieldData.data[index],
116 static_cast<unsigned char>(fieldData.value_status[index]));
119 auto cartIndex = cartMapper.cartesianIndex(index);
120 const auto& center = eclGridOnRoot->getCellCenter(cartIndex);
121 for (
int dim = 0; dim < Grid::dimensionworld; ++dim)
122 data.emplace_back(center[dim],
'1');
127 ~PropsCentroidsDataHandle()
130 for (
const auto& intKey : m_intKeys)
132 m_distributed_fieldProps.m_intProps[intKey].data.resize(m_grid.size(0));
133 m_distributed_fieldProps.m_intProps[intKey].value_status.resize(m_grid.size(0));
136 for (
const auto& doubleKey : m_doubleKeys)
138 m_distributed_fieldProps.m_doubleProps[doubleKey].data.resize(m_grid.size(0));
139 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status.resize(m_grid.size(0));
142 m_centroids.resize(m_grid.size(0) * Grid::dimensionworld);
145 const auto& idSet = m_grid.localIdSet();
146 const auto& gridView = m_grid.levelGridView(0);
147 using ElementMapper =
148 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
149 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
151 for (
const auto &element : elements( gridView, Dune::Partitions::all))
153 std::size_t counter{};
154 const auto&
id = idSet.id(element);
155 auto index = elemMapper.index(element);
156 auto data = elementData_.find(
id);
157 assert(data != elementData_.end());
159 for (
const auto& intKey : m_intKeys)
161 const auto& pair = data->second[counter++];
162 m_distributed_fieldProps.m_intProps[intKey].data[index] =
static_cast<int>(pair.first);
163 m_distributed_fieldProps.m_intProps[intKey].value_status[index] =
static_cast<value::status
>(pair.second);
166 for (
const auto& doubleKey : m_doubleKeys)
168 const auto& pair = data->second[counter++];
169 m_distributed_fieldProps.m_doubleProps[doubleKey].data[index] = pair.first;
170 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status[index] =
static_cast<value::status
>(pair.second);
173 auto centroidIter = m_centroids.begin() + Grid::dimensionworld * index;
174 auto centroidIterEnd = centroidIter + Grid::dimensionworld;
175 for ( ; centroidIter != centroidIterEnd; ++centroidIter )
176 *centroidIter = data->second[counter++].first;
180 bool contains(
int ,
int codim)
185 bool fixedsize(
int ,
int )
189 bool fixedSize(
int ,
int )
194 template<
class EntityType>
195 std::size_t size(
const EntityType )
200 template<
class BufferType,
class EntityType>
201 void gather(BufferType& buffer,
const EntityType& e)
const
203 auto iter = elementData_.find(m_grid.localIdSet().id(e));
204 assert(iter != elementData_.end());
205 for (
const auto& data : iter->second)
211 template<
class BufferType,
class EntityType>
212 void scatter(BufferType& buffer,
const EntityType& e, std::size_t n)
214 assert(n == m_no_data);
215 auto& array = elementData_[m_grid.localIdSet().id(e)];
217 for (
auto& data : array)
223 template<
class Serializer>
224 void serializeOp(Serializer& serializer)
226 serializer(m_intKeys);
227 serializer(m_doubleKeys);
228 m_distributed_fieldProps.serializeOp(serializer);
232 using LocalIdSet =
typename Grid::LocalIdSet;
235 ParallelFieldPropsManager& m_distributed_fieldProps;
237 std::vector<std::string> m_intKeys;
239 std::vector<std::string> m_doubleKeys;
243 std::unordered_map<typename LocalIdSet::IdType, std::vector<std::pair<double,unsigned char> > > elementData_;
245 std::vector<double>& m_centroids;
247 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