mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
This commit adds sequential solvers, including a simulator variant using them (flow_sequential.cpp) with an integration test (running SPE1, same as for fully implicit). The sequential code is capable of running several (but not all) test cases without tuning or special parameters, but reducing ds_max a bit (from default 0.2 to say 0.1) helps with transport solver convergence. The Norne model runs fine (esp. with a little tuning). A parameter iterate_to_fully_implicit (defaults to false) is available, when set the simulator will iterate with alternating pressure and transport solves towards the fully implicit solution. Although that takes a lot extra time it serves as a correctness check. Performance is not competitive with fully implicit at this point: essentially both the pressure and transport models inherit the fully implicit model and do a lot of double (or triple) work. The point has been to establish a proof of concept and baseline for further experiments, without disturbing the base model too much (or at all, if possible). Changes to existing code has been minimized by merging most such changes as smaller PRs already, the only remaining such change is to NewtonIterationBlackoilInterleaved. Admittedly, that code (to solve the pressure system with AMG) is not ideal because it duplicates similar code in CPRPreconditioner.hpp and is not parallel. I propose to address this later by refactoring the "solve elliptic system" code from CPRPreconditioner into a separate class that can be used also from here
154 lines
6.1 KiB
CMake
154 lines
6.1 KiB
CMake
# -*- mode: cmake; tab-width: 2; indent-tabs-mode: t; truncate-lines: t; compile-command: "cmake -Wdev" -*-
|
|
# vim: set filetype=cmake autoindent tabstop=2 shiftwidth=2 noexpandtab softtabstop=2 nowrap:
|
|
|
|
###########################################################################
|
|
# #
|
|
# Note: The bulk of the build system is located in the cmake/ directory. #
|
|
# This file only contains the specializations for this particular #
|
|
# project. Most likely you are interested in editing one of these #
|
|
# files instead: #
|
|
# #
|
|
# dune.module Name and version number #
|
|
# CMakeLists_files.cmake Path of source files #
|
|
# cmake/Modules/${project}-prereqs.cmake Dependencies #
|
|
# #
|
|
###########################################################################
|
|
|
|
cmake_minimum_required (VERSION 2.8)
|
|
|
|
set( OPM_COMMON_ROOT "" CACHE PATH "Root directory containing OPM related cmake modules")
|
|
option(SIBLING_SEARCH "Search for other modules in sibling directories?" ON)
|
|
set( USE_OPENMP_DEFAULT OFF ) # Use of OpenMP is considered experimental
|
|
|
|
if(NOT OPM_COMMON_ROOT)
|
|
find_package(opm-common QUIET)
|
|
endif()
|
|
|
|
if (opm-common_FOUND)
|
|
include(OpmInit)
|
|
else()
|
|
unset(opm-common_FOUND)
|
|
|
|
if (NOT OPM_COMMON_ROOT AND SIBLING_SEARCH)
|
|
set(OPM_COMMON_ROOT ${PROJECT_SOURCE_DIR}/../opm-common)
|
|
endif()
|
|
if (OPM_COMMON_ROOT)
|
|
list( APPEND CMAKE_MODULE_PATH "${OPM_COMMON_ROOT}/cmake/Modules")
|
|
include (OpmInit OPTIONAL RESULT_VARIABLE OPM_INIT)
|
|
set( OPM_MACROS_ROOT ${OPM_COMMON_ROOT} )
|
|
endif()
|
|
|
|
if (NOT OPM_INIT)
|
|
message( "" )
|
|
message( " /---------------------------------------------------------------------------------\\")
|
|
message( " | Could not locate the opm build macros. The opm build macros |")
|
|
message( " | are in a separate repository - instructions to proceed: |")
|
|
message( " | |")
|
|
message( " | 1. Clone the repository: git clone git@github.com:OPM/opm-common.git |")
|
|
message( " | |")
|
|
message( " | 2. Run cmake in the current project with -DOPM_COMMON_ROOT=<path>/opm-common |")
|
|
message( " | |")
|
|
message( " \\---------------------------------------------------------------------------------/")
|
|
message( "" )
|
|
message( FATAL_ERROR "Could not find OPM Macros")
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
# not the same location as most of the other projects? this hook overrides
|
|
macro (dir_hook)
|
|
endmacro (dir_hook)
|
|
|
|
# project information is in dune.module. Read this file and set variables.
|
|
# we cannot generate dune.module since it is read by dunecontrol before
|
|
# the build starts, so it makes sense to keep the data there then.
|
|
include (OpmInit)
|
|
|
|
# Look for the opm-data repository; if found the variable
|
|
# HAVE_OPM_DATA will be set to true.
|
|
include( Findopm-data )
|
|
|
|
# list of prerequisites for this particular project; this is in a
|
|
# separate file (in cmake/Modules sub-directory) because it is shared
|
|
# with the find module
|
|
include ("${project}-prereqs")
|
|
|
|
# read the list of components from this file (in the project directory);
|
|
# it should set various lists with the names of the files to include
|
|
include (CMakeLists_files.cmake)
|
|
|
|
macro (config_hook)
|
|
opm_need_version_of ("dune-common")
|
|
opm_need_version_of ("dune-istl")
|
|
endmacro (config_hook)
|
|
|
|
macro (prereqs_hook)
|
|
endmacro (prereqs_hook)
|
|
|
|
macro (sources_hook)
|
|
if(OPM_GRID_FOUND OR opm-grid_FOUND)
|
|
list (APPEND examples_SOURCES
|
|
${PROJECT_SOURCE_DIR}/examples/flow_mpi.cpp
|
|
${PROJECT_SOURCE_DIR}/examples/flow_multisegment_mpi.cpp
|
|
)
|
|
list (APPEND examples_SOURCES_DIST
|
|
${PROJECT_SOURCE_DIR}/examples/flow_mpi.cpp
|
|
)
|
|
endif()
|
|
endmacro (sources_hook)
|
|
|
|
macro (fortran_hook)
|
|
endmacro (fortran_hook)
|
|
|
|
macro (files_hook)
|
|
endmacro (files_hook)
|
|
|
|
macro (tests_hook)
|
|
endmacro (tests_hook)
|
|
|
|
# all setup common to the OPM library modules is done here
|
|
include (OpmLibMain)
|
|
|
|
# download Eigen if user doesn't have the correct version
|
|
if (NOT EIGEN3_FOUND)
|
|
message (STATUS "Downloading Eigen3")
|
|
include (ExternalProject)
|
|
externalProject_Add (Eigen3
|
|
GIT_REPOSITORY git://github.com/OPM/eigen3
|
|
UPDATE_COMMAND git checkout 9e788db99d73f3199ade74bfda8d9f73fdfbbe4c
|
|
CMAKE_ARGS -DEIGEN_TEST_NO_OPENGL=1 -DEIGEN_BUILD_PKGCONFIG=0 -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/eigen3-installed
|
|
)
|
|
|
|
include_directories (${CMAKE_BINARY_DIR}/eigen3-installed/include/eigen3)
|
|
add_dependencies (opmsimulators Eigen3)
|
|
endif (NOT EIGEN3_FOUND)
|
|
|
|
|
|
|
|
if (HAVE_OPM_DATA)
|
|
add_test( NAME flow_SPE1 COMMAND flow ${OPM_DATA_ROOT}/spe1/SPE1CASE1.DATA )
|
|
|
|
add_test( NAME flow_SPE1CASE2 COMMAND flow ${OPM_DATA_ROOT}/spe1/SPE1CASE2.DATA )
|
|
add_test( NAME flow_SPE1CASE2_restart COMMAND flow ${OPM_DATA_ROOT}/spe1/SPE1CASE2_RESTART.DATA )
|
|
|
|
add_test( NAME flow_MSW2DH__ COMMAND flow_multisegment ${OPM_DATA_ROOT}/multisegment_wells_test_suite/2D_H__/2D_H__.DATA)
|
|
|
|
set_tests_properties(flow_SPE1CASE2_restart PROPERTIES DEPENDS flow_SPE1CASE2) # Dependes on the restart file from test flow_SPE1CASE2
|
|
|
|
add_executable( test_restart tests/test_restart.cpp )
|
|
target_link_libraries( test_restart opmsimulators ${Boost_LIBRARIES})
|
|
|
|
add_test( compare_restart_files
|
|
${CMAKE_BINARY_DIR}/bin/test_restart
|
|
SPE1CASE2.UNRST
|
|
SPE1CASE2_RESTART.UNRST # Restart from step 60
|
|
120
|
|
)
|
|
|
|
set_tests_properties(compare_restart_files PROPERTIES DEPENDS flow_SPE1CASE2_restart) # Compares the restart files from tests flow_SPE1CASE2_restart and flow_SPE1CASE2
|
|
|
|
add_test( NAME flow_sequential_SPE1 COMMAND flow_sequential ${OPM_DATA_ROOT}/spe1/SPE1CASE1.DATA )
|
|
|
|
endif()
|