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>
48 class 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,
67 const typename Dune::CartesianIndexMapper<Grid>& cartMapper)
68 : m_grid(grid), m_distributed_fieldProps(eclState.m_fieldProps),
69 m_centroids(centroids)
72 const Parallel::Communication comm = m_grid.comm();
75 const auto& globalProps = eclState.globalFieldProps();
76 m_intKeys = globalProps.keys<
int>();
77 m_doubleKeys = globalProps.keys<
double>();
78 std::size_t packSize = Mpi::packSize(m_intKeys, comm) +
79 Mpi::packSize(m_doubleKeys,comm);
80 std::vector<char> buffer(packSize);
82 Mpi::pack(m_intKeys, buffer, position, comm);
83 Mpi::pack(m_doubleKeys, buffer, position, comm);
84 int calcStart = position;
86 std::vector<char> tran_buffer = globalProps.serialize_tran();
87 position += tran_buffer.size();
88 buffer.insert(buffer.end(), std::make_move_iterator(tran_buffer.begin()), std::make_move_iterator(tran_buffer.end()));
90 comm.broadcast(&position, 1, 0);
91 comm.broadcast(buffer.data(), position, 0);
94 m_distributed_fieldProps.deserialize_tran( std::vector<char>(buffer.begin() + calcStart, buffer.end()) );
97 m_no_data = m_intKeys.size() + m_doubleKeys.size() +
99 const auto& idSet = m_grid.localIdSet();
100 const auto& gridView = m_grid.levelGridView(0);
101 using ElementMapper =
102 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
103 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
105 for(
const auto &element : elements( gridView, Dune::Partitions::interiorBorder ) )
107 const auto&
id = idSet.id(element);
108 auto index = elemMapper.index(element);
109 auto& data = elementData_[id];
110 data.reserve(m_no_data);
112 for (
const auto& intKey : m_intKeys)
114 const auto& fieldData = globalProps.get_int_field_data(intKey);
115 data.emplace_back(fieldData.data[index],
116 static_cast<unsigned char>(fieldData.value_status[index]));
119 for (
const auto& doubleKey : m_doubleKeys)
123 const auto& fieldData = globalProps.get_double_field_data(doubleKey,
125 data.emplace_back(fieldData.data[index],
126 static_cast<unsigned char>(fieldData.value_status[index]));
129 auto cartIndex = cartMapper.cartesianIndex(index);
130 const auto& center = eclGridOnRoot->getCellCenter(cartIndex);
131 for (
int dim = 0; dim < Grid::dimensionworld; ++dim)
132 data.emplace_back(center[dim],
'1');
138 comm.broadcast(&bufferSize, 1, 0);
139 std::vector<char> buffer(bufferSize);
140 comm.broadcast(buffer.data(), bufferSize, 0);
142 Mpi::unpack(m_intKeys, buffer, position, comm);
143 Mpi::unpack(m_doubleKeys, buffer, position, comm);
144 m_distributed_fieldProps.deserialize_tran( std::vector<char>(buffer.begin() + position, buffer.end()) );
145 m_no_data = m_intKeys.size() + m_doubleKeys.size() +
146 Grid::dimensionworld;
150 ~PropsCentroidsDataHandle()
153 for(
const auto& intKey : m_intKeys)
155 m_distributed_fieldProps.m_intProps[intKey].data.resize(m_grid.size(0));
156 m_distributed_fieldProps.m_intProps[intKey].value_status.resize(m_grid.size(0));
159 for(
const auto& doubleKey : m_doubleKeys)
161 m_distributed_fieldProps.m_doubleProps[doubleKey].data.resize(m_grid.size(0));
162 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status.resize(m_grid.size(0));
165 m_centroids.resize(m_grid.size(0) * Grid::dimensionworld);
168 const auto& idSet = m_grid.localIdSet();
169 const auto& gridView = m_grid.levelGridView(0);
170 using ElementMapper =
171 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
172 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
174 for(
const auto &element : elements( gridView, Dune::Partitions::all ) )
176 std::size_t counter{};
177 const auto&
id = idSet.id(element);
178 auto index = elemMapper.index(element);
179 auto data = elementData_.find(
id);
180 assert(data != elementData_.end());
182 for(
const auto& intKey : m_intKeys)
184 const auto& pair = data->second[counter++];
185 m_distributed_fieldProps.m_intProps[intKey].data[index] =
static_cast<int>(pair.first);
186 m_distributed_fieldProps.m_intProps[intKey].value_status[index] =
static_cast<value::status
>(pair.second);
189 for(
const auto& doubleKey : m_doubleKeys)
191 const auto& pair = data->second[counter++];
192 m_distributed_fieldProps.m_doubleProps[doubleKey].data[index] = pair.first;
193 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status[index] =
static_cast<value::status
>(pair.second);
196 auto centroidIter = m_centroids.begin() + Grid::dimensionworld * index;
197 auto centroidIterEnd = centroidIter + Grid::dimensionworld;
198 for ( ; centroidIter != centroidIterEnd; ++centroidIter )
199 *centroidIter = data->second[counter++].first;
203 bool contains(
int ,
int codim)
208 bool fixedsize(
int ,
int )
212 bool fixedSize(
int ,
int )
217 template<
class EntityType>
218 std::size_t size(
const EntityType )
223 template<
class BufferType,
class EntityType>
224 void gather(BufferType& buffer,
const EntityType& e)
const
226 auto iter = elementData_.find(m_grid.localIdSet().id(e));
227 assert(iter != elementData_.end());
228 for(
const auto& data : iter->second)
234 template<
class BufferType,
class EntityType>
235 void scatter(BufferType& buffer,
const EntityType& e, std::size_t n)
237 assert(n == m_no_data);
238 auto& array = elementData_[m_grid.localIdSet().id(e)];
240 for(
auto& data: array)
247 using LocalIdSet =
typename Grid::LocalIdSet;
250 ParallelFieldPropsManager& m_distributed_fieldProps;
252 std::vector<std::string> m_intKeys;
254 std::vector<std::string> m_doubleKeys;
258 std::unordered_map<typename LocalIdSet::IdType, std::vector<std::pair<double,unsigned char> > > elementData_;
260 std::vector<double>& m_centroids;
262 std::size_t m_no_data;
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27