diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 7c1f73298..4b796c1c0 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -291,6 +291,10 @@ list (APPEND TEST_SOURCE_FILES tests/test_wellstate.cpp ) +if (HAVE_ECL_INPUT) + list(APPEND TEST_SOURCE_FILES tests/test_nonnc.cpp) +endif() + if(MPI_FOUND) list(APPEND TEST_SOURCE_FILES tests/test_parallelistlinformation.cpp tests/test_ParallelSerialization.cpp) diff --git a/tests/test_nonnc.cpp b/tests/test_nonnc.cpp new file mode 100644 index 000000000..9b15079fe --- /dev/null +++ b/tests/test_nonnc.cpp @@ -0,0 +1,141 @@ +/* + Copyright 2024 Dr. Blatt - HPC-Simulation-Software & Services + + 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 3 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 . +*/ + +#include + +#define BOOST_TEST_MODULE NONNCTest +#define BOOST_TEST_NO_MAIN + +#include +#include +#include +#include + +#include + +#include + +#include + +using namespace Opm; + +const int dimWorld = 3; +const int cartDims[3] = {8,15,3}; + +// Class extending EclTransmissibility, such that we can access the protected member trans_ to check its contents +template +class Transmissibility : public EclTransmissibility +{ + using ParentType = EclTransmissibility; + public: + Transmissibility(const EclipseState& eclState, + const GridView& gridView, + const CartesianIndexMapper& cartMapper, + const Grid& grid, + std::function(int)> centroids, + bool enableEnergy, + bool enableDiffusivity, + bool enableDispersivity) : ParentType(eclState,gridView,cartMapper,grid,centroids,enableEnergy,enableDiffusivity,enableDispersivity) {} + auto getTransmissibilitymap() { + return this->trans_; + } +}; + +int main(int argc, char** argv ) +{ + Dune::MPIHelper::instance(argc, argv); + + using Grid = Dune::CpGrid; + using GridView = Grid::LeafGridView; + using ElementMapper = Dune::MultipleCodimMultipleGeomTypeMapper; + using CartesianIndexMapper = Dune::CartesianIndexMapper; + using Transmissibility = Transmissibility; + + Parser parser; + + // Deck with 2 NNCs + const auto deck = parser.parseString( R"(RUNSPEC + NONNC + DIMENS + 8 15 3 / + GRID + DX + 360*10./ + DY + 360*10./ + DZ + 360*1./ + TOPS + 360*100./ + + PORO + 0. 0.25 0. 357*0.25/ + PERMX + 360*1000./ + PERMY + 360*1000./ + PERMZ + 360*10./ + + NNC + -- I1 J1 K1 I2 J2 K2 Trans + 1 1 1 2 2 2 1000.0 / --- connection between 0 and 129 + 1 1 1 3 3 3 1000.0 / --- connection between 0 and 258 + / + + END)"); + Grid grid; + EclipseGrid eclGrid(deck); + EclipseState eclState(deck); + + grid.processEclipseFormat(&eclGrid, &eclState, false, false, false); + const auto& gridView = grid.leafGridView(); + + CartesianIndexMapper cartMapper = Dune::CartesianIndexMapper(grid); + + auto centroids = [](int) { return std::array{}; }; + Transmissibility eclTransmissibility(eclState, + gridView, + cartMapper, + grid, + centroids, + false,false,false); + // Call update, true indicates that update is called on all processes + eclTransmissibility.update(true); + + auto transmissibilityMap = eclTransmissibility.getTransmissibilitymap(); + + // Check if the transmissibilities of the NNCs that were added manually are either not contained in the transmissibility array (because they might be on a different process) or 0.0 + if (transmissibilityMap.count(details::isId(0,129)) > 0) + assert(eclTransmissibility.transmissibility(0,129) == 0.0); + if (transmissibilityMap.count(details::isId(0,258)) > 0) + assert(eclTransmissibility.transmissibility(0,258) == 0.0); + + // If there is a non-zero transmissibility in the map, ensure that it is form a neighboring connection + for (auto&& trans : transmissibilityMap) { + if (trans.second != 0.0) { + const auto& id = trans.first; + const auto& elements = details::isIdReverse(id); + int gc1 = std::min(cartMapper.cartesianIndex(elements.first), cartMapper.cartesianIndex(elements.second)); + int gc2 = std::max(cartMapper.cartesianIndex(elements.first), cartMapper.cartesianIndex(elements.second)); + assert(gc2 - gc1 == 1 || gc2 - gc1 == cartDims[0] || gc2 - gc1 == cartDims[0]*cartDims[1] || gc2 - gc1 == 0); + } + } + return 0; +}