mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
çonverted tabs to spaces
This commit is contained in:
parent
9982ddf3fb
commit
8efae16087
@ -1277,7 +1277,6 @@ public:
|
||||
case WType::WATER: return "Wat";
|
||||
case WType::GAS: return "Gas";
|
||||
case WType::MULTI: return "Multi";
|
||||
|
||||
default:
|
||||
{
|
||||
return "";
|
||||
@ -1293,7 +1292,6 @@ public:
|
||||
case CMode::THP: return "THP";
|
||||
case CMode::BHP: return "BHP";
|
||||
case CMode::GRUP: return "GRUP";
|
||||
|
||||
default:
|
||||
{
|
||||
return "";
|
||||
@ -1405,7 +1403,6 @@ public:
|
||||
case WType::WATER: return "Wat";
|
||||
case WType::GAS: return "Gas";
|
||||
case WType::MULTI: return "Multi";
|
||||
|
||||
default:
|
||||
{
|
||||
return "";
|
||||
@ -1421,7 +1418,6 @@ public:
|
||||
case CMode::THP: return "THP";
|
||||
case CMode::BHP: return "BHP";
|
||||
case CMode::GRUP: return "GRUP";
|
||||
|
||||
default:
|
||||
{
|
||||
return "";
|
||||
|
@ -43,19 +43,19 @@
|
||||
#include <opm/output/eclipse/Summary.hpp>
|
||||
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
|
||||
|
||||
#include <opm/simulators/utils/ParallelRestart.hpp>
|
||||
#include <opm/grid/GridHelpers.hpp>
|
||||
#include <opm/grid/utility/cartesianToCompressed.hpp>
|
||||
#include <opm/simulators/utils/ParallelRestart.hpp>
|
||||
|
||||
#include <opm/material/common/Exceptions.hpp>
|
||||
#include <opm/material/common/Valgrind.hpp>
|
||||
#include <opm/material/common/Exceptions.hpp>
|
||||
|
||||
#include <opm/common/OpmLog/OpmLog.hpp>
|
||||
|
||||
#include <chrono>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
|
||||
#ifdef HAVE_MPI
|
||||
#include <mpi.h>
|
||||
@ -71,9 +71,11 @@ END_PROPERTIES
|
||||
|
||||
namespace Opm {
|
||||
|
||||
template <class TypeTag> class EclWriter;
|
||||
template <class TypeTag>
|
||||
class EclWriter;
|
||||
|
||||
template <class TypeTag> class EclOutputBlackOilModule;
|
||||
template <class TypeTag>
|
||||
class EclOutputBlackOilModule;
|
||||
|
||||
/*!
|
||||
* \brief Detect whether two cells are direct vertical neighbours.
|
||||
@ -84,18 +86,16 @@ template <class TypeTag> class EclOutputBlackOilModule;
|
||||
* \tparam CM The type of the cartesian index mapper.
|
||||
* \param cartMapper The mapper onto cartesian indices.
|
||||
* \param cartesianToActive The mapping of cartesian indices to active indices.
|
||||
* \param smallGlobalIndex The cartesian cell index of the cell with smaller
|
||||
* index
|
||||
* \param largeGlobalIndex The cartesian cell index of the cell with larger
|
||||
* index
|
||||
* \return True if the cells have the same i and j indices and all cartesian
|
||||
* cells
|
||||
* \param smallGlobalIndex The cartesian cell index of the cell with smaller index
|
||||
* \param largeGlobalIndex The cartesian cell index of the cell with larger index
|
||||
* \return True if the cells have the same i and j indices and all cartesian cells
|
||||
* between them are inactive.
|
||||
*/
|
||||
inline bool
|
||||
directVerticalNeighbors(const std::array<int, 3> &cartDims,
|
||||
inline
|
||||
bool directVerticalNeighbors(const std::array<int, 3>& cartDims,
|
||||
const std::unordered_map<int,int>& cartesianToActive,
|
||||
int smallGlobalIndex, int largeGlobalIndex) {
|
||||
int smallGlobalIndex, int largeGlobalIndex)
|
||||
{
|
||||
assert(smallGlobalIndex <= largeGlobalIndex);
|
||||
std::array<int, 3> ijk1, ijk2;
|
||||
auto globalToIjk = [cartDims](int gc) {
|
||||
@ -110,13 +110,14 @@ directVerticalNeighbors(const std::array<int, 3> &cartDims,
|
||||
ijk2 = globalToIjk(largeGlobalIndex);
|
||||
assert(ijk2[2]>=ijk1[2]);
|
||||
|
||||
if (ijk1[0] == ijk2[0] && ijk1[1] == ijk2[1] && (ijk2[2] - ijk1[2]) > 1) {
|
||||
assert((largeGlobalIndex - smallGlobalIndex) %
|
||||
(cartDims[0] * cartDims[1]) ==
|
||||
0);
|
||||
for (int gi = smallGlobalIndex + cartDims[0] * cartDims[1];
|
||||
gi < largeGlobalIndex; gi += cartDims[0] * cartDims[1]) {
|
||||
if (cartesianToActive.find(gi) != cartesianToActive.end()) {
|
||||
if ( ijk1[0] == ijk2[0] && ijk1[1] == ijk2[1] && (ijk2[2] - ijk1[2]) > 1)
|
||||
{
|
||||
assert((largeGlobalIndex-smallGlobalIndex)%(cartDims[0]*cartDims[1])==0);
|
||||
for ( int gi = smallGlobalIndex + cartDims[0] * cartDims[1]; gi < largeGlobalIndex;
|
||||
gi += cartDims[0] * cartDims[1] )
|
||||
{
|
||||
if ( cartesianToActive.find( gi ) != cartesianToActive.end() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -140,7 +141,9 @@ directVerticalNeighbors(const std::array<int, 3> &cartDims,
|
||||
* - This class requires to use the black oil model with the element
|
||||
* centered finite volume discretization.
|
||||
*/
|
||||
template <class TypeTag> class EclWriter {
|
||||
template <class TypeTag>
|
||||
class EclWriter
|
||||
{
|
||||
typedef typename GET_PROP_TYPE(TypeTag, Simulator) Simulator;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, Vanguard) Vanguard;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
|
||||
@ -158,58 +161,60 @@ template <class TypeTag> class EclWriter {
|
||||
enum { enableEnergy = GET_PROP_VALUE(TypeTag, EnableEnergy) };
|
||||
enum { enableSolvent = GET_PROP_VALUE(TypeTag, EnableSolvent) };
|
||||
|
||||
|
||||
public:
|
||||
static void registerParameters() {
|
||||
static void registerParameters()
|
||||
{
|
||||
EclOutputBlackOilModule<TypeTag>::registerParameters();
|
||||
|
||||
EWOMS_REGISTER_PARAM(TypeTag, bool, EnableAsyncEclOutput,
|
||||
"Write the ECL-formated results in a non-blocking way "
|
||||
"(i.e., using a separate thread).");
|
||||
"Write the ECL-formated results in a non-blocking way (i.e., using a separate thread).");
|
||||
}
|
||||
|
||||
// The Simulator object should preferably have been const - the
|
||||
// only reason that is not the case is due to the SummaryState
|
||||
// object owned deep down by the vanguard.
|
||||
EclWriter(Simulator& simulator)
|
||||
: simulator_(simulator), collectToIORank_(simulator_.vanguard()),
|
||||
eclOutputModule_(simulator, collectToIORank_) {
|
||||
: simulator_(simulator)
|
||||
, collectToIORank_(simulator_.vanguard())
|
||||
, eclOutputModule_(simulator, collectToIORank_)
|
||||
{
|
||||
if (collectToIORank_.isIORank()) {
|
||||
globalGrid_ = simulator_.vanguard().grid();
|
||||
globalGrid_.switchToGlobalView();
|
||||
eclIO_.reset(new Opm::EclipseIO(
|
||||
simulator_.vanguard().eclState(),
|
||||
Opm::UgGridHelpers::createEclipseGrid(
|
||||
globalGrid_, simulator_.vanguard().eclState().getInputGrid()),
|
||||
eclIO_.reset(new Opm::EclipseIO(simulator_.vanguard().eclState(),
|
||||
Opm::UgGridHelpers::createEclipseGrid(globalGrid_, simulator_.vanguard().eclState().getInputGrid()),
|
||||
simulator_.vanguard().schedule(),
|
||||
simulator_.vanguard().summaryConfig()));
|
||||
}
|
||||
|
||||
// create output thread if enabled and rank is I/O rank
|
||||
// async output is enabled by default if pthread are enabled
|
||||
bool enableAsyncOutput =
|
||||
EWOMS_GET_PARAM(TypeTag, bool, EnableAsyncEclOutput);
|
||||
bool enableAsyncOutput = EWOMS_GET_PARAM(TypeTag, bool, EnableAsyncEclOutput);
|
||||
int numWorkerThreads = 0;
|
||||
if (enableAsyncOutput && collectToIORank_.isIORank())
|
||||
numWorkerThreads = 1;
|
||||
taskletRunner_.reset(new TaskletRunner(numWorkerThreads));
|
||||
}
|
||||
|
||||
~EclWriter() {}
|
||||
~EclWriter()
|
||||
{ }
|
||||
|
||||
const Opm::EclipseIO &eclIO() const {
|
||||
const Opm::EclipseIO& eclIO() const
|
||||
{
|
||||
assert(eclIO_);
|
||||
return *eclIO_;
|
||||
}
|
||||
|
||||
void writeInit() {
|
||||
void writeInit()
|
||||
{
|
||||
if (collectToIORank_.isIORank()) {
|
||||
std::map<std::string, std::vector<int> > integerVectors;
|
||||
if (collectToIORank_.isParallel())
|
||||
integerVectors.emplace("MPI_RANK", collectToIORank_.globalRanks());
|
||||
auto cartMap = Opm::cartesianToCompressed(
|
||||
globalGrid_.size(0), Opm::UgGridHelpers::globalCell(globalGrid_));
|
||||
eclIO_->writeInitial(computeTrans_(cartMap), integerVectors,
|
||||
exportNncStructure_(cartMap));
|
||||
auto cartMap = Opm::cartesianToCompressed(globalGrid_.size(0),
|
||||
Opm::UgGridHelpers::globalCell(globalGrid_));
|
||||
eclIO_->writeInitial(computeTrans_(cartMap), integerVectors, exportNncStructure_(cartMap));
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,7 +222,8 @@ public:
|
||||
* \brief collect and pass data and pass it to eclIO writer
|
||||
*/
|
||||
|
||||
void evalSummaryState(bool isSubStep) {
|
||||
void evalSummaryState(bool isSubStep)
|
||||
{
|
||||
int reportStepNum = simulator_.episodeIndex() + 1;
|
||||
/*
|
||||
The summary data is not evaluated for timestep 0, that is
|
||||
@ -240,18 +246,17 @@ public:
|
||||
return;
|
||||
|
||||
Scalar curTime = simulator_.time() + simulator_.timeStepSize();
|
||||
Scalar totalCpuTime = simulator_.executionTimer().realTimeElapsed() +
|
||||
Scalar totalCpuTime =
|
||||
simulator_.executionTimer().realTimeElapsed() +
|
||||
simulator_.setupTimer().realTimeElapsed() +
|
||||
simulator_.vanguard().externalSetupTime();
|
||||
|
||||
Opm::data::Wells localWellData =
|
||||
simulator_.problem().wellModel().wellData();
|
||||
Opm::data::Wells localWellData = simulator_.problem().wellModel().wellData();
|
||||
|
||||
const auto& gridView = simulator_.vanguard().gridView();
|
||||
int numElements = gridView.size(/*codim=*/0);
|
||||
bool log = collectToIORank_.isIORank();
|
||||
eclOutputModule_.allocBuffers(numElements, reportStepNum, isSubStep, log,
|
||||
/*isRestart*/ false);
|
||||
eclOutputModule_.allocBuffers(numElements, reportStepNum, isSubStep, log, /*isRestart*/ false);
|
||||
|
||||
ElementContext elemCtx(simulator_);
|
||||
ElementIterator elemIt = gridView.template begin</*codim=*/0>();
|
||||
@ -264,8 +269,7 @@ public:
|
||||
}
|
||||
|
||||
if (collectToIORank_.isParallel())
|
||||
collectToIORank_.collect({}, eclOutputModule_.getBlockData(),
|
||||
localWellData);
|
||||
collectToIORank_.collect({}, eclOutputModule_.getBlockData(), localWellData);
|
||||
|
||||
std::map<std::string, double> miscSummaryData;
|
||||
std::map<std::string, std::vector<double>> regionData;
|
||||
@ -287,29 +291,33 @@ public:
|
||||
if (totalCpuTime != 0.0)
|
||||
miscSummaryData["TCPU"] = totalCpuTime;
|
||||
|
||||
const Opm::data::Wells &wellData = collectToIORank_.isParallel()
|
||||
? collectToIORank_.globalWellData()
|
||||
: localWellData;
|
||||
const Opm::data::Wells& wellData = collectToIORank_.isParallel() ? collectToIORank_.globalWellData() : localWellData;
|
||||
|
||||
const std::map<std::pair<std::string, int>, double> &blockData =
|
||||
collectToIORank_.isParallel() ? collectToIORank_.globalBlockData()
|
||||
const std::map<std::pair<std::string, int>, double>& blockData
|
||||
= collectToIORank_.isParallel()
|
||||
? collectToIORank_.globalBlockData()
|
||||
: eclOutputModule_.getBlockData();
|
||||
|
||||
summary.eval(summaryState(), reportStepNum, curTime, eclState, schedule(),
|
||||
wellData, miscSummaryData, regionData, blockData);
|
||||
summary.eval(summaryState(),
|
||||
reportStepNum,
|
||||
curTime,
|
||||
eclState,
|
||||
schedule(),
|
||||
wellData,
|
||||
miscSummaryData,
|
||||
regionData,
|
||||
blockData);
|
||||
buffer = summaryState().serialize();
|
||||
}
|
||||
|
||||
if (collectToIORank_.isParallel()) {
|
||||
#ifdef HAVE_MPI
|
||||
unsigned long buffer_size = buffer.size();
|
||||
MPI_Bcast(&buffer_size, 1, MPI_UNSIGNED_LONG, collectToIORank_.ioRank,
|
||||
MPI_COMM_WORLD);
|
||||
MPI_Bcast(&buffer_size, 1, MPI_UNSIGNED_LONG, collectToIORank_.ioRank, MPI_COMM_WORLD);
|
||||
if (!collectToIORank_.isIORank())
|
||||
buffer.resize( buffer_size );
|
||||
|
||||
MPI_Bcast(buffer.data(), buffer_size, MPI_CHAR, collectToIORank_.ioRank,
|
||||
MPI_COMM_WORLD);
|
||||
MPI_Bcast(buffer.data(), buffer_size, MPI_CHAR, collectToIORank_.ioRank, MPI_COMM_WORLD);
|
||||
if (!collectToIORank_.isIORank()) {
|
||||
Opm::SummaryState& st = summaryState();
|
||||
st.deserialize(buffer);
|
||||
@ -318,20 +326,20 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void writeOutput(bool isSubStep) {
|
||||
|
||||
void writeOutput(bool isSubStep)
|
||||
{
|
||||
Scalar curTime = simulator_.time() + simulator_.timeStepSize();
|
||||
Scalar nextStepSize = simulator_.problem().nextTimeStepSize();
|
||||
|
||||
// output using eclWriter if enabled
|
||||
Opm::data::Wells localWellData =
|
||||
simulator_.problem().wellModel().wellData();
|
||||
Opm::data::Wells localWellData = simulator_.problem().wellModel().wellData();
|
||||
|
||||
int reportStepNum = simulator_.episodeIndex() + 1;
|
||||
const auto& gridView = simulator_.vanguard().gridView();
|
||||
int numElements = gridView.size(/*codim=*/0);
|
||||
bool log = collectToIORank_.isIORank();
|
||||
eclOutputModule_.allocBuffers(numElements, reportStepNum, isSubStep, log,
|
||||
/*isRestart*/ false);
|
||||
eclOutputModule_.allocBuffers(numElements, reportStepNum, isSubStep, log, /*isRestart*/ false);
|
||||
|
||||
ElementContext elemCtx(simulator_);
|
||||
ElementIterator elemIt = gridView.template begin</*codim=*/0>();
|
||||
@ -354,39 +362,35 @@ public:
|
||||
eclOutputModule_.addRftDataToWells(localWellData, reportStepNum);
|
||||
|
||||
if (collectToIORank_.isParallel())
|
||||
collectToIORank_.collect(localCellData, eclOutputModule_.getBlockData(),
|
||||
localWellData);
|
||||
collectToIORank_.collect(localCellData, eclOutputModule_.getBlockData(), localWellData);
|
||||
|
||||
|
||||
if (collectToIORank_.isIORank()) {
|
||||
const auto& eclState = simulator_.vanguard().eclState();
|
||||
const auto& simConfig = eclState.getSimulationConfig();
|
||||
|
||||
bool enableDoublePrecisionOutput =
|
||||
EWOMS_GET_PARAM(TypeTag, bool, EclOutputDoublePrecision);
|
||||
const Opm::data::Solution &cellData =
|
||||
collectToIORank_.isParallel() ? collectToIORank_.globalCellData()
|
||||
: localCellData;
|
||||
const Opm::data::Wells &wellData = collectToIORank_.isParallel()
|
||||
? collectToIORank_.globalWellData()
|
||||
: localWellData;
|
||||
bool enableDoublePrecisionOutput = EWOMS_GET_PARAM(TypeTag, bool, EclOutputDoublePrecision);
|
||||
const Opm::data::Solution& cellData = collectToIORank_.isParallel() ? collectToIORank_.globalCellData() : localCellData;
|
||||
const Opm::data::Wells& wellData = collectToIORank_.isParallel() ? collectToIORank_.globalWellData() : localWellData;
|
||||
Opm::RestartValue restartValue(cellData, wellData);
|
||||
|
||||
if (simConfig.useThresholdPressure())
|
||||
restartValue.addExtra("THRESHPR", Opm::UnitSystem::measure::pressure,
|
||||
simulator_.problem().thresholdPressure().data());
|
||||
restartValue.addExtra("THRESHPR", Opm::UnitSystem::measure::pressure, simulator_.problem().thresholdPressure().data());
|
||||
|
||||
// Add suggested next timestep to extra data.
|
||||
if (!isSubStep)
|
||||
restartValue.addExtra("OPMEXTRA", std::vector<double>(1, nextStepSize));
|
||||
|
||||
// first, create a tasklet to write the data for the current time step to
|
||||
// disk
|
||||
auto eclWriteTasklet = std::make_shared<EclWriteTasklet>(
|
||||
summaryState(), *eclIO_, reportStepNum, isSubStep, curTime,
|
||||
restartValue, enableDoublePrecisionOutput);
|
||||
// first, create a tasklet to write the data for the current time step to disk
|
||||
auto eclWriteTasklet = std::make_shared<EclWriteTasklet>(summaryState(),
|
||||
*eclIO_,
|
||||
reportStepNum,
|
||||
isSubStep,
|
||||
curTime,
|
||||
restartValue,
|
||||
enableDoublePrecisionOutput);
|
||||
|
||||
// then, make sure that the previous I/O request has been completed and
|
||||
// the
|
||||
// then, make sure that the previous I/O request has been completed and the
|
||||
// number of incomplete tasklets does not increase between time steps
|
||||
taskletRunner_->barrier();
|
||||
|
||||
@ -395,39 +399,28 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void beginRestart() {
|
||||
bool enableHysteresis =
|
||||
simulator_.problem().materialLawManager()->enableHysteresis();
|
||||
bool enableSwatinit = simulator_.vanguard()
|
||||
.eclState()
|
||||
.get3DProperties()
|
||||
.hasDeckDoubleGridProperty("SWATINIT");
|
||||
void beginRestart()
|
||||
{
|
||||
bool enableHysteresis = simulator_.problem().materialLawManager()->enableHysteresis();
|
||||
bool enableSwatinit = simulator_.vanguard().eclState().get3DProperties().hasDeckDoubleGridProperty("SWATINIT");
|
||||
std::vector<Opm::RestartKey> solutionKeys{
|
||||
{"PRESSURE", Opm::UnitSystem::measure::pressure},
|
||||
{"SWAT", Opm::UnitSystem::measure::identity,
|
||||
static_cast<bool>(
|
||||
FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx))},
|
||||
{"SGAS", Opm::UnitSystem::measure::identity,
|
||||
static_cast<bool>(
|
||||
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx))},
|
||||
{"SWAT", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx))},
|
||||
{"SGAS", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx))},
|
||||
{"TEMP" , Opm::UnitSystem::measure::temperature, enableEnergy},
|
||||
{"SSOLVENT" , Opm::UnitSystem::measure::identity, enableSolvent},
|
||||
{"RS", Opm::UnitSystem::measure::gas_oil_ratio,
|
||||
FluidSystem::enableDissolvedGas()},
|
||||
{"RV", Opm::UnitSystem::measure::oil_gas_ratio,
|
||||
FluidSystem::enableVaporizedOil()},
|
||||
{"SOMAX", Opm::UnitSystem::measure::identity,
|
||||
simulator_.problem().vapparsActive()},
|
||||
{"RS", Opm::UnitSystem::measure::gas_oil_ratio, FluidSystem::enableDissolvedGas()},
|
||||
{"RV", Opm::UnitSystem::measure::oil_gas_ratio, FluidSystem::enableVaporizedOil()},
|
||||
{"SOMAX", Opm::UnitSystem::measure::identity, simulator_.problem().vapparsActive()},
|
||||
{"PCSWM_OW", Opm::UnitSystem::measure::identity, enableHysteresis},
|
||||
{"KRNSW_OW", Opm::UnitSystem::measure::identity, enableHysteresis},
|
||||
{"PCSWM_GO", Opm::UnitSystem::measure::identity, enableHysteresis},
|
||||
{"KRNSW_GO", Opm::UnitSystem::measure::identity, enableHysteresis},
|
||||
{"PPCW", Opm::UnitSystem::measure::pressure, enableSwatinit}};
|
||||
{"PPCW", Opm::UnitSystem::measure::pressure, enableSwatinit}
|
||||
};
|
||||
|
||||
const auto &inputThpres =
|
||||
eclState().getSimulationConfig().getThresholdPressure();
|
||||
std::vector<Opm::RestartKey> extraKeys = {
|
||||
{"OPMEXTRA", Opm::UnitSystem::measure::identity, false},
|
||||
const auto& inputThpres = eclState().getSimulationConfig().getThresholdPressure();
|
||||
std::vector<Opm::RestartKey> extraKeys = {{"OPMEXTRA", Opm::UnitSystem::measure::identity, false},
|
||||
{"THRESHPR", Opm::UnitSystem::measure::pressure, inputThpres.active()}};
|
||||
|
||||
// The episodeIndex is rewined one back before beginRestart is called
|
||||
@ -439,15 +432,12 @@ public:
|
||||
|
||||
const auto& gridView = simulator_.vanguard().gridView();
|
||||
unsigned numElements = gridView.size(/*codim=*/0);
|
||||
eclOutputModule_.allocBuffers(numElements, restartStepIdx,
|
||||
/*isSubStep=*/false, /*log=*/false,
|
||||
/*isRestart*/ true);
|
||||
eclOutputModule_.allocBuffers(numElements, restartStepIdx, /*isSubStep=*/false, /*log=*/false, /*isRestart*/ true);
|
||||
|
||||
{
|
||||
Opm::SummaryState& summaryState = simulator_.vanguard().summaryState();
|
||||
auto restartValues =
|
||||
loadParallelRestart(eclIO_.get(), summaryState, solutionKeys,
|
||||
extraKeys, gridView.grid().comm());
|
||||
auto restartValues = loadParallelRestart(eclIO_.get(), summaryState, solutionKeys, extraKeys,
|
||||
gridView.grid().comm());
|
||||
|
||||
for (unsigned elemIdx = 0; elemIdx < numElements; ++elemIdx) {
|
||||
unsigned globalIdx = collectToIORank_.localIdxToGlobalIdx(elemIdx);
|
||||
@ -467,34 +457,29 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void endRestart() {}
|
||||
void endRestart()
|
||||
{}
|
||||
|
||||
const EclOutputBlackOilModule<TypeTag> &eclOutputModule() const {
|
||||
return eclOutputModule_;
|
||||
}
|
||||
const EclOutputBlackOilModule<TypeTag>& eclOutputModule() const
|
||||
{ return eclOutputModule_; }
|
||||
|
||||
Scalar restartTimeStepSize() const
|
||||
{ return restartTimeStepSize_; }
|
||||
|
||||
Scalar restartTimeStepSize() const { return restartTimeStepSize_; }
|
||||
|
||||
private:
|
||||
static bool enableEclOutput_() {
|
||||
return EWOMS_GET_PARAM(TypeTag, bool, EnableEclOutput);
|
||||
}
|
||||
static bool enableEclOutput_()
|
||||
{ return EWOMS_GET_PARAM(TypeTag, bool, EnableEclOutput); }
|
||||
|
||||
Opm::data::Solution
|
||||
computeTrans_(const std::unordered_map<int, int> &cartesianToActive) const {
|
||||
Opm::data::Solution computeTrans_(const std::unordered_map<int,int>& cartesianToActive) const
|
||||
{
|
||||
const auto& cartMapper = simulator_.vanguard().cartesianIndexMapper();
|
||||
const auto& cartDims = cartMapper.cartesianDimensions();
|
||||
const int globalSize = cartDims[0]*cartDims[1]*cartDims[2];
|
||||
|
||||
Opm::data::CellData tranx = {Opm::UnitSystem::measure::transmissibility,
|
||||
std::vector<double>(globalSize),
|
||||
Opm::data::TargetType::INIT};
|
||||
Opm::data::CellData trany = {Opm::UnitSystem::measure::transmissibility,
|
||||
std::vector<double>(globalSize),
|
||||
Opm::data::TargetType::INIT};
|
||||
Opm::data::CellData tranz = {Opm::UnitSystem::measure::transmissibility,
|
||||
std::vector<double>(globalSize),
|
||||
Opm::data::TargetType::INIT};
|
||||
Opm::data::CellData tranx = {Opm::UnitSystem::measure::transmissibility, std::vector<double>(globalSize), Opm::data::TargetType::INIT};
|
||||
Opm::data::CellData trany = {Opm::UnitSystem::measure::transmissibility, std::vector<double>(globalSize), Opm::data::TargetType::INIT};
|
||||
Opm::data::CellData tranz = {Opm::UnitSystem::measure::transmissibility, std::vector<double>(globalSize), Opm::data::TargetType::INIT};
|
||||
|
||||
for (size_t i = 0; i < tranx.data.size(); ++i) {
|
||||
tranx.data[0] = 0.0;
|
||||
@ -505,20 +490,18 @@ private:
|
||||
typedef typename Grid :: LeafGridView GlobalGridView;
|
||||
const GlobalGridView& globalGridView = globalGrid_.leafGridView();
|
||||
#if DUNE_VERSION_NEWER(DUNE_GRID, 2,6)
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView>
|
||||
ElementMapper;
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView> ElementMapper;
|
||||
ElementMapper globalElemMapper(globalGridView, Dune::mcmgElementLayout());
|
||||
#else
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView,
|
||||
Dune::MCMGElementLayout>
|
||||
ElementMapper;
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView, Dune::MCMGElementLayout> ElementMapper;
|
||||
ElementMapper globalElemMapper(globalGridView);
|
||||
#endif
|
||||
|
||||
const auto& cartesianCellIdx = globalGrid_.globalCell();
|
||||
const EclTransmissibility<TypeTag>* globalTrans;
|
||||
|
||||
if (!collectToIORank_.isParallel()) {
|
||||
if (!collectToIORank_.isParallel())
|
||||
{
|
||||
// in the sequential case we must use the transmissibilites defined by
|
||||
// the problem. (because in the sequential case, the grid manager does
|
||||
// not compute "global" transmissibilities for performance reasons. in
|
||||
@ -526,7 +509,9 @@ private:
|
||||
// because this object refers to the distributed grid and we need the
|
||||
// sequential version here.)
|
||||
globalTrans = &simulator_.problem().eclTransmissibilities();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
globalTrans = &(simulator_.vanguard().globalTransmissibility());
|
||||
}
|
||||
|
||||
@ -556,8 +541,7 @@ private:
|
||||
|
||||
if (gc2 - gc1 == 1) {
|
||||
tranx.data[gc1] = globalTrans->transmissibility(c1, c2);
|
||||
continue; // skip other if clauses as they are false, last one needs
|
||||
// some computation
|
||||
continue; // skip other if clauses as they are false, last one needs some computation
|
||||
}
|
||||
|
||||
if (gc2 - gc1 == cartDims[0]) {
|
||||
@ -571,11 +555,13 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
return {{"TRANX", tranx}, {"TRANY", trany}, {"TRANZ", tranz}};
|
||||
return {{"TRANX", tranx},
|
||||
{"TRANY", trany},
|
||||
{"TRANZ", tranz}};
|
||||
}
|
||||
|
||||
Opm::NNC exportNncStructure_(
|
||||
const std::unordered_map<int, int> &cartesianToActive) const {
|
||||
Opm::NNC exportNncStructure_(const std::unordered_map<int,int>& cartesianToActive) const
|
||||
{
|
||||
std::size_t nx = eclState().getInputGrid().getNX();
|
||||
std::size_t ny = eclState().getInputGrid().getNY();
|
||||
auto nncData = sortNncAndApplyEditnnc(eclState().getInputNNC().nncdata(),
|
||||
@ -591,10 +577,8 @@ private:
|
||||
auto cellDiff = entry.cell2 - entry.cell1;
|
||||
|
||||
if (cellDiff != 1 && cellDiff != nx && cellDiff != nx*ny) {
|
||||
auto tt = unitSystem.from_si(Opm::UnitSystem::measure::transmissibility,
|
||||
entry.trans);
|
||||
// Eclipse ignores NNCs (with EDITNNC applied) that are small. Seems
|
||||
// like the threshold is 1.0e-6
|
||||
auto tt = unitSystem.from_si(Opm::UnitSystem::measure::transmissibility, entry.trans);
|
||||
// Eclipse ignores NNCs (with EDITNNC applied) that are small. Seems like the threshold is 1.0e-6
|
||||
if ( tt >= 1.0e-6 )
|
||||
outputNnc.emplace_back(entry.cell1, entry.cell2, entry.trans);
|
||||
}
|
||||
@ -603,8 +587,7 @@ private:
|
||||
|
||||
auto nncCompare = []( const Opm::NNCdata& nnc1, const Opm::NNCdata& nnc2){
|
||||
return nnc1.cell1 < nnc2.cell1 ||
|
||||
(nnc1.cell1 == nnc2.cell1 && nnc1.cell2 < nnc2.cell2);
|
||||
};
|
||||
( nnc1.cell1 == nnc2.cell1 && nnc1.cell2 < nnc2.cell2);};
|
||||
// Sort the nncData values from the deck as they need to be
|
||||
// Checked when writing NNC transmissibilities from the simulation.
|
||||
std::sort(nncData.begin(), nncData.end(), nncCompare);
|
||||
@ -612,14 +595,11 @@ private:
|
||||
typedef typename Grid :: LeafGridView GlobalGridView;
|
||||
const GlobalGridView& globalGridView = globalGrid_.leafGridView();
|
||||
#if DUNE_VERSION_NEWER(DUNE_GRID, 2,6)
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView>
|
||||
ElementMapper;
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView> ElementMapper;
|
||||
ElementMapper globalElemMapper(globalGridView, Dune::mcmgElementLayout());
|
||||
|
||||
#else
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView,
|
||||
Dune::MCMGElementLayout>
|
||||
ElementMapper;
|
||||
typedef Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView, Dune::MCMGElementLayout> ElementMapper;
|
||||
ElementMapper globalElemMapper(globalGridView);
|
||||
#endif
|
||||
|
||||
@ -632,12 +612,13 @@ private:
|
||||
// because this object refers to the distributed grid and we need the
|
||||
// sequential version here.)
|
||||
globalTrans = &simulator_.problem().eclTransmissibilities();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
globalTrans = &(simulator_.vanguard().globalTransmissibility());
|
||||
}
|
||||
|
||||
auto cartDims =
|
||||
simulator_.vanguard().cartesianIndexMapper().cartesianDimensions();
|
||||
auto cartDims = simulator_.vanguard().cartesianIndexMapper().cartesianDimensions();
|
||||
auto elemIt = globalGridView.template begin</*codim=*/0>();
|
||||
const auto& elemEndIt = globalGridView.template end</*codim=*/0>();
|
||||
for (; elemIt != elemEndIt; ++ elemIt) {
|
||||
@ -668,29 +649,24 @@ private:
|
||||
|
||||
auto cellDiff = cc2 - cc1;
|
||||
|
||||
if (cellDiff != 1 && cellDiff != nx && cellDiff != nx * ny &&
|
||||
if (cellDiff != 1 &&
|
||||
cellDiff != nx &&
|
||||
cellDiff != nx*ny &&
|
||||
! directVerticalNeighbors(cartDims, cartesianToActive, cc1, cc2)) {
|
||||
// We need to check whether an NNC for this face was also specified
|
||||
// via the NNC keyword in the deck (i.e. in the first origNncSize
|
||||
// entries.
|
||||
// via the NNC keyword in the deck (i.e. in the first origNncSize entries.
|
||||
auto t = globalTrans->transmissibility(c1, c2);
|
||||
auto candidate =
|
||||
std::lower_bound(nncData.begin(), nncData.end(),
|
||||
Opm::NNCdata(cc1, cc2, 0.0), nncCompare);
|
||||
auto candidate = std::lower_bound(nncData.begin(), nncData.end(), Opm::NNCdata(cc1, cc2, 0.0), nncCompare);
|
||||
|
||||
while (candidate != nncData.end() && candidate->cell1 == cc1 &&
|
||||
candidate->cell2 == cc2) {
|
||||
while ( candidate != nncData.end() && candidate->cell1 == cc1
|
||||
&& candidate->cell2 == cc2) {
|
||||
t -= candidate->trans;
|
||||
++candidate;
|
||||
}
|
||||
// eclipse ignores NNCs with zero transmissibility (different
|
||||
// threshold than for NNC
|
||||
// with corresponding EDITNNC above). In addition we do set small
|
||||
// transmissibilties
|
||||
// to zero when setting up the simulator. These will be ignored here,
|
||||
// too.
|
||||
auto tt = unitSystem.from_si(
|
||||
Opm::UnitSystem::measure::transmissibility, std::abs(t));
|
||||
// eclipse ignores NNCs with zero transmissibility (different threshold than for NNC
|
||||
// with corresponding EDITNNC above). In addition we do set small transmissibilties
|
||||
// to zero when setting up the simulator. These will be ignored here, too.
|
||||
auto tt = unitSystem.from_si(Opm::UnitSystem::measure::transmissibility, std::abs(t));
|
||||
if ( tt > 1e-12 )
|
||||
outputNnc.push_back({cc1, cc2, t});
|
||||
}
|
||||
@ -702,7 +678,9 @@ private:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct EclWriteTasklet : public TaskletInterface {
|
||||
struct EclWriteTasklet
|
||||
: public TaskletInterface
|
||||
{
|
||||
Opm::SummaryState summaryState_;
|
||||
Opm::EclipseIO& eclIO_;
|
||||
int reportStepNum_;
|
||||
@ -712,34 +690,41 @@ private:
|
||||
bool writeDoublePrecision_;
|
||||
|
||||
explicit EclWriteTasklet(const Opm::SummaryState& summaryState,
|
||||
Opm::EclipseIO &eclIO, int reportStepNum,
|
||||
bool isSubStep, double secondsElapsed,
|
||||
Opm::EclipseIO& eclIO,
|
||||
int reportStepNum,
|
||||
bool isSubStep,
|
||||
double secondsElapsed,
|
||||
Opm::RestartValue restartValue,
|
||||
bool writeDoublePrecision)
|
||||
: summaryState_(summaryState), eclIO_(eclIO),
|
||||
reportStepNum_(reportStepNum), isSubStep_(isSubStep),
|
||||
secondsElapsed_(secondsElapsed), restartValue_(restartValue),
|
||||
writeDoublePrecision_(writeDoublePrecision) {}
|
||||
: summaryState_(summaryState)
|
||||
, eclIO_(eclIO)
|
||||
, reportStepNum_(reportStepNum)
|
||||
, isSubStep_(isSubStep)
|
||||
, secondsElapsed_(secondsElapsed)
|
||||
, restartValue_(restartValue)
|
||||
, writeDoublePrecision_(writeDoublePrecision)
|
||||
{ }
|
||||
|
||||
// callback to eclIO serial writeTimeStep method
|
||||
void run() {
|
||||
eclIO_.writeTimeStep(summaryState_, reportStepNum_, isSubStep_,
|
||||
secondsElapsed_, restartValue_,
|
||||
void run()
|
||||
{
|
||||
eclIO_.writeTimeStep(summaryState_,
|
||||
reportStepNum_,
|
||||
isSubStep_,
|
||||
secondsElapsed_,
|
||||
restartValue_,
|
||||
writeDoublePrecision_);
|
||||
}
|
||||
};
|
||||
|
||||
const Opm::EclipseState &eclState() const {
|
||||
return simulator_.vanguard().eclState();
|
||||
}
|
||||
const Opm::EclipseState& eclState() const
|
||||
{ return simulator_.vanguard().eclState(); }
|
||||
|
||||
Opm::SummaryState &summaryState() {
|
||||
return simulator_.vanguard().summaryState();
|
||||
}
|
||||
Opm::SummaryState& summaryState()
|
||||
{ return simulator_.vanguard().summaryState(); }
|
||||
|
||||
const Opm::Schedule &schedule() const {
|
||||
return simulator_.vanguard().schedule();
|
||||
}
|
||||
const Opm::Schedule& schedule() const
|
||||
{ return simulator_.vanguard().schedule(); }
|
||||
|
||||
Simulator& simulator_;
|
||||
CollectDataToIORankType collectToIORank_;
|
||||
@ -748,6 +733,8 @@ private:
|
||||
Grid globalGrid_;
|
||||
std::unique_ptr<TaskletRunner> taskletRunner_;
|
||||
Scalar restartTimeStepSize_;
|
||||
|
||||
|
||||
};
|
||||
} // namespace Opm
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user