PerforationData: template Scalar type

This commit is contained in:
Arne Morten Kvarving 2024-02-20 14:37:48 +01:00
parent d2cbf33b62
commit 81189b89c7
23 changed files with 57 additions and 54 deletions

View File

@ -193,7 +193,7 @@ public:
bool forceShutWellByName(const std::string& wellname,
const double simulation_time);
const std::vector<PerforationData>& perfData(const int well_idx) const
const std::vector<PerforationData<Scalar>>& perfData(const int well_idx) const
{ return well_perf_data_[well_idx]; }
const Parallel::Communication& comm() const { return comm_; }
@ -450,7 +450,7 @@ protected:
std::optional<int> last_run_wellpi_{};
std::vector<Well> wells_ecl_;
std::vector<std::vector<PerforationData>> well_perf_data_;
std::vector<std::vector<PerforationData<Scalar>>> well_perf_data_;
/// Connection index mappings
class ConnectionIndexMap

View File

@ -71,7 +71,7 @@ template<class Scalar>
void BlackoilWellModelRestart<Scalar>::
loadRestartConnectionData(const std::vector<data::Rates::opt>& phs,
const data::Well& rst_well,
const std::vector<PerforationData>& old_perf_data,
const std::vector<PerforationData<Scalar>>& old_perf_data,
SingleWellState<Scalar>& ws) const
{
auto& perf_data = ws.perf_data;
@ -130,7 +130,7 @@ loadRestartWellData(const std::string& well_name,
const bool handle_ms_well,
const std::vector<data::Rates::opt>& phs,
const data::Well& rst_well,
const std::vector<PerforationData>& old_perf_data,
const std::vector<PerforationData<Scalar>>& old_perf_data,
SingleWellState<Scalar>& ws) const
{
const auto np = phs.size();

View File

@ -38,7 +38,7 @@ class GroupAndNetworkValues;
template<class Scalar> class GroupState;
class GuideRate;
class GuideRateConfig;
struct PerforationData;
template<class Scalar> struct PerforationData;
struct PhaseUsage;
template<class Scalar> class SingleWellState;
template<class Scalar> class WellState;
@ -76,7 +76,7 @@ private:
//! \brief Loads per-connection data from restart structures.
void loadRestartConnectionData(const std::vector<data::Rates::opt>& phs,
const data::Well& rst_well,
const std::vector<PerforationData>& old_perf_data,
const std::vector<PerforationData<Scalar>>& old_perf_data,
SingleWellState<Scalar>& ws) const;
//! \brief Loads per-segment data from restart structures.
@ -90,7 +90,7 @@ private:
const bool handle_ms_well,
const std::vector<data::Rates::opt>& phs,
const data::Well& rst_well,
const std::vector<PerforationData>& old_perf_data,
const std::vector<PerforationData<Scalar>>& old_perf_data,
SingleWellState<Scalar>& ws) const;
//! \brief Loads per-group data from restart structures.

View File

@ -76,7 +76,7 @@ namespace Opm
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
void init(const PhaseUsage* phase_usage_arg,
const std::vector<double>& depth_arg,

View File

@ -65,7 +65,7 @@ namespace Opm
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: Base(well, pw_info, time_step, param, rate_converter, pvtRegionIdx, num_components, num_phases, index_of_well, perf_data)
, MSWEval(static_cast<WellInterfaceIndices<FluidSystem,Indices>&>(*this))
, regularize_(false)

View File

@ -22,15 +22,15 @@
#include <cstddef>
namespace Opm
{
namespace Opm {
/// Static data associated with a well perforation.
template<class Scalar>
struct PerforationData
{
int cell_index{};
double connection_transmissibility_factor{};
double connection_d_factor{};
Scalar connection_transmissibility_factor{};
Scalar connection_d_factor{};
int satnum_id{};
/// \brief The original index of the perforation in ECL Schedule
std::size_t ecl_index{};

View File

@ -34,7 +34,7 @@ SingleWellState(const std::string& name_,
const ParallelWellInfo& pinfo,
bool is_producer,
Scalar pressure_first_connection,
const std::vector<PerforationData>& perf_input,
const std::vector<PerforationData<Scalar>>& perf_input,
const PhaseUsage& pu_,
Scalar temp)
: name(name_)
@ -138,7 +138,7 @@ void SingleWellState<Scalar>::updateStatus(Well::Status new_status)
template<class Scalar>
void SingleWellState<Scalar>::
reset_connection_factors(const std::vector<PerforationData>& new_perf_data)
reset_connection_factors(const std::vector<PerforationData<Scalar>>& new_perf_data)
{
if (this->perf_data.size() != new_perf_data.size()) {
throw std::invalid_argument {

View File

@ -33,7 +33,7 @@
namespace Opm {
struct PerforationData;
template<class Scalar> struct PerforationData;
class SummaryState;
class Well;
@ -44,7 +44,7 @@ public:
const ParallelWellInfo& pinfo,
bool is_producer,
Scalar presssure_first_connection,
const std::vector<PerforationData>& perf_input,
const std::vector<PerforationData<Scalar>>& perf_input,
const PhaseUsage& pu,
Scalar temp);
@ -120,7 +120,7 @@ public:
/// \param[in] new_perf_data New perforation data. Only
/// PerforationData::connection_transmissibility_factor actually
/// used (overwrites existing internal values).
void reset_connection_factors(const std::vector<PerforationData>& new_perf_data);
void reset_connection_factors(const std::vector<PerforationData<Scalar>>& new_perf_data);
void update_producer_targets(const Well& ecl_well, const SummaryState& st);
void update_injector_targets(const Well& ecl_well, const SummaryState& st);
void update_targets(const Well& ecl_well, const SummaryState& st);

View File

@ -128,7 +128,7 @@ namespace Opm
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
virtual void init(const PhaseUsage* phase_usage_arg,
const std::vector<Scalar>& depth_arg,

View File

@ -78,7 +78,7 @@ namespace Opm
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: Base(well, pw_info, time_step, param, rate_converter, pvtRegionIdx, num_components, num_phases, index_of_well, perf_data)
, StdWellEval(static_cast<const WellInterfaceIndices<FluidSystem,Indices>&>(*this))
, regularize_(false)

View File

@ -25,6 +25,7 @@
#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
#include <opm/simulators/wells/PerforationData.hpp>
#include <opm/simulators/wells/WellInterfaceGeneric.hpp>
#include <opm/simulators/wells/WellState.hpp>

View File

@ -60,7 +60,6 @@ namespace Opm {
#include <opm/material/densead/Evaluation.hpp>
#include <cassert>
#include <vector>
namespace Opm
@ -142,7 +141,7 @@ public:
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
/// Virtual destructor
virtual ~WellInterface() = default;

View File

@ -53,7 +53,7 @@ WellInterfaceFluidSystem(const Well& well,
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: WellInterfaceGeneric<Scalar>(well, parallel_well_info, time_step,
pvtRegionIdx, num_components, num_phases,
index_of_well, perf_data)

View File

@ -75,7 +75,7 @@ protected:
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
// updating the voidage rates in well_state when requested
void calculateReservoirRates(SingleWellState<Scalar>& ws) const;

View File

@ -60,7 +60,7 @@ WellInterfaceGeneric(const Well& well,
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: well_ecl_(well)
, parallel_well_info_(pw_info)
, current_step_(time_step)
@ -143,7 +143,7 @@ adaptRatesForVFP(std::vector<Scalar>& rates) const
}
template<class Scalar>
const std::vector<PerforationData>&
const std::vector<PerforationData<Scalar>>&
WellInterfaceGeneric<Scalar>::perforationData() const
{
return *perf_data_;

View File

@ -37,7 +37,7 @@ namespace Opm
class DeferredLogger;
class GuideRate;
class ParallelWellInfo;
struct PerforationData;
template<class Scalar> struct PerforationData;
struct PhaseUsage;
class SummaryState;
template<class Scalar> class VFPProperties;
@ -57,10 +57,10 @@ public:
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
/// \brief Get the perforations of the well
const std::vector<PerforationData>& perforationData() const;
const std::vector<PerforationData<Scalar>>& perforationData() const;
/// Well name.
const std::string& name() const;
@ -286,7 +286,7 @@ protected:
// the index of well in Wells struct
int index_of_well_;
const std::vector<PerforationData>* perf_data_;
const std::vector<PerforationData<Scalar>>* perf_data_;
// the vectors used to describe the inflow performance relationship (IPR)
// Q = IPR_A - BHP * IPR_B

View File

@ -43,7 +43,7 @@ WellInterfaceIndices(const Well& well,
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: WellInterfaceFluidSystem<FluidSystem>(well,
parallel_well_info,
time_step,

View File

@ -63,7 +63,7 @@ protected:
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data);
const std::vector<PerforationData<Scalar>>& perf_data);
};
}

View File

@ -40,6 +40,7 @@
#include <dune/common/version.hh>
#include <cassert>
#include <cstddef>
#include <utility>
@ -60,7 +61,7 @@ namespace Opm
const int num_components,
const int num_phases,
const int index_of_well,
const std::vector<PerforationData>& perf_data)
const std::vector<PerforationData<Scalar>>& perf_data)
: WellInterfaceIndices<FluidSystem,Indices>(well,
pw_info,
time_step,

View File

@ -30,6 +30,7 @@
#include <opm/simulators/utils/ParallelCommunication.hpp>
#include <opm/simulators/wells/ParallelWellInfo.hpp>
#include <opm/simulators/wells/PerforationData.hpp>
#include <opm/grid/common/p2pcommunicator.hh>
#include <opm/output/data/Wells.hpp>
@ -150,7 +151,7 @@ template<class Scalar>
void WellState<Scalar>::base_init(const std::vector<Scalar>& cellPressures,
const std::vector<Well>& wells_ecl,
const std::vector<std::reference_wrapper<ParallelWellInfo>>& parallel_well_info,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state)
{
// clear old name mapping
@ -172,7 +173,7 @@ template<class Scalar>
void WellState<Scalar>::initSingleProducer(const Well& well,
const ParallelWellInfo& well_info,
Scalar pressure_first_connection,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const SummaryState& summary_state)
{
const auto& pu = this->phase_usage_;
@ -201,7 +202,7 @@ template<class Scalar>
void WellState<Scalar>::initSingleInjector(const Well& well,
const ParallelWellInfo& well_info,
Scalar pressure_first_connection,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const SummaryState& summary_state)
{
const auto& pu = this->phase_usage_;
@ -228,7 +229,7 @@ void WellState<Scalar>::initSingleInjector(const Well& well,
template<class Scalar>
void WellState<Scalar>::initSingleWell(const std::vector<Scalar>& cellPressures,
const Well& well,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const ParallelWellInfo& well_info,
const SummaryState& summary_state)
{
@ -253,7 +254,7 @@ void WellState<Scalar>::init(const std::vector<Scalar>& cellPressures,
const std::vector<std::reference_wrapper<ParallelWellInfo>>& parallel_well_info,
const int report_step,
const WellState* prevState,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state)
{
// call init on base class
@ -423,7 +424,7 @@ void WellState<Scalar>::resize(const std::vector<Well>& wells_ecl,
const Schedule& schedule,
const bool handle_ms_well,
const std::size_t numCells,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state)
{
const std::vector<Scalar> tmp(numCells, 0.0); // <- UGLY HACK to pass the size

View File

@ -36,7 +36,6 @@
#include <opm/simulators/wells/ALQState.hpp>
#include <opm/simulators/wells/GlobalWellInfo.hpp>
#include <opm/simulators/wells/PerfData.hpp>
#include <opm/simulators/wells/PerforationData.hpp>
#include <opm/simulators/wells/SegmentState.hpp>
#include <opm/simulators/wells/SingleWellState.hpp>
#include <opm/simulators/wells/WellContainer.hpp>
@ -52,6 +51,7 @@ namespace Opm
{
class ParallelWellInfo;
template<class Scalar> struct PerforationData;
class Schedule;
enum class WellStatus;
@ -102,7 +102,7 @@ public:
const std::vector<std::reference_wrapper<ParallelWellInfo>>& parallel_well_info,
const int report_step,
const WellState* prevState,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state);
void resize(const std::vector<Well>& wells_ecl,
@ -110,7 +110,7 @@ public:
const Schedule& schedule,
const bool handle_ms_well,
const std::size_t numCells,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state);
void setCurrentWellRates(const std::string& wellName,
@ -379,25 +379,25 @@ private:
void base_init(const std::vector<Scalar>& cellPressures,
const std::vector<Well>& wells_ecl,
const std::vector<std::reference_wrapper<ParallelWellInfo>>& parallel_well_info,
const std::vector<std::vector<PerforationData>>& well_perf_data,
const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
const SummaryState& summary_state);
void initSingleWell(const std::vector<Scalar>& cellPressures,
const Well& well,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const ParallelWellInfo& well_info,
const SummaryState& summary_state);
void initSingleProducer(const Well& well,
const ParallelWellInfo& well_info,
Scalar pressure_first_connection,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const SummaryState& summary_state);
void initSingleInjector(const Well& well,
const ParallelWellInfo& well_info,
Scalar pressure_first_connection,
const std::vector<PerforationData>& well_perf_data,
const std::vector<PerforationData<Scalar>>& well_perf_data,
const SummaryState& summary_state);
};

View File

@ -83,7 +83,7 @@ struct SetupTest {
std::shared_ptr<Opm::Python> python;
std::unique_ptr<const Opm::Schedule> schedule;
std::unique_ptr<Opm::SummaryState> summaryState;
std::vector<std::vector<Opm::PerforationData>> well_perf_data;
std::vector<std::vector<Opm::PerforationData<double>>> well_perf_data;
int current_timestep;
};
@ -125,8 +125,8 @@ BOOST_AUTO_TEST_CASE(TestStandardWellInput) {
rateConverter.reset(new RateConverterType (phaseUsage,
std::vector<int>(10, 0)));
Opm::PerforationData dummy;
std::vector<Opm::PerforationData> pdata(well.getConnections().size(), dummy);
Opm::PerforationData<double> dummy;
std::vector<Opm::PerforationData<double>> pdata(well.getConnections().size(), dummy);
for (auto c = 0*pdata.size(); c < pdata.size(); ++c) {
pdata[c].ecl_index = c;
}
@ -160,8 +160,8 @@ BOOST_AUTO_TEST_CASE(TestBehavoir) {
// Compute reservoir volumes for RESV controls.
rateConverter.reset(new RateConverterType (phaseUsage,
std::vector<int>(10, 0)));
Opm::PerforationData dummy;
std::vector<Opm::PerforationData> pdata(wells_ecl[w].getConnections().size(), dummy);
Opm::PerforationData<double> dummy;
std::vector<Opm::PerforationData<double>> pdata(wells_ecl[w].getConnections().size(), dummy);
for (auto c = 0*pdata.size(); c < pdata.size(); ++c) {
pdata[c].ecl_index = c;
}

View File

@ -28,6 +28,7 @@
#include <opm/common/ErrorMacros.hpp>
#include <opm/simulators/wells/GlobalWellInfo.hpp>
#include <opm/simulators/wells/ParallelWellInfo.hpp>
#include <opm/simulators/wells/PerforationData.hpp>
#include <opm/simulators/wells/WellState.hpp>
#include <opm/simulators/wells/SingleWellState.hpp>
#include <opm/simulators/wells/SegmentState.hpp>
@ -106,7 +107,7 @@ struct Setup
+ std::to_string(k) + " not found in grid (well = " + well.name() + ").");
OPM_THROW(std::runtime_error, msg);
} else {
Opm::PerforationData pd;
Opm::PerforationData<double> pd;
pd.cell_index = active_index;
pd.connection_transmissibility_factor = completion.CF();
pd.connection_d_factor = completion.dFactor();
@ -132,7 +133,7 @@ struct Setup
std::shared_ptr<Opm::Python> python;
Opm::Schedule sched;
Opm::SummaryState st;
std::vector<std::vector<Opm::PerforationData>> well_perf_data;
std::vector<std::vector<Opm::PerforationData<double>>> well_perf_data;
};
namespace {
@ -581,7 +582,7 @@ BOOST_AUTO_TEST_CASE(TESTPerfData) {
BOOST_AUTO_TEST_CASE(TestSingleWellState) {
Opm::ParallelWellInfo pinfo;
std::vector<Opm::PerforationData> connections = {{0,1,1,0,0},{1,1,1,0,1},{2,1,1,0,2}};
std::vector<Opm::PerforationData<double>> connections = {{0,1,1,0,0},{1,1,1,0,1},{2,1,1,0,2}};
Opm::PhaseUsage pu;
// This is totally bonkers, but the pu needs a complete deck to initialize properly