26#ifndef PROPS_DATAHANDLE_HPP
27#define PROPS_DATAHANDLE_HPP
31#include <opm/input/eclipse/EclipseState/Grid/FieldData.hpp>
33#include <opm/simulators/utils/MPISerializer.hpp>
34#include <opm/simulators/utils/ParallelEclipseState.hpp>
35#include <opm/simulators/utils/ParallelRestart.hpp>
36#include <dune/grid/common/datahandleif.hh>
37#include <dune/grid/common/mcmgmapper.hh>
38#include <dune/grid/common/partitionset.hh>
39#include <dune/common/parallel/mpihelper.hh>
40#include <unordered_map>
53 :
public Dune::CommDataHandleIF< PropsDataHandle<Grid>, double>
57 using DataType = std::pair<double, unsigned char>;
63 PropsDataHandle(
const Grid& grid, ParallelEclipseState& eclState)
65 m_distributed_fieldProps(eclState.m_fieldProps)
68 const Parallel::Communication comm = m_grid.comm();
71 const FieldPropsManager& globalProps = eclState.globalFieldProps();
72 m_intKeys = globalProps.keys<
int>();
73 m_doubleKeys = globalProps.keys<
double>();
74 m_distributed_fieldProps.copyTran(globalProps);
77 Parallel::MpiSerializer ser(comm);
80 m_no_data = m_intKeys.size() + m_doubleKeys.size();
82 if (comm.rank() == 0) {
83 const FieldPropsManager& globalProps = eclState.globalFieldProps();
84 const auto& idSet = m_grid.localIdSet();
85 const auto& gridView = m_grid.levelGridView(0);
87 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
88 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
90 for (
const auto &element : elements(gridView, Dune::Partitions::interiorBorder))
92 const auto&
id = idSet.id(element);
93 auto index = elemMapper.index(element);
94 auto& data = elementData_[id];
95 data.reserve(m_no_data);
97 for (
const auto& intKey : m_intKeys)
99 const auto& fieldData = globalProps.get_int_field_data(intKey);
100 data.emplace_back(fieldData.data[index],
101 static_cast<unsigned char>(fieldData.value_status[index]));
104 for (
const auto& doubleKey : m_doubleKeys)
108 const auto& fieldData = globalProps.get_double_field_data(doubleKey,
110 data.emplace_back(fieldData.data[index],
111 static_cast<unsigned char>(fieldData.value_status[index]));
120 for (
const auto& intKey : m_intKeys)
122 m_distributed_fieldProps.m_intProps[intKey].data.resize(m_grid.size(0));
123 m_distributed_fieldProps.m_intProps[intKey].value_status.resize(m_grid.size(0));
126 for (
const auto& doubleKey : m_doubleKeys)
128 m_distributed_fieldProps.m_doubleProps[doubleKey].data.resize(m_grid.size(0));
129 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status.resize(m_grid.size(0));
133 const auto& idSet = m_grid.localIdSet();
134 const auto& gridView = m_grid.levelGridView(0);
135 using ElementMapper =
136 Dune::MultipleCodimMultipleGeomTypeMapper<typename Grid::LevelGridView>;
137 ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
139 for (
const auto &element : elements( gridView, Dune::Partitions::all))
141 std::size_t counter{};
142 const auto&
id = idSet.id(element);
143 auto index = elemMapper.index(element);
144 auto data = elementData_.find(
id);
145 assert(data != elementData_.end());
147 for (
const auto& intKey : m_intKeys)
149 const auto& pair = data->second[counter++];
150 m_distributed_fieldProps.m_intProps[intKey].data[index] =
static_cast<int>(pair.first);
151 m_distributed_fieldProps.m_intProps[intKey].value_status[index] =
static_cast<value::status
>(pair.second);
154 for (
const auto& doubleKey : m_doubleKeys)
156 const auto& pair = data->second[counter++];
157 m_distributed_fieldProps.m_doubleProps[doubleKey].data[index] = pair.first;
158 m_distributed_fieldProps.m_doubleProps[doubleKey].value_status[index] =
static_cast<value::status
>(pair.second);
163 bool contains(
int ,
int codim)
168 bool fixedsize(
int ,
int )
172 bool fixedSize(
int ,
int )
177 template<
class EntityType>
178 std::size_t size(
const EntityType )
183 template<
class BufferType,
class EntityType>
184 void gather(BufferType& buffer,
const EntityType& e)
const
186 auto iter = elementData_.find(m_grid.localIdSet().id(e));
187 assert(iter != elementData_.end());
188 for (
const auto& data : iter->second)
194 template<
class BufferType,
class EntityType>
195 void scatter(BufferType& buffer,
const EntityType& e, std::size_t n)
197 assert(n == m_no_data);
198 auto& array = elementData_[m_grid.localIdSet().id(e)];
200 for (
auto& data : array)
206 template<
class Serializer>
207 void serializeOp(Serializer& serializer)
209 serializer(m_intKeys);
210 serializer(m_doubleKeys);
211 m_distributed_fieldProps.serializeOp(serializer);
215 using LocalIdSet =
typename Grid::LocalIdSet;
218 ParallelFieldPropsManager& m_distributed_fieldProps;
220 std::vector<std::string> m_intKeys;
222 std::vector<std::string> m_doubleKeys;
226 std::unordered_map<typename LocalIdSet::IdType, std::vector<std::pair<double,unsigned char> > > elementData_;
228 std::size_t m_no_data;
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition BlackoilPhases.hpp:27