Merge pull request #1111 from blattms/make-updateState-work-for-non-interior-elements

Make update state  and getConvergence work for non interior elements
This commit is contained in:
Atgeirr Flø Rasmussen 2017-04-04 10:47:39 +02:00 committed by GitHub
commit 1232a7a021

View File

@ -583,9 +583,18 @@ namespace Opm {
{ {
using namespace Opm::AutoDiffGrid; using namespace Opm::AutoDiffGrid;
const int np = fluid_.numPhases(); const int np = fluid_.numPhases();
const int nc = numCells(grid_);
for (int cell_idx = 0; cell_idx < nc; ++cell_idx) { ElementContext elemCtx( ebosSimulator_ );
const auto& gridView = ebosSimulator_.gridView();
const auto& elemEndIt = gridView.template end</*codim=*/0>();
for (auto elemIt = gridView.template begin</*codim=*/0>();
elemIt != elemEndIt;
++elemIt)
{
const auto& elem = *elemIt;
elemCtx.updatePrimaryStencil(elem);
elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0);
const unsigned cell_idx = elemCtx.globalSpaceIndex(/*spaceIdx=*/0, /*timeIdx=*/0);
const double& dp = dx[cell_idx][flowPhaseToEbosCompIdx(0)]; const double& dp = dx[cell_idx][flowPhaseToEbosCompIdx(0)];
//reservoir_state.pressure()[cell_idx] -= dp; //reservoir_state.pressure()[cell_idx] -= dp;
double& p = reservoir_state.pressure()[cell_idx]; double& p = reservoir_state.pressure()[cell_idx];
@ -667,7 +676,7 @@ namespace Opm {
// phase translation sg <-> rs // phase translation sg <-> rs
const HydroCarbonState hydroCarbonState = reservoir_state.hydroCarbonState()[cell_idx]; const HydroCarbonState hydroCarbonState = reservoir_state.hydroCarbonState()[cell_idx];
const auto& intQuants = *(ebosSimulator_.model().cachedIntensiveQuantities(cell_idx, /*timeIdx=*/0)); const auto& intQuants = elemCtx.intensiveQuantities(/*spaceIdx=*/0, /*timeIdx=*/0);
const auto& fs = intQuants.fluidState(); const auto& fs = intQuants.fluidState();
switch (hydroCarbonState) { switch (hydroCarbonState) {
case HydroCarbonState::GasAndOil: { case HydroCarbonState::GasAndOil: {
@ -874,6 +883,21 @@ namespace Opm {
const auto& ebosResid = ebosSimulator_.model().linearizer().residual(); const auto& ebosResid = ebosSimulator_.model().linearizer().residual();
ElementContext elemCtx(ebosSimulator_);
const auto& gridView = ebosSimulator().gridView();
const auto& elemEndIt = gridView.template end</*codim=*/0>();
for (auto elemIt = gridView.template begin</*codim=*/0>();
elemIt != elemEndIt;
++elemIt)
{
const auto& elem = *elemIt;
elemCtx.updatePrimaryStencil(elem);
elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0);
const unsigned cell_idx = elemCtx.globalSpaceIndex(/*spaceIdx=*/0, /*timeIdx=*/0);
const auto& intQuants = elemCtx.intensiveQuantities(/*spaceIdx=*/0, /*timeIdx=*/0);
const auto& fs = intQuants.fluidState();
for ( int idx = 0; idx < np; ++idx ) for ( int idx = 0; idx < np; ++idx )
{ {
Vector& R2_idx = R2[ idx ]; Vector& R2_idx = R2[ idx ];
@ -881,11 +905,7 @@ namespace Opm {
const int ebosPhaseIdx = flowPhaseToEbosPhaseIdx(idx); const int ebosPhaseIdx = flowPhaseToEbosPhaseIdx(idx);
const int ebosCompIdx = flowPhaseToEbosCompIdx(idx); const int ebosCompIdx = flowPhaseToEbosCompIdx(idx);
for (int cell_idx = 0; cell_idx < nc; ++cell_idx) { B_idx [cell_idx] = 1.0 / fs.invB(ebosPhaseIdx).value();
const auto& intQuants = *(ebosSimulator_.model().cachedIntensiveQuantities(cell_idx, /*timeIdx=*/0));
const auto& fs = intQuants.fluidState();
B_idx [cell_idx] = 1 / fs.invB(ebosPhaseIdx).value();
R2_idx[cell_idx] = ebosResid[cell_idx][ebosCompIdx]; R2_idx[cell_idx] = ebosResid[cell_idx][ebosCompIdx];
} }
} }
@ -1012,7 +1032,7 @@ namespace Opm {
computeFluidInPlace(const std::vector<int>& fipnum) const computeFluidInPlace(const std::vector<int>& fipnum) const
{ {
const auto& comm = grid_.comm(); const auto& comm = grid_.comm();
const auto& gridView = grid_.leafGridView(); const auto& gridView = ebosSimulator().gridView();
const int nc = gridView.size(/*codim=*/0); const int nc = gridView.size(/*codim=*/0);
const int maxnp = Opm::BlackoilPhases::MaxNumPhases; const int maxnp = Opm::BlackoilPhases::MaxNumPhases;
int ntFip = *std::max_element(fipnum.begin(), fipnum.end()); int ntFip = *std::max_element(fipnum.begin(), fipnum.end());
@ -1028,17 +1048,12 @@ namespace Opm {
} }
ElementContext elemCtx(ebosSimulator_); ElementContext elemCtx(ebosSimulator_);
const auto& elemEndIt = gridView.template end</*codim=*/0>(); const auto& elemEndIt = gridView.template end</*codim=*/0, Dune::Interior_Partition>();
for (auto elemIt = gridView.template begin</*codim=*/0>(); for (auto elemIt = gridView.template begin</*codim=*/0, Dune::Interior_Partition>();
elemIt != elemEndIt; elemIt != elemEndIt;
++elemIt) ++elemIt)
{ {
const auto& elem = *elemIt; elemCtx.updatePrimaryStencil(*elemIt);
if (elem.partitionType() != Dune::InteriorEntity) {
continue;
}
elemCtx.updatePrimaryStencil(elem);
elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0); elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0);
const unsigned cellIdx = elemCtx.globalSpaceIndex(/*spaceIdx=*/0, /*timeIdx=*/0); const unsigned cellIdx = elemCtx.globalSpaceIndex(/*spaceIdx=*/0, /*timeIdx=*/0);
@ -1093,14 +1108,11 @@ namespace Opm {
comm.sum(tpv.data(), tpv.size()); comm.sum(tpv.data(), tpv.size());
comm.sum(hcpv.data(), hcpv.size()); comm.sum(hcpv.data(), hcpv.size());
for (auto elemIt = gridView.template begin</*codim=*/0>(); for (auto elemIt = gridView.template begin</*codim=*/0, Dune::Interior_Partition>();
elemIt != elemEndIt; elemIt != elemEndIt;
++elemIt) ++elemIt)
{ {
const auto& elem = *elemIt; const auto& elem = *elemIt;
if (elem.partitionType() != Dune::InteriorEntity) {
continue;
}
elemCtx.updatePrimaryStencil(elem); elemCtx.updatePrimaryStencil(elem);
elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0); elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0);
@ -1235,15 +1247,12 @@ namespace Opm {
std::vector<int> failed_cells_pb; std::vector<int> failed_cells_pb;
std::vector<int> failed_cells_pd; std::vector<int> failed_cells_pd;
const auto& gridView = ebosSimulator().gridView(); const auto& gridView = ebosSimulator().gridView();
auto elemIt = gridView.template begin</*codim=*/ 0>(); auto elemIt = gridView.template begin</*codim=*/ 0, Dune::Interior_Partition>();
const auto& elemEndIt = gridView.template end</*codim=*/ 0>(); const auto& elemEndIt = gridView.template end</*codim=*/ 0, Dune::Interior_Partition>();
ElementContext elemCtx(ebosSimulator()); ElementContext elemCtx(ebosSimulator());
for (; elemIt != elemEndIt; ++elemIt) { for (; elemIt != elemEndIt; ++elemIt) {
const auto& elem = *elemIt; const auto& elem = *elemIt;
if (elem.partitionType() != Dune::InteriorEntity) {
continue;
}
elemCtx.updatePrimaryStencil(elem); elemCtx.updatePrimaryStencil(elem);
elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0); elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0);