26#ifndef PROPS_DATAHANDLE_HPP
27#define PROPS_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>
52 :
public Dune::CommDataHandleIF< PropsDataHandle<Grid>, double>
56 using DataType = std::pair<double, unsigned char>;
62 PropsDataHandle(
const Grid& grid, ParallelEclipseState& eclState)
64 m_distributed_fieldProps(eclState.m_fieldProps)
67 const Parallel::Communication comm = m_grid.comm();
70 const FieldPropsManager& globalProps = eclState.globalFieldProps();
71 m_intKeys = globalProps.keys<
int>();
72 m_doubleKeys = globalProps.keys<
double>();
73 m_distributed_fieldProps.copyTran(globalProps);
76 EclMpiSerializer ser(comm);
79 m_no_data = m_intKeys.size() + m_doubleKeys.size();
81 if (comm.rank() == 0) {
82 const FieldPropsManager& globalProps = eclState.globalFieldProps();
83 const auto& idSet = m_grid.localIdSet();
84 const auto& gridView = m_grid.levelGridView(0);
86 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
87 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
89 for (
const auto &element : elements(gridView, Dune::Partitions::interiorBorder))
91 const auto&
id = idSet.id(element);
92 auto index = elemMapper.index(element);
93 auto& data = elementData_[id];
94 data.reserve(m_no_data);
96 for (
const auto& intKey : m_intKeys)
98 const auto& fieldData = globalProps.get_int_field_data(intKey);
99 data.emplace_back(fieldData.data[index],
100 static_cast<unsigned char>(fieldData.value_status[index]));
103 for (
const auto& doubleKey : m_doubleKeys)
107 const auto& fieldData = globalProps.get_double_field_data(doubleKey,
109 data.emplace_back(fieldData.data[index],
110 static_cast<unsigned char>(fieldData.value_status[index]));
119 for (
const auto& intKey : m_intKeys)
121 m_distributed_fieldProps.m_intProps[intKey].data.resize(m_grid.size(0));
122 m_distributed_fieldProps.m_intProps[intKey].value_status.resize(m_grid.size(0));
125 for (
const auto& doubleKey : m_doubleKeys)
127 m_distributed_fieldProps.m_doubleProps[doubleKey].data.resize(m_grid.size(0));
128 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status.resize(m_grid.size(0));
132 const auto& idSet = m_grid.localIdSet();
133 const auto& gridView = m_grid.levelGridView(0);
134 using ElementMapper =
135 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
136 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
138 for (
const auto &element : elements( gridView, Dune::Partitions::all))
140 std::size_t counter{};
141 const auto&
id = idSet.id(element);
142 auto index = elemMapper.index(element);
143 auto data = elementData_.find(
id);
144 assert(data != elementData_.end());
146 for (
const auto& intKey : m_intKeys)
148 const auto& pair = data->second[counter++];
149 m_distributed_fieldProps.m_intProps[intKey].data[index] =
static_cast<int>(pair.first);
150 m_distributed_fieldProps.m_intProps[intKey].value_status[index] =
static_cast<value::status
>(pair.second);
153 for (
const auto& doubleKey : m_doubleKeys)
155 const auto& pair = data->second[counter++];
156 m_distributed_fieldProps.m_doubleProps[doubleKey].data[index] = pair.first;
157 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status[index] =
static_cast<value::status
>(pair.second);
162 bool contains(
int ,
int codim)
167 bool fixedsize(
int ,
int )
171 bool fixedSize(
int ,
int )
176 template<
class EntityType>
177 std::size_t size(
const EntityType )
182 template<
class BufferType,
class EntityType>
183 void gather(BufferType& buffer,
const EntityType& e)
const
185 auto iter = elementData_.find(m_grid.localIdSet().id(e));
186 assert(iter != elementData_.end());
187 for (
const auto& data : iter->second)
193 template<
class BufferType,
class EntityType>
194 void scatter(BufferType& buffer,
const EntityType& e, std::size_t n)
196 assert(n == m_no_data);
197 auto& array = elementData_[m_grid.localIdSet().id(e)];
199 for (
auto& data : array)
205 template<
class Serializer>
206 void serializeOp(Serializer& serializer)
208 serializer(m_intKeys);
209 serializer(m_doubleKeys);
210 m_distributed_fieldProps.serializeOp(serializer);
214 using LocalIdSet =
typename Grid::LocalIdSet;
217 ParallelFieldPropsManager& m_distributed_fieldProps;
219 std::vector<std::string> m_intKeys;
221 std::vector<std::string> m_doubleKeys;
225 std::unordered_map<typename LocalIdSet::IdType, std::vector<std::pair<double,unsigned char> > > elementData_;
227 std::size_t m_no_data;
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition BlackoilPhases.hpp:27