PYACTION: The actual python code is in an external file
With this commit the PYACTION keyword is changed, instead of embedding the Python code directly in the .DATA file the keyword now points to an external file which is loaded verbatim into the PyAction keyword. In addition the PYACTION keyword has now got a name and a string indicating how many times it should run.
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include <opm/parser/eclipse/Python/Python.hpp>
|
||||
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
#include <opm/parser/eclipse/Parser/ParserKeywords/P.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
||||
|
||||
@@ -99,107 +100,16 @@ BOOST_AUTO_TEST_CASE(PYINPUT_BASIC) {
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(PYACTION) {
|
||||
const std::string deck_string = R"(
|
||||
RUNSPEC
|
||||
|
||||
DIMENS
|
||||
10 10 3 /
|
||||
|
||||
|
||||
GRID
|
||||
|
||||
DX
|
||||
300*1000 /
|
||||
DY
|
||||
300*1000 /
|
||||
DZ
|
||||
100*20 100*30 100*50 /
|
||||
|
||||
TOPS
|
||||
100*8325 /
|
||||
|
||||
PORO
|
||||
300*0.3 /
|
||||
|
||||
PERMX
|
||||
300*1 /
|
||||
|
||||
PERMY
|
||||
300*1 /
|
||||
|
||||
PERMZ
|
||||
300*1 /
|
||||
|
||||
SCHEDULE
|
||||
|
||||
PYACTION
|
||||
import sys
|
||||
sys.stdout.write("Running PYACTION\n")
|
||||
if "FOPR" in context.sim:
|
||||
sys.stdout.write("Have FOPR: {}\n".format( context.sim["FOPR"] ))
|
||||
else:
|
||||
sys.stdout.write("Missing FOPR\n")
|
||||
|
||||
grid = context.state.grid()
|
||||
sys.stdout.write("Grid dimensions: ({},{},{})\n".format(grid.nx, grid.ny, grid.nz))
|
||||
|
||||
prod_well = context.schedule.get_well("PROD1", context.report_step)
|
||||
sys.stdout.write("Well status: {}\n".format(prod_well.status()))
|
||||
if not "list" in context.storage:
|
||||
context.storage["list"] = []
|
||||
context.storage["list"].append(context.report_step)
|
||||
|
||||
if context.sim.well_var("PROD1", "WWCT") > 0.80:
|
||||
context.schedule.shut_well("PROD1", context.report_step)
|
||||
context.schedule.open_well("PROD2", context.report_step)
|
||||
context.sim.update("RUN_COUNT", 1)
|
||||
print(context.storage["list"])
|
||||
PYEND
|
||||
|
||||
|
||||
WELSPECS
|
||||
'PROD1' 'G1' 10 10 8400 'OIL' /
|
||||
'PROD2' 'G1' 5 5 8400 'OIL' /
|
||||
'INJ' 'G1' 1 1 8335 'GAS' /
|
||||
/
|
||||
|
||||
COMPDAT
|
||||
'PROD1' 10 10 3 3 'OPEN' 1* 1* 0.5 /
|
||||
'PROD2' 5 5 3 3 'SHUT' 1* 1* 0.5 /
|
||||
'INJ' 1 1 1 1 'OPEN' 1* 1* 0.5 /
|
||||
/
|
||||
|
||||
|
||||
WCONPROD
|
||||
'PROD1' 'OPEN' 'ORAT' 20000 4* 1000 /
|
||||
/
|
||||
|
||||
WCONINJE
|
||||
'INJ' 'GAS' 'OPEN' 'RATE' 100000 1* 9014 /
|
||||
/
|
||||
|
||||
TSTEP
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31
|
||||
31 28 31 30 31 30 31 31 30 31 30 31 /
|
||||
|
||||
END
|
||||
)";
|
||||
Parser parser;
|
||||
auto deck = parser.parseString(deck_string);
|
||||
auto deck = parser.parseFile("EMBEDDED_PYTHON.DATA");
|
||||
auto ecl_state = EclipseState(deck);
|
||||
auto schedule = Schedule(deck, ecl_state);
|
||||
|
||||
Python python;
|
||||
SummaryState st(std::chrono::system_clock::now());
|
||||
PyAction py_action(deck.getKeyword("PYACTION").getRecord(0).getItem("code").get<std::string>(0));
|
||||
const auto& pyaction_kw = deck.getKeyword<ParserKeywords::PYACTION>(0);
|
||||
const std::string& fname = pyaction_kw.getRecord(1).getItem(0).get<std::string>(0);
|
||||
PyAction py_action("WCLOSE", PyAction::RunCount::unlimited, PyAction::load(deck.getInputPath(), fname));
|
||||
st.update_well_var("PROD1", "WWCT", 0);
|
||||
python.exec(py_action, ecl_state, schedule, 10, st);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user