20#ifndef PAVG_CALCULATOR_HPP
21#define PAVG_CALCULATOR_HPP
29#include <unordered_map>
38template<
class Scalar>
class PAvgDynamicSourceData;
45template<
class Scalar>
class PAvgCalculator;
65typename PAvgCalculator<Scalar>::Result
66linearCombination(
const Scalar alpha,
typename PAvgCalculator<Scalar>::Result x,
67 const Scalar beta ,
const typename PAvgCalculator<Scalar>::Result& y);
89 linearCombination<Scalar>(
const Scalar alpha,
Result x,
90 const Scalar beta ,
const Result& y);
108 return this->wbp_[this->index(type)];
113 static constexpr auto NumModes =
114 static_cast<std::size_t
>(WBPMode::WBP9) + 1;
117 using WBPStore = std::array<Scalar, NumModes>;
127 Result& set(
const WBPMode type,
const Scalar wbp)
129 this->wbp_[this->index(type)] = wbp;
138 constexpr typename WBPStore::size_type index(
const WBPMode mode)
const
140 return static_cast<typename WBPStore::size_type
>(mode);
197 const WellConnections& connections);
227 const PAvg& controls,
228 const Scalar gravity,
229 const Scalar refDepth);
235 return this->contributingCells_;
257 return this->averagePressures_;
386 std::unique_ptr<Impl> pImpl_;
397 using ContrIndexType = std::vector<std::size_t>::size_type;
403 using SetupMap = std::unordered_map<std::size_t, ContrIndexType>;
406 enum class NeighbourKind
417 struct PAvgConnection
427 PAvgConnection(
const Scalar ctf_arg,
428 const Scalar depth_arg,
429 const ContrIndexType cell_arg)
442 ContrIndexType cell{};
447 std::vector<ContrIndexType> rectNeighbours{};
452 std::vector<ContrIndexType> diagNeighbours{};
459 typename std::vector<PAvgConnection>::size_type numInputConns_{};
463 std::vector<PAvgConnection> connections_{};
466 std::vector<typename std::vector<PAvgConnection>::size_type> openConns_{};
476 std::vector<typename std::vector<PAvgConnection>::size_type> inputConn_{};
480 std::vector<std::size_t> contributingCells_{};
485 Result averagePressures_{};
500 void addConnection(
const GridDims& cellIndexMap,
501 const Connection& conn,
502 SetupMap& setupHelperMap);
514 void pruneInactiveConnections(
const std::vector<bool>& isActive);
531 void accumulateLocalContributions(
const Sources& sources,
532 const PAvg& controls,
533 const Scalar gravity,
534 const Scalar refDepth);
543 virtual void collectGlobalContributions();
552 void assignResults(
const PAvg& controls);
570 void addNeighbour(std::optional<std::size_t> neighbour,
571 NeighbourKind neighbourKind,
572 SetupMap& setupHelperMap);
577 std::size_t lastConnsCell()
const;
590 void addNeighbours_X(
const GridDims& grid, SetupMap& setupHelperMap);
603 void addNeighbours_Y(
const GridDims& grid, SetupMap& setupHelperMap);
616 void addNeighbours_Z(
const GridDims& grid, SetupMap& setupHelperMap);
657 template <
typename ConnIndexMap,
typename CTFPressureWeightFunction>
658 void accumulateLocalContributions(
const Sources& sources,
659 const PAvg& controls,
660 const std::vector<Scalar>& connDP,
661 ConnIndexMap connIndex,
662 CTFPressureWeightFunction ctfPressWeight);
695 template <
typename ConnIndexMap>
696 void accumulateLocalContributions(
const Sources& sources,
697 const PAvg& controls,
698 const std::vector<Scalar>& connDP,
699 ConnIndexMap&& connIndex);
712 void accumulateLocalContribOpen(
const Sources& sources,
713 const PAvg& controls,
714 const std::vector<Scalar>& connDP);
727 void accumulateLocalContribAll(
const Sources& sources,
728 const PAvg& controls,
729 const std::vector<Scalar>& connDP);
761 template <
typename ConnIndexMap>
763 connectionPressureOffsetWell(
const std::size_t nconn,
764 const Sources& sources,
765 const Scalar gravity,
766 const Scalar refDepth,
767 ConnIndexMap connIndex)
const;
800 template <
typename ConnIndexMap>
802 connectionPressureOffsetRes(
const std::size_t nconn,
803 const Sources& sources,
804 const Scalar gravity,
805 const Scalar refDepth,
806 ConnIndexMap connIndex)
const;
827 connectionPressureOffset(
const Sources& sources,
828 const PAvg& controls,
829 const Scalar gravity,
830 const Scalar refDepth)
const;
Accumulate weighted running averages of cell contributions to WBP.
Definition PAvgCalculator.hpp:263
Accumulator()
Constructor.
Definition PAvgCalculator.cpp:495
void prepareAccumulation()
Zero out/clear WBP result buffer.
Definition PAvgCalculator.cpp:565
Accumulator & addCentre(const Scalar weight, const Scalar press)
Add contribution from centre/connecting cell.
Definition PAvgCalculator.cpp:530
Accumulator & addDiagonal(const Scalar weight, const Scalar press)
Add contribution from diagonal, level 2 neighbouring cell.
Definition PAvgCalculator.cpp:548
Result getFinalResult() const
Calculate final WBP results from individual contributions.
Definition PAvgCalculator.cpp:598
void prepareContribution()
Zero out/clear WBP term buffer.
Definition PAvgCalculator.cpp:571
~Accumulator()
Destructor.
void assignRunningAverages(const LocalRunningAverages &avg)
Assign coalesced/global contributions.
Definition PAvgCalculator.cpp:591
LocalRunningAverages getRunningAverages() const
Get buffer of intermediate, local results.
Definition PAvgCalculator.cpp:584
Accumulator & addRectangular(const Scalar weight, const Scalar press)
Add contribution from direct, rectangular, level 1 neighbouring cell.
Definition PAvgCalculator.cpp:539
Accumulator & add(const Scalar weight, const Accumulator &other)
Add contribution from other accumulator.
Definition PAvgCalculator.cpp:557
std::array< Scalar, 8 > LocalRunningAverages
Collection of running averages and their associate weights.
Definition PAvgCalculator.hpp:269
void commitContribution(const Scalar innerWeight=-1.0)
Accumulate current source term into result buffer whilst applying any user-prescribed term weighting.
Definition PAvgCalculator.cpp:577
Accumulator & operator=(const Accumulator &rhs)
Assignment operator.
Definition PAvgCalculator.cpp:514
Result of block-averaging well pressure procedure.
Definition PAvgCalculator.hpp:81
Scalar value(const WBPMode type) const
Retrieve numerical value of specific block-averaged well pressure.
Definition PAvgCalculator.hpp:106
WBPMode
Kind of block-averaged well pressure.
Definition PAvgCalculator.hpp:95
References to source contributions owned by other party.
Definition PAvgCalculator.hpp:146
const PAvgDynamicSourceData< Scalar > & wellConns() const
Get read-only access to connection-level contributions.
Definition PAvgCalculator.hpp:177
Sources & wellConns(const PAvgDynamicSourceData< Scalar > &wcSrc)
Provide reference to connection-level contributions (pressure, pore-volume, mixture density) owned by...
Definition PAvgCalculator.hpp:164
Sources & wellBlocks(const PAvgDynamicSourceData< Scalar > &wbSrc)
Provide reference to cell-level contributions (pressure, pore-volume, mixture density) owned by other...
Definition PAvgCalculator.hpp:153
const PAvgDynamicSourceData< Scalar > & wellBlocks() const
Get read-only access to cell-level contributions.
Definition PAvgCalculator.hpp:171
Facility for deriving well-level pressure values from selected block-averaging procedures.
Definition PAvgCalculator.hpp:74
virtual ~PAvgCalculator()
Destructor.
void pruneInactiveWBPCells(const std::vector< bool > &isActive)
Finish construction by pruning inactive cells.
Definition PAvgCalculator.cpp:636
std::vector< std::size_t > allWellConnections() const
List all reservoir connections that potentially contribute to this block-averaging pressure calculati...
Definition PAvgCalculator.cpp:721
Accumulator accumPV_
Average pressures weighted by pore-volume.
Definition PAvgCalculator.hpp:393
Accumulator accumCTF_
Average pressures weighted by connection transmissibility factor.
Definition PAvgCalculator.hpp:390
const Result & averagePressures() const
Block-average pressure derived from selection of source cells.
Definition PAvgCalculator.hpp:255
PAvgCalculator(const GridDims &cellIndexMap, const WellConnections &connections)
Constructor.
Definition PAvgCalculator.cpp:618
const std::vector< std::size_t > & allWBPCells() const
List of all cells, global indices in natural ordering, that contribute to the block-average pressures...
Definition PAvgCalculator.hpp:233
void inferBlockAveragePressures(const Sources &sources, const PAvg &controls, const Scalar gravity, const Scalar refDepth)
Compute block-average well-level pressure values from collection of source contributions and user-def...
Definition PAvgCalculator.cpp:707
Dynamic source data for block-average pressure calculations.
Definition PAvgDynamicSourceData.hpp:36
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30