Skip to content
Snippets Groups Projects
Commit 71e25a7d authored by Beatrix Becker's avatar Beatrix Becker Committed by Katharina Heck
Browse files

[test compositionalflash] add tests against sequential routines to determine...

[test compositionalflash] add tests against sequential routines to determine reference state in one- and two-phase state
parent 2b3feca1
No related branches found
No related tags found
1 merge request!1701Feature/test compositionalflash
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <dumux/material/constraintsolvers/compositionalflash.hh> #include <dumux/material/constraintsolvers/compositionalflash.hh>
#include <dumux/material/fluidstates/compositional.hh> #include <dumux/material/fluidstates/compositional.hh>
#include <dumux/material/fluidstates/pseudo1p2c.hh>
#include <dumux/material/fluidsystems/h2on2.hh> #include <dumux/material/fluidsystems/h2on2.hh>
...@@ -43,11 +44,11 @@ ...@@ -43,11 +44,11 @@
#include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh> #include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh>
#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh> #include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh>
template <class Scalar, class FluidState> template <class Scalar, class FluidState1, class FluidState2>
void checkSame(const FluidState &fsRef, const FluidState &fsFlash) void checkSame(const FluidState1 &fsRef, const FluidState2 &fsFlash)
{ {
enum { numPhases = FluidState::numPhases }; enum { numPhases = FluidState1::numPhases };
enum { numComponents = FluidState::numComponents }; enum { numComponents = FluidState1::numComponents };
for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) { for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
Scalar error; Scalar error;
...@@ -108,7 +109,36 @@ void checkCompositionalFlash(const FluidState &fsRef) ...@@ -108,7 +109,36 @@ void checkCompositionalFlash(const FluidState &fsRef)
// call flash for testing // call flash for testing
FluidState fsFlash; FluidState fsFlash;
flash.concentrationFlash2p2c(fsFlash, Z0, phasePressures, 0/*dummy*/, fsRef.temperature(/*phaseIdx=*/0)); flash.concentrationFlash2p2c(fsFlash, Z0, phasePressures, 0/*dummy*/, fsRef.temperature(0));
// compare the "flashed" fluid state with the reference one
checkSame<Scalar>(fsRef, fsFlash);
}
template <class Scalar, class FluidSystem, class MaterialLaw, class FluidState>
void checkCompositionalFlashSequential(const FluidState &fsRef, int refPhaseIdx)
{
enum { numPhases = FluidSystem::numPhases };
enum { numComponents = FluidSystem::numComponents };
using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
// calculate the total mass of the first component related to the total mass
// of fluids (equals phase mass fraction for one-phase state)
Scalar Z0 = fsRef.moleFraction(refPhaseIdx, 0) * FluidSystem::molarMass(0) /
(fsRef.moleFraction(refPhaseIdx, 0) * FluidSystem::molarMass(0) +
(1. - fsRef.moleFraction(refPhaseIdx, 0)) * FluidSystem::molarMass(1));
PhaseVector phasePressures;
for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
phasePressures[phaseIdx] += fsRef.pressure(phaseIdx);
}
// make a new flash
Dumux::CompositionalFlash<Scalar, FluidSystem> flash;
// call flash for testing
Dumux::CompositionalFluidState<Scalar, FluidSystem> fsFlash;
flash.concentrationFlash2p2c(fsFlash, Z0, phasePressures, 0/*dummy*/, fsRef.temperature(0));
// compare the "flashed" fluid state with the reference one // compare the "flashed" fluid state with the reference one
checkSame<Scalar>(fsRef, fsFlash); checkSame<Scalar>(fsRef, fsFlash);
...@@ -145,12 +175,44 @@ void completeReferenceFluidState(FluidState &fs, ...@@ -145,12 +175,44 @@ void completeReferenceFluidState(FluidState &fs,
refPhaseIdx); refPhaseIdx);
} }
template <class Scalar, class FluidSystem, class MaterialLaw, class FluidState>
void completeReferenceFluidStateSequential(FluidState &fs,
typename MaterialLaw::Params &matParams,
int refPhaseIdx)
{
enum { numPhases = FluidSystem::numPhases };
using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
int otherPhaseIdx = 1 - refPhaseIdx;
// calculate the total mass of the first component related to the total mass
// of fluids (equals phase mass fraction for one-phase state)
Scalar Z0 = fs.moleFraction(refPhaseIdx, 0) * FluidSystem::molarMass(0) /
(fs.moleFraction(refPhaseIdx, 0) * FluidSystem::molarMass(0) +
(1. - fs.moleFraction(refPhaseIdx, 0)) * FluidSystem::molarMass(1));
// calulate the capillary pressure
PhaseVector pc;
MaterialLaw::capillaryPressures(pc, matParams, fs, /*liquidPhaseIdx=*/0);
PhaseVector phasePressures(0.0);
phasePressures[refPhaseIdx] = fs.pressure(refPhaseIdx);
phasePressures[otherPhaseIdx] = fs.pressure(refPhaseIdx)
+ (pc[otherPhaseIdx] - pc[refPhaseIdx]);
// make the fluid state consistent with local thermodynamic
// equilibrium
Dumux::CompositionalFlash<Scalar, FluidSystem>::concentrationFlash1p2c(fs, Z0, phasePressures, refPhaseIdx, fs.temperature(0));
}
int main() int main()
{ {
using Scalar = double; using Scalar = double;
using FluidSystem = Dumux::FluidSystems::H2ON2<Scalar, Dumux::FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/true>>; using FluidSystem = Dumux::FluidSystems::H2ON2<Scalar, Dumux::FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/true>>;
using CompositionalFluidState = Dumux::CompositionalFluidState<Scalar, FluidSystem>; using CompositionalFluidState = Dumux::CompositionalFluidState<Scalar, FluidSystem>;
using FluidState1p2c = Dumux::PseudoOnePTwoCFluidState<Scalar, FluidSystem>;
enum { numPhases = FluidSystem::numPhases }; enum { numPhases = FluidSystem::numPhases };
enum { numComponents = FluidSystem::numComponents }; enum { numComponents = FluidSystem::numComponents };
...@@ -187,27 +249,34 @@ int main() ...@@ -187,27 +249,34 @@ int main()
matParams.setLambda(2.0); matParams.setLambda(2.0);
CompositionalFluidState fsRef; CompositionalFluidState fsRef;
FluidState1p2c fsRefSeq;
// create a fluid state which is consistent // create a fluid state which is consistent
// set the fluid temperatures // set the fluid temperatures
fsRef.setTemperature(T); fsRef.setTemperature(T);
fsRefSeq.setTemperature(T);
//////////////// ////////////////
// only liquid // only liquid
//////////////// ////////////////
std::cout << "testing single-phase liquid\n"; std::cout << "testing single-phase liquid against implicit routines\n";
// set liquid saturation // set liquid saturation
fsRef.setSaturation(liquidPhaseIdx, 1.0); fsRef.setSaturation(liquidPhaseIdx, 1.0);
// set pressure of the liquid phase // set pressure of the liquid phase
fsRef.setPressure(liquidPhaseIdx, 2e5); fsRef.setPressure(liquidPhaseIdx, 2e5);
fsRefSeq.setPressure(liquidPhaseIdx, 2e5);
// set the liquid composition to pure water // set the liquid composition to pure water
fsRef.setMoleFraction(liquidPhaseIdx, N2Idx, 0.0); fsRef.setMoleFraction(liquidPhaseIdx, N2Idx, 0.0);
fsRef.setMoleFraction(liquidPhaseIdx, H2OIdx, 1.0); fsRef.setMoleFraction(liquidPhaseIdx, H2OIdx, 1.0);
fsRefSeq.setMoleFraction(liquidPhaseIdx, N2Idx, 0.0);
fsRefSeq.setMoleFraction(liquidPhaseIdx, H2OIdx, 1.0);
fsRef.setWettingPhase(wPhaseIdx); fsRef.setWettingPhase(wPhaseIdx);
// "complete" the fluid state // "complete" the fluid state
...@@ -216,30 +285,50 @@ int main() ...@@ -216,30 +285,50 @@ int main()
// check the flash calculation // check the flash calculation
checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef); checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef);
std::cout << "testing single-phase liquid for consistency with other sequential routines\n";
// "complete" the fluid state
completeReferenceFluidStateSequential<Scalar, FluidSystem, MPAdapter>(fsRefSeq, matParams, liquidPhaseIdx);
// check the flash calculation
checkCompositionalFlashSequential<Scalar, FluidSystem, MPAdapter>(fsRefSeq, liquidPhaseIdx);
//////////////// ////////////////
// only gas // only gas
//////////////// ////////////////
std::cout << "testing single-phase gas\n"; std::cout << "testing single-phase gas against implicit routines\n";
// set gas saturation // set gas saturation
fsRef.setSaturation(gasPhaseIdx, 1.0); fsRef.setSaturation(gasPhaseIdx, 1.0);
// set pressure of the gas phase // set pressure of the gas phase
fsRef.setPressure(gasPhaseIdx, 1e6); fsRef.setPressure(gasPhaseIdx, 1e6);
fsRefSeq.setPressure(gasPhaseIdx, 1e6);
// set the gas composition to 99.9% nitrogen and 0.1% water // set the gas composition to 99.9% nitrogen and 0.1% water
fsRef.setMoleFraction(gasPhaseIdx, N2Idx, 0.999); fsRef.setMoleFraction(gasPhaseIdx, N2Idx, 0.999);
fsRef.setMoleFraction(gasPhaseIdx, H2OIdx, 0.001); fsRef.setMoleFraction(gasPhaseIdx, H2OIdx, 0.001);
fsRefSeq.setMoleFraction(gasPhaseIdx, N2Idx, 0.999);
fsRefSeq.setMoleFraction(gasPhaseIdx, H2OIdx, 0.001);
// "complete" the fluid state // "complete" the fluid state
completeReferenceFluidState<Scalar, FluidSystem, MPAdapter>(fsRef, matParams, gasPhaseIdx); completeReferenceFluidState<Scalar, FluidSystem, MPAdapter>(fsRef, matParams, gasPhaseIdx);
// check the flash calculation // check the flash calculation
checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef); checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef);
std::cout << "testing single-phase gas for consistency with other sequential routines\n";
// "complete" the fluid state
completeReferenceFluidStateSequential<Scalar, FluidSystem, MPAdapter>(fsRefSeq, matParams, gasPhaseIdx);
// check the flash calculation
checkCompositionalFlashSequential<Scalar, FluidSystem, MPAdapter>(fsRefSeq, gasPhaseIdx);
//////////////// ////////////////
// both phases // both phases
//////////////// ////////////////
std::cout << "testing two-phase\n"; std::cout << "testing two-phase against implicit routines\n";
// set saturations // set saturations
fsRef.setSaturation(liquidPhaseIdx, 0.5); fsRef.setSaturation(liquidPhaseIdx, 0.5);
...@@ -256,9 +345,23 @@ int main() ...@@ -256,9 +345,23 @@ int main()
// check the flash calculation // check the flash calculation
checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef); checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef);
std::cout << "testing two-phase for consistency with other sequential routines\n";
// "complete" the fluid state
using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
PhaseVector pressures(0.0);
pressures[liquidPhaseIdx] = fsRef.pressure(liquidPhaseIdx);
pressures[gasPhaseIdx] = fsRef.pressure(gasPhaseIdx);
Dumux::CompositionalFlash<Scalar, FluidSystem>::saturationFlash2p2c(fsRef, fsRef.saturation(liquidPhaseIdx),
pressures, 0/*dummy*/, fsRef.temperature(0));
// check the flash calculation
checkCompositionalFlash<Scalar, FluidSystem, MPAdapter>(fsRef);
//////////////// ////////////////
// with capillary pressure // with capillary pressure
//////////////// ////////////////
std::cout << "testing two-phase against implicit routines, including capillary pressure\n";
MaterialLawParams matParams2; MaterialLawParams matParams2;
matParams2.setSwr(0.0); matParams2.setSwr(0.0);
...@@ -274,7 +377,6 @@ int main() ...@@ -274,7 +377,6 @@ int main()
fsRef.setPressure(liquidPhaseIdx, 1e6); fsRef.setPressure(liquidPhaseIdx, 1e6);
// calulate the capillary pressure // calulate the capillary pressure
using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
PhaseVector pc; PhaseVector pc;
MPAdapter::capillaryPressures(pc, matParams2, fsRef, /*wPhaseIdx=*/0); MPAdapter::capillaryPressures(pc, matParams2, fsRef, /*wPhaseIdx=*/0);
fsRef.setPressure(gasPhaseIdx, fsRef.setPressure(gasPhaseIdx,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment