Segment data aggregation refactor

- Pass segment string as argument to lambda get instead of binding at
  declaration.

- Use SummaryState::get() overload with default

- Introduce scope to make special casing of first segment more distinct
This commit is contained in:
Joakim Hove
2021-11-23 11:24:55 +01:00
parent f5cc0da3ee
commit 604321ebdb

View File

@@ -763,16 +763,19 @@ namespace {
sSFR = getSegmentSetFlowRates(welSegSet, wRatesIt->second.connections, welConns, units);
}
std::string stringSegNum = std::to_string(segment0.segmentNumber());
auto get = [&smry, &wname, &stringSegNum](const std::string& vector)
auto get = [&smry, &wname](const std::string& vector, const std::string& segment_nr)
{
// 'stringSegNum' is one-based (1 .. #segments inclusive)
const auto key = vector + ':' + wname + ':' + stringSegNum;
return smry.has(key) ? smry.get(key) : 0.0;
const auto key = vector + ':' + wname + ':' + segment_nr;
return smry.get(key, 0.0);
};
auto iS = (segment0.segmentNumber() - 1)*noElmSeg;
// Treat the top segment individually
{
const int segNumber = segment0.segmentNumber();
const auto& segment_string = std::to_string(segNumber);
auto iS = (segNumber - 1)*noElmSeg;
rSeg[iS + Ix::DistOutlet] = units.from_si(M::length, welSegSet.lengthTopSegment());
rSeg[iS + Ix::OutletDepthDiff] = units.from_si(M::length, welSegSet.depthTopSegment());
rSeg[iS + Ix::SegVolume] = volFromLengthUnitConv*welSegSet.volumeTopSegment();
@@ -794,11 +797,11 @@ namespace {
else {
// Note: Segment flow rates and pressure from 'smry' have correct
// output units and sign conventions.
temp_o = get("SOFR");
temp_w = get("SWFR")*0.1;
temp_g = get("SGFR")*gfactor;
temp_o = get("SOFR", segment_string);
temp_w = get("SWFR", segment_string)*0.1;
temp_g = get("SGFR", segment_string)*gfactor;
//Item 12 Segment pressure
rSeg[iS + Ix::Pressure] = get("SPR");
rSeg[iS + Ix::Pressure] = get("SPR", segment_string);
}
rSeg[iS + Ix::TotFlowRate] = temp_o + temp_w + temp_g;
@@ -817,16 +820,17 @@ namespace {
rSeg[iS + Ix::flowFractionOilViscosityExponent] = 1.0;
rSeg[iS + Ix::flowFractionWaterViscosityExponent] = 1.0;
rSeg[iS + Ix::flowFractionGasViscosityExponent] = 1.0;
}
//Treat subsequent segments
for (std::size_t segIndex = 1; segIndex < welSegSet.size(); segIndex++) {
const auto& segment = welSegSet[segIndex];
const auto& outlet_segment = welSegSet.getFromSegmentNumber( segment.outletSegment() );
const int segNumber = segment.segmentNumber();
stringSegNum = std::to_string(segNumber);
const auto& segment_string = std::to_string(segNumber);
// set the elements of the rSeg array
iS = (segNumber - 1)*noElmSeg;
auto iS = (segNumber - 1)*noElmSeg;
rSeg[iS + Ix::DistOutlet] = units.from_si(M::length, (segment.totalLength() - outlet_segment.totalLength()));
rSeg[iS + Ix::OutletDepthDiff] = units.from_si(M::length, (segment.depth() - outlet_segment.depth()));
rSeg[iS + Ix::SegDiam] = units.from_si(M::length, (segment.internalDiameter()));
@@ -850,11 +854,11 @@ namespace {
else {
// Note: Segment flow rates and pressure from 'smry' have correct
// output units and sign conventions.
temp_o = get("SOFR");
temp_w = get("SWFR")*0.1;
temp_g = get("SGFR")*gfactor;
temp_o = get("SOFR", segment_string);
temp_w = get("SWFR", segment_string)*0.1;
temp_g = get("SGFR", segment_string)*gfactor;
//Item 12 Segment pressure
rSeg[iS + Ix::Pressure] = get("SPR");
rSeg[iS + Ix::Pressure] = get("SPR", segment_string);
}
rSeg[iS + Ix::TotFlowRate] = temp_o + temp_w + temp_g;