Commit Graph
100 Commits
Author SHA1 Message Date
Roland Kaufmann acf9f96e46 Use TimeMap directly instead of copying times
The simulator object will probably have created a time map anyway to
control the timestepping so this can be reused directly by the output
writer. (If not, it is easy to create one and pass it).
2014-04-01 20:27:53 +02:00
Roland Kaufmann a4c168e58e Use new parser for reading time map and generating output 2014-04-01 14:34:02 +02:00
Roland Kaufmann 5371e19d19 Use new parser in common output interface
Since EclipseWriter can now take a Deck instead of an EclipseGridParser
the interface can be changed to take this type instead.
2014-04-01 14:33:55 +02:00
Roland Kaufmann ac61cde15f Depend on Boost::iostreams
The benchmark library uses Boost::iostreams to do decompression. Since
we only scan for the Boost dependency once, this submodule is added to
all of the projects in order to have a coherent dependency on Boost.
2014-02-28 18:22:33 +01:00
Roland Kaufmann 54fbd6b190 Provide dependency information for opm-benchmarks 2014-02-28 18:21:33 +01:00
Roland Kaufmann fc231e8978 Declare a need to know if BOOST is available
Note that the variable HAVE_DUNE_BOOST is not set by FindBoost,
but by OpmAliases.
2014-01-24 13:58:48 +01:00
Roland Kaufmann 981fe79429 Declare a need to know if UMFPACK is available
Note that the variable HAVE_UMFPACK is not set by FindSuiteSparse,
but by OpmAliases.
2014-01-24 13:58:48 +01:00
Roland Kaufmann 60c54705c0 Create aliases for probed variables
Headers from other libraries (notably DUNE) require definitions of
other variables than our probe process set (e.g. HAVE_UMFPACK instead
of HAVE_SUITESPARSE_UMFPACK_H). This module sets those aliases for
compatibility.
2014-01-24 13:58:47 +01:00
Roland Kaufmann e79a65bb81 Terminology instead of Notation as section header
Notation implies that we are going to be given symbols which
represents values or such (which arguably could be true since the
path is a particular value, and from programming we are used to
multi-letter symbols perhaps also with whitespace, but it's a
stretch), but Terminology is more accurate, as this section
describes fits the definition better: it is a vocabulary of
technical terms.

Hat tip: @bska
2014-01-15 09:08:00 +01:00
Roland Kaufmann d5a3db50c5 Document modules and structures in the build system
Give a brief description of each of the modules that comprises the build
system, and the suffices that is used to form a virtual structure of
variables for each project.
2014-01-14 21:14:17 +01:00
Roland Kaufmann ee7f4242b5 Only add linker option if it is not really there
This code is run unconditionally each time we do a reconfigure; if the
option is added at each time, they will accumulate (needlessly) on the
command-line, making it harder to inspect the log.
2013-12-10 21:01:22 +01:00
Roland Kaufmann a9e71c0d84 Provide CMake find module for opm-autodiff
If the module root is not explicitly specified, the loading of its
configuration is delegated to a find module, which does a heuristic
search in known/surrounding directories. Most OPM modules use the
common logic in OpmPackage; this patch configures the search
specifically for opm-autodiff.
2013-12-06 23:31:57 +01:00
Roland Kaufmann a62e2f4770 Search after new Eigen3 versions in sibling dirs
If we have checked out a newer Eigen3 directory in a sibling directory
to ours, assume that this is because the system version is obsolete and
that we want to use this one instead.
2013-12-06 23:26:57 +01:00
Roland Kaufmann 7d75c4f058 If given build tree as Eigen3 root, find source
Eigen3 is a template-library, so we must compile the source code
directly together with ours instead of linking to a library.

If the build script gives us the location of a "built" Eigen3,
meaning a directory in which CMake has been run, locate the true
source directory from the cache entries.
2013-12-06 23:26:37 +01:00
Roland Kaufmann 392c6b3892 Actually use transformation function that was passed 2013-11-28 19:34:47 +01:00
Roland Kaufmann 7eeb381f45 Fix grammatical error in comment 2013-11-28 11:37:39 +01:00
Roland Kaufmann 039e549033 Allow sequentially layed out arrays to be indexed
If we want to index into two arrays that has been concatenated (for
instance oil phase pressure continuously, then water phase pressure
continuously), then this variant (courtesy of @bska) will cover both
variants (intermixed striding (where offset < stride) and sequentially
striding (where offset > stride)).
2013-11-28 11:10:52 +01:00
Roland Kaufmann a997c17a51 Offset is irrelevant for the number of records
We are interested in how many records there are, since we extract one
item per record. The offset is just used to index into each record, and
doesn't affect the total number of records.
2013-11-28 01:04:03 +01:00
Roland Kaufmann a0a574b01a Use the previous step length to calculate historic rate 2013-11-27 00:37:40 +01:00
Roland Kaufmann 8e95f522bf Provide routine to return the step length taken
The output routine needs to know which step that has been taken in the
past (to arrive at this result), not which step to take next going
forward.
2013-11-27 00:36:17 +01:00
Roland Kaufmann 9cba2591e9 Do without the timestep index adjustment
If the output routines are called at the right place in the simulator,
then the numbering scheme coincide with that of Eclipse, and no
adjustments are necessary.
2013-11-27 00:24:30 +01:00
Roland Kaufmann ee78a79316 Replace unclear constant with better documentation
The step number is zero before the first timestep has been taken, and
one after. The step number is one before the second timestep has been
taken, and two after. This was not clear from the text.
2013-11-27 00:23:00 +01:00
Roland Kaufmann e6c77c8afb Report after the timestep really is completed
If we report before we increment the timer, then we will report at
a time which is at the beginning and not at the end of the timestep.
2013-11-27 00:04:45 +01:00
Roland Kaufmann 57beb1c279 Don't write initial state in main timestep loop
The call to writeInit should take care of this instead.
2013-11-26 23:54:30 +01:00
Roland Kaufmann 9bcb7aed30 Convert permeability to milli-Darcy when writing 2013-11-26 23:43:58 +01:00
Roland Kaufmann d62226dd3c Introduce conversion function to avoid explicit copy
We already copy the data once from the OPM state into the ERT-managed
memory, so we may as well fudge a conversion routine in there (at the
expense of having to do this everywhere).
2013-11-26 23:22:25 +01:00
Roland Kaufmann c3e0b83927 Write initial solution when the writer is initialized 2013-11-26 22:34:42 +01:00
Roland Kaufmann 7e349636c1 Propagate initial state to the writer as well
The writeTimeStep method is called *after* each timestep and does
not include the initial state of the reservoir. If the writer wants
to dump the initial state of the reservoir, this must be done in
writeInit, which is called before the simulator is run, but after
the initial state has been set up.
2013-11-26 22:34:42 +01:00
Roland Kaufmann 1c0051b40e Factor out code that writes solution field variables
We will reuse this later for also writing the initial solution.
2013-11-26 22:34:42 +01:00
Roland Kaufmann e7da0053cf Allow timestep index to be overridden
The Eclipse timestep index can not always be retrieved from the
SimulatorTimer object; the initial state is 0 in Eclipse (and does not
have an index in OPM), and the timestep in OPM is not increased until
*after* the timestep is completed (i.e. it is not initialized to -1).
2013-11-26 22:34:42 +01:00
Roland Kaufmann be7fd164b8 Don't write latest timestep twice for skipped report
If the simulator skips a reporting timestep, the latest timestep
should not be written twice to compensate (!).
2013-11-26 14:08:18 +01:00
Roland Kaufmann 7e2950f1dc Write the field data for the initial timestep 2013-11-26 14:08:18 +01:00
Roland Kaufmann 6becc16567 Don't use the wrong index for the timestep 2013-11-26 14:08:17 +01:00
Roland Kaufmann f272f54e56 Make starting timestep more explicitly known
One-based or zero-based? Better be documented (in a way that doesn't
promote hard-coding in the clients!)
2013-11-26 12:44:37 +01:00
Roland Kaufmann d15056be11 Added comment about header/data for each timestep
We would like to build up and write the header only once (with
ecl_sum_fwrite_smspec) and then the data for each timestep (with
ecl_sum_fwrite_step), but since the data attach to the summary
object and so does the header, how do we keep the header in memory
without also accumulating all the data?
2013-11-26 12:28:56 +01:00
Roland Kaufmann bf19e48e67 Add virtual destructor to avoid memory loss upon free 2013-11-26 11:40:37 +01:00
Roland Kaufmann a145c7489f Use forward list since we don't need random access 2013-11-26 11:19:39 +01:00
Roland Kaufmann d67088b15d Let timestep and well report be owned by summary
Instead of calling the destroy functions for the timestep and well
report objects, the ERT memory allocated for these are contained in
the summary handle and freed together with that.

The timestep and well report objects thus becomes only views into this
memory; it is no longer allowed for these to outlive the summary section
(not that this was ever sensible in the first place).
2013-11-26 10:46:10 +01:00
Roland Kaufmann e806be8f83 Setup a new summary section for each timestep
Although this will lead to parsing the same input data over and over
again (setting up the smspecs for the wells), the summary files contain
this redundant information because in Eclipse, wells can appear and
disappear during the run.
2013-11-26 10:16:30 +01:00
Roland Kaufmann aff6fad661 Use more generic simulator state
We can dump the state of the two-phase incompressible simulators as
well as the blackoil simulators by just using the common interface.
2013-11-25 14:14:51 +01:00
Roland Kaufmann 754ff4c2ee Use std namespace for div function
Although GCC 4.6.3 implements div by including stdlib.h (where
everything is put in the global namespace), and then importing these
into std, not every compiler does this (one could for instance think
that in #include <stdlib.h> inside the namespace).
2013-11-25 14:14:50 +01:00
Roland Kaufmann f45f7d19a0 Don't copy data needlessly 2013-11-25 14:14:50 +01:00
Roland Kaufmann f83d581e42 Correct number of elements taken from strided arrays
If we have a stride > 1, then we take fewer elements from the array;
the old code would fill in a bunch of unrelated data at the end.
2013-11-25 14:14:50 +01:00
Roland Kaufmann 06fffedc4f Revert "Data copying takes an iterator"
The original rationale for commit c39d367 was to pass a pointer since
this was all we got from one of the APIs. However, just after the code
was changed to copy the data anyway since it would have to be converted
from double to float.

Reverting actually serves a purpose; as @bska pointed out, taking
&data[0] of an empty vector is undefined, whereas it now checks the
size and assert here (and not in the standard library) on that condition.
2013-11-25 14:14:50 +01:00
Roland Kaufmann 24b6bd8254 Refactor common code into a function 2013-11-25 14:14:50 +01:00
Roland Kaufmann 419cffe73b Define destructor in .cpp to handle forward-def field
The EclipseSummary field is just forward declared in the header, and
the compiler cannot create a proper destructor based on just that. If
we define it in the compilation unit, it will get instantiated there
once and for all and the compiler won't try to create it (and leave it
to the linker to sort out duplicates) everywhere the header is used
(which may be in another module, even).

This is similar to commit 18b9f2b for SimulatorOutput.
2013-11-25 14:14:50 +01:00
Roland Kaufmann 8e6ccadfc3 Convert timestep numbers to correct base 2013-11-25 14:14:50 +01:00
Roland Kaufmann c3bcd6c83c Use all uppercase in filenames
ERT already does the conversion for *some* of the files; we might as
well convert all the names so that there is no confusion.
2013-11-25 14:14:50 +01:00
Roland Kaufmann d83d7d829c Writing output should not change the state
Therefore we take const parameters across the board. (This is a
follow-up to the patch which declared the UnstructuredGrid const).
2013-11-25 14:14:50 +01:00
Roland Kaufmann eb276f79e1 Eliminate redundant timestep class
Since all construction should go through the wrapper method, and the
class otherwise just handed everything down to the base class, we might
as well inline everything in there to avoid someone starting to make
their own objects of this type.
2013-11-25 14:14:49 +01:00
Roland Kaufmann 06c370009a Add timesteps to a list and write at once in summary
Instead of having each timestep available just locally in the
writeTimeStep method, which will free the memory and create a
corruption error, keep all timesteps on a free list in the summary,
and do all the writing in the destructor there (the memory of the
individual timesteps will have to linger on anyway).
2013-11-25 14:14:49 +01:00
Roland Kaufmann 04ed5b23b4 Use timestep number as is
Why add one? They are already one based.
2013-11-25 14:14:49 +01:00
Roland Kaufmann b9c667214d Write pressure and saturation as single-precision 2013-11-25 14:14:49 +01:00
Roland Kaufmann f3df8d9cf9 Data copying takes an iterator, not necessarily vector 2013-11-25 14:14:49 +01:00
Roland Kaufmann 358f5f75c4 Use float instead of double keywords
ERT requires the type of the keywords that are passed to the grid
allocation routine to be float (and it is checked - causes abort if
there is a mismatch!)
2013-11-25 14:14:49 +01:00
Roland Kaufmann f4b3e3ec56 Provide compatibility constructor for C++03 clients
Clients written to the C++03 standard (most of opm-core, really) do
obviously not use shared_ptr, and most likely takes references with
an implicit lifetime guarantee instead. Converting everything to
shared_ptr is a task for the long run.

This constructor provides the conversion routine that is most likely
to be used: To rely on the lifetime through convention, and then
wrapping everything with share_obj.

It should be considered deprecated out of the box; as soon as you
have the chance to use shared_ptr instead, you should do so.
2013-11-25 14:14:49 +01:00
Roland Kaufmann 6d444c2657 Define Event type completely
The Event type must be known because we call it from the inline template
method. The alternative is worse, we'd have to instantiate the template
for every possible simulator type in the .cpp!
2013-11-25 14:14:49 +01:00
Roland Kaufmann c896df77cf Define destructor in .cpp to avoid defining members
If the compiler is to create the default destructor for us, it will
need the size of the OutputWriter type to be defined at the time of
inclusion in the header. By explicitly defining it in a compilation
unit, we can avoid that.
2013-11-25 14:14:49 +01:00
Roland Kaufmann 3c10785241 Use correct pointer indirection
When the sim parameter is a pointer to a simulator, we must of course
use indirect access to its field; the shared_ptr template class does not
have this method!
2013-11-25 14:14:49 +01:00
Roland Kaufmann 1baf7369ef Use constant grid in output writing
Grid manager returns a const UnstructuredGrid*, and the entire chain
of pointer-passing glory should adhere to this const-ness.
2013-11-25 14:14:48 +01:00
Roland Kaufmann e02f0cd7de Use processed grid to figure out active cell map 2013-11-25 14:14:48 +01:00
Roland Kaufmann cec6f12f50 Store reference to UnstructuredGrid in EclipseWriter 2013-11-25 14:14:48 +01:00
Roland Kaufmann e978cbf848 Remove tucked away reference to parser in Sim.outp. 2013-11-25 14:14:48 +01:00
Roland Kaufmann ce7eb44836 Propagate UnstructuredGrid to the EclipseWriter ctor
The writer will need to know which cells are the active cells after
post-processing (because these are the cells there is stored results
for in the pressure and saturation arrays), and thus not only the
raw input grid (to get the COORD and ZCORN arrays which is not easily
detainable from the UnstructuredGrid), *and* the UnstructuredGrid
needs to be available.
2013-11-25 14:14:48 +01:00
Roland Kaufmann 3b22d1b8f9 Remove superfluous backing class for share_obj
I originally wanted to make share_obj a class so that I could hide the
helper function, but it turned out that I needed a function after all
since a function template can be inferred from the parameters but the
type cannot from the constructor.

By returning a shared_ptr directly, the compiler can do return object
optimization.
2013-11-25 14:14:48 +01:00
Roland Kaufmann f71eee34e1 Forgot header for partial_sum 2013-11-25 14:14:48 +01:00
Roland Kaufmann b6c192fea5 Move shared object hack into more useful generic
The template function share_obj let you pass regular references
as shared pointers, which makes it easy (perhaps too easy) to quick-
fix old code which pass references and have stern warnings about the
lifetime rules of the objects in the documentation section instead.
2013-11-25 14:14:48 +01:00
Roland Kaufmann f710ff71d1 Provide wrapper which connect simulator and writer
This wrapper class aggregate all the result objects (state, timer
etc.) and register itself for notification with the simulator. At
every timestep the simulator should provide a notification. The
wrapper will receive this and pass all the state objects to the
writer(s) which creates a new timestep.

Currently this doesn't work out-of-the-box because only the
two-phase simulator sends notifications and the writer only
understand the state of blackoil simulators, but these two concepts
should be unified.
2013-11-25 14:14:48 +01:00
Roland Kaufmann ede84e6cc8 Add helper to use stack variables with shared_ptr
If an interface requires a shared_ptr, but we have an object that is
known to outlive the client anyway, we can use a custom deleter to
suppress the delete part and pass this object around anyway.
2013-11-25 14:14:48 +01:00
Roland Kaufmann 568e597561 Use shared_ptr to signal lifetime requirement
The code is now allowed to use C++11, where shared_ptr is available
in the standard. To specify that the parser object must be present
for the output writer in its entire lifetime, we require to be passed
a shared_ptr. (This can be faked for local storage anyway).
2013-11-25 14:14:47 +01:00
Roland Kaufmann cd3e047957 Change formatting due to shorter names 2013-11-25 14:14:47 +01:00
Roland Kaufmann 7ea2f32bca Use correct order of saturation names
Due to a glitch the order of the names was put incorrectly in the file,
even though the comment stressed that it was important it was right!

Hat tip: @bska
2013-11-25 14:14:47 +01:00
Roland Kaufmann 39e7943618 Accomodate older versions of boost::filesystem
The return type of the path methods has changed in newer version of
Boost; by wrapping them with a new path object we can get a string
in a way that is compatible for both version 2 and 3.

Hat tip: @bska
2013-11-25 14:14:47 +01:00
Roland Kaufmann b0b50618d0 Only write the declared phases to file
Only the phases that are specified in the input deck should be written.
Hence the class should work with both two- and three-phase simulations.
2013-11-25 14:14:47 +01:00
Roland Kaufmann 6f32b92f6c Renamed away extraneous verbosity in filenames 2013-11-25 14:14:47 +01:00
Roland Kaufmann 36dfc1db52 Assume positive rate for injectors, negative producers
The rate that is written to the file is always (if the flow is natural)
a positive value; for producers we flip the sign before writing.
2013-11-25 14:14:47 +01:00
Roland Kaufmann c630220e6f Reorder loops to resemble future processing
We will look at the presence of keywords first, and then for each
keyword determine which wells it applies to.
2013-11-25 14:14:47 +01:00
Roland Kaufmann 441fd2825b Masquerade the actual output format with an interface
Using an interface allows us to code the simulator to just pass the
necessary state variables to something which implements this, and
then the user can select the actual output format with configuration
values. This allows us to set new formats without having to change
the code being compiled (for instance, we can have a special debug
"format" which prints out things of interest in each timestep)
2013-11-25 14:14:47 +01:00
Roland Kaufmann 992572c522 Don't rely on implicit inclusion 2013-11-25 14:14:47 +01:00
Roland Kaufmann 8a2fb74f0d Document limitations of type parameter for getValue 2013-11-25 14:14:46 +01:00
Roland Kaufmann b53e9b952b Copy between arrays instead of function call
By getting a pointer directly into the data store, the copy can be
performed faster than calling a function for every item. Also, the
storage type of the array should now match the C++ one exactly (i.e.
no conversion to float).
2013-11-25 14:14:46 +01:00
Roland Kaufmann d8db1acc75 Active cell flag is integral, not floating point type 2013-11-25 14:14:46 +01:00
Roland Kaufmann 82ed3dcd72 Refactor common constructor code into a function
GCC 4.4 doesn't handle calling another constructor in the same type.
(Allowed in C++11 but not supported in GCC 4.4's --std=c++0x mode)
2013-11-25 14:14:46 +01:00
Roland Kaufmann cb14ee7ce8 Provide default (move) constructors and operators
C++11 will write a default move constructor that invoke the same in
the base class. However, GCC 4.4 doesn't support this, so we have to
explicitly give the implementation that would be generated on later
compilers.
2013-11-25 14:14:46 +01:00
Roland Kaufmann 74ed3d54c0 Avoid comparing signed and unsigned integers 2013-11-25 14:14:46 +01:00
Roland Kaufmann 4a6e502869 Use integer for counter and cast to enumeration 2013-11-25 14:14:46 +01:00
Roland Kaufmann 2b1ad42b9e Hide internals in its own namespace
If we put them in the anonymous namespace, then we cannot have a
reference to the types in the header (because that would mean different
things in each compilation unit).
2013-11-25 14:14:46 +01:00
Roland Kaufmann 351043f76e Explicitly mention template parameter for base class
GCC 4.4 doesn't understand that EclipseHandle (without template
parameter) is supposed to refer to the base class and not a field.
2013-11-25 14:14:46 +01:00
Roland Kaufmann 1a0b6f0eb6 Eliminate dependency on UnstructuredGrid
The only thing it was needed for was the number of cells in the grid,
and the Cartesian dimensions, and those are already available from other
structures.
2013-11-25 14:14:46 +01:00
Roland Kaufmann 9dc4df625f Correct parameter sequence
ecl_grid_alloc_GRDECL_kw takes zcorn first, then coord (slightly
unintuitive if you ask me), and this is also the order that is used
in EclipseGrid::make; thus, the order should be consistent through
the constructor also.
2013-11-25 14:14:45 +01:00
Roland Kaufmann 5a914a2852 Initialize writer with directories gotten from params 2013-11-25 14:14:45 +01:00
Roland Kaufmann 98a36189d3 Conditionally use input file
If config.h is written, then the build system will also define
HAVE_CONFIG_H.
2013-11-25 14:14:45 +01:00
Roland Kaufmann cdc45b2d56 Trim needless header includes 2013-11-25 14:14:45 +01:00
Roland Kaufmann 1cda556cb9 Remove dependency on ERT in header 2013-11-25 14:14:45 +01:00
Roland Kaufmann 5ce5975586 Coalesce called methods into init and timestep 2013-11-25 14:14:45 +01:00
Roland Kaufmann 572123675d Updated copyright statement at top 2013-11-25 14:14:45 +01:00
Roland Kaufmann 92fd082630 Remove now unused member holding starting time
If we restart from a later time, then the SimulatorTimer should be
restarted in that state as well, so it is already always a reflection
of how far we've progressed in the input file's schedule.
2013-11-25 14:14:45 +01:00
Roland Kaufmann f637a0cea9 Replace summary variables with RAII type 2013-11-25 14:14:45 +01:00
Roland Kaufmann cf8c58a33d Replace restart and solution handling with RAII type 2013-11-25 14:14:45 +01:00
Roland Kaufmann b0a4881d45 Replace init setup with RAII type 2013-11-25 14:14:45 +01:00