From d9c67ef551995ec92734c4ccf8c4b78b9d07409d Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Fri, 1 Mar 2019 10:41:48 +0100 Subject: [PATCH 1/3] ebos: use the same well model, aquifer model and linear solver as flow This enables `ebos` to run Norne and other non-trivial data sets. While at it, adapt the tolerances by `ebos`. This patch only affects the research simulator, i.e. `flow` is unaffected by it. --- ebos/ebos.cc | 21 ++------ ebos/ebos.hh | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 17 deletions(-) create mode 100644 ebos/ebos.hh diff --git a/ebos/ebos.cc b/ebos/ebos.cc index b225f138e..e2a7c05b6 100644 --- a/ebos/ebos.cc +++ b/ebos/ebos.cc @@ -23,28 +23,15 @@ /*! * \file * - * \brief A general-purpose simulator for ECL decks using the black-oil model. + * \brief The main file for ebos, a general-purpose simulator for ECL decks for research + * purposes. */ #include "config.h" -#include -#include - -#include "eclproblem.hh" - -BEGIN_PROPERTIES - -NEW_TYPE_TAG(EclProblem, INHERITS_FROM(BlackOilModel, EclBaseProblem)); - -// Enable experimental features for ebos: ebos is the research simulator of the OPM -// project. If you're looking for a more stable "production quality" simulator, consider -// using `flow` -SET_BOOL_PROP(EclProblem, EnableExperiments, true); - -END_PROPERTIES +#include "ebos.hh" int main(int argc, char **argv) { - typedef TTAG(EclProblem) ProblemTypeTag; + typedef TTAG(EbosTypeTag) ProblemTypeTag; return Ewoms::start(argc, argv); } diff --git a/ebos/ebos.hh b/ebos/ebos.hh new file mode 100644 index 000000000..77390c48c --- /dev/null +++ b/ebos/ebos.hh @@ -0,0 +1,135 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/* + This file is part of the Open Porous Media project (OPM). + + OPM 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 2 of the License, or + (at your option) any later version. + + OPM 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 for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + + Consult the COPYING file in the top-level source directory of this + module for the precise wording of the license and the list of + copyright holders. +*/ +/*! + * \file + * + * \brief The common settings for all ebos variants. + */ +#include "eclproblem.hh" + +#include +#include +#include + +#include + +namespace Ewoms { +template +class EbosProblem; +} + +BEGIN_PROPERTIES + +NEW_TYPE_TAG(EbosTypeTag, INHERITS_FROM(BlackOilModel, EclBaseProblem, FlowModelParameters)); + +// Set the problem class +SET_TYPE_PROP(EbosTypeTag, Problem, Ewoms::EbosProblem); + +// Enable experimental features for ebos: ebos is the research simulator of the OPM +// project. If you're looking for a more stable "production quality" simulator, consider +// using `flow` +SET_BOOL_PROP(EbosTypeTag, EnableExperiments, true); + +// use flow's well model for now +SET_TYPE_PROP(EbosTypeTag, EclWellModel, Opm::BlackoilWellModel); + +// set some properties that are only required by the well model +SET_BOOL_PROP(EbosTypeTag, MatrixAddWellContributions, true); +SET_BOOL_PROP(EbosTypeTag, EnableTerminalOutput, false); +// flow's well model only works with surface volumes +SET_BOOL_PROP(EbosTypeTag, BlackoilConserveSurfaceVolume, true); +// the values for the residual are for the whole cell instead of for a cubic meter of the cell +SET_BOOL_PROP(EbosTypeTag, UseVolumetricResidual, false); + +// by default use flow's aquifer model for now +SET_TYPE_PROP(EbosTypeTag, EclAquiferModel, Opm::BlackoilAquiferModel); + +// use flow's linear solver backend for now +SET_TAG_PROP(EbosTypeTag, LinearSolverSplice, FlowIstlSolver); + +// the default for the allowed volumetric error for oil per second +SET_SCALAR_PROP(EbosTypeTag, NewtonTolerance, 1e-1); + +// set fraction of the pore volume where the volumetric residual may be violated during +// strict Newton iterations +SET_SCALAR_PROP(EbosTypeTag, EclNewtonRelaxedVolumeFraction, 0.05); + +// the maximum volumetric error of a cell in the relaxed region +SET_SCALAR_PROP(EbosTypeTag, EclNewtonRelaxedTolerance, 1e6*GET_PROP_VALUE(TypeTag, NewtonTolerance)); + +// the tolerated amount of "incorrect" amount of oil per time step for the complete +// reservoir. this is scaled by the pore volume of the reservoir, i.e., larger reservoirs +// will tolerate larger residuals. +SET_SCALAR_PROP(EbosTypeTag, EclNewtonSumTolerance, 1e-5); + +// make all Newton iterations strict, i.e., the volumetric Newton tolerance must be +// always be upheld in the majority of the spatial domain. In this context, "majority" +// means 1 - EclNewtonRelaxedVolumeFraction. +SET_INT_PROP(EbosTypeTag, EclNewtonStrictIterations, 100); + +// set the maximum number of Newton iterations to 8 so that we fail quickly (albeit +// relatively often) +SET_INT_PROP(EbosTypeTag, NewtonMaxIterations, 8); + +END_PROPERTIES + +namespace Ewoms { +template +class EbosProblem : public EclProblem +{ + typedef EclProblem ParentType; + +public: + static void registerParameters() + { + ParentType::registerParameters(); + + Opm::BlackoilModelParametersEbos::registerParameters(); + EWOMS_REGISTER_PARAM(TypeTag, bool, EnableTerminalOutput, "Do *NOT* use!"); + EWOMS_HIDE_PARAM(TypeTag, DbhpMaxRel); + EWOMS_HIDE_PARAM(TypeTag, DwellFractionMax); + EWOMS_HIDE_PARAM(TypeTag, MaxResidualAllowed); + EWOMS_HIDE_PARAM(TypeTag, ToleranceMb); + EWOMS_HIDE_PARAM(TypeTag, ToleranceCnv); + EWOMS_HIDE_PARAM(TypeTag, ToleranceCnvRelaxed); + EWOMS_HIDE_PARAM(TypeTag, ToleranceWells); + EWOMS_HIDE_PARAM(TypeTag, ToleranceWellControl); + EWOMS_HIDE_PARAM(TypeTag, MaxWelleqIter); + EWOMS_HIDE_PARAM(TypeTag, UseMultisegmentWell); + EWOMS_HIDE_PARAM(TypeTag, TolerancePressureMsWells); + EWOMS_HIDE_PARAM(TypeTag, MaxPressureChangeMsWells); + EWOMS_HIDE_PARAM(TypeTag, UseInnerIterationsMsWells); + EWOMS_HIDE_PARAM(TypeTag, MaxInnerIterMsWells); + EWOMS_HIDE_PARAM(TypeTag, MaxSinglePrecisionDays); + EWOMS_HIDE_PARAM(TypeTag, MaxStrictIter); + EWOMS_HIDE_PARAM(TypeTag, SolveWelleqInitially); + EWOMS_HIDE_PARAM(TypeTag, UpdateEquationsScaling); + EWOMS_HIDE_PARAM(TypeTag, UseUpdateStabilization); + EWOMS_HIDE_PARAM(TypeTag, MatrixAddWellContributions); + EWOMS_HIDE_PARAM(TypeTag, EnableTerminalOutput); + } + + // inherit the constructors + using ParentType::EclProblem; +}; +} From f4435a5de9146da3078d5d62c4dd80b8ca80ed59 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Mon, 4 Mar 2019 15:38:07 +0100 Subject: [PATCH 2/3] fix the default build system for some reason, libraries produced for a module are not linked to the executables of the module by the default build system. so far this did not matter for `ebos` but with this PR, it starts using stuff from `libopmsimulators`... --- CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c4e24f23..6411aa1cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,9 +154,12 @@ set_tests_properties(flow__version PROPERTIES # the research oriented general-purpose ECL simulator ("ebos" == &ecl # &black-&oil &simulator) opm_add_test(ebos - SOURCES ebos/ebos.cc + ONLY_COMPILE + ALWAYS_ENABLE EXE_NAME ebos - ONLY_COMPILE) + DEPENDS "opmsimulators" + LIBRARIES "opmsimulators" + SOURCES ebos/ebos.cc) if(OPM_GRID_FOUND AND HAVE_ECL_INPUT AND HAVE_ECL_OUTPUT) install(TARGETS ebos DESTINATION bin) From a5863a1f3631d0c98902622ffb535d42c865507e Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Mon, 4 Mar 2019 15:42:57 +0100 Subject: [PATCH 3/3] CMakeLists.txt: remove unecessary condition thanks to [at]akva2 for catching this. --- CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6411aa1cf..3374b97bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,9 +161,7 @@ opm_add_test(ebos LIBRARIES "opmsimulators" SOURCES ebos/ebos.cc) -if(OPM_GRID_FOUND AND HAVE_ECL_INPUT AND HAVE_ECL_OUTPUT) - install(TARGETS ebos DESTINATION bin) -endif() +install(TARGETS ebos DESTINATION bin) include(OpmBashCompletion) opm_add_bash_completion(flow)