20#ifndef PAVG_CALCULATOR_HPP
21#define PAVG_CALCULATOR_HPP
29#include <unordered_map>
38template<
class Scalar>
class PAvgDynamicSourceData;
45template <
typename Scalar>
46class PAvgCalculatorResult;
65template <
typename Scalar>
66PAvgCalculatorResult<Scalar>
67linearCombination(
const Scalar alpha, PAvgCalculatorResult<Scalar> x,
68 const Scalar beta ,
const PAvgCalculatorResult<Scalar>& y);
71template <
typename Scalar>
98 this->wbp_[this->index(type)] = wbp;
109 return this->wbp_[this->index(type)];
114 static constexpr auto NumModes =
115 static_cast<std::size_t
>(WBPMode::WBP9) + 1;
118 using WBPStore = std::array<Scalar, NumModes>;
127 constexpr typename WBPStore::size_type index(
const WBPMode mode)
const
129 return static_cast<typename WBPStore::size_type
>(mode);
136template<
class Scalar>
196 const WellConnections& connections);
226 const PAvg& controls,
227 const Scalar gravity,
228 const Scalar refDepth);
234 return this->contributingCells_;
256 return this->averagePressures_;
385 std::unique_ptr<Impl> pImpl_;
396 using ContrIndexType = std::vector<std::size_t>::size_type;
402 using SetupMap = std::unordered_map<std::size_t, ContrIndexType>;
405 enum class NeighbourKind
416 struct PAvgConnection
426 PAvgConnection(
const Scalar ctf_arg,
427 const ContrIndexType cell_arg)
436 ContrIndexType cell{};
441 std::vector<ContrIndexType> rectNeighbours{};
446 std::vector<ContrIndexType> diagNeighbours{};
453 typename std::vector<PAvgConnection>::size_type numInputConns_{};
457 std::vector<PAvgConnection> connections_{};
460 std::vector<typename std::vector<PAvgConnection>::size_type> openConns_{};
469 std::vector<typename std::vector<PAvgConnection>::size_type> inputConn_{};
473 std::vector<std::size_t> contributingCells_{};
478 PAvgCalculatorResult<Scalar> averagePressures_{};
493 void addConnection(
const GridDims& cellIndexMap,
494 const Connection& conn,
495 SetupMap& setupHelperMap);
507 void pruneInactiveConnections(
const std::vector<bool>& isActive);
524 void accumulateLocalContributions(
const Sources& sources,
525 const PAvg& controls,
526 const Scalar gravity,
527 const Scalar refDepth);
536 virtual void collectGlobalContributions();
545 void assignResults(
const PAvg& controls);
563 void addNeighbour(std::optional<std::size_t> neighbour,
564 NeighbourKind neighbourKind,
565 SetupMap& setupHelperMap);
570 std::size_t lastConnsCell()
const;
583 void addNeighbours_X(
const GridDims& grid, SetupMap& setupHelperMap);
596 void addNeighbours_Y(
const GridDims& grid, SetupMap& setupHelperMap);
609 void addNeighbours_Z(
const GridDims& grid, SetupMap& setupHelperMap);
656 template <
typename ConnIndexMap,
typename CTFPressureWeightFunction>
657 void accumulateLocalContributions(
const Sources& sources,
658 const PAvg& controls,
659 const Scalar gravity,
660 const Scalar refDepth,
661 const std::vector<Scalar>& connDensity,
662 ConnIndexMap connIndex,
663 CTFPressureWeightFunction ctfPressWeight);
702 template <
typename ConnIndexMap>
703 void accumulateLocalContributions(
const Sources& sources,
704 const PAvg& controls,
705 const Scalar gravity,
706 const Scalar refDepth,
707 const std::vector<Scalar>& connDensity,
708 ConnIndexMap&& connIndex);
727 void accumulateLocalContribOpen(
const Sources& sources,
728 const PAvg& controls,
729 const Scalar gravity,
730 const Scalar refDepth,
731 const std::vector<Scalar>& connDP);
750 void accumulateLocalContribAll(
const Sources& sources,
751 const PAvg& controls,
752 const Scalar gravity,
753 const Scalar refDepth,
754 const std::vector<Scalar>& connDensity);
781 template <
typename ConnIndexMap>
783 connectionDensityWell(
const std::size_t nconn,
784 const Sources& sources,
785 ConnIndexMap connIndex)
const;
813 template <
typename ConnIndexMap>
815 connectionDensityRes(
const std::size_t nconn,
816 const Sources& sources,
817 ConnIndexMap connIndex)
const;
834 connectionDensity(
const Sources& sources,
835 const PAvg& controls,
836 const Scalar gravity)
const;
Result of block-averaging well pressure procedure.
Definition PAvgCalculator.hpp:73
WBPMode
Kind of block-averaged well pressure.
Definition PAvgCalculator.hpp:84
PAvgCalculatorResult & set(const WBPMode type, const Scalar wbp)
Assign single block-averaged pressure result.
Definition PAvgCalculator.hpp:96
friend PAvgCalculatorResult< T > linearCombination(const T alpha, PAvgCalculatorResult< T > x, const T beta, const PAvgCalculatorResult< T > &y)
Grant internal data member access to combination function.
Scalar value(const WBPMode type) const
Retrieve numerical value of specific block-averaged well pressure.
Definition PAvgCalculator.hpp:107
Accumulate weighted running averages of cell contributions to WBP.
Definition PAvgCalculator.hpp:262
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
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
PAvgCalculatorResult< Scalar > getFinalResult() const
Calculate final WBP results from individual contributions.
Definition PAvgCalculator.cpp:598
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:268
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
References to source contributions owned by other party.
Definition PAvgCalculator.hpp:145
const PAvgDynamicSourceData< Scalar > & wellConns() const
Get read-only access to connection-level contributions.
Definition PAvgCalculator.hpp:176
Sources & wellConns(const PAvgDynamicSourceData< Scalar > &wcSrc)
Provide reference to connection-level contributions (pressure, pore-volume, mixture density) owned by...
Definition PAvgCalculator.hpp:163
Sources & wellBlocks(const PAvgDynamicSourceData< Scalar > &wbSrc)
Provide reference to cell-level contributions (pressure, pore-volume, mixture density) owned by other...
Definition PAvgCalculator.hpp:152
const PAvgDynamicSourceData< Scalar > & wellBlocks() const
Get read-only access to cell-level contributions.
Definition PAvgCalculator.hpp:170
Facility for deriving well-level pressure values from selected block-averaging procedures.
Definition PAvgCalculator.hpp:138
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:729
const PAvgCalculatorResult< Scalar > & averagePressures() const
Block-average pressure derived from selection of source cells.
Definition PAvgCalculator.hpp:254
Accumulator accumPV_
Average pressures weighted by pore-volume.
Definition PAvgCalculator.hpp:392
Accumulator accumCTF_
Average pressures weighted by connection transmissibility factor.
Definition PAvgCalculator.hpp:389
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:232
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:715
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