mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#4254 Saturation Pressure Plots: Add command file command
This commit is contained in:
parent
c0f3258f19
commit
6e88cecbb2
@ -27,6 +27,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.h
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.h
|
${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.h
|
${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.h
|
${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set (SOURCE_GROUP_SOURCE_FILES
|
set (SOURCE_GROUP_SOURCE_FILES
|
||||||
@ -57,6 +58,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.cpp
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND CODE_HEADER_FILES
|
list(APPEND CODE_HEADER_FILES
|
||||||
|
@ -0,0 +1,83 @@
|
|||||||
|
#include "RicfCreateSaturationPressurePlots.h"
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2017 Statoil ASA
|
||||||
|
//
|
||||||
|
// ResInsight is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "RicfCreateSaturationPressurePlots.h"
|
||||||
|
|
||||||
|
#include "GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.h"
|
||||||
|
|
||||||
|
#include "RiaApplication.h"
|
||||||
|
#include "RiaLogging.h"
|
||||||
|
|
||||||
|
#include "RimEclipseResultCase.h"
|
||||||
|
#include "RimMainPlotCollection.h"
|
||||||
|
#include "RimProject.h"
|
||||||
|
#include "RimSaturationPressurePlotCollection.h"
|
||||||
|
|
||||||
|
CAF_PDM_SOURCE_INIT(RicfCreateSaturationPressurePlots, "createSaturationPressurePlots");
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicfCreateSaturationPressurePlots::RicfCreateSaturationPressurePlots()
|
||||||
|
{
|
||||||
|
RICF_InitField(&m_caseIds, "caseIds", std::vector<int>(), "Case IDs", "", "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicfCreateSaturationPressurePlots::execute()
|
||||||
|
{
|
||||||
|
std::vector<int> caseIds = m_caseIds();
|
||||||
|
if (caseIds.empty())
|
||||||
|
{
|
||||||
|
RimProject* project = RiaApplication::instance()->project();
|
||||||
|
if (project)
|
||||||
|
{
|
||||||
|
auto eclipeCases = project->eclipseCases();
|
||||||
|
for (auto c : eclipeCases)
|
||||||
|
{
|
||||||
|
caseIds.push_back(c->caseId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RimProject* project = RiaApplication::instance()->project();
|
||||||
|
if (project)
|
||||||
|
{
|
||||||
|
auto eclipeCases = project->eclipseCases();
|
||||||
|
for (auto c : eclipeCases)
|
||||||
|
{
|
||||||
|
auto eclipseResultCase = dynamic_cast<RimEclipseResultCase*>(c);
|
||||||
|
if (!eclipseResultCase) continue;
|
||||||
|
|
||||||
|
for (auto caseId : caseIds)
|
||||||
|
{
|
||||||
|
if (c->caseId == caseId)
|
||||||
|
{
|
||||||
|
RicCreateSaturationPressurePlotsFeature::createPlots(eclipseResultCase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RimSaturationPressurePlotCollection* collection = project->mainPlotCollection()->saturationPressurePlotCollection();
|
||||||
|
collection->updateAllRequiredEditors();
|
||||||
|
RiaApplication::instance()->getOrCreateAndShowMainPlotWindow();
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2017 Statoil ASA
|
||||||
|
//
|
||||||
|
// ResInsight is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RicfCommandObject.h"
|
||||||
|
|
||||||
|
#include "cafPdmField.h"
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RicfCreateSaturationPressurePlots : public RicfCommandObject
|
||||||
|
{
|
||||||
|
CAF_PDM_HEADER_INIT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RicfCreateSaturationPressurePlots();
|
||||||
|
|
||||||
|
void execute() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
caf::PdmField< std::vector<int> > m_caseIds;
|
||||||
|
};
|
@ -45,6 +45,63 @@
|
|||||||
|
|
||||||
CAF_CMD_SOURCE_INIT(RicCreateSaturationPressurePlotsFeature, "RicCreateSaturationPressurePlotsFeature");
|
CAF_CMD_SOURCE_INIT(RicCreateSaturationPressurePlotsFeature, "RicCreateSaturationPressurePlotsFeature");
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RimSaturationPressurePlot*>
|
||||||
|
RicCreateSaturationPressurePlotsFeature::createPlots(RimEclipseResultCase* eclipseResultCase)
|
||||||
|
{
|
||||||
|
std::vector<RimSaturationPressurePlot*> plots;
|
||||||
|
|
||||||
|
if (!eclipseResultCase)
|
||||||
|
{
|
||||||
|
RiaLogging::error(
|
||||||
|
"RicCreateSaturationPressurePlotsFeature:: No case specified for creation of saturation pressure plots");
|
||||||
|
|
||||||
|
return plots;
|
||||||
|
}
|
||||||
|
|
||||||
|
RimProject* project = RiaApplication::instance()->project();
|
||||||
|
|
||||||
|
RimSaturationPressurePlotCollection* collection = project->mainPlotCollection()->saturationPressurePlotCollection();
|
||||||
|
|
||||||
|
if (eclipseResultCase && eclipseResultCase->ensureReservoirCaseIsOpen())
|
||||||
|
{
|
||||||
|
eclipseResultCase->ensureDeckIsParsedForEquilData();
|
||||||
|
|
||||||
|
RigEclipseCaseData* eclipseCaseData = eclipseResultCase->eclipseCaseData();
|
||||||
|
|
||||||
|
bool requiredInputDataPresent = false;
|
||||||
|
if (!eclipseCaseData->equilData().empty())
|
||||||
|
{
|
||||||
|
if (eclipseCaseData && eclipseCaseData->results(RiaDefines::MATRIX_MODEL))
|
||||||
|
{
|
||||||
|
RigCaseCellResultsData* resultData = eclipseCaseData->results(RiaDefines::MATRIX_MODEL);
|
||||||
|
|
||||||
|
if (resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PRESSURE")) &&
|
||||||
|
resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) &&
|
||||||
|
resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PBUB")))
|
||||||
|
{
|
||||||
|
requiredInputDataPresent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiredInputDataPresent)
|
||||||
|
{
|
||||||
|
plots = collection->createSaturationPressurePlots(eclipseResultCase);
|
||||||
|
for (auto plot : plots)
|
||||||
|
{
|
||||||
|
plot->loadDataAndUpdate();
|
||||||
|
plot->zoomAll();
|
||||||
|
plot->updateConnectedEditors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return plots;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -60,15 +117,7 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked)
|
|||||||
{
|
{
|
||||||
RimProject* project = RiaApplication::instance()->project();
|
RimProject* project = RiaApplication::instance()->project();
|
||||||
|
|
||||||
bool launchedFromPlotCollection = true;
|
RimSaturationPressurePlotCollection* collection = project->mainPlotCollection()->saturationPressurePlotCollection();
|
||||||
RimSaturationPressurePlotCollection* collection =
|
|
||||||
caf::SelectionManager::instance()->selectedItemAncestorOfType<RimSaturationPressurePlotCollection>();
|
|
||||||
|
|
||||||
if (!collection)
|
|
||||||
{
|
|
||||||
collection = project->mainPlotCollection()->saturationPressurePlotCollection();
|
|
||||||
launchedFromPlotCollection = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<RimEclipseResultCase*> eclipseCases;
|
std::vector<RimEclipseResultCase*> eclipseCases;
|
||||||
{
|
{
|
||||||
@ -112,58 +161,24 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked)
|
|||||||
|
|
||||||
caf::PdmObject* objectToSelect = nullptr;
|
caf::PdmObject* objectToSelect = nullptr;
|
||||||
|
|
||||||
if (eclipseResultCase && eclipseResultCase->ensureReservoirCaseIsOpen())
|
std::vector<RimSaturationPressurePlot*> plots = createPlots(eclipseResultCase);
|
||||||
|
if (plots.empty())
|
||||||
{
|
{
|
||||||
eclipseResultCase->ensureDeckIsParsedForEquilData();
|
QString text = "No plots generated.\n\n";
|
||||||
|
text += "Data required to generate saturation/pressure plots:\n";
|
||||||
|
text += " - EQLNUM property defining at least one region\n";
|
||||||
|
text += " - Dynamic properties PRESSURE, PBUB and PDEW\n\n";
|
||||||
|
text += "Make sure to add 'PBPD' to the RPTRST keyword in the SOLUTION selection. ";
|
||||||
|
text += "If this is a two phase run (Oil/water or Gas/Water) or if both VAPOIL ";
|
||||||
|
text += "and DISGAS are disabled, saturation pressure are not valid.";
|
||||||
|
|
||||||
RigEclipseCaseData* eclipseCaseData = eclipseResultCase->eclipseCaseData();
|
QMessageBox::warning(nullptr, "Saturation Pressure Plots", text);
|
||||||
|
|
||||||
bool requiredInputDataPresent = false;
|
RiaLogging::warning(text);
|
||||||
if (!eclipseCaseData->equilData().empty())
|
}
|
||||||
{
|
else
|
||||||
if (eclipseCaseData && eclipseCaseData->results(RiaDefines::MATRIX_MODEL))
|
{
|
||||||
{
|
objectToSelect = plots.front();
|
||||||
RigCaseCellResultsData* resultData = eclipseCaseData->results(RiaDefines::MATRIX_MODEL);
|
|
||||||
|
|
||||||
if (resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PRESSURE")) &&
|
|
||||||
resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) &&
|
|
||||||
resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PBUB")))
|
|
||||||
{
|
|
||||||
requiredInputDataPresent = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<RimSaturationPressurePlot*> plots;
|
|
||||||
if (requiredInputDataPresent)
|
|
||||||
{
|
|
||||||
plots = collection->createSaturationPressurePlots(eclipseResultCase);
|
|
||||||
for (auto plot : plots)
|
|
||||||
{
|
|
||||||
plot->loadDataAndUpdate();
|
|
||||||
plot->zoomAll();
|
|
||||||
plot->updateConnectedEditors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plots.empty())
|
|
||||||
{
|
|
||||||
QString text = "No plots generated.\n\n";
|
|
||||||
text += "Data required to generate saturation/pressure plots:\n";
|
|
||||||
text += " - EQLNUM property defining at least one region\n";
|
|
||||||
text += " - Dynamic properties PRESSURE, PBUB and PDEW\n\n";
|
|
||||||
text += "Make sure to add 'PBPD' to the RPTRST keyword in the SOLUTION selection. ";
|
|
||||||
text += "If this is a two phase run (Oil/water or Gas/Water) or if both VAPOIL ";
|
|
||||||
text += "and DISGAS are disabled, saturation pressure are not valid.";
|
|
||||||
|
|
||||||
QMessageBox::warning(nullptr, "Saturation Pressure Plots", text);
|
|
||||||
|
|
||||||
RiaLogging::warning(text);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
objectToSelect = plots.front();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collection->updateAllRequiredEditors();
|
collection->updateAllRequiredEditors();
|
||||||
@ -180,15 +195,6 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked)
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RicCreateSaturationPressurePlotsFeature::setupActionLook(QAction* actionToSetup)
|
void RicCreateSaturationPressurePlotsFeature::setupActionLook(QAction* actionToSetup)
|
||||||
{
|
{
|
||||||
RimSaturationPressurePlotCollection* collection =
|
actionToSetup->setText("Create Saturation Pressure Plots");
|
||||||
caf::SelectionManager::instance()->selectedItemAncestorOfType<RimSaturationPressurePlotCollection>();
|
|
||||||
if (!collection)
|
|
||||||
{
|
|
||||||
actionToSetup->setText("New Grid Cross Plot from 3d View");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
actionToSetup->setText("Create Saturation Pressure Plots");
|
|
||||||
}
|
|
||||||
actionToSetup->setIcon(QIcon(":/SummaryXPlotsLight16x16.png"));
|
actionToSetup->setIcon(QIcon(":/SummaryXPlotsLight16x16.png"));
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
#include "cafCmdFeature.h"
|
#include "cafCmdFeature.h"
|
||||||
|
|
||||||
|
class RimEclipseResultCase;
|
||||||
|
class RimSaturationPressurePlot;
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
@ -27,6 +30,9 @@ class RicCreateSaturationPressurePlotsFeature : public caf::CmdFeature
|
|||||||
{
|
{
|
||||||
CAF_CMD_HEADER_INIT;
|
CAF_CMD_HEADER_INIT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static std::vector<RimSaturationPressurePlot*> createPlots(RimEclipseResultCase* eclipseCase);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool isCommandEnabled() override;
|
bool isCommandEnabled() override;
|
||||||
void onActionTriggered(bool isChecked) override;
|
void onActionTriggered(bool isChecked) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user