From 64e1e4e0972ad36e68b8bb47ee2aa520341c628d Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Tue, 10 Jan 2023 16:01:49 +0000 Subject: [PATCH] solvers::compressibleMultiphaseVoF: New solver module for compressible multiphase VoF simulations executed with foamRun for single region simulations of foamMultiRun for multi-region simulations. Replaces compressibleMultiphaseInterFoam and all the corresponding tutorials have been updated and moved to tutorials/modules/compressibleMultiphaseVoF. compressibleMultiphaseVoF is derived from the multiphaseVoFSolver which adds compressible multiphase capability to the VoFSolver base-class used as the basis of all two-phase and multiphase VoF solvers. Class Foam::solvers::compressibleMultiphaseVoF Description Solver module for the solution of multiple compressible, isothermal immiscible fluids using a VOF (volume of fluid) phase-fraction based interface capturing approach, with optional mesh motion and mesh topology changes including adaptive re-meshing. The momentum and other fluid properties are of the "mixture" and a single momentum equation is solved. A mixture approach for momentum transport is provided in which a single laminar, RAS or LES model is selected to model the momentum stress. Uses the flexible PIMPLE (PISO-SIMPLE) solution for time-resolved and pseudo-transient and steady simulations. SourceFiles compressibleMultiphaseVoF.C See also Foam::solvers::VoFSolver Foam::solvers::multiphaseVoFSolver --- applications/solvers/modules/Allwmake | 1 + .../compressibleMultiphaseVoF/Make/files | 11 + .../compressibleMultiphaseVoF/Make/options | 28 + .../alphaPredictor.C | 277 ++++++++ .../compressibleMultiphaseVoF.C | 160 +++++ .../compressibleMultiphaseVoF.H | 210 ++++++ .../compressibleMultiphaseVoFMixture.C | 188 +++++ .../compressibleMultiphaseVoFMixture.H | 145 ++++ .../compressibleMultiphaseVoFMixtureThermo.C} | 28 +- .../compressibleMultiphaseVoFMixtureThermo.H} | 46 +- .../compressibleVoFphase.C} | 29 +- .../compressibleVoFphase.H} | 62 +- .../momentumPredictor.C | 52 ++ .../pressureCorrector.C | 176 +++++ .../thermophysicalPredictor.C | 64 ++ .../modules/compressibleVoF/Make/files | 1 + .../modules/compressibleVoF/compressibleVoF.C | 11 - .../modules/compressibleVoF/compressibleVoF.H | 10 +- .../compressibleVoF/momentumPredictor.C | 53 ++ .../compressibleVoF/pressureCorrector.C | 13 +- .../compressibleVoF/thermophysicalPredictor.C | 3 +- .../incompressibleMultiphaseVoFMixture.C | 91 +-- .../incompressibleMultiphaseVoFMixture.H | 18 +- .../incompressibleVoFphase.C | 8 - .../incompressibleVoFphase.H | 3 - .../compressibleMultiphaseInterFoam/Allwclean | 7 - .../compressibleMultiphaseInterFoam/Allwmake | 10 - .../Make/files | 3 - .../Make/options | 25 - .../compressibleMultiphaseInterFoam/TEqn.H | 25 - .../compressibleMultiphaseInterFoam/UEqn.H | 32 - .../compressibleMultiphaseInterFoam.C | 122 ---- .../compressibleMultiphaseMixture/Make/files | 5 - .../Make/options | 13 - .../compressibleMultiphaseMixture.C | 648 ------------------ .../compressibleMultiphaseMixture.H | 295 -------- .../compressibleMultiphaseInterFoam/contErr.H | 10 - .../createFields.H | 62 -- .../compressibleMultiphaseInterFoam/pEqn.H | 114 --- bin/compressibleMultiphaseInterFoam | 46 ++ bin/multiphaseInterFoam | 4 +- etc/config.sh/bash_completion | 75 +- .../damBreak4phaseLaminar}/0/T | 0 .../damBreak4phaseLaminar}/0/U | 0 .../damBreak4phaseLaminar}/0/alpha.air.orig | 0 .../0/alpha.mercury.orig | 0 .../damBreak4phaseLaminar}/0/alpha.oil.orig | 0 .../damBreak4phaseLaminar}/0/alpha.water.orig | 0 .../damBreak4phaseLaminar}/0/p | 0 .../damBreak4phaseLaminar}/0/p_rgh | 0 .../damBreak4phaseLaminar}/Allclean | 0 .../damBreak4phaseLaminar}/Allrun | 0 .../damBreak4phaseLaminar}/constant/g | 0 .../constant/momentumTransport | 0 .../constant/phaseProperties | 0 .../constant/physicalProperties.air | 0 .../constant/physicalProperties.mercury | 0 .../constant/physicalProperties.oil | 0 .../constant/physicalProperties.water | 0 .../system/blockMeshDict | 0 .../damBreak4phaseLaminar}/system/controlDict | 4 +- .../system/decomposeParDict | 0 .../damBreak4phaseLaminar}/system/fvSchemes | 0 .../damBreak4phaseLaminar}/system/fvSolution | 0 .../system/setFieldsDict | 0 65 files changed, 1601 insertions(+), 1587 deletions(-) create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/Make/files create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/Make/options create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/alphaPredictor.C create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.C create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.H create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixture.C create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixture.H rename applications/solvers/{multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/phase/phase.C => modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixtureThermo/compressibleMultiphaseVoFMixtureThermo.C} (76%) rename applications/solvers/{multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/phase/phase.H => modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixtureThermo/compressibleMultiphaseVoFMixtureThermo.H} (70%) rename applications/solvers/{multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressiblePhase/compressiblePhase.C => modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleVoFphase/compressibleVoFphase.C} (79%) rename applications/solvers/{multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressiblePhase/compressiblePhase.H => modules/compressibleMultiphaseVoF/compressibleMultiphaseVoFMixture/compressibleVoFphase/compressibleVoFphase.H} (71%) create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/momentumPredictor.C create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/pressureCorrector.C create mode 100644 applications/solvers/modules/compressibleMultiphaseVoF/thermophysicalPredictor.C create mode 100644 applications/solvers/modules/compressibleVoF/momentumPredictor.C delete mode 100755 applications/solvers/multiphase/compressibleMultiphaseInterFoam/Allwclean delete mode 100755 applications/solvers/multiphase/compressibleMultiphaseInterFoam/Allwmake delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/files delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/options delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/TEqn.H delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/UEqn.H delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseInterFoam.C delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/files delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/options delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.C delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.H delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/contErr.H delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/createFields.H delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/pEqn.H create mode 100755 bin/compressibleMultiphaseInterFoam rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/T (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/U (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/alpha.air.orig (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/alpha.mercury.orig (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/alpha.oil.orig (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/alpha.water.orig (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/p (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/0/p_rgh (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/Allclean (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/Allrun (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/g (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/momentumTransport (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/phaseProperties (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/physicalProperties.air (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/physicalProperties.mercury (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/physicalProperties.oil (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/constant/physicalProperties.water (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/blockMeshDict (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/controlDict (94%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/decomposeParDict (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/fvSchemes (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/fvSolution (100%) rename tutorials/{multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase => modules/compressibleMultiphaseVoF/damBreak4phaseLaminar}/system/setFieldsDict (100%) diff --git a/applications/solvers/modules/Allwmake b/applications/solvers/modules/Allwmake index 9b2cb328a7..7d0d8dc874 100755 --- a/applications/solvers/modules/Allwmake +++ b/applications/solvers/modules/Allwmake @@ -16,6 +16,7 @@ incompressibleVoF/Allwmake $targetType $* compressibleVoF/Allwmake $targetType $* wmake $targetType multiphaseVoFSolver wmake $targetType incompressibleMultiphaseVoF +wmake $targetType compressibleMultiphaseVoF multiphaseEuler/Allwmake $targetType $* wmake $targetType solid solidDisplacement/Allwmake $targetType $* diff --git a/applications/solvers/modules/compressibleMultiphaseVoF/Make/files b/applications/solvers/modules/compressibleMultiphaseVoF/Make/files new file mode 100644 index 0000000000..81da7fe42a --- /dev/null +++ b/applications/solvers/modules/compressibleMultiphaseVoF/Make/files @@ -0,0 +1,11 @@ +compressibleMultiphaseVoFMixture/compressibleVoFphase/compressibleVoFphase.C +compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixtureThermo/compressibleMultiphaseVoFMixtureThermo.C +compressibleMultiphaseVoFMixture/compressibleMultiphaseVoFMixture.C + +alphaPredictor.C +momentumPredictor.C +thermophysicalPredictor.C +pressureCorrector.C +compressibleMultiphaseVoF.C + +LIB = $(FOAM_LIBBIN)/libcompressibleMultiphaseVoF diff --git a/applications/solvers/modules/compressibleMultiphaseVoF/Make/options b/applications/solvers/modules/compressibleMultiphaseVoF/Make/options new file mode 100644 index 0000000000..8073e24c1a --- /dev/null +++ b/applications/solvers/modules/compressibleMultiphaseVoF/Make/options @@ -0,0 +1,28 @@ +EXE_INC = \ + -I$(FOAM_SOLVERS)/modules/multiphaseVoFSolver/lnInclude \ + -I$(FOAM_SOLVERS)/modules/VoFSolver/lnInclude \ + -I$(FOAM_SOLVERS)/modules/fluidSolver/lnInclude \ + -I$(LIB_SRC)/physicalProperties/lnInclude \ + -I$(LIB_SRC)/multiphaseModels/multiphaseProperties/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \ + -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \ + -I$(LIB_SRC)/MomentumTransportModels/phaseIncompressible/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude + +LIB_LIBS = \ + -lmultiphaseVoFSolver \ + -lphysicalProperties \ + -lmultiphaseProperties \ + -lfluidThermophysicalModels \ + -linterfaceCompression \ + -lmomentumTransportModels \ + -lcompressibleMomentumTransportModels \ + -lphaseIncompressibleMomentumTransportModels \ + -lfiniteVolume \ + -lmeshTools \ + -lfvModels \ + -lfvConstraints \ + -lsampling diff --git a/applications/solvers/modules/compressibleMultiphaseVoF/alphaPredictor.C b/applications/solvers/modules/compressibleMultiphaseVoF/alphaPredictor.C new file mode 100644 index 0000000000..b388a8bdd4 --- /dev/null +++ b/applications/solvers/modules/compressibleMultiphaseVoF/alphaPredictor.C @@ -0,0 +1,277 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2023 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "compressibleMultiphaseVoF.H" +#include "subCycle.H" +#include "CMULES.H" +#include "fvcFlux.H" +#include "fvcMeshPhi.H" + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::solvers::compressibleMultiphaseVoF::alphaSolve +( + const dictionary& alphaControls +) +{ + const scalar cAlpha(alphaControls.lookup("cAlpha")); + + const word alphaScheme("div(phi,alpha)"); + const word alpharScheme("div(phirb,alpha)"); + + surfaceScalarField phic(mag(phi/mesh.magSf())); + phic = min(cAlpha*phic, max(phic)); + + UPtrList alphas(phases.size()); + PtrList alphaPhis(phases.size()); + + forAll(phases, phasei) + { + const compressibleVoFphase& alpha = phases[phasei]; + + alphas.set(phasei, &alpha); + + alphaPhis.set + ( + phasei, + new surfaceScalarField + ( + "phi" + alpha.name() + "Corr", + fvc::flux + ( + phi, + alpha, + alphaScheme + ) + ) + ); + + surfaceScalarField& alphaPhi = alphaPhis[phasei]; + + forAll(phases, phasej) + { + compressibleVoFphase& alpha2 = phases[phasej]; + + if (&alpha2 == &alpha) continue; + + surfaceScalarField phir(phic*mixture.nHatf(alpha, alpha2)); + + alphaPhi += fvc::flux + ( + -fvc::flux(-phir, alpha2, alpharScheme), + alpha, + alpharScheme + ); + } + + // Limit alphaPhi for each phase + MULES::limit + ( + 1.0/mesh.time().deltaT().value(), + geometricOneField(), + alpha, + phi, + alphaPhi, + zeroField(), + zeroField(), + oneField(), + zeroField(), + false + ); + } + + MULES::limitSum(alphas, alphaPhis, phi); + + rhoPhi = Zero; + + volScalarField sumAlpha + ( + IOobject + ( + "sumAlpha", + mesh.time().name(), + mesh + ), + mesh, + dimensionedScalar(dimless, 0) + ); + + const volScalarField divU(fvc::div(fvc::absolute(phi, U))); + + forAll(phases, phasei) + { + compressibleVoFphase& alpha = phases[phasei]; + + surfaceScalarField& alphaPhi = alphaPhis[phasei]; + + volScalarField::Internal Sp + ( + IOobject + ( + "Sp", + mesh.time().name(), + mesh + ), + mesh, + dimensionedScalar(alpha.dgdt().dimensions(), 0) + ); + + volScalarField::Internal Su + ( + IOobject + ( + "Su", + mesh.time().name(), + mesh + ), + // Divergence term is handled explicitly to be + // consistent with the explicit transport solution + divU.v()*min(alpha.v(), scalar(1)) + ); + + { + const scalarField& dgdt = alpha.dgdt(); + + forAll(dgdt, celli) + { + if (dgdt[celli] < 0.0 && alpha[celli] > 0.0) + { + Sp[celli] += dgdt[celli]*alpha[celli]; + Su[celli] -= dgdt[celli]*alpha[celli]; + } + else if (dgdt[celli] > 0.0 && alpha[celli] < 1.0) + { + Sp[celli] -= dgdt[celli]*(1.0 - alpha[celli]); + } + } + } + + + forAll(phases, phasej) + { + const compressibleVoFphase& alpha2 = phases[phasej]; + + if (&alpha2 == &alpha) continue; + + const scalarField& dgdt2 = alpha2.dgdt(); + + forAll(dgdt2, celli) + { + if (dgdt2[celli] > 0.0 && alpha2[celli] < 1.0) + { + Sp[celli] -= dgdt2[celli]*(1.0 - alpha2[celli]); + Su[celli] += dgdt2[celli]*alpha[celli]; + } + else if (dgdt2[celli] < 0.0 && alpha2[celli] > 0.0) + { + Sp[celli] += dgdt2[celli]*alpha2[celli]; + } + } + } + + MULES::explicitSolve + ( + geometricOneField(), + alpha, + alphaPhi, + Sp, + Su + ); + + rhoPhi += fvc::interpolate(alpha.thermo().rho())*alphaPhi; + + Info<< alpha.name() << " volume fraction, min, max = " + << alpha.weightedAverage(mesh.V()).value() + << ' ' << min(alpha).value() + << ' ' << max(alpha).value() + << endl; + + sumAlpha += alpha; + } + + // Correct the sum of the phase-fractions to avoid 'drift' + const volScalarField sumCorr(1.0 - sumAlpha); + forAll(phases, phasei) + { + compressibleVoFphase& alpha = phases[phasei]; + alpha += alpha*sumCorr; + } +} + + +void Foam::solvers::compressibleMultiphaseVoF::alphaPredictor() +{ + const dictionary& alphaControls = mesh.solution().solverDict("alpha"); + + const label nAlphaSubCycles(alphaControls.lookup