19#ifndef OPM_PY_FLUID_STATE_IMPL_HEADER_INCLUDED
20#define OPM_PY_FLUID_STATE_IMPL_HEADER_INCLUDED
23#ifndef OPM_PY_FLUID_STATE_HEADER_INCLUDED
28#include <opm/material/common/MathToolbox.hpp>
32#include <fmt/format.h>
36template <
class TypeTag>
39 : simulator_(simulator)
45template <
class TypeTag>
50 Model& model = this->simulator_->model();
51 auto& sol = model.solution(0);
52 const auto size = model.numGridDof();
53 std::vector<int> array(size);
54 for (
unsigned dof_idx = 0; dof_idx < size; ++dof_idx) {
55 auto primary_vars = sol[dof_idx];
56 array[dof_idx] = getVariableMeaning_(primary_vars, variable);
61template <
class TypeTag>
62std::map<std::string, int>
66 if (variable.compare(
"pressure") == 0) {
67 return {{
"Po",
static_cast<int>(PrimaryVariables::PressureMeaning::Po) },
68 {
"Pw",
static_cast<int>(PrimaryVariables::PressureMeaning::Pw) },
69 {
"Pg",
static_cast<int>(PrimaryVariables::PressureMeaning::Pg) }};
71 else if (variable.compare(
"water") == 0) {
72 return {{
"Sw",
static_cast<int>(PrimaryVariables::WaterMeaning::Sw) },
73 {
"Rvw",
static_cast<int>(PrimaryVariables::WaterMeaning::Rvw) },
74 {
"Rsw",
static_cast<int>(PrimaryVariables::WaterMeaning::Rsw) },
75 {
"Disabled",
static_cast<int>(PrimaryVariables::WaterMeaning::Disabled) }};
77 else if (variable.compare(
"gas") == 0) {
78 return {{
"Sg",
static_cast<int>(PrimaryVariables::GasMeaning::Sg) },
79 {
"Rs",
static_cast<int>(PrimaryVariables::GasMeaning::Rs) },
80 {
"Rv",
static_cast<int>(PrimaryVariables::GasMeaning::Rv) },
81 {
"Disabled",
static_cast<int>(PrimaryVariables::GasMeaning::Disabled) }};
83 else if (variable.compare(
"brine") == 0) {
84 return {{
"Cs",
static_cast<int>(PrimaryVariables::BrineMeaning::Cs) },
85 {
"Sp",
static_cast<int>(PrimaryVariables::BrineMeaning::Sp) },
86 {
"Disabled",
static_cast<int>(PrimaryVariables::BrineMeaning::Disabled) }};
89 const std::string msg = fmt::format(
90 "Unknown variable meaning '{}': Expected pressure, water, gas, or brine", variable);
91 throw std::runtime_error(msg);
121template <
class TypeTag>
126 Model& model = this->simulator_->model();
127 const auto size = model.numGridDof();
128 std::vector<double> array(size);
129 const auto& grid_view = this->simulator_->vanguard().gridView();
133 ElementContext elem_ctx(*this->simulator_);
134 auto var_type = getVariableType_(name);
135 for (
const auto& elem : elements(grid_view, Dune::Partitions::interior)) {
136 elem_ctx.updatePrimaryStencil(elem);
137 elem_ctx.updatePrimaryIntensiveQuantities(0);
138 for (
unsigned dof_idx = 0; dof_idx < elem_ctx.numPrimaryDof(0); ++dof_idx) {
139 const auto& int_quants = elem_ctx.intensiveQuantities(dof_idx, 0);
140 const auto& fs = int_quants.fluidState();
141 unsigned global_dof_idx = elem_ctx.globalSpaceIndex(dof_idx, 0);
142 array[global_dof_idx] = getVariableValue_(fs, var_type, name);
148template <
class TypeTag>
153 std::size_t primary_var_idx = getPrimaryVarIndex_(idx_name);
154 Model& model = this->simulator_->model();
155 auto& sol = model.solution(0);
156 const auto size = model.numGridDof();
157 std::vector<double> array(size);
158 for (
unsigned dof_idx = 0; dof_idx < size; ++dof_idx) {
159 auto primary_vars = sol[dof_idx];
160 array[dof_idx] = primary_vars[primary_var_idx];
165template <
class TypeTag>
172 const std::size_t primary_var_idx = getPrimaryVarIndex_(idx_name);
173 Model& model = this->simulator_->model();
174 auto& sol = model.solution(0);
175 const auto model_size = model.numGridDof();
176 if (model_size != size) {
177 const std::string msg = fmt::format(
178 "Cannot set primary variable. Expected array of size {} but got array of size: {}",
180 throw std::runtime_error(msg);
182 for (
unsigned dof_idx = 0; dof_idx < size; ++dof_idx) {
183 auto& primary_vars = sol[dof_idx];
184 primary_vars[primary_var_idx] = data[dof_idx];
191template <
class TypeTag>
196 if (idx_name.compare(
"pressure") == 0) {
197 return Indices::pressureSwitchIdx;
199 else if (idx_name.compare(
"water_saturation") == 0) {
200 return Indices::waterSwitchIdx;
202 else if (idx_name.compare(
"composition") == 0) {
203 return Indices::compositionSwitchIdx;
206 const std::string msg = fmt::format(
"Unknown primary variable index name: {}", idx_name);
207 throw std::runtime_error(msg);
211template <
class TypeTag>
213PyFluidState<TypeTag>::
214getVariableMeaning_(PrimaryVariables& primary_vars,
215 const std::string& variable)
const
217 if (variable.compare(
"pressure") == 0) {
218 return static_cast<int>(primary_vars.primaryVarsMeaningPressure());
220 else if(variable.compare(
"water") == 0) {
221 return static_cast<int>(primary_vars.primaryVarsMeaningWater());
223 else if (variable.compare(
"gas") == 0) {
224 return static_cast<int>(primary_vars.primaryVarsMeaningGas());
226 else if (variable.compare(
"brine") == 0) {
227 return static_cast<int>(primary_vars.primaryVarsMeaningBrine());
230 const std::string msg = fmt::format(
231 "Unknown variable meaning '{}': Expected pressure, water, gas, or brine", variable);
232 throw std::runtime_error(msg);
236template <
class TypeTag>
237typename PyFluidState<TypeTag>::VariableType
238PyFluidState<TypeTag>::
239getVariableType_(
const std::string& name)
const
241 static std::map<std::string, VariableType> variable_type_map{
242 {
"Sw", VariableType::Sw},
243 {
"Sg", VariableType::Sg},
244 {
"So", VariableType::So},
245 {
"pw", VariableType::pw},
246 {
"pg", VariableType::pg},
247 {
"po", VariableType::po},
248 {
"Rs", VariableType::Rs},
249 {
"Rv", VariableType::Rv},
250 {
"rho_w", VariableType::rho_w},
251 {
"rho_g", VariableType::rho_g},
252 {
"rho_o", VariableType::rho_o},
253 {
"T", VariableType::T}
256 if (variable_type_map.count(name) == 0) {
257 variableNotFoundError_(name);
259 return variable_type_map.at(name);
262template <
class TypeTag>
263template <
class Flu
idState>
265PyFluidState<TypeTag>::
266getVariableValue_(FluidState& fs,
267 VariableType var_type,
268 const std::string& name)
const
271 case VariableType::pw :
272 return getValue(fs.pressure(FluidSystem::waterPhaseIdx));
273 case VariableType::pg :
274 return getValue(fs.pressure(FluidSystem::gasPhaseIdx));
275 case VariableType::po :
276 return getValue(fs.pressure(FluidSystem::oilPhaseIdx));
277 case VariableType::rho_w :
278 return getValue(fs.density(FluidSystem::waterPhaseIdx));
279 case VariableType::rho_g :
280 return getValue(fs.density(FluidSystem::gasPhaseIdx));
281 case VariableType::rho_o :
282 return getValue(fs.density(FluidSystem::oilPhaseIdx));
283 case VariableType::Rs :
284 return getValue(fs.Rs());
285 case VariableType::Rv :
286 return getValue(fs.Rv());
287 case VariableType::Sw :
288 return getValue(fs.saturation(FluidSystem::waterPhaseIdx));
289 case VariableType::Sg :
290 return getValue(fs.saturation(FluidSystem::gasPhaseIdx));
291 case VariableType::So :
292 return getValue(fs.saturation(FluidSystem::oilPhaseIdx));
293 case VariableType::T :
294 return getValue(fs.temperature(FluidSystem::waterPhaseIdx));
296 variableNotFoundError_(name);
301template <
class TypeTag>
303PyFluidState<TypeTag>::
304variableNotFoundError_(
const std::string& name)
const
306 const std::string msg = fmt::format(
"Access to variable '{}' is not implemented yet!", name);
307 throw std::runtime_error(msg);
Definition: PyFluidState.hpp:36
std::map< std::string, int > getPrimaryVarMeaningMap(const std::string &variable) const
Definition: PyFluidState_impl.hpp:64
PyFluidState(Simulator *simulator)
Definition: PyFluidState_impl.hpp:38
std::vector< double > getFluidStateVariable(const std::string &name) const
Definition: PyFluidState_impl.hpp:124
std::vector< int > getPrimaryVarMeaning(const std::string &variable) const
Definition: PyFluidState_impl.hpp:48
void setPrimaryVariable(const std::string &idx_name, const double *data, std::size_t size)
Definition: PyFluidState_impl.hpp:168
std::vector< double > getPrimaryVariable(const std::string &idx_name) const
Definition: PyFluidState_impl.hpp:151
Definition: PyBaseSimulator.hpp:41