diff --git a/applications/solvers/lagrangian/denseParticleFoam/CourantNo.H b/applications/solvers/lagrangian/denseParticleFoam/CourantNo.H
deleted file mode 100644
index 63c2e2bb63..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/CourantNo.H
+++ /dev/null
@@ -1,46 +0,0 @@
-/*---------------------------------------------------------------------------*\
- ========= |
- \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
- \\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2013-2022 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 .
-
-Global
- CourantNo
-
-Description
- Calculates and outputs the mean and maximum Courant Numbers.
-
-\*---------------------------------------------------------------------------*/
-
-scalar CoNum = 0;
-
-{
- const scalarField sumPhi(fvc::surfaceSum(mag(phic))().primitiveField());
-
- CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
-
- const scalar meanCoNum =
- 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
-
- Info<< "Courant Number mean: " << meanCoNum
- << " max: " << CoNum << endl;
-}
-
-// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/Make/files b/applications/solvers/lagrangian/denseParticleFoam/Make/files
deleted file mode 100644
index 2bd83594aa..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/Make/files
+++ /dev/null
@@ -1,3 +0,0 @@
-denseParticleFoam.C
-
-EXE = $(FOAM_APPBIN)/denseParticleFoam
diff --git a/applications/solvers/lagrangian/denseParticleFoam/UcEqn.H b/applications/solvers/lagrangian/denseParticleFoam/UcEqn.H
deleted file mode 100644
index d1bdcfe0c1..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/UcEqn.H
+++ /dev/null
@@ -1,28 +0,0 @@
-fvVectorMatrix UcEqn
-(
- fvm::ddt(alphac, Uc) + fvm::div(alphaPhic, Uc)
- - fvm::Sp(fvc::ddt(alphac) + fvc::div(alphaPhic), Uc)
- + continuousPhaseTurbulence->divDevTau(Uc)
-);
-
-UcEqn.relax();
-
-fvConstraints.constrain(UcEqn);
-
-if (pimple.momentumPredictor())
-{
- solve
- (
- UcEqn
- ==
- fvc::reconstruct
- (
- Fgf - fvc::snGrad(p)*mesh.magSf()
- - Dcf*(phic - phid)
- )
- + Dc*fvc::reconstruct(phic - phid)
- + Fd - fvm::Sp(Dc, Uc)
- );
-
- fvConstraints.constrain(Uc);
-}
diff --git a/applications/solvers/lagrangian/denseParticleFoam/continuityErrs.H b/applications/solvers/lagrangian/denseParticleFoam/continuityErrs.H
deleted file mode 100644
index 792b8a6aad..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/continuityErrs.H
+++ /dev/null
@@ -1,48 +0,0 @@
-/*---------------------------------------------------------------------------*\
- ========= |
- \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
- \\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2013-2020 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 .
-
-Global
- continuityErrs
-
-Description
- Calculates and prints the continuity errors.
-
-\*---------------------------------------------------------------------------*/
-
-{
- volScalarField contErr(fvc::ddt(alphac) + fvc::div(alphacf*phic));
-
- scalar sumLocalContErr = runTime.deltaTValue()*
- mag(contErr)().weightedAverage(mesh.V()).value();
-
- scalar globalContErr = runTime.deltaTValue()*
- contErr.weightedAverage(mesh.V()).value();
- cumulativeContErr += globalContErr;
-
- Info<< "time step continuity errors : sum local = " << sumLocalContErr
- << ", global = " << globalContErr
- << ", cumulative = " << cumulativeContErr
- << endl;
-}
-
-// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/correctPhic.H b/applications/solvers/lagrangian/denseParticleFoam/correctPhic.H
deleted file mode 100644
index bdbed32ae8..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/correctPhic.H
+++ /dev/null
@@ -1,20 +0,0 @@
-// Calculate absolute flux from the mapped surface velocity
-phic = mesh.Sf() & Ucf();
-
-correctUphiBCs(Uc, phic, true);
-
-fv::correctPhi
-(
- phic,
- Uc,
- p,
- autoPtr(),
- autoPtr(),
- pressureReference,
- pimple
-);
-
-#include "continuityErrs.H"
-
-// Make the flux relative to the mesh motion
-fvc::makeRelative(phic, Uc);
diff --git a/applications/solvers/lagrangian/denseParticleFoam/createFields.H b/applications/solvers/lagrangian/denseParticleFoam/createFields.H
deleted file mode 100644
index 71bfb562fd..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/createFields.H
+++ /dev/null
@@ -1,162 +0,0 @@
-#include "readGravitationalAcceleration.H"
-
-word continuousPhaseName
-(
- IOdictionary
- (
- IOobject
- (
- "physicalProperties",
- runTime.constant(),
- mesh,
- IOobject::MUST_READ
- )
- ).lookup("continuousPhaseName")
-);
-
-Info<< "Reading field U\n" << endl;
-volVectorField Uc
-(
- IOobject
- (
- IOobject::groupName("U", continuousPhaseName),
- runTime.name(),
- mesh,
- IOobject::MUST_READ,
- IOobject::AUTO_WRITE
- ),
- mesh
-);
-
-Info<< "Reading field p\n" << endl;
-volScalarField p
-(
- IOobject
- (
- "p",
- runTime.name(),
- mesh,
- IOobject::MUST_READ,
- IOobject::AUTO_WRITE
- ),
- mesh
-);
-
-
-Info<< "Reading/calculating continuous-phase face flux field phic\n"
- << endl;
-
-surfaceScalarField phic
-(
- IOobject
- (
- IOobject::groupName("phi", continuousPhaseName),
- runTime.name(),
- mesh,
- IOobject::READ_IF_PRESENT,
- IOobject::AUTO_WRITE
- ),
- linearInterpolate(Uc) & mesh.Sf()
-);
-
-pressureReference pressureReference(p, pimple.dict());
-
-mesh.schemes().setFluxRequired(p.name());
-
-Info<< "Creating turbulence model\n" << endl;
-
-autoPtr continuousPhaseViscosity(viscosityModel::New(mesh));
-
-dimensionedScalar rhocValue
-(
- IOobject::groupName("rho", continuousPhaseName),
- dimDensity,
- continuousPhaseViscosity->lookup
- (
- IOobject::groupName("rho", continuousPhaseName)
- )
-);
-
-volScalarField rhoc
-(
- IOobject
- (
- rhocValue.name(),
- runTime.name(),
- mesh,
- IOobject::NO_READ,
- IOobject::AUTO_WRITE
- ),
- mesh,
- rhocValue
-);
-
-volScalarField muc
-(
- IOobject
- (
- IOobject::groupName("mu", continuousPhaseName),
- runTime.name(),
- mesh,
- IOobject::NO_READ,
- IOobject::AUTO_WRITE
- ),
- rhoc*continuousPhaseViscosity->nu()
-);
-
-Info << "Creating field alphac\n" << endl;
-// alphac must be constructed before the cloud
-// so that the drag-models can find it
-volScalarField alphac
-(
- IOobject
- (
- IOobject::groupName("alpha", continuousPhaseName),
- runTime.name(),
- mesh,
- IOobject::READ_IF_PRESENT,
- IOobject::AUTO_WRITE
- ),
- mesh,
- dimensionedScalar(dimless, 0)
-);
-
-Info<< "Constructing clouds" << endl;
-parcelClouds& clouds = parcelClouds::New(mesh, rhoc, Uc, muc, g);
-
-// Particle fraction upper limit
-scalar alphacMin
-(
- 1 - mesh.solution().solverDict(alphac.name()).lookup("max")
-);
-
-// Update alphac from the particle locations
-alphac = max(1.0 - clouds.theta(), alphacMin);
-alphac.correctBoundaryConditions();
-
-surfaceScalarField alphacf("alphacf", fvc::interpolate(alphac));
-
-surfaceScalarField alphaPhic
-(
- IOobject::groupName
- (
- "alphaPhi",
- continuousPhaseName
- ),
- alphacf*phic
-);
-
-autoPtr continuousPhaseTurbulence
-(
- phaseIncompressible::momentumTransportModel::New
- (
- alphac,
- Uc,
- alphaPhic,
- phic,
- continuousPhaseViscosity
- )
-);
-
-#include "createFvModels.H"
-#include "createFvConstraints.H"
diff --git a/applications/solvers/lagrangian/denseParticleFoam/denseParticleFoam.C b/applications/solvers/lagrangian/denseParticleFoam/denseParticleFoam.C
deleted file mode 100644
index 1e7d6dec4f..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/denseParticleFoam.C
+++ /dev/null
@@ -1,208 +0,0 @@
-/*---------------------------------------------------------------------------*\
- ========= |
- \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
- \\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2013-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 .
-
-Application
- denseParticleFoam
-
-Description
- Transient solver for the coupled transport of particle clouds including the
- effect of the volume fraction of particles on the continuous phase, with
- optional mesh motion and mesh topology changes.
-
-\*---------------------------------------------------------------------------*/
-
-#include "argList.H"
-#include "timeSelector.H"
-#include "viscosityModel.H"
-#include "phaseIncompressibleMomentumTransportModel.H"
-#include "pimpleControl.H"
-#include "pressureReference.H"
-#include "findRefCell.H"
-#include "constrainPressure.H"
-#include "constrainHbyA.H"
-#include "adjustPhi.H"
-#include "uniformDimensionedFields.H"
-#include "zeroGradientFvPatchFields.H"
-#include "fvModels.H"
-#include "fvConstraints.H"
-
-#include "fvcDdt.H"
-#include "fvcGrad.H"
-#include "fvcSnGrad.H"
-#include "fvcFlux.H"
-#include "fvcMeshPhi.H"
-#include "fvCorrectPhi.H"
-#include "fvcReconstruct.H"
-
-#include "fvmDdt.H"
-#include "fvmDiv.H"
-#include "fvmLaplacian.H"
-
-#include "parcelClouds.H"
-
-using namespace Foam;
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-int main(int argc, char *argv[])
-{
- #include "postProcess.H"
-
- #include "setRootCaseLists.H"
- #include "createTime.H"
- #include "createMesh.H"
- #include "createDyMControls.H"
- #include "createFields.H"
- #include "createUcfIfPresent.H"
- #include "initContinuityErrs.H"
-
- Info<< "\nStarting time loop\n" << endl;
-
- while (pimple.run(runTime))
- {
- #include "readDyMControls.H"
- #include "CourantNo.H"
- #include "setDeltaT.H"
-
- // Update the mesh for topology change, mesh to mesh mapping
- mesh.update();
-
- runTime++;
-
- Info<< "Time = " << runTime.userTimeName() << nl << endl;
-
- // Store the particle positions
- clouds.storeGlobalPositions();
-
- // Move the mesh
- mesh.move();
-
- if (mesh.changing())
- {
- if (correctPhi)
- {
- #include "correctPhic.H"
- }
-
- if (checkMeshCourantNo)
- {
- #include "meshCourantNo.H"
- }
- }
-
- continuousPhaseViscosity->correct();
- muc = rhoc*continuousPhaseViscosity->nu();
-
- clouds.evolve();
-
- // Update continuous phase volume fraction field
- alphac = max(1.0 - clouds.theta(), alphacMin);
- alphac.correctBoundaryConditions();
- alphacf = fvc::interpolate(alphac);
- alphaPhic = alphacf*phic;
-
- // Dispersed phase drag force
- volVectorField Fd
- (
- IOobject
- (
- "Fd",
- runTime.name(),
- mesh
- ),
- mesh,
- dimensionedVector(dimAcceleration, Zero),
- zeroGradientFvPatchVectorField::typeName
- );
-
- // continuous-dispersed phase drag coefficient
- volScalarField Dc
- (
- IOobject
- (
- "Dc",
- runTime.name(),
- mesh
- ),
- mesh,
- dimensionedScalar(dimless/dimTime, Zero),
- zeroGradientFvPatchVectorField::typeName
- );
-
- {
- const fvVectorMatrix cloudSU(clouds.SU(Uc));
-
- // Dispersed phase drag force
- Fd.primitiveFieldRef() = -cloudSU.source()/mesh.V()/rhoc;
- Fd.correctBoundaryConditions();
-
- // Continuous phase drag coefficient
- Dc.primitiveFieldRef() = -cloudSU.diag()/mesh.V()/rhoc;
- Dc.correctBoundaryConditions();
- }
-
- // Face continuous-dispersed phase drag coefficient
- const surfaceScalarField Dcf(fvc::interpolate(Dc));
-
- // Effective flux of the dispersed phase
- const surfaceScalarField phid
- (
- fvc::flux(Fd)/(Dcf + dimensionedScalar(Dc.dimensions(), small))
- );
-
- // Face buoyancy force
- const surfaceScalarField Fgf(g & mesh.Sf());
-
- // --- Pressure-velocity PIMPLE corrector loop
- while (pimple.loop())
- {
- fvModels.correct();
-
- #include "UcEqn.H"
-
- // --- PISO loop
- while (pimple.correct())
- {
- #include "pEqn.H"
- }
-
- if (pimple.correctTransport())
- {
- continuousPhaseTurbulence->correct();
- }
- }
-
- runTime.write();
-
- Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
- << " ClockTime = " << runTime.elapsedClockTime() << " s"
- << nl << endl;
- }
-
- Info<< "End\n" << endl;
-
- return 0;
-}
-
-
-// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/meshCourantNo.H b/applications/solvers/lagrangian/denseParticleFoam/meshCourantNo.H
deleted file mode 100644
index 9f3dd4df71..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/meshCourantNo.H
+++ /dev/null
@@ -1,50 +0,0 @@
-/*---------------------------------------------------------------------------*\
- ========= |
- \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
- \\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2011-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 .
-
-Global
- meshCourantNo
-
-Description
- Calculates and outputs the mean and maximum Courant Numbers.
-
-\*---------------------------------------------------------------------------*/
-
-scalar meshCoNum = 0.0;
-scalar meanMeshCoNum = 0.0;
-
-{
- scalarField sumPhi
- (
- fvc::surfaceSum(mag(mesh.phi()))().primitiveField()
- );
-
- meshCoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
-
- meanMeshCoNum =
- 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
-}
-
-Info<< "Mesh Courant Number mean: " << meanMeshCoNum
- << " max: " << meshCoNum << endl;
-
-// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/pEqn.H b/applications/solvers/lagrangian/denseParticleFoam/pEqn.H
deleted file mode 100644
index 124bb89a4f..0000000000
--- a/applications/solvers/lagrangian/denseParticleFoam/pEqn.H
+++ /dev/null
@@ -1,89 +0,0 @@
-{
- const volScalarField rAUc(1.0/UcEqn.A());
- const volScalarField r1ADUc(1/(1 + rAUc*Dc));
-
- const surfaceScalarField rAUcf(fvc::interpolate(rAUc));
- const surfaceScalarField r1ADUcf(1/(1 + rAUcf*Dcf));
- const surfaceScalarField rADUcf("Dp", r1ADUcf*rAUcf);
-
- volVectorField HbyA(constrainHbyA(rAUc*UcEqn.H(), Uc, p));
-
- surfaceScalarField phiHbyAD
- (
- "phiHbyAD",
- (
- r1ADUcf
- *(
- fvc::flux(HbyA)
- + alphacf*rAUcf*fvc::ddtCorr(Uc, phic, Ucf)
- )
- )
- );
-
- if (p.needReference())
- {
- fvc::makeRelative(phiHbyAD, Uc);
- adjustPhi(phiHbyAD, Uc, p);
- fvc::makeAbsolute(phiHbyAD, Uc);
- }
-
- phiHbyAD += rADUcf*(Fgf + Dcf*phid);
-
- // Update the pressure BCs to ensure flux consistency
- constrainPressure(p, Uc, phiHbyAD, rADUcf);
-
- // Non-orthogonal pressure corrector loop
- while (pimple.correctNonOrthogonal())
- {
- fvScalarMatrix pEqn
- (
- fvm::laplacian(alphacf*rADUcf, p)
- ==
- fvc::ddt(alphac)
- + fvc::div(alphacf*phiHbyAD)
- );
-
- pEqn.setReference
- (
- pressureReference.refCell(),
- pressureReference.refValue()
- );
-
- pEqn.solve();
-
- if (pimple.finalNonOrthogonalIter())
- {
- phic = phiHbyAD - pEqn.flux()/alphacf;
-
- // Explicitly relax pressure for momentum corrector
- p.relax();
-
- Uc =
- r1ADUc
- *(
- HbyA
- + rAUc
- *(
- fvc::reconstruct
- (
- Fgf - pEqn.flux()/alphacf/rADUcf
- - Dcf*(phic - phid)
- )
- + Dc*fvc::reconstruct(phic - phid)
- + Fd
- )
- );
-
- Uc.correctBoundaryConditions();
- fvConstraints.constrain(Uc);
-
- // Correct Ucf if the mesh is moving
- fvc::correctUf(Ucf, Uc, phic);
-
- // Make the fluxes relative to the mesh motion
- fvc::makeRelative(phic, Uc);
- }
- }
-}
-
-#include "continuityErrs.H"
diff --git a/applications/solvers/modules/Allwmake b/applications/solvers/modules/Allwmake
index c89c938a57..2a0a8d4dc7 100755
--- a/applications/solvers/modules/Allwmake
+++ b/applications/solvers/modules/Allwmake
@@ -21,6 +21,7 @@ wmake $targetType multiphaseVoFSolver
wmake $targetType incompressibleMultiphaseVoF
wmake $targetType compressibleMultiphaseVoF
multiphaseEuler/Allwmake $targetType $*
+wmake $targetType incompressibleDenseParticleFluid
isothermalFilm/Allwmake $targetType $*
film/Allwmake $targetType $*
wmake $targetType solid
diff --git a/applications/solvers/modules/incompressibleDenseParticleFluid/Make/files b/applications/solvers/modules/incompressibleDenseParticleFluid/Make/files
new file mode 100644
index 0000000000..1fda8362bc
--- /dev/null
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/Make/files
@@ -0,0 +1,6 @@
+moveMesh.C
+momentumPredictor.C
+correctPressure.C
+incompressibleDenseParticleFluid.C
+
+LIB = $(FOAM_LIBBIN)/libincompressibleDenseParticleFluid
diff --git a/applications/solvers/lagrangian/denseParticleFoam/Make/options b/applications/solvers/modules/incompressibleDenseParticleFluid/Make/options
similarity index 75%
rename from applications/solvers/lagrangian/denseParticleFoam/Make/options
rename to applications/solvers/modules/incompressibleDenseParticleFluid/Make/options
index f10997c7e6..28f913d41e 100644
--- a/applications/solvers/lagrangian/denseParticleFoam/Make/options
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/Make/options
@@ -1,26 +1,25 @@
EXE_INC = \
- -I$(LIB_SRC)/lagrangian/basic/lnInclude \
- -I$(LIB_SRC)/lagrangian/parcel/lnInclude \
- -I$(LIB_SRC)/physicalProperties/lnInclude \
- -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
- -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
- -I$(LIB_SRC)/thermophysicalModels/multicomponentThermo/lnInclude \
+ -I$(FOAM_SOLVERS)/modules/fluidSolver/lnInclude \
-I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
-I$(LIB_SRC)/MomentumTransportModels/incompressible/lnInclude \
-I$(LIB_SRC)/MomentumTransportModels/phaseIncompressible/lnInclude \
- -I$(LIB_SRC)/surfaceFilmModels/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/lagrangian/basic/lnInclude \
+ -I$(LIB_SRC)/lagrangian/parcel/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
-EXE_LIBS = \
- -llagrangian \
- -llagrangianParcel \
- -llagrangianParcelTurbulence \
- -lphysicalProperties \
+LIB_LIBS = \
+ -lfluidSolver \
-lmomentumTransportModels \
-lincompressibleMomentumTransportModels \
-lphaseIncompressibleMomentumTransportModels \
+ -lphysicalProperties \
+ -llagrangian \
+ -llagrangianParcel \
+ -llagrangianParcelTurbulence \
-lfiniteVolume \
-lfvModels \
-lfvConstraints \
+ -lsampling \
-lmeshTools
diff --git a/applications/solvers/modules/incompressibleDenseParticleFluid/correctPressure.C b/applications/solvers/modules/incompressibleDenseParticleFluid/correctPressure.C
new file mode 100644
index 0000000000..367b87ccea
--- /dev/null
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/correctPressure.C
@@ -0,0 +1,138 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 "incompressibleDenseParticleFluid.H"
+#include "constrainHbyA.H"
+#include "constrainPressure.H"
+#include "adjustPhi.H"
+#include "fvcMeshPhi.H"
+#include "fvcFlux.H"
+#include "fvcDdt.H"
+#include "fvcSnGrad.H"
+#include "fvcReconstruct.H"
+#include "fvmLaplacian.H"
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::solvers::incompressibleDenseParticleFluid::correctPressure()
+{
+ volScalarField& p(p_);
+ volVectorField& Uc(Uc_);
+ surfaceScalarField& phic(phic_);
+
+ fvVectorMatrix& UcEqn = tUcEqn.ref();
+
+ const volScalarField rAUc(1.0/UcEqn.A());
+ const volScalarField r1ADUc(1/(1 + rAUc*Dc()));
+
+ const surfaceScalarField rAUcf(fvc::interpolate(rAUc));
+ const surfaceScalarField r1ADUcf(1/(1 + rAUcf*Dcf()));
+ const surfaceScalarField rADUcf("Dp", r1ADUcf*rAUcf);
+
+ volVectorField HbyA(constrainHbyA(rAUc*UcEqn.H(), Uc, p));
+
+ surfaceScalarField phiHbyAD
+ (
+ "phiHbyAD",
+ (
+ r1ADUcf
+ *(
+ fvc::flux(HbyA)
+ + alphacf*rAUcf*fvc::ddtCorr(Uc, phic, Ucf)
+ )
+ )
+ );
+
+ if (p.needReference())
+ {
+ fvc::makeRelative(phiHbyAD, Uc);
+ adjustPhi(phiHbyAD, Uc, p);
+ fvc::makeAbsolute(phiHbyAD, Uc);
+ }
+
+ // Face buoyancy force
+ const surfaceScalarField Fgf(g & mesh.Sf());
+
+ phiHbyAD += rADUcf*(Fgf + Dcf()*phid());
+
+ // Update the pressure BCs to ensure flux consistency
+ constrainPressure(p, Uc, phiHbyAD, rADUcf);
+
+ // Non-orthogonal pressure corrector loop
+ while (pimple.correctNonOrthogonal())
+ {
+ fvScalarMatrix pEqn
+ (
+ fvm::laplacian(alphacf*rADUcf, p)
+ ==
+ fvc::ddt(alphac)
+ + fvc::div(alphacf*phiHbyAD)
+ );
+
+ pEqn.setReference
+ (
+ pressureReference.refCell(),
+ pressureReference.refValue()
+ );
+
+ pEqn.solve();
+
+ if (pimple.finalNonOrthogonalIter())
+ {
+ phic = phiHbyAD - pEqn.flux()/alphacf;
+
+ // Explicitly relax pressure for momentum corrector
+ p.relax();
+
+ Uc =
+ r1ADUc
+ *(
+ HbyA
+ + rAUc
+ *(
+ fvc::reconstruct
+ (
+ Fgf - pEqn.flux()/alphacf/rADUcf
+ - Dcf()*(phic - phid())
+ )
+ + Dc()*fvc::reconstruct(phic - phid())
+ + Fd()
+ )
+ );
+
+ Uc.correctBoundaryConditions();
+ fvConstraints().constrain(Uc);
+
+ // Correct Ucf if the mesh is moving
+ fvc::correctUf(Ucf, Uc, phic);
+
+ // Make the fluxes relative to the mesh motion
+ fvc::makeRelative(phic, Uc);
+ }
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C b/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C
new file mode 100644
index 0000000000..8bb542a752
--- /dev/null
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C
@@ -0,0 +1,390 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 "incompressibleDenseParticleFluid.H"
+#include "surfaceInterpolate.H"
+#include "fvMatrix.H"
+#include "fvcFlux.H"
+#include "zeroGradientFvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace solvers
+{
+ defineTypeNameAndDebug(incompressibleDenseParticleFluid, 0);
+ addToRunTimeSelectionTable
+ (
+ solver,
+ incompressibleDenseParticleFluid,
+ fvMesh
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+void Foam::solvers::incompressibleDenseParticleFluid::correctCoNum()
+{
+ fluidSolver::correctCoNum(phic);
+}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::continuityErrors()
+{
+ fluidSolver::continuityErrors(phic);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::solvers::incompressibleDenseParticleFluid::
+incompressibleDenseParticleFluid
+(
+ fvMesh& mesh
+)
+:
+ fluidSolver(mesh),
+
+ continuousPhaseName
+ (
+ IOdictionary
+ (
+ IOobject
+ (
+ "physicalProperties",
+ runTime.constant(),
+ mesh,
+ IOobject::MUST_READ
+ )
+ ).lookup("continuousPhaseName")
+ ),
+
+ p_
+ (
+ IOobject
+ (
+ "p",
+ runTime.name(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+ ),
+
+ pressureReference(p_, pimple.dict()),
+
+ g
+ (
+ IOobject
+ (
+ "g",
+ runTime.constant(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE
+ )
+ ),
+
+ Uc_
+ (
+ IOobject
+ (
+ IOobject::groupName("U", continuousPhaseName),
+ runTime.name(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+ ),
+
+ phic_
+ (
+ IOobject
+ (
+ IOobject::groupName("phi", continuousPhaseName),
+ runTime.name(),
+ mesh,
+ IOobject::READ_IF_PRESENT,
+ IOobject::AUTO_WRITE
+ ),
+ linearInterpolate(Uc_) & mesh.Sf()
+ ),
+
+ viscosity(viscosityModel::New(mesh)),
+
+ rhoc
+ (
+ IOobject
+ (
+ IOobject::groupName("rho", continuousPhaseName),
+ runTime.name(),
+ mesh
+ ),
+ mesh,
+ dimensionedScalar
+ (
+ IOobject::groupName("rho", continuousPhaseName),
+ dimDensity,
+ viscosity->lookup
+ (
+ IOobject::groupName("rho", continuousPhaseName)
+ )
+ )
+ ),
+
+ muc
+ (
+ IOobject
+ (
+ IOobject::groupName("mu", continuousPhaseName),
+ runTime.name(),
+ mesh
+ ),
+ rhoc*viscosity->nu()
+ ),
+
+ alphac_
+ (
+ IOobject
+ (
+ IOobject::groupName("alpha", continuousPhaseName),
+ runTime.name(),
+ mesh,
+ IOobject::READ_IF_PRESENT,
+ IOobject::AUTO_WRITE
+ ),
+ mesh,
+ dimensionedScalar(dimless, 0)
+ ),
+
+ alphacMin
+ (
+ 1 - mesh.solution().solverDict(alphac_.name()).lookup("max")
+ ),
+
+ alphacf("alphacf", fvc::interpolate(alphac_)),
+
+ alphaPhic
+ (
+ IOobject::groupName("alphaPhi", continuousPhaseName),
+ alphacf*phic_
+ ),
+
+ momentumTransport
+ (
+ phaseIncompressible::momentumTransportModel::New
+ (
+ alphac_,
+ Uc_,
+ alphaPhic,
+ phic_,
+ viscosity
+ )
+ ),
+
+ clouds
+ (
+ parcelClouds::New(mesh, rhoc, Uc_, muc, g)
+ ),
+
+ p(p_),
+ Uc(Uc_),
+ phic(phic_),
+ alphac(alphac_)
+{
+ mesh.schemes().setFluxRequired(p.name());
+
+ momentumTransport->validate();
+
+ // Update alphac from the particle locations
+ alphac_ = max(1 - clouds.theta(), alphacMin);
+ alphac_.correctBoundaryConditions();
+ alphacf = fvc::interpolate(alphac);
+ alphaPhic = alphacf*phic;
+
+ if (mesh.dynamic())
+ {
+ Info<< "Constructing face momentum Ucf" << endl;
+
+ // Ensure the U BCs are up-to-date before constructing Ucf
+ Uc_.correctBoundaryConditions();
+
+ Ucf = new surfaceVectorField
+ (
+ IOobject
+ (
+ "Ucf",
+ runTime.name(),
+ mesh,
+ IOobject::READ_IF_PRESENT,
+ IOobject::AUTO_WRITE
+ ),
+ fvc::interpolate(Uc)
+ );
+ }
+
+ correctCoNum();
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::solvers::incompressibleDenseParticleFluid::
+~incompressibleDenseParticleFluid()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::solvers::incompressibleDenseParticleFluid::preSolve()
+{
+ // Read the controls
+ readControls();
+
+ // Store the particle positions
+ if (mesh.topoChanging())
+ {
+ clouds.storeGlobalPositions();
+ }
+
+ fvModels().preUpdateMesh();
+
+ correctCoNum();
+
+ // Update the mesh for topology change, mesh to mesh mapping
+ mesh_.update();
+}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::prePredictor()
+{
+ if (pimple.firstIter())
+ {
+ clouds.evolve();
+
+ // Update continuous phase volume fraction field
+ alphac_ = max(1 - clouds.theta(), alphacMin);
+ alphac_.correctBoundaryConditions();
+ alphacf = fvc::interpolate(alphac);
+
+ // ... and continuous phase volumetric flux
+ alphaPhic = alphacf*phic;
+
+ // Update the continuous phase dynamic viscosity
+ muc = rhoc*viscosity->nu();
+
+ Fd = new volVectorField
+ (
+ IOobject
+ (
+ "Fd",
+ runTime.name(),
+ mesh
+ ),
+ mesh,
+ dimensionedVector(dimAcceleration, Zero),
+ zeroGradientFvPatchVectorField::typeName
+ );
+
+ Dc = new volScalarField
+ (
+ IOobject
+ (
+ "Dc",
+ runTime.name(),
+ mesh
+ ),
+ mesh,
+ dimensionedScalar(dimless/dimTime, Zero),
+ zeroGradientFvPatchVectorField::typeName
+ );
+
+ const fvVectorMatrix cloudSU(clouds.SU(Uc));
+
+ Fd().primitiveFieldRef() = -cloudSU.source()/mesh.V()/rhoc;
+ Fd().correctBoundaryConditions();
+
+ Dc().primitiveFieldRef() = -cloudSU.diag()/mesh.V()/rhoc;
+ Dc().correctBoundaryConditions();
+
+ Dcf = fvc::interpolate(Dc()).ptr();
+
+ phid =
+ (
+ fvc::flux(Fd())
+ /(Dcf() + dimensionedScalar(Dc().dimensions(), small))
+ ).ptr();
+ }
+
+ fvModels().correct();
+
+ if (pimple.predictTransport())
+ {
+ momentumTransport->predict();
+ }
+}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::thermophysicalPredictor()
+{}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::pressureCorrector()
+{
+ while (pimple.correct())
+ {
+ correctPressure();
+ }
+
+ tUcEqn.clear();
+}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::postCorrector()
+{
+ if (pimple.correctTransport())
+ {
+ viscosity->correct();
+ momentumTransport->correct();
+ }
+}
+
+
+void Foam::solvers::incompressibleDenseParticleFluid::postSolve()
+{
+ Fd.clear();
+ Dc.clear();
+ Dcf.clear();
+ phid.clear();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.H b/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.H
new file mode 100644
index 0000000000..889d6f3ea8
--- /dev/null
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.H
@@ -0,0 +1,265 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::solvers::incompressibleDenseParticleFluid
+
+Description
+
+ Solver module for transient flow of incompressible isothermal fluids coupled
+ with particle clouds including the effect of the volume fraction of
+ particles on the continuous phase, with optional mesh motion and change.
+
+ Uses the flexible PIMPLE (PISO-SIMPLE) solution for time-resolved and
+ pseudo-transient and steady simulations.
+
+ Optional fvModels and fvConstraints are provided to enhance the simulation
+ in many ways including adding various sources, constraining or limiting
+ the solution.
+
+ Reference:
+ \verbatim
+ Greenshields, C. J., & Weller, H. G. (2022).
+ Notes on Computational Fluid Dynamics: General Principles.
+ CFD Direct Ltd.: Reading, UK.
+ \endverbatim
+
+SourceFiles
+ incompressibleDenseParticleFluid.C
+
+See also
+ Foam::solvers::fluidSolver
+ Foam::solvers::incompressibleFluid
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef incompressibleDenseParticleFluid_H
+#define incompressibleDenseParticleFluid_H
+
+#include "fluidSolver.H"
+#include "viscosityModel.H"
+#include "phaseIncompressibleMomentumTransportModel.H"
+#include "pressureReference.H"
+#include "uniformDimensionedFields.H"
+#include "parcelClouds.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace solvers
+{
+
+/*---------------------------------------------------------------------------*\
+ Class incompressibleDenseParticleFluid Declaration
+\*---------------------------------------------------------------------------*/
+
+class incompressibleDenseParticleFluid
+:
+ public fluidSolver
+{
+
+protected:
+
+ //- Name of the continuous phase
+ const word continuousPhaseName;
+
+
+ // Pressure
+
+ //- Pressure field
+ volScalarField p_;
+
+ //- Pressure reference
+ Foam::pressureReference pressureReference;
+
+
+ // Buoyancy
+
+ //- Acceleration due to gravity
+ uniformDimensionedVectorField g;
+
+
+ // Kinematic properties
+
+ //- Continuous phase velocity field
+ volVectorField Uc_;
+
+ //- Continuous phase flux field
+ surfaceScalarField phic_;
+
+ //- Continuous phase kinematic viscosity model
+ autoPtr viscosity;
+
+
+ // Continuous phase properties for Lagrangian cloud
+
+ //- Continuous phase density
+ volScalarField rhoc;
+
+ //- Continuous phase viscosity
+ volScalarField muc;
+
+ //- Continuous phase-fraction
+ volScalarField alphac_;
+
+ //- Minimum continuous phase-fraction
+ scalar alphacMin;
+
+ //- Interpolated continuous phase-fraction
+ surfaceScalarField alphacf;
+
+ //- Continuous phase volumetric-flux field
+ surfaceScalarField alphaPhic;
+
+
+ // Momentum transport
+
+ //- Pointer to the momentum transport model
+ autoPtr momentumTransport;
+
+
+ // Dispersed phase Lagrangian clouds
+
+ parcelClouds& clouds;
+
+
+ // Cached temporary fields
+
+ //- Dispersed phase drag force
+ autoPtr Fd;
+
+ // Continuous-dispersed phase drag coefficient
+ autoPtr Dc;
+
+ //- Face continuous-dispersed phase drag coefficient
+ autoPtr Dcf;
+
+ //- Effective volumetric flux of the dispersed phase
+ autoPtr phid;
+
+ //- Pointer to the surface momentum field
+ // used to recreate the flux after mesh-change
+ autoPtr Ucf;
+
+ //- Cached momentum matrix
+ // shared between the momentum predictor and pressure corrector
+ tmp tUcEqn;
+
+
+ // Protected Member Functions
+
+ //- Correct the cached Courant numbers
+ void correctCoNum();
+
+ //- Calculate and print the continuity errors
+ void continuityErrors();
+
+ //- Construct the pressure equation
+ // and correct the pressure and velocity
+ virtual void correctPressure();
+
+
+public:
+
+ // Public Data
+
+ //- Reference to the pressure field
+ const volScalarField& p;
+
+ //- Reference to the continuous phase velocity field
+ const volVectorField& Uc;
+
+ //- Reference to the continuous phase volumetric-flux field
+ const surfaceScalarField& phic;
+
+ //- Reference continuous phase-fraction
+ const volScalarField& alphac;
+
+
+ //- Runtime type information
+ TypeName("incompressibleDenseParticleFluid");
+
+
+ // Constructors
+
+ //- Construct from region mesh
+ incompressibleDenseParticleFluid(fvMesh& mesh);
+
+ //- Disallow default bitwise copy construction
+ incompressibleDenseParticleFluid
+ (
+ const incompressibleDenseParticleFluid&
+ ) = delete;
+
+
+ //- Destructor
+ virtual ~incompressibleDenseParticleFluid();
+
+
+ // Member Functions
+
+ //- Called at the start of the time-step, before the PIMPLE loop
+ virtual void preSolve();
+
+ //- Called at the start of the PIMPLE loop to move the mesh
+ virtual void moveMesh();
+
+ //- Called at the start of the PIMPLE loop
+ virtual void prePredictor();
+
+ //- Construct and optionally solve the momentum equation
+ virtual void momentumPredictor();
+
+ //- Construct and solve the energy equation,
+ // convert to temperature
+ // and update thermophysical and transport properties
+ virtual void thermophysicalPredictor();
+
+ //- Construct and solve the pressure equation in the PISO loop
+ virtual void pressureCorrector();
+
+ //- Correct the momentum and thermophysical transport modelling
+ virtual void postCorrector();
+
+ //- Called after the PIMPLE loop at the end of the time-step
+ virtual void postSolve();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const incompressibleDenseParticleFluid&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace solvers
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/createUcfIfPresent.H b/applications/solvers/modules/incompressibleDenseParticleFluid/momentumPredictor.C
similarity index 51%
rename from applications/solvers/lagrangian/denseParticleFoam/createUcfIfPresent.H
rename to applications/solvers/modules/incompressibleDenseParticleFluid/momentumPredictor.C
index d527f1a9b0..edb602fbbe 100644
--- a/applications/solvers/lagrangian/denseParticleFoam/createUcfIfPresent.H
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/momentumPredictor.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2023 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -21,35 +21,56 @@ License
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
-Global
- createUcfIfPresent
-
-Description
- Creates and initialises the continuous phase face velocity field Ufc
- if required.
-
\*---------------------------------------------------------------------------*/
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+#include "incompressibleDenseParticleFluid.H"
+#include "fvcDdt.H"
+#include "fvcSnGrad.H"
+#include "fvcReconstruct.H"
+#include "fvmDiv.H"
+#include "fvmDdt.H"
-autoPtr Ucf;
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
-if (mesh.dynamic())
+void Foam::solvers::incompressibleDenseParticleFluid::momentumPredictor()
{
- Info<< "Constructing continuous phase face velocity Ucf\n" << endl;
+ volVectorField& Uc(Uc_);
- Ucf = new surfaceVectorField
+ tUcEqn =
(
- IOobject
- (
- "Ucf",
- runTime.name(),
- mesh,
- IOobject::READ_IF_PRESENT,
- IOobject::AUTO_WRITE
- ),
- fvc::interpolate(Uc)
+ fvm::ddt(alphac, Uc) + fvm::div(alphaPhic, Uc)
+ - fvm::Sp(fvc::ddt(alphac) + fvc::div(alphaPhic), Uc)
+ + momentumTransport->divDevSigma(Uc)
+ ==
+ fvModels().source(Uc)
);
+ fvVectorMatrix& UcEqn = tUcEqn.ref();
+
+ UcEqn.relax();
+
+ fvConstraints().constrain(UcEqn);
+
+ if (pimple.momentumPredictor())
+ {
+ // Face buoyancy force
+ const surfaceScalarField Fgf(g & mesh.Sf());
+
+ solve
+ (
+ UcEqn
+ ==
+ fvc::reconstruct
+ (
+ Fgf - fvc::snGrad(p)*mesh.magSf()
+ - Dcf()*(phic - phid())
+ )
+ + Dc()*fvc::reconstruct(phic - phid())
+ + Fd() - fvm::Sp(Dc(), Uc)
+ );
+
+ fvConstraints().constrain(Uc);
+ }
}
+
// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/denseParticleFoam/createUcf.H b/applications/solvers/modules/incompressibleDenseParticleFluid/moveMesh.C
similarity index 50%
rename from applications/solvers/lagrangian/denseParticleFoam/createUcf.H
rename to applications/solvers/modules/incompressibleDenseParticleFluid/moveMesh.C
index 1475407c16..e467437ee8 100644
--- a/applications/solvers/lagrangian/denseParticleFoam/createUcf.H
+++ b/applications/solvers/modules/incompressibleDenseParticleFluid/moveMesh.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2023 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -21,29 +21,51 @@ License
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
-Global
- createUcf
-
-Description
- Creates and initialises the velocity velocity field Ucf.
-
\*---------------------------------------------------------------------------*/
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+#include "incompressibleDenseParticleFluid.H"
+#include "fvCorrectPhi.H"
+#include "fvcMeshPhi.H"
+#include "geometricZeroField.H"
-Info<< "Reading/calculating continuous phase face velocity Ucf\n" << endl;
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::solvers::incompressibleDenseParticleFluid::moveMesh()
+{
+ if (pimple.firstIter() || pimple.moveMeshOuterCorrectors())
+ {
+ // Move the mesh
+ mesh_.move();
+
+ if (mesh.changing())
+ {
+ if (correctPhi || mesh.topoChanged())
+ {
+ // Calculate absolute flux
+ // from the mapped surface velocity
+ phic_ = mesh.Sf() & Ucf();
+
+ correctUphiBCs(Uc_, phic_, true);
+
+ fv::correctPhi
+ (
+ phic_,
+ Uc,
+ p,
+ autoPtr(),
+ autoPtr(),
+ pressureReference,
+ pimple
+ );
+
+ // Make the flux relative to the mesh motion
+ fvc::makeRelative(phic_, Uc);
+ }
+
+ meshCourantNo();
+ }
+ }
+}
-surfaceVectorField Ucf
-(
- IOobject
- (
- "Ucf",
- runTime.name(),
- mesh,
- IOobject::READ_IF_PRESENT,
- IOobject::AUTO_WRITE
- ),
- fvc::interpolate(Uc)
-);
// ************************************************************************* //
diff --git a/applications/solvers/modules/incompressibleFluid/incompressibleFluid.H b/applications/solvers/modules/incompressibleFluid/incompressibleFluid.H
index 18636719a6..e3dc0acc1a 100644
--- a/applications/solvers/modules/incompressibleFluid/incompressibleFluid.H
+++ b/applications/solvers/modules/incompressibleFluid/incompressibleFluid.H
@@ -92,7 +92,7 @@ protected:
//- Velocity field
volVectorField U_;
- //- Mass-flux field
+ //- Volumetric-flux field
surfaceScalarField phi_;
@@ -151,7 +151,7 @@ public:
//- Reference to the velocity field
const volVectorField& U;
- //- Reference to the mass-flux field
+ //- Reference to the volumetric-flux field
const surfaceScalarField& phi;
diff --git a/bin/denseParticleFoam b/bin/denseParticleFoam
new file mode 100755
index 0000000000..d436a5edcc
--- /dev/null
+++ b/bin/denseParticleFoam
@@ -0,0 +1,46 @@
+#!/bin/sh
+#------------------------------------------------------------------------------
+# ========= |
+# \\ / 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 .
+#
+# Script
+# denseParticleFoam
+#
+# Description
+# Script to inform the user that denseParticleFoam has been superseded and
+# replaced by the more general incompressibleDenseParticleFluid solver
+# module executed by the foamRun application.
+#
+#------------------------------------------------------------------------------
+
+cat <