diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index fc364b370..68058f6a9 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -52,6 +52,7 @@ list (APPEND MAIN_SOURCE_FILES opm/simulators/linalg/FlexibleSolver5.cpp opm/simulators/linalg/FlexibleSolver6.cpp opm/simulators/linalg/MILU.cpp + opm/simulators/linalg/ParallelIstlInformation.cpp opm/simulators/linalg/PropertyTree.cpp opm/simulators/linalg/setupPropertyTree.cpp opm/simulators/utils/PartiallySupportedFlowKeywords.cpp diff --git a/opm/simulators/flow/BlackoilModelEbos.hpp b/opm/simulators/flow/BlackoilModelEbos.hpp index e0c6643cd..673143127 100644 --- a/opm/simulators/flow/BlackoilModelEbos.hpp +++ b/opm/simulators/flow/BlackoilModelEbos.hpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include diff --git a/opm/simulators/flow/countGlobalCells.cpp b/opm/simulators/flow/countGlobalCells.cpp index d72c550c3..240ddc85a 100644 --- a/opm/simulators/flow/countGlobalCells.cpp +++ b/opm/simulators/flow/countGlobalCells.cpp @@ -21,9 +21,12 @@ along with OPM. If not, see . */ +#include + #include "countGlobalCells.hpp" #include +#include namespace Opm { namespace detail { diff --git a/opm/simulators/flow/countGlobalCells.hpp b/opm/simulators/flow/countGlobalCells.hpp index de5fe2459..050a668a2 100644 --- a/opm/simulators/flow/countGlobalCells.hpp +++ b/opm/simulators/flow/countGlobalCells.hpp @@ -24,7 +24,6 @@ #ifndef OPM_COUNTGLOBALCELLS_HEADER_INCLUDED #define OPM_COUNTGLOBALCELLS_HEADER_INCLUDED -#include #include #include diff --git a/opm/simulators/linalg/ParallelIstlInformation.cpp b/opm/simulators/linalg/ParallelIstlInformation.cpp new file mode 100644 index 000000000..7cd233d26 --- /dev/null +++ b/opm/simulators/linalg/ParallelIstlInformation.cpp @@ -0,0 +1,355 @@ +/* + Copyright 2014, 2015 Dr. Markus Blatt - HPC-Simulation-Software & Services + Copyright 2014, 2015 Statoil ASA + Copyright 2015 NTNU + + 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 + +#if HAVE_MPI && HAVE_DUNE_ISTL + +#include + +#include + +#include + +#include +#include +#include +#include + +namespace +{ + +template +class IndexSetInserter +{ +public: + using ParallelIndexSet = T; + using LocalIndex = typename ParallelIndexSet::LocalIndex; + using GlobalIndex = typename ParallelIndexSet::GlobalIndex; + + IndexSetInserter(ParallelIndexSet& indexSet, const GlobalIndex& component_size, + std::size_t local_component_size, std::size_t num_components) + : indexSet_(&indexSet), component_size_(component_size), + local_component_size_(local_component_size), + num_components_(num_components) + {} + + void operator()(const typename ParallelIndexSet::IndexPair& pair) + { + for(std::size_t i = 0; i < num_components_; i++) + indexSet_->add(i * component_size_ + pair.global(), + LocalIndex(i * local_component_size_ + pair.local(), + pair.local().attribute())); + } +private: + ParallelIndexSet* indexSet_; + /// \brief The global number of unknowns per component/equation. + GlobalIndex component_size_; + /// \brief The local number of unknowns per component/equation. + std::size_t local_component_size_; + /// \brief The number of components/equations. + std::size_t num_components_; +}; + +/** \brief gather/scatter callback for communcation */ +template +struct CopyGatherScatter +{ + using V = typename Dune::CommPolicy::IndexedType; + + static V gather(const T& a, std::size_t i) + { + return a[i]; + } + + static void scatter(T& a, V v, std::size_t i) + { + a[i] = v; + } +}; + +template +typename std::enable_if::type +computeGlobalReduction(const std::tuple&, + std::tuple&, + std::tuple&) +{} + +template +typename std::enable_if::type +computeGlobalReduction(const std::tuple& receivedValues, + std::tuple& operators, + std::tuple& values) +{ + auto& val = std::get(values); + val = std::get(operators).localOperator()(val, std::get(receivedValues)); + computeGlobalReduction(receivedValues, operators, values); +} + +template +typename std::enable_if::type +computeLocalReduction(const std::tuple&, + std::tuple&, + std::tuple&, + const std::vector&) +{} + +template +typename std::enable_if::type +computeLocalReduction(const std::tuple& containers, + std::tuple& operators, + std::tuple& values, + const std::vector& ownerMask) +{ + const auto& container = std::get(containers); + if (container.size()) + { + auto& reduceOperator = std::get(operators); + // Eigen:Block does not support STL iterators!!!! + // Therefore we need to rely on the harder random-access + // property of the containers. But this should be save, too. + // Just commenting out code in the hope that Eigen might improve + // in this regard in the future. + //auto newVal = container.begin(); + auto mask = ownerMask.begin(); + auto& value = std::get(values); + value = reduceOperator.getInitialValue(); + + for (auto endVal = ownerMask.end(); mask != endVal; /*++newVal,*/ ++mask ) + { + value = reduceOperator(value, container[mask-ownerMask.begin()], *mask); + } + } + computeLocalReduction(containers, operators, values, ownerMask); +} + +} + +namespace Opm +{ +namespace +{ + + template + struct is_tuple + : std::integral_constant + {}; + template + struct is_tuple > + : std::integral_constant + {}; +} + +ParallelISTLInformation::ParallelISTLInformation() + : indexSet_(new ParallelIndexSet), + remoteIndices_(new RemoteIndices(*indexSet_, *indexSet_, MPI_COMM_WORLD)), + communicator_(MPI_COMM_WORLD) +{} + + +ParallelISTLInformation::ParallelISTLInformation(MPI_Comm communicator) + : indexSet_(new ParallelIndexSet), + remoteIndices_(new RemoteIndices(*indexSet_, *indexSet_, communicator)), + communicator_(communicator) +{} + + +ParallelISTLInformation:: +ParallelISTLInformation(const std::shared_ptr& indexSet, + const std::shared_ptr& remoteIndices, + MPI_Comm communicator) + : indexSet_(indexSet), remoteIndices_(remoteIndices), communicator_(communicator) +{} + +ParallelISTLInformation::ParallelISTLInformation(const ParallelISTLInformation& other) + : indexSet_(other.indexSet_), remoteIndices_(other.remoteIndices_), + communicator_(other.communicator_) +{} + +void ParallelISTLInformation::copyValuesTo(ParallelIndexSet& indexSet, + RemoteIndices& remoteIndices, + std::size_t local_component_size, + std::size_t num_components) const +{ + ParallelIndexSet::GlobalIndex global_component_size = local_component_size; + if ( num_components > 1 ) + { + ParallelIndexSet::GlobalIndex max_gi = 0; + // component the max global index + for( auto i = indexSet_->begin(), end = indexSet_->end(); i != end; ++i ) + { + max_gi = std::max(max_gi, i->global()); + } + global_component_size = max_gi+1; + global_component_size = communicator_.max(global_component_size); + } + indexSet.beginResize(); + IndexSetInserter inserter(indexSet, global_component_size, + local_component_size, num_components); + std::for_each(indexSet_->begin(), indexSet_->end(), inserter); + indexSet.endResize(); + remoteIndices.rebuild(); +} + +template +void ParallelISTLInformation::copyOwnerToAll(const T& source, T& dest) const +{ + using AS = Dune::OwnerOverlapCopyAttributeSet; + using CopySet = Dune::EnumItem; + using OwnerSet = Dune::EnumItem; + using OverlapSet = Dune::EnumItem; + using OwnerOverlapSet = Dune::Combine; + using AllSet = Dune::Combine; + OwnerSet sourceFlags; + AllSet destFlags; + Dune::Interface interface(communicator_); + if( !remoteIndices_->isSynced() ) + { + remoteIndices_->rebuild(); + } + interface.build(*remoteIndices_,sourceFlags,destFlags); + Dune::BufferedCommunicator communicator; + communicator.template build(interface); + communicator.template forward>(source,dest); + communicator.free(); +} + +template +const std::vector& +ParallelISTLInformation::updateOwnerMask(const T& container) const +{ + if (!indexSet_) + { + OPM_THROW(std::runtime_error, "Trying to update owner mask without parallel information!"); + } + if (static_cast(container.size()) != ownerMask_.size()) + { + ownerMask_.resize(container.size(), 1.); + for (const auto& i : *indexSet_) + { + if (i.local().attribute() != Dune::OwnerOverlapCopyAttributeSet::owner) + { + ownerMask_[i.local().local()] = 0.; + } + } + } + return ownerMask_; +} + +template +void ParallelISTLInformation::computeReduction(const Container& container, + BinaryOperator binaryOperator, + T& value) const +{ + if constexpr (is_tuple()) + computeTupleReduction(container, binaryOperator, value); + else + { + std::tuple containers = std::tuple(container); + auto values = std::make_tuple(value); + auto operators = std::make_tuple(binaryOperator); + computeTupleReduction(containers, operators, values); + value = std::get<0>(values); + } +} + +template +void ParallelISTLInformation::computeTupleReduction(const std::tuple& containers, + std::tuple& operators, + std::tuple& values) const +{ + static_assert(std::tuple_size >::value == + std::tuple_size >::value, + "We need the same number of containers and binary operators"); + static_assert(std::tuple_size >::value == + std::tuple_size >::value, + "We need the same number of containers and return values"); + if (std::tuple_size >::value == 0) + { + return; + } + + // Copy the initial values. + std::tuple init = values; + updateOwnerMask(std::get<0>(containers)); + computeLocalReduction(containers, operators, values, ownerMask_); + std::vector > receivedValues(communicator_.size()); + communicator_.allgather(&values, 1, &(receivedValues[0])); + values = init; + for (auto& rval : receivedValues) + { + computeGlobalReduction(rval, operators, values); + } +} + +template +auto +accumulateMaskedValues(const T1& container, const std::vector* maskContainer) + -> decltype(container[0]*(*maskContainer)[0]) +{ + decltype(container[0]*(*maskContainer)[0]) initial = 0; + + if (maskContainer) + { + return std::inner_product(container.begin(), container.end(), + maskContainer->begin(), initial); + } + else + { + return std::accumulate(container.begin(), container.end(), initial); + } +} + +template using C1 = std::vector; +template using Ops1 = Reduction::MaskIDOperator>; + +template +using C2 = std::tuple, + std::vector, + std::vector, + std::vector, + std::vector>; +template +using Ops2 = std::tuple()), + decltype(Reduction::makeGlobalMaxFunctor()), + decltype(Reduction::makeGlobalMinFunctor()), + decltype(Reduction::makeInnerProductFunctor()), + decltype(Reduction::makeLInfinityNormFunctor())>; +template +using Vals2 = std::tuple; + +#define INSTANCE1(T) \ + template void ParallelISTLInformation::computeReduction,Ops1,T>(const C1&,Ops1,T&) const; + +#define INSTANCE2(T) \ + template void ParallelISTLInformation::computeReduction,Ops2,Vals2>(const C2&,Ops2,Vals2&) const; + +#define INSTANCE(T) \ + INSTANCE1(T) \ + INSTANCE2(T) + +INSTANCE(int) +INSTANCE(float) +INSTANCE(std::size_t) + +#endif + +} diff --git a/opm/simulators/linalg/ParallelIstlInformation.hpp b/opm/simulators/linalg/ParallelIstlInformation.hpp index 624013e1b..29e623c25 100644 --- a/opm/simulators/linalg/ParallelIstlInformation.hpp +++ b/opm/simulators/linalg/ParallelIstlInformation.hpp @@ -18,48 +18,25 @@ You should have received a copy of the GNU General Public License along with OPM. If not, see . */ -#ifndef OPM_PARALLELISTLINFORMTION_HEADER_INCLUDED -#define OPM_PARALLELISTLINFORMTION_HEADER_INCLUDED +#ifndef OPM_PARALLELISTLINFORMATION_HEADER_INCLUDED +#define OPM_PARALLELISTLINFORMATION_HEADER_INCLUDED - -#include -#include -#include -#include - -#include -#include -#include -#include -#include #include #if HAVE_MPI && HAVE_DUNE_ISTL -#include -#include +#include +#include +#include +#include +#include + #include -#include -#include -#include -#include #include namespace Opm { -namespace -{ - - template - struct is_tuple - : std::integral_constant - {}; - template - struct is_tuple > - : std::integral_constant - {}; -} /// \brief Class that encapsulates the parallelization information needed by the /// ISTL solvers. @@ -67,49 +44,42 @@ class ParallelISTLInformation { public: /// \brief The type of the parallel index set used. - typedef Dune::OwnerOverlapCopyCommunication::ParallelIndexSet ParallelIndexSet; + using ParallelIndexSet = Dune::OwnerOverlapCopyCommunication::ParallelIndexSet; /// \brief The type of the remote indices information used. - typedef Dune::OwnerOverlapCopyCommunication::RemoteIndices RemoteIndices; + using RemoteIndices = Dune::OwnerOverlapCopyCommunication::RemoteIndices; /// \brief Constructs an empty parallel information object using MPI_COMM_WORLD - ParallelISTLInformation() - : indexSet_(new ParallelIndexSet), - remoteIndices_(new RemoteIndices(*indexSet_, *indexSet_, MPI_COMM_WORLD)), - communicator_(MPI_COMM_WORLD) - {} + ParallelISTLInformation(); + /// \brief Constructs an empty parallel information object using a communicator. /// \param communicator The communicator to use. - ParallelISTLInformation(MPI_Comm communicator) - : indexSet_(new ParallelIndexSet), - remoteIndices_(new RemoteIndices(*indexSet_, *indexSet_, communicator)), - communicator_(communicator) - {} + ParallelISTLInformation(MPI_Comm communicator); + /// \brief Constructs a parallel information object from the specified information. /// \param indexSet The parallel index set to use. /// \param remoteIndices The remote indices information to use. /// \param communicator The communicator to use. ParallelISTLInformation(const std::shared_ptr& indexSet, const std::shared_ptr& remoteIndices, - MPI_Comm communicator) - : indexSet_(indexSet), remoteIndices_(remoteIndices), communicator_(communicator) - {} + MPI_Comm communicator); + /// \brief Copy constructor. /// /// The information will be shared by the the two objects. - ParallelISTLInformation(const ParallelISTLInformation& other) - : indexSet_(other.indexSet_), remoteIndices_(other.remoteIndices_), - communicator_(other.communicator_) - {} + ParallelISTLInformation(const ParallelISTLInformation& other); + /// \brief Get a pointer to the underlying index set. std::shared_ptr indexSet() const { return indexSet_; } + /// \brief Get a pointer to the remote indices information. std::shared_ptr remoteIndices() const { return remoteIndices_; } + /// \brief Get the Collective MPI communicator that we use. Parallel::Communication communicator() const { @@ -119,69 +89,17 @@ public: /// \param[out] indexSet The object to store the index set in. /// \param[out] remoteIndices The object to store the remote indices information in. void copyValuesTo(ParallelIndexSet& indexSet, RemoteIndices& remoteIndices, - std::size_t local_component_size = 0, std::size_t num_components = 1) const - { - ParallelIndexSet::GlobalIndex global_component_size = local_component_size; - if ( num_components > 1 ) - { - ParallelIndexSet::GlobalIndex max_gi = 0; - // component the max global index - for( auto i = indexSet_->begin(), end = indexSet_->end(); i != end; ++i ) - { - max_gi = std::max(max_gi, i->global()); - } - global_component_size = max_gi+1; - global_component_size = communicator_.max(global_component_size); - } - indexSet.beginResize(); - IndexSetInserter inserter(indexSet, global_component_size, - local_component_size, num_components); - std::for_each(indexSet_->begin(), indexSet_->end(), inserter); - indexSet.endResize(); - remoteIndices.rebuild(); - } + std::size_t local_component_size = 0, + std::size_t num_components = 1) const; + /// \brief Communcate the dofs owned by us to the other process. /// /// Afterwards all associated dofs will contain the same data. template - void copyOwnerToAll (const T& source, T& dest) const - { - typedef Dune::Combine,Dune::EnumItem,Dune::OwnerOverlapCopyAttributeSet::AttributeSet> OwnerOverlapSet; - typedef Dune::EnumItem OwnerSet; - typedef Dune::Combine,Dune::OwnerOverlapCopyAttributeSet::AttributeSet> AllSet; - OwnerSet sourceFlags; - AllSet destFlags; - Dune::Interface interface(communicator_); - if( !remoteIndices_->isSynced() ) - { - remoteIndices_->rebuild(); - } - interface.build(*remoteIndices_,sourceFlags,destFlags); - Dune::BufferedCommunicator communicator; - communicator.template build(interface); - communicator.template forward >(source,dest); - communicator.free(); - } + void copyOwnerToAll (const T& source, T& dest) const; + template - const std::vector& updateOwnerMask(const T& container) const - { - if( ! indexSet_ ) - { - OPM_THROW(std::runtime_error, "Trying to update owner mask without parallel information!"); - } - if( static_cast(container.size())!= ownerMask_.size() ) - { - ownerMask_.resize(container.size(), 1.); - for( auto i=indexSet_->begin(), end=indexSet_->end(); i!=end; ++i ) - { - if (i->local().attribute()!=Dune::OwnerOverlapCopyAttributeSet::owner) - { - ownerMask_[i->local().local()] = 0.; - } - } - } - return ownerMask_; - } + const std::vector& updateOwnerMask(const T& container) const; /// \brief Get the owner Mask. /// @@ -214,166 +132,14 @@ public: /// \param value The initial value or a tuple of them. template void computeReduction(const Container& container, BinaryOperator binaryOperator, - T& value) const - { - computeReduction(container, binaryOperator, value, is_tuple()); - } + T& value) const; + private: - /// \brief compute the reductions for tuples. - /// - /// This is a helper function to prepare for calling computeTupleReduction. - template - void computeReduction(const Container& container, BinaryOperator binaryOperator, - T& value, std::integral_constant) const - { - computeTupleReduction(container, binaryOperator, value); - } - /// \brief compute the reductions for non-tuples. - /// - /// This is a helper function to prepare for calling computeTupleReduction. - template - void computeReduction(const Container& container, BinaryOperator binaryOperator, - T& value, std::integral_constant) const - { - std::tuple containers=std::tuple(container); - auto values=std::make_tuple(value); - auto operators=std::make_tuple(binaryOperator); - computeTupleReduction(containers, operators, values); - value=std::get<0>(values); - } - /// \brief Compute the reductions for tuples. template void computeTupleReduction(const std::tuple& containers, std::tuple& operators, - std::tuple& values) const - { - static_assert(std::tuple_size >::value== - std::tuple_size >::value, - "We need the same number of containers and binary operators"); - static_assert(std::tuple_size >::value== - std::tuple_size >::value, - "We need the same number of containers and return values"); - if( std::tuple_size >::value==0 ) - { - return; - } - // Copy the initial values. - std::tuple init=values; - updateOwnerMask(std::get<0>(containers)); - computeLocalReduction(containers, operators, values); - std::vector > receivedValues(communicator_.size()); - communicator_.allgather(&values, 1, &(receivedValues[0])); - values=init; - for( auto rvals=receivedValues.begin(), endvals=receivedValues.end(); rvals!=endvals; - ++rvals ) - { - computeGlobalReduction(*rvals, operators, values); - } - } - /// \brief TMP for computing the the global reduction after receiving the local ones. - /// - /// End of recursion. - template - typename std::enable_if::type - computeGlobalReduction(const std::tuple&, - std::tuple&, - std::tuple&) const - {} - /// \brief TMP for computing the the global reduction after receiving the local ones. - template - typename std::enable_if::type - computeGlobalReduction(const std::tuple& receivedValues, - std::tuple& operators, - std::tuple& values) const - { - auto& val=std::get(values); - val = std::get(operators).localOperator()(val, std::get(receivedValues)); - computeGlobalReduction(receivedValues, operators, values); - } - /// \brief TMP for computing the the local reduction on the DOF that the process owns. - /// - /// End of recursion. - template - typename std::enable_if::type - computeLocalReduction(const std::tuple&, - std::tuple&, - std::tuple&) const - {} - /// \brief TMP for computing the the local reduction on the DOF that the process owns. - template - typename std::enable_if::type - computeLocalReduction(const std::tuple& containers, - std::tuple& operators, - std::tuple& values) const - { - const auto& container = std::get(containers); - if( container.size() ) - { - auto& reduceOperator = std::get(operators); - // Eigen:Block does not support STL iterators!!!! - // Therefore we need to rely on the harder random-access - // property of the containers. But this should be save, too. - // Just commenting out code in the hope that Eigen might improve - // in this regard in the future. - //auto newVal = container.begin(); - auto mask = ownerMask_.begin(); - auto& value = std::get(values); - value = reduceOperator.getInitialValue(); + std::tuple& values) const; - for( auto endVal=ownerMask_.end(); mask!=endVal; - /*++newVal,*/ ++mask ) - { - value = reduceOperator(value, container[mask-ownerMask_.begin()], *mask); - } - } - computeLocalReduction(containers, operators, values); - } - /** \brief gather/scatter callback for communcation */ - template - struct CopyGatherScatter - { - typedef typename Dune::CommPolicy::IndexedType V; - - static V gather(const T& a, std::size_t i) - { - return a[i]; - } - - static void scatter(T& a, V v, std::size_t i) - { - a[i] = v; - } - }; - template - class IndexSetInserter - { - public: - typedef T ParallelIndexSet; - typedef typename ParallelIndexSet::LocalIndex LocalIndex; - typedef typename ParallelIndexSet::GlobalIndex GlobalIndex; - - IndexSetInserter(ParallelIndexSet& indexSet, const GlobalIndex& component_size, - std::size_t local_component_size, std::size_t num_components) - : indexSet_(&indexSet), component_size_(component_size), - local_component_size_(local_component_size), - num_components_(num_components) - {} - void operator()(const typename ParallelIndexSet::IndexPair& pair) - { - for(std::size_t i = 0; i < num_components_; i++) - indexSet_->add(i * component_size_ + pair.global(), - LocalIndex(i * local_component_size_ + pair.local(), - pair.local().attribute())); - } - private: - ParallelIndexSet* indexSet_; - /// \brief The global number of unknowns per component/equation. - GlobalIndex component_size_; - /// \brief The local number of unknowns per component/equation. - std::size_t local_component_size_; - /// \brief The number of components/equations. - std::size_t num_components_; - }; std::shared_ptr indexSet_; std::shared_ptr remoteIndices_; Dune::CollectiveCommunication communicator_; @@ -663,21 +429,6 @@ private: namespace Opm { -/// \brief Extracts the information about the data decomposition from the grid for dune-istl -/// -/// In the case that grid is a parallel grid this method will query it to get the information -/// about the data decompoisition and convert it to the format expected by the linear algebra -/// of dune-istl. -/// \warn for UnstructuredGrid this function doesn't do anything. -/// \param anyComm The handle to store the information in. If grid is a parallel grid -/// then this will ecapsulate an instance of ParallelISTLInformation. -/// \param grid The grid to inspect. - -inline void extractParallelGridInformationToISTL(std::any& anyComm, const UnstructuredGrid& grid) -{ - (void)anyComm; (void)grid; -} - /// \brief Accumulates entries masked with 1. /// \param container The container whose values to accumulate. /// \param maskContainer null pointer or a pointer to a container @@ -687,19 +438,8 @@ inline void extractParallelGridInformationToISTL(std::any& anyComm, const Unstru template auto accumulateMaskedValues(const T1& container, const std::vector* maskContainer) - -> decltype(container[0]*(*maskContainer)[0]) -{ - decltype(container[0]*(*maskContainer)[0]) initial = 0; + -> decltype(container[0]*(*maskContainer)[0]); - if( maskContainer ) - { - return std::inner_product(container.begin(), container.end(), maskContainer->begin(), - initial); - }else - { - return std::accumulate(container.begin(), container.end(), initial); - } -} } // end namespace Opm #endif diff --git a/opm/simulators/wells/RateConverter.hpp b/opm/simulators/wells/RateConverter.hpp index 2f73f4bde..62afcf60a 100644 --- a/opm/simulators/wells/RateConverter.hpp +++ b/opm/simulators/wells/RateConverter.hpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include diff --git a/opm/simulators/wells/RegionAttributeHelpers.hpp b/opm/simulators/wells/RegionAttributeHelpers.hpp index b7d2d67a5..57003f9c0 100644 --- a/opm/simulators/wells/RegionAttributeHelpers.hpp +++ b/opm/simulators/wells/RegionAttributeHelpers.hpp @@ -25,7 +25,6 @@ #include #include -#include #include #include diff --git a/opm/simulators/wells/RegionAverageCalculator.hpp b/opm/simulators/wells/RegionAverageCalculator.hpp index 3140e9a58..0c0bea16f 100644 --- a/opm/simulators/wells/RegionAverageCalculator.hpp +++ b/opm/simulators/wells/RegionAverageCalculator.hpp @@ -22,7 +22,6 @@ #include #include -#include #include #include