#3391 Ensemble curves. Use vector addresses from the case having the highest number of vectors

This commit is contained in:
Bjørn Erik Jensen 2018-09-24 13:59:55 +02:00
parent e0d7352c1b
commit fce06c0057
5 changed files with 31 additions and 23 deletions

View File

@ -120,13 +120,13 @@ std::vector<RimSummaryCase*> RimDerivedEnsembleCaseCollection::allSummaryCases()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::set<RifEclipseSummaryAddress> RimDerivedEnsembleCaseCollection::calculateUnionOfSummaryAddresses() const
std::set<RifEclipseSummaryAddress> RimDerivedEnsembleCaseCollection::ensembleSummaryAddresses() const
{
std::set<RifEclipseSummaryAddress> addresses;
if (!m_ensemble1 || !m_ensemble2) return addresses;
addresses = m_ensemble1->calculateUnionOfSummaryAddresses();
auto addrs2 = m_ensemble2->calculateUnionOfSummaryAddresses();
addresses = m_ensemble1->ensembleSummaryAddresses();
auto addrs2 = m_ensemble2->ensembleSummaryAddresses();
addresses.insert(addrs2.begin(), addrs2.end());
return addresses;
}

View File

@ -53,7 +53,7 @@ public:
void setEnsemble2(RimSummaryCaseCollection* ensemble);
virtual std::vector<RimSummaryCase*> allSummaryCases() const override;
virtual std::set<RifEclipseSummaryAddress> calculateUnionOfSummaryAddresses() const override;
virtual std::set<RifEclipseSummaryAddress> ensembleSummaryAddresses() const override;
void updateDerivedEnsembleCases();
bool hasCaseReference(const RimSummaryCase* sumCase) const;

View File

@ -170,26 +170,34 @@ void RimSummaryCaseCollection::setAsEnsemble(bool isEnsemble)
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::set<RifEclipseSummaryAddress> RimSummaryCaseCollection::calculateUnionOfSummaryAddresses() const
std::set<RifEclipseSummaryAddress> RimSummaryCaseCollection::ensembleSummaryAddresses() const
{
std::set<RifEclipseSummaryAddress> addressUnion;
std::set<RifEclipseSummaryAddress> addresses;
size_t maxAddrCount = 0;
int maxAddrIndex = -1;
for (RimSummaryCase* currCase: m_cases)
for (int i = 0; i < (int)m_cases.size(); i++)
{
if ( !currCase ) continue;
RimSummaryCase* currCase = m_cases[i];
if (!currCase) continue;
RifSummaryReaderInterface* reader = currCase->summaryReader();
if (!reader) continue;
if ( !reader ) continue;
size_t addrCount = reader->allResultAddresses().size();
if (addrCount > maxAddrCount)
{
maxAddrCount = addrCount;
maxAddrIndex = (int)i;
}
}
const std::set<RifEclipseSummaryAddress>& readerAddresses = reader->allResultAddresses();
addressUnion.insert(readerAddresses.begin(), readerAddresses.end());
// We assume that all cases have the same addresses when they have equal number of addresses.
// In that case there is no need to calculate the union, we only use the addresses from the first case
if (m_commonAddressCount > 0) break;
}
return addressUnion;
if (maxAddrIndex >= 0)
{
const std::set<RifEclipseSummaryAddress>& addrs = m_cases[maxAddrIndex]->summaryReader()->allResultAddresses();
addresses.insert(addrs.begin(), addrs.end());
}
return addresses;
}
//--------------------------------------------------------------------------------------------------

View File

@ -72,7 +72,7 @@ public:
QString name() const;
bool isEnsemble() const;
void setAsEnsemble(bool isEnsemble);
virtual std::set<RifEclipseSummaryAddress> calculateUnionOfSummaryAddresses() const;
virtual std::set<RifEclipseSummaryAddress> ensembleSummaryAddresses() const;
EnsembleParameter ensembleParameter(const QString& paramName) const;
void calculateEnsembleParametersIntersectionHash();
void clearEnsembleParametersHashes();

View File

@ -273,7 +273,7 @@ std::vector<RiaSummaryCurveDefinition> RiuSummaryCurveDefSelection::allCurveDefi
// Build case list
if (ensemble)
{
auto addresses = ensemble->calculateUnionOfSummaryAddresses();
auto addresses = ensemble->ensembleSummaryAddresses();
addressesFromSource.insert(addresses.begin(), addresses.end());
auto ensembleCases = ensemble->allSummaryCases();
casesFromSource.insert(casesFromSource.end(), ensembleCases.begin(), ensembleCases.end());
@ -324,7 +324,7 @@ std::vector<RiaCurveSetDefinition> RiuSummaryCurveDefSelection::allCurveSetDefin
std::set<RifEclipseSummaryAddress> addressesFromSource;
// Build case list
auto addresses = ensemble->calculateUnionOfSummaryAddresses();
auto addresses = ensemble->ensembleSummaryAddresses();
addressesFromSource.insert(addresses.begin(), addresses.end());
for (const auto& addressFromSource : addressesFromSource)
@ -354,7 +354,7 @@ std::vector<RiaSummaryCurveDefinition> RiuSummaryCurveDefSelection::selection()
if (ensemble)
{
std::set<RifEclipseSummaryAddress> addressUnion = ensemble->calculateUnionOfSummaryAddresses();
std::set<RifEclipseSummaryAddress> addressUnion = ensemble->ensembleSummaryAddresses();
for ( const auto& addr : selectedAddressesFromUi)
{
if (addressUnion.count(addr))
@ -978,7 +978,7 @@ std::set<RifEclipseSummaryAddress> RiuSummaryCurveDefSelection::findPossibleSumm
}
else if (currEnsemble)
{
allAddresses = currEnsemble->calculateUnionOfSummaryAddresses();
allAddresses = currEnsemble->ensembleSummaryAddresses();
}
bool applySelections = identifierAndField == nullptr || (!isVectorField && controllingIdentifierAndField != nullptr);