27#ifndef OPM_FLOW_BASE_VANGUARD_HPP
28#define OPM_FLOW_BASE_VANGUARD_HPP
30#include <dune/grid/common/partitionset.hh>
32#include <opm/grid/common/GridEnums.hpp>
33#include <opm/grid/common/CartesianIndexMapper.hpp>
34#include <opm/grid/LookUpCellCentroid.hh>
36#include <opm/input/eclipse/EclipseState/Aquifer/NumericalAquifer/NumericalAquiferCell.hpp>
37#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
45#include <opm/simulators/flow/BlackoilModelParameters.hpp>
51#include <unordered_map>
55template <
class TypeTag>
60namespace Opm::Properties {
69template<
class TypeTag,
class MyTypeTag>
81template <
class TypeTag>
85 using ParentType = BaseVanguard<TypeTag>;
98 static const int dimension = Grid::dimension;
99 static const int dimensionworld = Grid::dimensionworld;
100 using Element =
typename GridView::template Codim<0>::Entity;
112 FlowGenericVanguard::registerParameters_<Scalar>();
122 : ParentType(simulator)
130 enableExperiments_ = enableExperiments;
135 const CartesianIndexMapper& cartesianMapper()
const
136 {
return asImp_().cartesianIndexMapper(); }
142 {
return asImp_().cartesianIndexMapper().cartesianDimensions(); }
148 {
return asImp_().cartesianIndexMapper().cartesianSize(); }
154 {
return asImp_().equilCartesianIndexMapper().cartesianSize(); }
160 {
return asImp_().cartesianIndexMapper().cartesianIndex(compressedCellIdx); }
167 unsigned cartIndex = coords[0];
169 for (
unsigned i = 1; i < dimension; ++i) {
170 cartIndex += coords[i]*factor;
187 return index_pair->second;
208 return index_pair->second;
212 virtual int compressedIndexForInteriorLGR([[maybe_unused]]
const std::string& lgr_tag,
213 [[maybe_unused]]
const Connection& conn)
const
215 throw std::runtime_error(
"compressedIndexForInteriorLGR not implemented");
225 {
return asImp_().cartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); }
231 {
return asImp_().equilCartesianIndexMapper().cartesianIndex(compressedEquilCellIdx); }
240 {
return asImp_().equilCartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); }
254 const std::vector<Scalar>& cellCenterDepths()
const
279 const auto& grid = asImp_().grid();
280 if (grid.comm().size() == 1)
282 return grid.leafGridView().size(0);
284 const auto&
gridView = grid.leafGridView();
285 constexpr int codim = 0;
286 constexpr auto Part = Dune::Interior_Partition;
287 auto local_cells = std::distance(
gridView.template begin<codim, Part>(),
288 gridView.template end<codim, Part>());
289 return grid.comm().sum(local_cells);
303 template<
class CartMapper>
304 std::function<std::array<double,dimensionworld>(
int)>
307 return [
this, cartMapper, isCpGrid](
int elemIdx) {
308 std::array<double,dimensionworld> centroid;
309 const auto rank = this->
gridView().comm().rank();
310 const auto maxLevel = this->
gridView().grid().maxLevel();
311 bool useEclipse = !isCpGrid || (isCpGrid && (rank == 0) && (maxLevel == 0));
314 centroid = this->
eclState().getInputGrid().getCellCenter(cartMapper.cartesianIndex(elemIdx));
319 centroid = lookUpCellCentroid(elemIdx);
325 void callImplementationInit()
327 asImp_().createGrids_();
330 asImp_().updateOutputDir_(outputDir, enableEclCompatFile);
332 asImp_().updateNOSIM_(dryRunString);
333 asImp_().finalizeInit_();
336 void updateCartesianToCompressedMapping_()
338 std::size_t num_cells = asImp_().grid().leafGridView().size(0);
341 ElementMapper elemMapper(this->
gridView(), Dune::mcmgElementLayout());
342 for (
const auto& element : elements(this->
gridView()))
344 const auto elemIdx = elemMapper.index(element);
347 if (element.partitionType() == Dune::InteriorEntity)
358 void updateCellDepths_()
360 int numCells = this->
gridView().size(0);
363 ElementMapper elemMapper(this->
gridView(), Dune::mcmgElementLayout());
365 const auto num_aqu_cells = this->allAquiferCells();
367 for(
const auto& element : elements(this->
gridView())) {
368 const unsigned int elemIdx = elemMapper.index(element);
371 if (!num_aqu_cells.empty()) {
373 const auto search = num_aqu_cells.find(global_index);
374 if (search != num_aqu_cells.end()) {
381 void updateCellThickness_()
383 if (!this->drsdtconEnabled())
386 ElementMapper elemMapper(this->
gridView(), Dune::mcmgElementLayout());
388 int numElements = this->
gridView().size(0);
391 for (
const auto& elem : elements(this->
gridView())) {
392 const unsigned int elemIdx = elemMapper.index(elem);
401 typedef typename Element::Geometry Geometry;
402 static constexpr int zCoord = Element::dimension - 1;
405 const Geometry& geometry = element.geometry();
406 const int corners = geometry.corners();
407 for (
int i=0; i < corners; ++i)
408 zz += geometry.corner(i)[zCoord];
410 return zz/Scalar(corners);
413 Scalar computeCellThickness(
const typename GridView::template Codim<0>::Entity& element)
const
415 typedef typename Element::Geometry Geometry;
416 static constexpr int zCoord = Element::dimension - 1;
420 const Geometry& geometry = element.geometry();
426 assert(geometry.corners() == 8);
427 for (
int i=0; i < 4; ++i){
428 zz1 += geometry.corner(i)[zCoord];
429 zz2 += geometry.corner(i+4)[zCoord];
436 Implementation& asImp_()
437 {
return *
static_cast<Implementation*
>(
this); }
439 const Implementation& asImp_()
const
440 {
return *
static_cast<const Implementation*
>(
this); }
450 mutable std::optional<std::vector<std::unordered_map<std::size_t, std::size_t>>>
lgrMappers_;
Helper class for grid instantiation of ECL file-format using problems.
Provides the base class for most (all?) simulator vanguards.
Definition CollectDataOnIORank.hpp:49
const GridView & gridView() const
Returns a reference to the grid view to be used.
Definition basevanguard.hh:70
Helper class for grid instantiation of ECL file-format using problems.
Definition FlowBaseVanguard.hpp:84
unsigned cartesianIndex(const std::array< int, dimension > &coords) const
Return the index of the cells in the logical Cartesian grid.
Definition FlowBaseVanguard.hpp:165
virtual ~FlowBaseVanguard()=default
Empty virtual dtor.
int cartesianSize() const
Returns the overall number of cells of the logically Cartesian grid.
Definition FlowBaseVanguard.hpp:147
int compressedIndex(int cartesianCellIdx) const
Return compressed index from cartesian index.
Definition FlowBaseVanguard.hpp:183
std::vector< Scalar > cellCenterDepth_
Cell center depths.
Definition FlowBaseVanguard.hpp:453
const std::array< int, dimension > & cartesianDimensions() const
Returns the number of logically Cartesian cells in each direction.
Definition FlowBaseVanguard.hpp:141
unsigned equilCartesianIndex(unsigned compressedEquilCellIdx) const
Returns the Cartesian cell id given an element index for the grid used for equilibration.
Definition FlowBaseVanguard.hpp:230
FlowBaseVanguard(Simulator &simulator)
Create the grid for problem data files which use the ECL file format.
Definition FlowBaseVanguard.hpp:121
int compressedIndexForInterior(int cartesianCellIdx) const
Return compressed index from cartesian index only in interior.
Definition FlowBaseVanguard.hpp:198
unsigned cartesianIndex(unsigned compressedCellIdx) const
Returns the Cartesian cell id for identifaction with ECL data.
Definition FlowBaseVanguard.hpp:159
std::vector< int > is_interior_
Whether a cells is in the interior.
Definition FlowBaseVanguard.hpp:461
void cartesianCoordinate(unsigned cellIdx, std::array< int, 3 > &ijk) const
Extract Cartesian index triplet (i,j,k) of an active cell.
Definition FlowBaseVanguard.hpp:224
std::unordered_map< int, int > cartesianToCompressed_
Mapping between cartesian and compressed cells.
Definition FlowBaseVanguard.hpp:446
std::vector< Scalar > cellThickness_
Cell thickness.
Definition FlowBaseVanguard.hpp:457
std::optional< std::vector< std::unordered_map< std::size_t, std::size_t > > > lgrMappers_
Mapping between LGR cartesian and compressed cells.
Definition FlowBaseVanguard.hpp:450
Scalar cellCenterDepth(unsigned globalSpaceIdx) const
Returns the depth of a degree of freedom [m].
Definition FlowBaseVanguard.hpp:249
std::size_t globalNumCells() const
Get the number of cells in the global leaf grid view.
Definition FlowBaseVanguard.hpp:277
void equilCartesianCoordinate(unsigned cellIdx, std::array< int, 3 > &ijk) const
Extract Cartesian index triplet (i,j,k) of an active cell of the grid used for EQUIL.
Definition FlowBaseVanguard.hpp:239
std::function< std::array< double, dimensionworld >(int)> cellCentroids_(const CartMapper &cartMapper, const bool &isCpGrid) const
Get function to query cell centroids for a distributed grid.
Definition FlowBaseVanguard.hpp:305
Scalar cellThickness(unsigned globalSpaceIdx) const
Returns the thickness of a degree of freedom [m].
Definition FlowBaseVanguard.hpp:266
static void registerParameters()
Register the common run-time parameters for all ECL simulator vanguards.
Definition FlowBaseVanguard.hpp:110
int equilCartesianSize() const
Returns the overall number of cells of the logically EquilCartesian grid.
Definition FlowBaseVanguard.hpp:153
const EclipseState & eclState() const
Return a reference to the internalized ECL deck.
Definition FlowGenericVanguard.hpp:168
FlowGenericVanguard()
Constructor.
Definition FlowGenericVanguard.cpp:108
Declare the properties used by the infrastructure code of the finite volume discretizations.
Declare the properties used by the infrastructure code of the finite volume discretizations.
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:45
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition propertysystem.hh:233
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:240
This file provides the infrastructure to retrieve run-time parameters.
bool IsSet(bool errorIfNotRegistered=true)
Returns true if a parameter has been specified at runtime, false otherwise.
Definition parametersystem.hpp:270
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition parametersystem.hpp:187
The Opm property system, traits with inheritance.
Definition FlowBaseVanguard.hpp:57
Definition FlowBaseVanguard.hpp:70
Definition FlowBaseVanguard.hpp:64
a tag to mark properties as undefined
Definition propertysystem.hh:38