Hello,
This is for anybody who will be wondering someday whether the two-phase
oil-gas compositional model is doable in DuMux. The short answer is yes.
The numerical algorithms required for such a model are described in many
sources (e.g. [1]) and implemented in ECLIPSE and a lot of other
programs, including the open-source MRST [2].
Now, what is required for implementing the two-phase compositional model
in DuMux:
1. The primary variables. Those must be the pressure and n-1 (overall)
mole fractions. I do not think that it is possible at all to implement a
two-phase compositional model with the usual primary variables of the
2pnc model [3] (pressure, saturation, n-2 mole fractions). But the good
news is that DuMux, for the most part, does not care about what is
stored in the primary variables. So it is possible to just treat 2pnc's
primary variables as the pressure and n-1 (overall) mole fractions. The
only thing that must be redesigned for that to work is VolumeVariables
and, in particular, completeFluidState() method that builds the
FluidState from the primary variables.
2. In order to build the FluidState from the primary variables, one
needs two algorithms: the Michelsen stability test (it decides whether
we have one-phase or two-phase composition with this pressure and
temperature) and the two-phase flash algorithm (it calculates the mole
fractions for each phase from overall mole fractions). Those algorithms
are not present in DuMux. DuMux has constraint solvers called
MiscibleMultiPhaseComposition and NcpFlash, but they will not work for
this kind of problem. Only the "classic" flash algorithm works. One has
to implement the Michelsen test and flash in the aforementioned
completeFluidState() replacement. These algorithms, in turn, require an
implementation of equation of state (EOS), usually Peng-Robinson (PR).
3. Good news: DuMux has a completely suitable implementation PR EOS! One
pitfall is that the default behavior of PR in DuMux is "too correct" in
its handling of single-root case, which causes Michelsen test to fail. A
flag "handleUnphysicalPhase" was added to computeMolarVolume() method to
allow to simplify the calculation and make it suitable for Michelsen test.
4. Switching of primary variables. Actually, no, this one is not needed
at all. The built-in TwoPNCPrimaryVariableSwitch is not suitable for
this problem; it is possible to implement a custom PrimaryVariableSwitch
which would be based of the Michelsen test, but it creates more problems
than it solves. To be specific, it reduces performance and worsens
Newton convergence and gives nothing in return. Phase presence in
FluidState is updated in completeFluidState() and it is fine.
One must be cautious about the performance because DuMux tends to call
the computationally expensive completeFluidState() more often than it is
needed to do the job [5]. At least EnableGridVolumeVariablesCache and
EnableGridFluxVariablesCache should be turned on to avoid unnecessary
recalculations. Also, PrimaryVariableSwitch should be disabled, as said
above. Finally, if the box method is used, DuMux calls
completeFluidState() on every scv connected to every node, which on a 2D
grid is 4x the number of nodes, while in principle, it is possible to
complete the task by making 1x the number of nodes calls. Maybe a
rewrite of GridVolumeVariables will help to achieve that. For now,
oil-gas simulation in DuMux is inferior to MRST in performance. While
MRST works on a much slower engine (Matlab), it does not waste time on
4x recalculations, and also uses automatic differentiation, while DuMux
uses slow numerical differentiation. One the other hand, DuMux, unlike
MRST, can be parallelized via both MPI and threads [6].
This is it, thank you for attention.
Regards,
Dmitry
[1] https://store.spe.org/Phase-Behavior-P46.aspx
[2]
https://www.sintef.no/contentassets/2551f5f85547478590ceca14bc13ad51/compositional.html
[3] https://dumux.org/docs/doxygen/master/a18414.html
[4]
https://git.iws.uni-stuttgart.de/dumux-repositories/dumux/-/merge_requests/2831
[5] https://listserv.uni-stuttgart.de/pipermail/dumux/2021q4/002811.html
[6]
https://git.iws.uni-stuttgart.de/dumux-repositories/dumux/-/merge_requests/2640
_______________________________________________
DuMux mailing list
DuMux@listserv.uni-stuttgart.de
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux