Bernd,
Thank you. I will check with my managers regarding what I can do about
publishing the code. The completeFluidState in my code is not a branch,
but a method in a dedicated VolumeVariables variant which is assigned to
the Problem via TypeTag. One "potential complication" that I can see is
that the code in its present form is not going to be accepted into DuMux
source because it does not comply with DuMux's C++ guidelines (that
happened before with my merge requests). So either I will have to
re-write it, or someone else will, or it will stay as an
example/prototype outside DuMux source tree.
To elaborate on my statement about complications with 2pnc PVS model:
imagine that at one moment, you have a two-phase configuration:
pressure, saturation, (n-2) mole fractions in one of the phases
and then you run the Newton method, and then the Newton method orders to
increase the pressure, leaving other variables intact:
pressure + delta, saturation, (n-2) mole fractions in one of the phases
It can happen that with the increased pressure, the two-phase
configuration is to become one-phase. It is very hard, if possible, to
figure that basing just on (n-2) mole fractions and the saturation. The
saturation without the (original, two-phase-compatible) pressure is
meaningless. And the old value or pressure is "lost" at this point. How
to even guess the total mole fractions in this situation? I do not know.
I imagine that a very intricate relay between the Newton method and
PrimaryVariableSwitch could, in principle, allow to slowly approach the
phase transition point and then change the primary variables... but
there is no need to do that in presence of "classic" flash that works so
well and converges so well. (I also have to say that figuring out the
fluid state from the "pressure, saturation, n-2 mole fractions" is a big
convergence pain).
Best regards,
Dmitry
On 3/18/22 09:57, Flemisch, Bernd wrote:
Hi Dmitry,
thank you for your report, this is very valuable!
It would be even more valuable and highly appreciated if you decide to
add your model to DuMux. As far as I can see, this would in essence
add the Michelsen test and your flash calculation. And the
completeFluidState method would branch depending on whether the
traditional "PVS" or the new "flash" model is used. Right? Or do you
see potential complications?
I consider your statement
"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"
very bold. The 2pnc PVS model is standard which has been used
successfully not only in DuMux to simulate two-phase compositional
flow for many years.
Nevertheless, I certainly acknowledge the fact that a flash-based
model might be superior for particular applications. With the drawback
on computational performance due to the more expensive flash
calculations for one Newton step.
In total, I would heartily encourage you to contribute your model!
Kind regards
Bernd
--
_________________________________________________________________
Bernd Flemisch
IWS, Universität Stuttgart phone: +49 711 685 69162
Pfaffenwaldring 61 email: be...@iws.uni-stuttgart.de
D-70569 Stuttgart url: www.iws.uni-stuttgart.de/en/lh2/
<http://www.iws.uni-stuttgart.de/en/lh2/>
_________________________________________________________________
------------------------------------------------------------------------
*Von:* DuMux <dumux-boun...@listserv.uni-stuttgart.de> im Auftrag von
Dmitry Pavlov <dmitry.pav...@outlook.com>
*Gesendet:* Donnerstag, 17. März 2022 23:20:09
*An:* dumux@listserv.uni-stuttgart.de
*Betreff:* [DuMux] Oil-gas compositional simulation in DuMux
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].
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