PhaseUsage: handle polymer and solvent the same way as energy

This commit is contained in:
Andreas Lauser 2017-12-06 16:12:00 +01:00
parent 4571a8f841
commit 244871829d
2 changed files with 90 additions and 45 deletions

View File

@ -28,16 +28,23 @@ namespace Opm
{ {
public: public:
static const int MaxNumPhases = 3; static const int MaxNumPhases = 3;
// enum ComponentIndex { Water = 0, Oil = 1, Gas = 2 };
enum PhaseIndex { Aqua = 0, Liquid = 1, Vapour = 2, Energy = 3 };
// "Crypto phases" are "phases" (or rather "conservation quantities") in the
// sense that they can be active or not and canonical indices can be translated
// to and from active ones. That said, they are not considered by num_phases or
// MaxNumPhases. The crypto phases which are currently implemented are solvent,
// polymer and energy.
static const int NumCryptoPhases = 3;
// enum ComponentIndex { Water = 0, Oil = 1, Gas = 2 };
enum PhaseIndex { Aqua = 0, Liquid = 1, Vapour = 2, Solvent = 3, Polymer = 4, Energy = 5 };
}; };
struct PhaseUsage : public BlackoilPhases struct PhaseUsage : public BlackoilPhases
{ {
int num_phases; int num_phases;
int phase_used[MaxNumPhases + 1]; int phase_used[MaxNumPhases + NumCryptoPhases];
int phase_pos[MaxNumPhases + 1]; int phase_pos[MaxNumPhases + NumCryptoPhases];
bool has_solvent; bool has_solvent;
bool has_polymer; bool has_polymer;
bool has_energy; bool has_energy;

View File

@ -1,3 +1,4 @@
/* /*
Copyright 2012 SINTEF ICT, Applied Mathematics. Copyright 2012 SINTEF ICT, Applied Mathematics.
@ -36,23 +37,18 @@ namespace Opm
inline PhaseUsage phaseUsageFromDeck(const Opm::EclipseState& eclipseState) inline PhaseUsage phaseUsageFromDeck(const Opm::EclipseState& eclipseState)
{ {
PhaseUsage pu; PhaseUsage pu;
std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases, 0); std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases + BlackoilPhases::NumCryptoPhases, 0);
const auto& phase = eclipseState.runspec().phases(); const auto& phase = eclipseState.runspec().phases();
// Discover phase usage. // Discover phase usage.
if (phase.active(Phase::WATER)) { pu.phase_used[BlackoilPhases::Aqua] = phase.active(Phase::WATER);
pu.phase_used[BlackoilPhases::Aqua] = 1; pu.phase_used[BlackoilPhases::Liquid] = phase.active(Phase::OIL);
} pu.phase_used[BlackoilPhases::Vapour] = phase.active(Phase::GAS);
if (phase.active(Phase::OIL)) {
pu.phase_used[BlackoilPhases::Liquid] = 1;
}
if (phase.active(Phase::GAS)) {
pu.phase_used[BlackoilPhases::Vapour] = 1;
}
pu.num_phases = 0; pu.num_phases = 0;
int numActivePhases = 0; int numActivePhases = 0;
for (int phaseIdx = 0; phaseIdx < BlackoilPhases::MaxNumPhases; ++phaseIdx) { for (int phaseIdx = 0; phaseIdx < BlackoilPhases::MaxNumPhases; ++phaseIdx) {
if (!pu.phase_used[numActivePhases]) { if (!pu.phase_used[phaseIdx]) {
pu.phase_pos[phaseIdx] = -1; pu.phase_pos[phaseIdx] = -1;
} }
else { else {
@ -74,16 +70,32 @@ namespace Opm
} }
// Add solvent info // Add solvent info
pu.has_solvent = false; pu.has_solvent = phase.active(Phase::SOLVENT);
if (phase.active(Phase::SOLVENT)) { if (pu.has_solvent) {
pu.has_solvent = true; // this is quite a hack: even though solvent is not considered as in
// MaxNumPhases and pu.num_phases because this would break a lot of
// assumptions in old code, it is nevertheless an index to be translated
// to. solvent and solvent are even larger hacks because not even this can be
// done for them.
pu.phase_pos[BlackoilPhases::Solvent] = numActivePhases;
++ numActivePhases;
} }
else
pu.phase_pos[BlackoilPhases::Solvent] = -1;
// Add polyme info // Add polymer info
pu.has_polymer = false; pu.has_polymer = phase.active(Phase::POLYMER);
if (phase.active(Phase::POLYMER)) { if (pu.has_polymer) {
pu.has_polymer = true; // this is quite a hack: even though polymer is not considered as in
// MaxNumPhases and pu.num_phases because this would break a lot of
// assumptions in old code, it is nevertheless an index to be translated
// to. polymer and solvent are even larger hacks because not even this can be
// done for them.
pu.phase_pos[BlackoilPhases::Polymer] = numActivePhases;
++ numActivePhases;
} }
else
pu.phase_pos[BlackoilPhases::Polymer] = -1;
// Add energy info // Add energy info
pu.has_energy = phase.active(Phase::ENERGY); pu.has_energy = phase.active(Phase::ENERGY);
@ -96,6 +108,9 @@ namespace Opm
pu.phase_pos[BlackoilPhases::Energy] = numActivePhases; pu.phase_pos[BlackoilPhases::Energy] = numActivePhases;
++ numActivePhases; ++ numActivePhases;
} }
else
pu.phase_pos[BlackoilPhases::Energy] = -1;
return pu; return pu;
} }
@ -104,30 +119,26 @@ namespace Opm
inline PhaseUsage phaseUsageFromDeck(const Opm::Deck& deck) inline PhaseUsage phaseUsageFromDeck(const Opm::Deck& deck)
{ {
PhaseUsage pu; PhaseUsage pu;
std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases, 0); std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases + BlackoilPhases::NumCryptoPhases, 0);
Runspec runspec( deck ); Runspec runspec( deck );
const auto& phase = runspec.phases(); const auto& phase = runspec.phases();
// Discover phase usage. // Discover phase usage.
if (phase.active( Phase::WATER )) { pu.phase_used[BlackoilPhases::Aqua] = phase.active(Phase::WATER);
pu.phase_used[BlackoilPhases::Aqua] = 1; pu.phase_used[BlackoilPhases::Liquid] = phase.active(Phase::OIL);
} pu.phase_used[BlackoilPhases::Vapour] = phase.active(Phase::GAS);
if (phase.active( Phase::OIL )) {
pu.phase_used[BlackoilPhases::Liquid] = 1;
}
if (phase.active( Phase::GAS )) {
pu.phase_used[BlackoilPhases::Vapour] = 1;
}
pu.num_phases = 0; pu.num_phases = 0;
for (int i = 0; i < BlackoilPhases::MaxNumPhases; ++i) { int numActivePhases = 0;
if (pu.phase_used[i]) { for (int phaseIdx = 0; phaseIdx < BlackoilPhases::MaxNumPhases; ++phaseIdx) {
pu.phase_pos[i] = pu.num_phases; if (!pu.phase_used[phaseIdx]) {
pu.num_phases += 1; pu.phase_pos[phaseIdx] = -1;
} }
else { else {
//Set to ridiculous value on purpose: should never be used pu.phase_pos[phaseIdx] = numActivePhases;
pu.phase_pos[i] = 2000000000; ++ numActivePhases;
pu.num_phases = numActivePhases;
} }
} }
@ -143,19 +154,46 @@ namespace Opm
} }
// Add solvent info // Add solvent info
pu.has_solvent = false; pu.has_solvent = phase.active(Phase::SOLVENT);
if (phase.active(Phase::SOLVENT)) { if (pu.has_solvent) {
pu.has_solvent = true; // this is quite a hack: even though solvent is not considered as in
// MaxNumPhases and pu.num_phases because this would break a lot of
// assumptions in old code, it is nevertheless an index to be translated
// to. solvent and solvent are even larger hacks because not even this can be
// done for them.
pu.phase_pos[BlackoilPhases::Solvent] = numActivePhases;
++ numActivePhases;
} }
else
pu.phase_pos[BlackoilPhases::Solvent] = -1;
// Add polyme info // Add polymer info
pu.has_polymer = false; pu.has_polymer = phase.active(Phase::POLYMER);
if (phase.active(Phase::POLYMER)) { if (pu.has_polymer) {
pu.has_polymer = true; // this is quite a hack: even though polymer is not considered as in
// MaxNumPhases and pu.num_phases because this would break a lot of
// assumptions in old code, it is nevertheless an index to be translated
// to. polymer and solvent are even larger hacks because not even this can be
// done for them.
pu.phase_pos[BlackoilPhases::Polymer] = numActivePhases;
++ numActivePhases;
} }
else
pu.phase_pos[BlackoilPhases::Polymer] = -1;
// Add energy info // Add energy info
pu.has_energy = phase.active(Phase::ENERGY); pu.has_energy = phase.active(Phase::ENERGY);
if (pu.has_energy) {
// this is quite a hack: even though energy is not considered as in
// MaxNumPhases and pu.num_phases because this would break a lot of
// assumptions in old code, it is nevertheless an index to be translated
// to. polymer and solvent are even larger hacks because not even this can be
// done for them.
pu.phase_pos[BlackoilPhases::Energy] = numActivePhases;
++ numActivePhases;
}
else
pu.phase_pos[BlackoilPhases::Energy] = -1;
return pu; return pu;
} }