Commit Graph
100 Commits
Author SHA1 Message Date
Håkon Hægland 5730dcf166 Update Schedule constructor
This is needed for PR 4123 in opm-common to build
2024-11-25 18:11:27 +01:00
Håkon Hægland 54d303ae5d Merge pull request #5401 from akva2/fix_cuda_shared_linking
fixed: linking of some cuda tests with shared libraries
2024-06-24 11:33:36 +02:00
Håkon Hægland a6c28ea85a Use the module sphinx-versioned-docs
Use the Python module sphinx-versioned-docs to get versioned docs.
Currently, there is only a version for the HEAD of the master branch
but release versions can be added later by specifying a release tag.
2024-05-14 09:00:58 +02:00
Håkon Hægland 34f93e2198 Dynamically extract sphinx documentation release version.
Dynamically extract sphinx documentation release version from
dune.module version.
2024-05-14 09:00:58 +02:00
Håkon Hægland 566a844fef Added sphinx documentation for Python bindings
Added sphinx documentation for the opm.simulators.BlackOilSimulator
Python module. Added GitHub action workflow to deploy sphinx
documentation to GitHub Pages.
2024-05-14 09:00:52 +02:00
Håkon Hægland 6c3f3af4b4 Docstring fixes 2024-05-02 11:24:58 +02:00
Håkon Hægland a1b7d4b5dd Allow Python bindings to setup MPI
Allows the Python bindings to control whether MPI_Init() and
MPI_Finalize() will be called when creating an OPM::Main object.
2024-05-02 11:14:07 +02:00
Håkon Hægland 8cbb1707e7 Move statements to after target is defined 2024-03-05 11:11:53 +01:00
Håkon Hægland 1c5143f02e Improve CMakeLists.txt
Add the generated .hpp file directly to pybind11 sources instead of
creating a custom target.
2024-03-05 10:48:04 +01:00
Håkon Hægland e20faa255c Add docstrings for Python bindings 2024-03-05 10:18:54 +01:00
Håkon Hægland 67bcc491ff Remove unused variables 2024-03-05 09:22:15 +01:00
Håkon Hægland 66eb6e1625 use the elements() range generator 2024-03-05 08:53:54 +01:00
Håkon Hægland 757c67f284 Return vectors by value
Return vectors by value instead of unique pointers to arrays.
2024-03-01 14:22:37 +01:00
Håkon Hægland 55aab60549 Get primary variables and fluid state from Python
Added methods to Python module opm.simulators.BlackOilSimulator to
access primary variables and fluid state variables.
2024-03-01 14:22:35 +01:00
Håkon Hægland 8849c7d357 Removed reference to unit system
The unit system is not used in this example, so we can remove it.
2023-09-25 11:01:12 +02:00
Håkon Hægland 9778929a81 Added some Python documentation 2023-09-25 10:18:13 +02:00
Håkon Hægland ac927d997b Added a get_dt() method
Added a get_dt() to the opm.simulators.BlackOilSimulator Python module.
This will return the size of the previous simulator time step.
2023-09-08 19:40:42 +02:00
Håkon Hægland e2f62644ae Get cell volumes from Python
Adds a new method get_cell_volumes() to the opm.simulators Python module
that returns a python list of the cell volumes in the black oil
simulator.
2023-09-08 09:39:24 +02:00
Håkon Hægland b1274096e9 Added to partially supported keywords
Added GECON to the list of partially supported keywords
2023-09-01 11:29:18 +02:00
Håkon Hægland dba282c7a4 Added missing header file 2023-08-29 09:14:35 +02:00
Håkon Hægland a5899f6f2f Added missing header file 2023-08-29 09:02:12 +02:00
Håkon Hægland 2f9b136bb1 Implement support for GECON keyword
Implement support for item 2 and 3 of the GECON keyword
2023-08-29 01:07:21 +02:00
Håkon Hægland 6d4959854e Undo last commit 2023-06-02 09:25:34 +02:00
Håkon Hægland 0a48f683ab Rearrange order of header includes 2023-06-02 09:25:34 +02:00
Håkon Hægland 7d68261d0b Removed unused variable
Removed an unused variable and fixed a bug that caused a warning.
2023-06-02 09:25:34 +02:00
Håkon Hægland 8843e8af66 Find thp iteratively 2023-06-02 09:25:34 +02:00
Håkon Hægland 79af105de5 Rebased on master 2023-06-02 09:25:34 +02:00
Håkon Hægland 64c041d08f Account for pressure loss also in thp 2023-06-02 09:25:34 +02:00
Håkon Hægland 54c7af85d4 Use new name from opm-common 2023-06-02 09:25:34 +02:00
Håkon Hægland bdfa287fec Add missing include file 2023-06-02 09:25:34 +02:00
Håkon Hægland 7feced0f52 Add missing include file 2023-06-02 09:25:34 +02:00
Håkon Hægland 69a0d1e20e Add support for WVFPDP 2023-06-02 09:25:34 +02:00
Håkon Hægland e241fccbca Only iterate wells activated for gaslift 2023-04-13 11:08:30 +02:00
Håkon Hægland 4ba5e3efad Iterate ALQ when testing gaslift well
When testing a gaslift well under THP control, if the
well does not converge with maximum alq, try to reduce alq
in increments until well equations converge.
2023-04-13 10:40:29 +02:00
Håkon Hægland 973a883043 Some minor changes as requested in review. 2023-03-31 09:26:28 +02:00
Håkon Hægland c2916bc7d9 Fix bug when recalculating gaslift gradient
Fixes a bug in recalculateGradientAndUpdateData_() if gaslift stage2.
Also adds some more debugging output.
2023-03-30 17:44:21 +02:00
Håkon Hægland 536ec73950 Add support for IMBNUMX, IMBNUMY, IMBNUMZ 2023-01-16 09:25:16 +01:00
Håkon Hægland c313a0a4b2 Remove unused variables 2022-11-21 08:58:49 +01:00
Håkon Hægland 43244c2132 Change condition under which stage 2 is done.
It only makes sense to try to optimize the distribution of lift gas if
the amount of lift gas is constrained either by the maximum allowed
gaslift or total gas or the group is under individual control.
2022-11-21 08:58:49 +01:00
Håkon Hægland 686a6a969d Calculate gradients with group limits.
Take into account group limits when calculating gradients for individual
wells in stage 2 of gas lift optimization.
2022-11-21 08:58:49 +01:00
Håkon Hægland 9c61262329 Changed formatting. 2022-11-21 08:58:49 +01:00
Håkon Hægland bc566e3981 Also check LRAT group target in stage2
Also account for a group LRAT limit when removing surplus ALQ in gaslift
optimization stage 2.
2022-11-21 08:58:49 +01:00
Håkon Hægland 61ed803740 Do stage2 even if GLIFTOPT is not defined 2022-11-21 08:58:49 +01:00
Håkon Hægland 5aa9f6cdea Simplify statement
We do not need to explicitly mention the template parameter here.
2022-09-26 17:55:30 +02:00
Håkon Hægland c9ae20bb64 Move updateRelperms() to the problem class
Moves the updateRelperms() method in BlackOilInstensiveQuantities in
opm-models to the EclProblem class and its parent MultiPhaseBaseProblem.
This is a more natural place for this method and it avoids having to
include EclMaterialManager into the  BlackOilInstensiveQuantities.
2022-09-26 17:13:03 +02:00
Håkon Hægland 4a9da82e94 Move updateRelperms() to the problem class
Moves the updateRelperms() method in BlackOilInstensiveQuantities to the
Problem class. This is a more natural place for this method and it avoids
including EclMaterialManager into the  BlackOilInstensiveQuantities. The
DirectionalMobility struct is moved to a separate file such that it can be
include from both the Problem files and the BlackOilInstensiveQuanMove
updateRelperms() to the problem class
2022-09-26 17:11:43 +02:00
Håkon Hægland f36aa67804 Return a nullptr to the EclMaterialLawManager
Define a method materialLawManagerPtr() that returns a nullpointer
to EclMaterialLawManager, but that can be overridden in derived classes
e.g. EclProblem
2022-09-23 00:05:09 +02:00
Håkon Hægland affc5cb53b Return a pointer to the material manager
This is used by blackoilintensivequantities.hh. Further, for other
problems derived from MultiPhaseBaseProblem, that base class will
return a null pointer such that problems that do not override the
materialLawManagerPtr() method still can use the blackoil intensive
quantitites (which in the case of directional relative permeabilities
makes use of the problem reference to access the materialLawManager)
2022-09-22 23:54:29 +02:00
Håkon Hægland a941ba49c0 Try to fix: no type named EclMaterialLawManager
Try to fix jenkins build error: no type named EclMaterialLawManager
2022-09-20 22:09:04 +02:00
Håkon Hægland 90a3ae8940 Include missing header 2022-09-20 21:59:00 +02:00
Håkon Hægland e143c9ed13 Move the CopyablePtr class to a separate file
Moved the CopyablePtr template class to opm-common, see file
opm/utility/CopyablePtr.hpp in opm-common
2022-09-20 01:27:59 +02:00
Håkon Hægland 769577c8aa Explicitly initialize member in copy constructor
For clarity, explicitly default construct the unique_ptr in the copy
constructor
2022-09-19 18:48:33 +02:00
Håkon Hægland cedb92c6d2 Make get() return a pointer instead of a reference
This is more in line with how std::unique_ptr works.
2022-09-19 18:15:04 +02:00
Håkon Hægland d9c6ecf79d Add missing include file 2022-09-19 12:03:22 +02:00
Håkon Hægland d15c5b51c8 Use a copyable unique pointer
Use a copyable unique pointer instead of writing custom copy constructor
and assignment operator.
2022-09-19 01:42:09 +02:00
Håkon Hægland 38add2ed66 Rename dirId() to faceDirFromDirId() 2022-09-16 09:22:17 +02:00
Håkon Hægland dc6141af13 Make updateRelperms() a static function
To aid readability, we make updateRelperms() a static function.
2022-09-16 09:20:48 +02:00
Håkon Hægland ee8e565137 Use unique_ptr for dirMob_ instead of shared_ptr
To make each copy of the IQ unique, we change dirMob_ to be a shared_ptr
instead of a unique_ptr.
2022-09-16 09:17:39 +02:00
Håkon Hægland c6129ad9a4 Renamed function in ecfvstencil.hh
Use the new name of the dirId() function in ecfvstencil.hh
2022-09-16 09:10:42 +02:00
Håkon Hægland cbdec23e50 Also check for unknown face direction
To avoid compiler warnings, we also need to check for the unknown face
direction due to change in the FaceDir::DirEnum values in opm-common.
2022-09-16 09:07:25 +02:00
Håkon Hægland 9ed974fda3 Minor simplification
Simplify code using the unknown facedir value.
2022-09-14 23:54:43 +02:00
Håkon Hægland 7eeca28018 Add more support for directional relperms
Adds support for directional relperms for the tpfa linearizer.
2022-09-14 23:37:10 +02:00
Håkon Hægland 7d0265dd44 Limit access to face direction.
Only access the grid face direction information if directional relperms
have been enabled.
2022-09-14 15:34:41 +02:00
Håkon Hægland 8b1bcb36bc Adds support for KRNUM 2022-09-14 15:34:41 +02:00
Håkon Hægland fe7b415350 Fix typo 2022-09-14 15:34:38 +02:00
Håkon Hægland ca78d271ce Only store directional mobilities if needed 2022-09-14 15:34:38 +02:00
Håkon Hægland 81cf436630 Add support for KRNUM 2022-09-14 15:34:38 +02:00
Håkon Hægland 8e3ce1aed9 Only copy necessary files from python folder
Instead of copying the whole python folder, only copy the necessary files to
the build directory. This means the opm, test, and test_data directories.
2022-06-10 12:19:24 +02:00
Håkon Hægland 8af152dcff Make Python opm package a namespace package
Convert the Python opm package from a regular package to a namespace
package such that opm-simulators and opm-common can contribute to the
package from different filesystem paths. In this way, the two packages
opm.simulators and opm.io (in opm-common) can have a different parent
filesystem path.
2022-06-10 11:37:15 +02:00
Håkon Hægland 19b074805d Use the new opm-common_PYTHON_COMMON_DIR
Use the new opm-common_PYTHON_COMMON_DIR to locate the install.py
script if we are building against an installed opm-common.
2022-06-10 11:31:48 +02:00
Håkon Hægland 9b0c63b325 Also use installed install.py for copy_python
Also use the installed install.py when copying python files at build time
2022-06-10 11:31:48 +02:00
Håkon Hægland 696f830eab Use installed install.py
If we are building against an installed opm-common, use the installed
install.py script instead
2022-06-10 11:31:48 +02:00
Håkon Hægland 063e336ec6 Remove SYSTEM argument for cmake >= 3.12
Remove SYSTEM argument for pybind11_add_module() if cmake version is
greater than 3.12. It appears that this argument has been deprecated
and also removed by the new FindPython mode in the cmake tools for
pybind11.
2022-06-10 11:31:48 +02:00
Håkon Hægland 101a5ada82 Also search for development artifacts
We should also search for development artifacts when combining
FindPython3.cmake with find_package(pybind11)
2022-06-10 11:31:48 +02:00
Håkon Hægland 3c0498e55f Dynamically update schedule from Python
Adds some test cases that show how injection properties in Opm::Schedule
can be dynamically modified from Python.
2022-06-10 11:31:48 +02:00
Håkon Hægland 91ac3a2a32 Dynamically update schedule from Python
Adds some methods that enables Opm::Schedule to be dynamically modified
from Python. A test case in test_schedule.py illustrates the use case.
2022-05-05 13:10:39 +02:00
Håkon Hægland 9d04895ddb Fix assertion error for 2p oil water
VFP calculations for two phase gas lift does not work unless the
rates are adpated to include a zero gas rate.
2022-04-20 21:47:15 +02:00
Håkon Hægland 11907495c1 Well testing of gas lift wells
Assign a maximum ALQ value to each GLIFT producer when doing well testing
in beginTimeStep(). This allows the well to be considered open. Then,
later in the timestep, when assemble() is called, the full gas lift
optimization procedure can adjust the ALQ to its correct value.

It is also observed that in some cases when gas lift is switched off by
setting ALQ to zero, and later in the schedule is switched back on again,
it might not be possible to determine bhp from thp for low small ALQ values.
Instead of aborting the gas lift optimization, we should try increasing
ALQ until we get convergence or until the maximum ALQ for the well is
reached.
2022-04-20 10:51:34 +02:00
Håkon Hægland a3c131955f Omit one redundant debugging message 2022-03-24 13:47:57 +01:00
Håkon Hægland fbd6c03dd6 Cleanup glift debugging output code 2022-03-24 12:42:46 +01:00
Håkon Hægland 367e26a719 Use new constructor
Refer to opm-common/pull #2971. In order to use the new constructor
proposed in that PR, the constructor must now be passed a boolean
variable signalling if gaslift is active.
2022-03-09 09:11:10 +01:00
Håkon Hægland 3cf181b2ee Throw exception instead of using assert
Throw an exception if two-phase gas lift optimization is used for
other phases than oil and water.
2022-03-07 15:58:11 +01:00
Håkon Hægland 438a712e54 Gas lift optimization for two-phase oil-water.
Add gas lift optimization support for two-phase oil-water flow.
2022-03-07 15:19:43 +01:00
Håkon Hægland c7aa43a82b Rename some methods and variables.
Renames some methods and variables to reflect that the well is no
longer necessarily a StandardWell. It can be either a MultisegmentWell
or a StandardWell. This should avoid confusion about the nature of
the variable.
2022-02-15 10:21:09 +01:00
Håkon Hægland 54160827de Add gaslift optimization support for MSW.
Implements gas lift optimization support for multisegmented wells (MSW).
2022-02-14 21:38:50 +01:00
Håkon Hægland 65c323e1a4 Replace assert with warning.
Replace assert with warning when group rates exceeds target.
2022-01-31 01:52:36 +01:00
Håkon Hægland 8810fa65af Cleanup code in GasLiftSingleWellGeneric
Introduces two new data types BasicRates and LimitedRates to capture
oil, gas, and water rates, and whether they have been limited by well
or group targets. This reduces the number of variables that are passed
to and returned from various methods and thus makes the code easier to
read.
2022-01-31 01:39:20 +01:00
Håkon Hægland a14ed57921 Silence reorder warning in GasLiftCommon 2022-01-25 13:31:49 +01:00
Håkon Hægland 538559cafa Add gas lift headers to PUBLIC_HEADER_FILES
The headers BlackoilWellModel.hpp, StandardWell.hpp,and WellInterface.hpp
all include various GasLift*.hpp headers directly. That means that any
client code that uses those well-related headers will need to have the
GasLift* headers available too.

Also sorts the headers under opm/simulators/wells to make the it easier
to read.
2022-01-25 12:14:50 +01:00
Håkon Hægland 4970b0641e Improve debugging tools in gaslift code.
Introduces a gaslift debugging variable in ALQState in WellState. This
variable will persist between timesteps in contrast to when debugging
variables are defined in GasLiftSingleWell, GasLiftGroupState, or GasLiftStage2.

Currently only an integer variable debug_counter is added to ALQState,
which can be used as follows: First debugging is switched on globally
for BlackOilWellModel, GasLiftSingleWell, GasLiftGroupState, and
GasLiftStage2 by setting glift_debug to a true value in BlackOilWellModelGeneric.
Then, the following debugging code can be added to e.g. one of
GasLiftSingleWell, GasLiftGroupState, or GasLiftStage2 :

    auto count = debugUpdateGlobalCounter_();
    if (count == some_integer) {
        displayDebugMessage_("stop here");
    }

Here, the integer "some_integer" is determined typically by looking at
the debugging output of a previous run. This can be done since the
call to debugUpdateGlobalCounter_() will print out the current value
of the counter and then increment the counter by one. And it will be
easy to recognize these values in the debug ouput. If you find a place
in the output that looks suspect, just take a note of the counter
value in the output around that point and insert the value for
"some_integer", then after recompiling the code with the desired value
for "some_integer", it is now easy to set a breakpoint in GDB at the
line

    displayDebugMessage_("stop here").

shown in the above snippet. This should improve the ability to quickly
to set a breakpoint in GDB around at a given time and point in the simulation.
2022-01-23 20:37:26 +01:00
Håkon Hægland 4bdf7c1b58 Refactor methods getXyzRateWithLimit_()
Refactors getOilRateWithLimit_(), getGasRateWithLimit_(), and
getWaterRateWithLimit_() in GasLiftSingleWellGeneric.cpp. The
common part of the methods is split out into a new method called
getRateWithLimit_(). The purpose of the refactorization is to reduce
reptetive code and make the code easier to maintain.
2021-12-22 10:45:31 +01:00
Håkon Hægland f28b906782 Made some methods in GasLiftGroupInfo const
This is in agreement with C++ Core Guidelines. A member function should
be marked const unless it changes the object’s observable state. This
gives a more precise statement of design intent, better readability, more
errors caught by the compiler, and sometimes more optimization opportunities.
2021-12-21 23:24:58 +01:00
Håkon Hægland 11ad879472 Make parameters to getLiquidRateWithGroupLimit_() const
To improve readability, we make the parameters of
getLiquidRateWithGroupLimit_() const as discussed in
https://github.com/OPM/opm-simulators/pull/3748
2021-12-20 23:19:40 +01:00
Håkon Hægland 837f33e679 Refactor some methods in GasLiftSingleWellGeneric.
Refactor getOilRateWithGroupLimit_(), getGasRateWithGroupLimit_(),
getWaterRateWithGroupLimit_(), and getLiquidRateWithGroupLimit_() into
a single generic method called getRateWithGroupLimit_().
2021-12-20 23:08:31 +01:00
Håkon Hægland e388827d81 Fixup in GasLiftSingleWellGeneric
Consider all groups when reducing oil rate to group limits.
The current code just checks the first group limit in the set.
But there might be groups later in the set with more restrictive
limits, causing the oil rate to be reduced more than the first
limit.
2021-12-15 19:15:35 +01:00
Håkon Hægland 738b5c5f18 Small clean up in GasLiftSingleWellGeneric.cpp
As discussed in PR #3728, it is better to move the two methods
reduceALQtoGroupTarget() and checkGroupTargetsViolated() from
OptimizeState to the parent class, then we do not have to abuse
OptimizeState in maybeAdjustALQbeforeOptimizeLoop_() just to call
reduceALQtoGroupTarget().

Also fixes a typo (as discussed in PR #3729) in reduceALQtoGrouptTarget()
where the water rate is updated with the gas flow rate instead of the
water flow rate. Should be like this:

 water_rate = -potentials[this->parent.water_pos_];

instead of

 water_rate = -potentials[this->parent.gas_pos_];
2021-12-09 11:58:43 +01:00
Håkon Hægland 7a394df43f Include <stdexcept> header to use std::logic_error()
And some minor stylistic changes.
2021-09-23 13:13:23 +02:00
Håkon Hægland 16bbc338ab Don't increase shared_ptrs use_count when forwarding.
Use std::move() to avoid increasing the use count of std::shared_ptr
when forwarding them to the vanguard object.
2021-09-23 10:56:18 +02:00
Håkon Hægland 4c5245196b Changed calling convention for shared pointers.
Expect non-reference type shared pointers arguments instead of references
to shared pointer. This will make it clear to the caller that the called
function is making a copy of the pointer for its own use and not trying
to modify the original pointer of the caller.
2021-09-22 23:49:13 +02:00
Håkon Hægland 5ad65c70ee Initialize blackoil simulator from schedule shared with Python.
Adds a new constructor to Main.hpp that takes shared pointers to Deck,
EclipseState, Schedule, and SummaryConfig. This makes it possible to
share these variables with Python without worrying about lifetime issues
of the underlying C++ objects. For example, a Python script can first
create an opm.io.schedule.Schedule object which is modified from Python.
Then, assume the same Python script creates an
opm.simulators.BlackOilSimulator which is initialized with the same
schedule object. Since the underlying C++ object is a shared pointer,
the Schedule object in Python may go out of scope (get deleted by Python)
without having the C++ schedule object being deleted. And the Python
BlackOilSimulator may continue to be used after the Python Schedule object
has been deleted since it still has a valid C++ schedule object.
2021-09-21 15:52:59 +02:00