Compare commits
1 Commits
feature-am
...
feature-ld
| Author | SHA1 | Date | |
|---|---|---|---|
| 82c405882d |
@ -49,7 +49,7 @@
|
||||
|
||||
<!--
|
||||
Providing details of your set-up can help us identify any issues, e.g.
|
||||
OpenFOAM version : v2312|v2306|v2212|v2206|v2112 etc
|
||||
OpenFOAM version : v2112|v2106|v2012|v2006|v1912|v1906 etc
|
||||
Operating system : ubuntu|openSUSE|centos etc
|
||||
Hardware info : any info that may help?
|
||||
Compiler : gcc|intel|clang etc
|
||||
|
||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -17,6 +17,3 @@
|
||||
[submodule "external-solver"]
|
||||
path = modules/external-solver
|
||||
url = https://develop.openfoam.com/Modules/external-solver.git
|
||||
[submodule "turbulence-community"]
|
||||
path = modules/turbulence-community
|
||||
url = https://gitlab.com/openfoam/community/tc-turbulence/turbulence-community.git
|
||||
|
||||
23
Allwmake
23
Allwmake
@ -37,7 +37,7 @@ echo
|
||||
echo ========================================
|
||||
date "+%Y-%m-%d %H:%M:%S %z" 2>/dev/null || echo "date is unknown"
|
||||
echo "Starting compile ${WM_PROJECT_DIR##*/} ${0##*/}"
|
||||
echo " $WM_COMPILER ${WM_COMPILER_TYPE:-system} compiler [${WM_COMPILE_CONTROL}]"
|
||||
echo " $WM_COMPILER ${WM_COMPILER_TYPE:-system} compiler"
|
||||
echo " ${WM_OPTIONS}, with ${WM_MPLIB} ${FOAM_MPI}"
|
||||
echo ========================================
|
||||
echo
|
||||
@ -70,16 +70,15 @@ applications/Allwmake $targetType $*
|
||||
|
||||
|
||||
# Additional components/modules
|
||||
case "$FOAM_MODULE_PREFIX" in
|
||||
(false | none)
|
||||
if [ "$FOAM_MODULE_PREFIX" = false ] || [ "$FOAM_MODULE_PREFIX" = none ]
|
||||
then
|
||||
echo ========================================
|
||||
echo "OpenFOAM modules disabled (prefix=${FOAM_MODULE_PREFIX})"
|
||||
echo
|
||||
;;
|
||||
(*)
|
||||
else
|
||||
# Use wmake -all instead of Allwmake to allow for overrides
|
||||
( cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all )
|
||||
esac
|
||||
(cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all)
|
||||
fi
|
||||
|
||||
# Count files in given directory. Ignore "Test-*" binaries.
|
||||
_foamCountDirEntries()
|
||||
@ -96,12 +95,10 @@ echo " ${WM_PROJECT_DIR##*/}"
|
||||
echo " $WM_COMPILER ${WM_COMPILER_TYPE:-system} compiler"
|
||||
echo " ${WM_OPTIONS}, with ${WM_MPLIB} ${FOAM_MPI}"
|
||||
echo
|
||||
|
||||
# The api/patch information
|
||||
sed -e 's/^/ /; s/=/ = /' ./META-INFO/api-info 2>/dev/null || true
|
||||
|
||||
echo " bin = $(_foamCountDirEntries "$FOAM_APPBIN") entries"
|
||||
echo " lib = $(_foamCountDirEntries "$FOAM_LIBBIN") entries"
|
||||
echo " api = $(etc/openfoam -show-api 2>/dev/null)"
|
||||
echo " patch = $(etc/openfoam -show-patch 2>/dev/null)"
|
||||
echo " bin = $(_foamCountDirEntries "$FOAM_APPBIN") entries"
|
||||
echo " lib = $(_foamCountDirEntries "$FOAM_LIBBIN") entries"
|
||||
echo
|
||||
echo ========================================
|
||||
|
||||
|
||||
@ -5,36 +5,26 @@ It is likely incomplete...
|
||||
|
||||
## Contributors (alphabetical by surname)
|
||||
|
||||
- Horacio Aguerre
|
||||
- Yu Ankun
|
||||
- Tetsuo Aoyagi
|
||||
- Akira Azami
|
||||
- Pete Bachant
|
||||
- William Bainbridge
|
||||
- Gabriel Barajas
|
||||
- Kutalmis Bercin
|
||||
- Julius Bergmann
|
||||
- Ivor Clifford
|
||||
- Greg Collecutt
|
||||
- Jonathan Cranford
|
||||
- Santiago Marquez Damian
|
||||
- Sergio Ferraris
|
||||
- Matej Forman
|
||||
- Marian Fuchs
|
||||
- Gabriel Gerlero
|
||||
- Pawan Ghildiyal
|
||||
- Chris Greenshields
|
||||
- Bernhard Gschaider
|
||||
- Andrew Heather
|
||||
- David Hill
|
||||
- Yoshiaki Inoue
|
||||
- Mattijs Janssens
|
||||
- Andrew Jackson
|
||||
- Hrvoje Jasak
|
||||
- Alexander Kabat vel Job
|
||||
- Thilo Knacke
|
||||
- Shannon Leakey
|
||||
- Sergey Lesnik
|
||||
- Tommaso Lucchini
|
||||
- Graham Macpherson
|
||||
- Alexey Matveichev
|
||||
@ -47,7 +37,6 @@ It is likely incomplete...
|
||||
- Victor Olesen
|
||||
- Evangelos Papoutsis-Kiachagias
|
||||
- Juho Peltola
|
||||
- Josep Pocurull
|
||||
- Johan Roenby
|
||||
- Henrik Rusche
|
||||
- Bruno Santos
|
||||
@ -58,12 +47,8 @@ It is likely incomplete...
|
||||
- Gavin Tabor
|
||||
- Zeljko Tukovic
|
||||
- Eugene De Villiers
|
||||
- Louis Vittoz
|
||||
- Vuko Vukcevic
|
||||
- Yi Wang
|
||||
- Norbert Weber
|
||||
- Gregor Weiss
|
||||
- Volker Weissmann
|
||||
- Henry Weller
|
||||
- Niklas Wikstrom
|
||||
- Guanyang Xue
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
api=2401
|
||||
patch=240220
|
||||
api=2109
|
||||
patch=0
|
||||
|
||||
16
README.md
16
README.md
@ -40,9 +40,9 @@ Violations of the Trademark are monitored, and will be duly prosecuted.
|
||||
|
||||
If OpenFOAM has already been compiled on your system, simply source
|
||||
the appropriate `etc/bashrc` or `etc/cshrc` file and get started.
|
||||
For example, for the OpenFOAM-v2312 version:
|
||||
For example, for the OpenFOAM-v2112 version:
|
||||
```
|
||||
source /installation/path/OpenFOAM-v2312/etc/bashrc
|
||||
source /installation/path/OpenFOAM-v2112/etc/bashrc
|
||||
```
|
||||
|
||||
## Compiling OpenFOAM
|
||||
@ -127,8 +127,8 @@ These 3rd-party sources are normally located in a directory parallel
|
||||
to the OpenFOAM directory. For example,
|
||||
```
|
||||
/path/parent
|
||||
|-- OpenFOAM-v2312
|
||||
\-- ThirdParty-v2312
|
||||
|-- OpenFOAM-v2112
|
||||
\-- ThirdParty-v2112
|
||||
```
|
||||
There are, however, many cases where this simple convention is inadequate:
|
||||
|
||||
@ -136,7 +136,7 @@ There are, however, many cases where this simple convention is inadequate:
|
||||
operating system or cluster installation provides it)
|
||||
|
||||
* When we have changed the OpenFOAM directory name to some arbitrary
|
||||
directory name, e.g. openfoam-sandbox2312, etc..
|
||||
directory name, e.g. openfoam-sandbox2112, etc..
|
||||
|
||||
* When we would like any additional 3rd party software to be located
|
||||
inside of the OpenFOAM directory to ensure that the installation is
|
||||
@ -156,9 +156,9 @@ when locating the ThirdParty directory with the following precedence:
|
||||
2. PREFIX/ThirdParty-VERSION
|
||||
* this corresponds to the traditional approach
|
||||
3. PREFIX/ThirdParty-vAPI
|
||||
* allows for an updated value of VERSION, *eg*, `v2312-myCustom`,
|
||||
* allows for an updated value of VERSION, *eg*, `v2112-myCustom`,
|
||||
without requiring a renamed ThirdParty. The API value would still
|
||||
be `2312` and the original `ThirdParty-v2312/` would be found.
|
||||
be `2112` and the original `ThirdParty-v2112/` would be found.
|
||||
4. PREFIX/ThirdParty-API
|
||||
* same as the previous example, but using an unadorned API value.
|
||||
5. PREFIX/ThirdParty-common
|
||||
@ -213,4 +213,4 @@ ThirdParty directory will contain either an `Allwmake` file or a
|
||||
- [Governance](http://www.openfoam.com/governance/), [Governance Projects](https://www.openfoam.com/governance/projects)
|
||||
- [Contacting OpenCFD](http://www.openfoam.com/contact/)
|
||||
|
||||
Copyright 2016-2023 OpenCFD Ltd
|
||||
Copyright 2016-2021 OpenCFD Ltd
|
||||
|
||||
@ -21,10 +21,10 @@ echo ========================================
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
wmake -all $targetType utilities
|
||||
wmake -all $targetType solvers
|
||||
wmake -all $targetType utilities
|
||||
|
||||
# Extra tools (optional)
|
||||
# Optional
|
||||
## wmake -all $targetType tools
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
@ -118,7 +118,7 @@ int main(int argc, char *argv[])
|
||||
fvm::laplacian(rAUf, p) == fvc::div(phiHbyA)
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(piso.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));
|
||||
|
||||
phi = phiHbyA - pEqn.flux();
|
||||
|
||||
|
||||
@ -11,5 +11,4 @@ EXE_LIBS = \
|
||||
-lfvOptions \
|
||||
-lmeshTools \
|
||||
-lsampling \
|
||||
-lregionFaModels \
|
||||
-lfiniteArea
|
||||
-lregionFaModels
|
||||
|
||||
@ -18,6 +18,6 @@ dimensionedScalar rho("rho", dimDensity, transportProperties);
|
||||
|
||||
scalar MaxCo =
|
||||
max(mesh.surfaceInterpolation::deltaCoeffs()*c0).value()
|
||||
*runTime.deltaTValue();
|
||||
*runTime.deltaT().value();
|
||||
|
||||
Info<< "Max acoustic Courant Number = " << MaxCo << endl;
|
||||
|
||||
@ -3,7 +3,6 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
|
||||
-I$(LIB_SRC)/overset/lnInclude \
|
||||
-I$(LIB_SRC)/overset/include/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
|
||||
@ -31,25 +31,3 @@
|
||||
Info<< "Reading diffusivity DT\n" << endl;
|
||||
|
||||
dimensionedScalar DT("DT", dimViscosity, transportProperties);
|
||||
|
||||
bool oversetPatchErrOutput =
|
||||
simple.dict().getOrDefault("oversetPatchErrOutput", false);
|
||||
|
||||
// Dummy phi for oversetPatchErrOutput
|
||||
tmp<surfaceScalarField> tdummyPhi;
|
||||
if (oversetPatchErrOutput)
|
||||
{
|
||||
tdummyPhi = tmp<surfaceScalarField>::New
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"dummyPhi",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar(dimless, Zero)
|
||||
);
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -58,7 +58,6 @@ Description
|
||||
#include "fvOptions.H"
|
||||
#include "simpleControl.H"
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "oversetPatchPhiErr.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -100,11 +99,6 @@ int main(int argc, char *argv[])
|
||||
fvOptions.constrain(TEqn);
|
||||
TEqn.solve();
|
||||
fvOptions.correct(T);
|
||||
|
||||
if (oversetPatchErrOutput)
|
||||
{
|
||||
oversetPatchPhiErr(TEqn, tdummyPhi.ref());
|
||||
}
|
||||
}
|
||||
|
||||
#include "write.H"
|
||||
|
||||
@ -1,4 +1,125 @@
|
||||
#include "../createFields.H"
|
||||
Info<< "Reading velocity field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
// Initialise the velocity internal field to zero
|
||||
U = dimensionedVector(U.dimensions(), Zero);
|
||||
|
||||
surfaceScalarField phi
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phi",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fvc::flux(U)
|
||||
);
|
||||
|
||||
if (args.found("initialiseUBCs"))
|
||||
{
|
||||
U.correctBoundaryConditions();
|
||||
phi = fvc::flux(U);
|
||||
}
|
||||
|
||||
|
||||
// Construct a pressure field
|
||||
// If it is available read it otherwise construct from the velocity BCs
|
||||
// converting fixed-value BCs to zero-gradient and vice versa.
|
||||
|
||||
// Allow override from command-line -pName option
|
||||
const word pName = args.getOrDefault<word>("pName", "p");
|
||||
|
||||
// Infer the pressure BCs from the velocity
|
||||
wordList pBCTypes
|
||||
(
|
||||
U.boundaryField().size(),
|
||||
fixedValueFvPatchScalarField::typeName
|
||||
);
|
||||
|
||||
forAll(U.boundaryField(), patchi)
|
||||
{
|
||||
if (U.boundaryField()[patchi].fixesValue())
|
||||
{
|
||||
pBCTypes[patchi] = zeroGradientFvPatchScalarField::typeName;
|
||||
}
|
||||
}
|
||||
|
||||
// Note that registerObject is false for the pressure field. The pressure
|
||||
// field in this solver doesn't have a physical value during the solution.
|
||||
// It shouldn't be looked up and used by sub models or boundary conditions.
|
||||
Info<< "Constructing pressure field " << pName << nl << endl;
|
||||
volScalarField p
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
pName,
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar(sqr(dimVelocity), Zero),
|
||||
pBCTypes
|
||||
);
|
||||
|
||||
// Infer the velocity potential BCs from the pressure
|
||||
wordList PhiBCTypes
|
||||
(
|
||||
p.boundaryField().size(),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
);
|
||||
|
||||
forAll(p.boundaryField(), patchi)
|
||||
{
|
||||
if (p.boundaryField()[patchi].fixesValue())
|
||||
{
|
||||
PhiBCTypes[patchi] = fixedValueFvPatchScalarField::typeName;
|
||||
}
|
||||
}
|
||||
|
||||
Info<< "Constructing velocity potential field Phi\n" << endl;
|
||||
volScalarField Phi
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Phi",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar(dimLength*dimVelocity, Zero),
|
||||
PhiBCTypes
|
||||
);
|
||||
|
||||
label PhiRefCell = 0;
|
||||
scalar PhiRefValue = 0;
|
||||
setRefCell
|
||||
(
|
||||
Phi,
|
||||
potentialFlow.dict(),
|
||||
PhiRefCell,
|
||||
PhiRefValue
|
||||
);
|
||||
mesh.setFluxRequired(Phi.name());
|
||||
|
||||
#include "createMRF.H"
|
||||
|
||||
// Add solver-specific interpolations
|
||||
{
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2017-2022 OpenCFD Ltd
|
||||
Copyright (C) 2017 OpenCFD Ltd
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -83,7 +83,6 @@ Description
|
||||
\heading Options
|
||||
\plaintable
|
||||
-writep | write the Euler pressure
|
||||
-writephi | Write the final volumetric flux
|
||||
-writePhi | Write the final velocity potential
|
||||
-initialiseUBCs | Update the velocity boundaries before solving for Phi
|
||||
\endplaintable
|
||||
@ -118,12 +117,6 @@ int main(int argc, char *argv[])
|
||||
"Initialise U boundary conditions"
|
||||
);
|
||||
|
||||
argList::addBoolOption
|
||||
(
|
||||
"writephi",
|
||||
"Write the final volumetric flux field"
|
||||
);
|
||||
|
||||
argList::addBoolOption
|
||||
(
|
||||
"writePhi",
|
||||
@ -142,8 +135,6 @@ int main(int argc, char *argv[])
|
||||
"Execute functionObjects"
|
||||
);
|
||||
|
||||
#include "addRegionOption.H"
|
||||
#include "addCheckCaseOptions.H"
|
||||
#include "setRootCaseLists.H"
|
||||
#include "createTime.H"
|
||||
#include "createNamedDynamicFvMesh.H"
|
||||
@ -158,6 +149,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
mesh.update();
|
||||
|
||||
surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
|
||||
|
||||
// Since solver contains no time loop it would never execute
|
||||
// function objects so do it ourselves
|
||||
@ -203,16 +195,11 @@ int main(int argc, char *argv[])
|
||||
<< endl;
|
||||
}
|
||||
|
||||
// Write U
|
||||
// Write U and phi
|
||||
U.write();
|
||||
phi.write();
|
||||
|
||||
// Optionally write the volumetric flux, phi
|
||||
if (args.found("writephi"))
|
||||
{
|
||||
phi.write();
|
||||
}
|
||||
|
||||
// Optionally write velocity potential, Phi
|
||||
// Optionally write Phi
|
||||
if (args.found("writePhi"))
|
||||
{
|
||||
Phi.write();
|
||||
|
||||
@ -25,7 +25,6 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lreactionThermophysicalModels \
|
||||
|
||||
@ -116,7 +116,7 @@ int main(int argc, char *argv[])
|
||||
"normalisedGradP",
|
||||
tmagGradP()/max(tmagGradP())
|
||||
);
|
||||
normalisedGradP.writeOpt(IOobject::AUTO_WRITE);
|
||||
normalisedGradP.writeOpt() = IOobject::AUTO_WRITE;
|
||||
tmagGradP.clear();
|
||||
|
||||
++runTime;
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2023 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -94,14 +93,24 @@ Foam::PDRDragModels::basic::~basic()
|
||||
|
||||
Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basic::Dcu() const
|
||||
{
|
||||
auto tDragDcu = volSymmTensorField::New
|
||||
tmp<volSymmTensorField> tDragDcu
|
||||
(
|
||||
"tDragDcu",
|
||||
IOobject::NO_REGISTER,
|
||||
U_.mesh(),
|
||||
dimensionedSymmTensor(dimMass/dimTime/dimVolume, Zero)
|
||||
new volSymmTensorField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"tDragDcu",
|
||||
U_.mesh().time().constant(),
|
||||
U_.mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
U_.mesh(),
|
||||
dimensionedSymmTensor(dimMass/dimTime/dimVolume, Zero)
|
||||
)
|
||||
);
|
||||
auto& DragDcu = tDragDcu.ref();
|
||||
|
||||
volSymmTensorField& DragDcu = tDragDcu.ref();
|
||||
|
||||
if (on_)
|
||||
{
|
||||
@ -118,14 +127,24 @@ Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basic::Dcu() const
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basic::Gk() const
|
||||
{
|
||||
auto tGk = volScalarField::New
|
||||
tmp<volScalarField> tGk
|
||||
(
|
||||
"tGk",
|
||||
IOobject::NO_REGISTER,
|
||||
U_.mesh(),
|
||||
dimensionedScalar(dimMass/dimLength/pow3(dimTime), Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"tGk",
|
||||
U_.mesh().time().constant(),
|
||||
U_.mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
U_.mesh(),
|
||||
dimensionedScalar(dimMass/dimLength/pow3(dimTime), Zero)
|
||||
)
|
||||
);
|
||||
auto& Gk = tGk.ref();
|
||||
|
||||
volScalarField& Gk = tGk.ref();
|
||||
|
||||
if (on_)
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2019-2020,2023 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -132,11 +132,6 @@ void PDRkEpsilon::correct()
|
||||
|
||||
// Update epsilon and G at the wall
|
||||
epsilon_.boundaryFieldRef().updateCoeffs();
|
||||
// Push new cell values to
|
||||
// coupled neighbours. Note that we want to avoid the re-updateCoeffs
|
||||
// of the wallFunctions so make sure to bypass the evaluate on
|
||||
// those patches and only do the coupled ones.
|
||||
epsilon_.boundaryFieldRef().evaluateCoupled<coupledFvPatch>();
|
||||
|
||||
// Add the blockage generation term so that it is included consistently
|
||||
// in both the k and epsilon equations
|
||||
|
||||
@ -69,8 +69,7 @@ Foam::XiEqModels::Gulder::~Gulder()
|
||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::Gulder::XiEq() const
|
||||
{
|
||||
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
||||
const tmp<volScalarField> tepsilon(turbulence_.epsilon());
|
||||
const volScalarField& epsilon = tepsilon();
|
||||
const volScalarField& epsilon = turbulence_.epsilon();
|
||||
|
||||
if (subGridSchelkin_)
|
||||
{
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2023 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -76,10 +75,8 @@ Foam::XiEqModels::SCOPEXiEq::~SCOPEXiEq()
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::SCOPEXiEq::XiEq() const
|
||||
{
|
||||
const tmp<volScalarField> tk(turbulence_.k());
|
||||
const volScalarField& k = tk();
|
||||
const tmp<volScalarField> tepsilon(turbulence_.epsilon());
|
||||
const volScalarField& epsilon = tepsilon();
|
||||
const volScalarField& k = turbulence_.k();
|
||||
const volScalarField& epsilon = turbulence_.epsilon();
|
||||
|
||||
volScalarField up(sqrt((2.0/3.0)*k));
|
||||
if (subGridSchelkin_)
|
||||
@ -94,14 +91,23 @@ Foam::tmp<Foam::volScalarField> Foam::XiEqModels::SCOPEXiEq::XiEq() const
|
||||
volScalarField K(0.157*upBySu/sqrt(Rl));
|
||||
volScalarField Ma(MaModel.Ma());
|
||||
|
||||
auto tXiEq = volScalarField::New
|
||||
tmp<volScalarField> tXiEq
|
||||
(
|
||||
"XiEq",
|
||||
IOobject::NO_REGISTER,
|
||||
epsilon.mesh(),
|
||||
dimensionedScalar(dimless, Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"XiEq",
|
||||
epsilon.time().timeName(),
|
||||
epsilon.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
epsilon.mesh(),
|
||||
dimensionedScalar(dimless, Zero)
|
||||
)
|
||||
);
|
||||
auto& xieq = tXiEq.ref();
|
||||
volScalarField& xieq = tXiEq.ref();
|
||||
|
||||
forAll(xieq, celli)
|
||||
{
|
||||
|
||||
@ -78,10 +78,11 @@ bool Foam::XiEqModel::read(const dictionary& XiEqProperties)
|
||||
void Foam::XiEqModel::writeFields() const
|
||||
{
|
||||
//***HGW It is not clear why B is written here
|
||||
const auto* B = Su_.mesh().cfindObject<volSymmTensorField>("B");
|
||||
if (B)
|
||||
if (Su_.mesh().foundObject<volSymmTensorField>("B"))
|
||||
{
|
||||
B->write();
|
||||
const volSymmTensorField& B =
|
||||
Su_.mesh().lookupObject<volSymmTensorField>("B");
|
||||
B.write();
|
||||
}
|
||||
}
|
||||
|
||||
@ -97,26 +98,39 @@ Foam::XiEqModel::calculateSchelkinEffect(const scalar uPrimeCoef) const
|
||||
const volSymmTensorField& nsv =
|
||||
mesh.lookupObject<volSymmTensorField>("nsv");
|
||||
|
||||
auto tN = volScalarField::New
|
||||
tmp<volScalarField> tN
|
||||
(
|
||||
"tN",
|
||||
IOobject::NO_REGISTER,
|
||||
mesh,
|
||||
dimensionedScalar(Nv.dimensions(), Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"tN",
|
||||
mesh.time().timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar(Nv.dimensions(), Zero)
|
||||
)
|
||||
);
|
||||
auto& N = tN.ref();
|
||||
|
||||
volScalarField& N = tN.ref();
|
||||
N.primitiveFieldRef() = Nv.primitiveField()*pow(mesh.V(), 2.0/3.0);
|
||||
|
||||
auto tns = volSymmTensorField::New
|
||||
volSymmTensorField ns
|
||||
(
|
||||
"tns",
|
||||
IOobject::NO_REGISTER,
|
||||
IOobject
|
||||
(
|
||||
"tns",
|
||||
mesh.time().timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
||||
);
|
||||
auto& ns = tns.ref();
|
||||
|
||||
ns.primitiveFieldRef() = nsv.primitiveField()*pow(mesh.V(), 2.0/3.0);
|
||||
|
||||
const volVectorField Uhat
|
||||
|
||||
@ -66,8 +66,7 @@ Foam::XiGModels::KTS::~KTS()
|
||||
Foam::tmp<Foam::volScalarField> Foam::XiGModels::KTS::G() const
|
||||
{
|
||||
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
||||
const tmp<volScalarField> tepsilon(turbulence_.epsilon());
|
||||
const volScalarField& epsilon = tepsilon();
|
||||
const volScalarField& epsilon = turbulence_.epsilon();
|
||||
|
||||
volScalarField tauEta(sqrt(mag(thermo_.muu()/(thermo_.rhou()*epsilon))));
|
||||
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2023 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -256,14 +255,24 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
||||
scalar phi
|
||||
) const
|
||||
{
|
||||
auto tSu0 = volScalarField::New
|
||||
tmp<volScalarField> tSu0
|
||||
(
|
||||
"Su0",
|
||||
IOobject::NO_REGISTER,
|
||||
p.mesh(),
|
||||
dimensionedScalar(dimVelocity, Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Su0",
|
||||
p.time().timeName(),
|
||||
p.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
p.mesh(),
|
||||
dimensionedScalar(dimVelocity, Zero)
|
||||
)
|
||||
);
|
||||
auto& Su0 = tSu0.ref();
|
||||
|
||||
volScalarField& Su0 = tSu0.ref();
|
||||
|
||||
forAll(Su0, celli)
|
||||
{
|
||||
@ -295,14 +304,24 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
||||
const volScalarField& phi
|
||||
) const
|
||||
{
|
||||
auto tSu0 = volScalarField::New
|
||||
tmp<volScalarField> tSu0
|
||||
(
|
||||
"Su0",
|
||||
IOobject::NO_REGISTER,
|
||||
p.mesh(),
|
||||
dimensionedScalar(dimVelocity, Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Su0",
|
||||
p.time().timeName(),
|
||||
p.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
p.mesh(),
|
||||
dimensionedScalar(dimVelocity, Zero)
|
||||
)
|
||||
);
|
||||
auto& Su0 = tSu0.ref();
|
||||
|
||||
volScalarField& Su0 = tSu0.ref();
|
||||
|
||||
forAll(Su0, celli)
|
||||
{
|
||||
@ -339,14 +358,24 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Ma
|
||||
const volScalarField& phi
|
||||
) const
|
||||
{
|
||||
auto tMa = volScalarField::New
|
||||
tmp<volScalarField> tMa
|
||||
(
|
||||
"Ma",
|
||||
IOobject::NO_REGISTER,
|
||||
phi.mesh(),
|
||||
dimensionedScalar(dimless, Zero)
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Ma",
|
||||
phi.time().timeName(),
|
||||
phi.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
phi.mesh(),
|
||||
dimensionedScalar(dimless, Zero)
|
||||
)
|
||||
);
|
||||
auto& ma = tMa.ref();
|
||||
|
||||
volScalarField& ma = tMa.ref();
|
||||
|
||||
forAll(ma, celli)
|
||||
{
|
||||
@ -389,12 +418,21 @@ Foam::laminarFlameSpeedModels::SCOPE::Ma() const
|
||||
{
|
||||
const fvMesh& mesh = psiuReactionThermo_.p().mesh();
|
||||
|
||||
return volScalarField::New
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
"Ma",
|
||||
IOobject::NO_REGISTER,
|
||||
mesh,
|
||||
dimensionedScalar("Ma", dimless, Ma(equivalenceRatio_))
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Ma",
|
||||
mesh.time().timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("Ma", dimless, Ma(equivalenceRatio_))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ if (pimple.transonic())
|
||||
betav*fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -57,7 +57,7 @@ else
|
||||
betav*fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -19,7 +19,6 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lreactionThermophysicalModels \
|
||||
|
||||
@ -26,7 +26,6 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lreactionThermophysicalModels \
|
||||
|
||||
@ -30,7 +30,7 @@ if (pimple.transonic())
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -66,7 +66,7 @@ else
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lreactionThermophysicalModels \
|
||||
|
||||
@ -35,7 +35,7 @@ if (pimple.transonic())
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -71,7 +71,7 @@ else
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -171,7 +171,10 @@ if (ign.ignited())
|
||||
|
||||
fvOptions.correct(Su);
|
||||
|
||||
Su.clamp_range(SuMin, SuMax);
|
||||
// Limit the maximum Su
|
||||
// ~~~~~~~~~~~~~~~~~~~~
|
||||
Su.min(SuMax);
|
||||
Su.max(SuMin);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -215,7 +218,7 @@ if (ign.ignited())
|
||||
+ (
|
||||
scalar(1)
|
||||
+ (2*XiShapeCoef)
|
||||
*(scalar(0.5) - clamp(b, zero_one{}))
|
||||
*(scalar(0.5) - min(max(b, scalar(0)), scalar(1)))
|
||||
)*(XiEqStar - scalar(1.001))
|
||||
);
|
||||
|
||||
@ -223,7 +226,7 @@ if (ign.ignited())
|
||||
volScalarField R(Gstar*XiEqStar/(XiEqStar - scalar(1)));
|
||||
volScalarField G(R*(XiEq - scalar(1.001))/XiEq);
|
||||
|
||||
//R *= (Gstar + 2*mag(devSymm(fvc::grad(U))))/Gstar;
|
||||
//R *= (Gstar + 2*mag(dev(symm(fvc::grad(U)))))/Gstar;
|
||||
|
||||
// Solve for the flame wrinkling
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@ -29,7 +29,7 @@ if (pimple.transonic())
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -64,7 +64,7 @@ else
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
solve
|
||||
(
|
||||
fvm::ddt(rho, Yi) - chemistry.RR(specieI),
|
||||
"Yi"
|
||||
mesh.solver("Yi")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@ Info<< "Creating base fields for time " << runTime.timeName() << endl;
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::NO_REGISTER
|
||||
false
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("Ydefault", dimless, 1)
|
||||
@ -29,7 +29,7 @@ Info<< "Creating base fields for time " << runTime.timeName() << endl;
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::NO_REGISTER
|
||||
false
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("p", dimPressure, p0)
|
||||
@ -46,7 +46,7 @@ Info<< "Creating base fields for time " << runTime.timeName() << endl;
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::NO_REGISTER
|
||||
false
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("T", dimTemperature, T0)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
if (adjustTimeStep)
|
||||
{
|
||||
runTime.setDeltaT(min(dtChem, maxDeltaT));
|
||||
Info<< "deltaT = " << runTime.deltaTValue() << endl;
|
||||
Info<< "deltaT = " << runTime.deltaT().value() << endl;
|
||||
}
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
dtChem = chemistry.solve(runTime.deltaTValue());
|
||||
dtChem = chemistry.solve(runTime.deltaT().value());
|
||||
scalar Qdot = chemistry.Qdot()()[0]/rho[0];
|
||||
integratedHeat += Qdot*runTime.deltaTValue();
|
||||
integratedHeat += Qdot*runTime.deltaT().value();
|
||||
|
||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lspecie
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/finiteArea/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/sampling/lnInclude \
|
||||
-I${LIB_SRC}/meshTools/lnInclude \
|
||||
-I${LIB_SRC}/sampling/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/distributionModels/lnInclude \
|
||||
@ -34,7 +34,6 @@ EXE_LIBS = \
|
||||
-lsampling \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lspecie \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
|
||||
@ -35,17 +35,17 @@ tmp<fv::convectionScheme<scalar>> mvConvection
|
||||
|
||||
fvOptions.constrain(YiEqn);
|
||||
|
||||
YiEqn.solve("Yi");
|
||||
YiEqn.solve(mesh.solver("Yi"));
|
||||
|
||||
fvOptions.correct(Yi);
|
||||
|
||||
Yi.clamp_min(0);
|
||||
Yi.max(0.0);
|
||||
Yt += Yi;
|
||||
}
|
||||
}
|
||||
|
||||
Y[inertIndex] = scalar(1) - Yt;
|
||||
Y[inertIndex].clamp_min(0);
|
||||
Y[inertIndex].max(0.0);
|
||||
|
||||
radiation->correct();
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
const volScalarField& psi = thermo.psi();
|
||||
const volScalarField& T = thermo.T();
|
||||
regionModels::surfaceFilmModel& surfaceFilm = tsurfaceFilm();
|
||||
const label inertIndex(composition.species().find(inertSpecie));
|
||||
const label inertIndex(composition.species()[inertSpecie]);
|
||||
|
||||
@ -36,7 +36,7 @@ while (pimple.correctNonOrthogonal())
|
||||
+ fvOptions(psi, p_rgh, rho.name())
|
||||
);
|
||||
|
||||
p_rghEqn.solve(p_rgh.select(pimple.finalInnerIter()));
|
||||
p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -10,8 +10,7 @@ if (pimple.dict().getOrDefault("hydrostaticInitialization", false))
|
||||
"0",
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::REGISTER
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh
|
||||
)
|
||||
|
||||
@ -19,7 +19,6 @@ EXE_LIBS = \
|
||||
-lsampling \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lreactionThermophysicalModels \
|
||||
-lspecie \
|
||||
-lcompressibleTransportModels \
|
||||
|
||||
@ -34,15 +34,15 @@ tmp<fv::convectionScheme<scalar>> mvConvection
|
||||
|
||||
fvOptions.constrain(YiEqn);
|
||||
|
||||
YiEqn.solve("Yi");
|
||||
YiEqn.solve(mesh.solver("Yi"));
|
||||
|
||||
fvOptions.correct(Yi);
|
||||
|
||||
Yi.clamp_min(0);
|
||||
Yi.max(0.0);
|
||||
Yt += Yi;
|
||||
}
|
||||
}
|
||||
|
||||
Y[inertIndex] = scalar(1) - Yt;
|
||||
Y[inertIndex].clamp_min(0);
|
||||
Y[inertIndex].max(0.0);
|
||||
}
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
const volScalarField& psi = thermo.psi();
|
||||
const volScalarField& T = thermo.T();
|
||||
const label inertIndex(composition.species().find(inertSpecie));
|
||||
const label inertIndex(composition.species()[inertSpecie]);
|
||||
|
||||
@ -37,7 +37,7 @@ if (pimple.transonic())
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -72,7 +72,7 @@ else
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -49,7 +49,7 @@ if (pimple.transonic())
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -89,7 +89,7 @@ else
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
||||
-lsampling \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lreactionThermophysicalModels \
|
||||
-lspecie \
|
||||
-lcompressibleTransportModels \
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
const volScalarField& psi = thermo.psi();
|
||||
const volScalarField& T = thermo.T();
|
||||
const label inertIndex(composition.species().find(inertSpecie));
|
||||
const label inertIndex(composition.species()[inertSpecie]);
|
||||
|
||||
@ -41,7 +41,7 @@ while (pimple.correctNonOrthogonal())
|
||||
- fvm::laplacian(rhorAUf, p_rgh)
|
||||
);
|
||||
|
||||
p_rghEqn.solve(p_rgh.select(pimple.finalInnerIter()));
|
||||
p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
||||
-lsampling \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-lreactionThermophysicalModels \
|
||||
-lspecie \
|
||||
-lcompressibleTransportModels \
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
const volScalarField& psi = thermo.psi();
|
||||
const volScalarField& T = thermo.T();
|
||||
const label inertIndex(composition.species().find(inertSpecie));
|
||||
const label inertIndex(composition.species()[inertSpecie]);
|
||||
|
||||
@ -4,5 +4,6 @@ cd "${0%/*}" || exit # Run from this directory
|
||||
|
||||
wclean libso BCs
|
||||
wclean
|
||||
wclean rhoCentralDyMFoam
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
@ -5,7 +5,8 @@ cd "${0%/*}" || exit # Run from this directory
|
||||
|
||||
(
|
||||
wmake $targetType BCs \
|
||||
&& wmake $targetType
|
||||
&& wmake $targetType \
|
||||
&& wmake $targetType rhoCentralDyMFoam \
|
||||
)
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
@ -103,10 +103,16 @@ Foam::smoluchowskiJumpTFvPatchScalarField::smoluchowskiJumpTFvPatchScalarField
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
if (!this->readValueEntry(dict))
|
||||
if (dict.found("value"))
|
||||
{
|
||||
// Fallback: set to the internal field
|
||||
fvPatchField<scalar>::patchInternalField(*this);
|
||||
fvPatchField<scalar>::operator=
|
||||
(
|
||||
scalarField("value", dict, p.size())
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
fvPatchField<scalar>::operator=(patchInternalField());
|
||||
}
|
||||
|
||||
refValue() = *this;
|
||||
@ -159,10 +165,14 @@ void Foam::smoluchowskiJumpTFvPatchScalarField::updateCoeffs()
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& pmu = patch().lookupPatchField<volScalarField>(muName_);
|
||||
const auto& prho = patch().lookupPatchField<volScalarField>(rhoName_);
|
||||
const auto& ppsi = patch().lookupPatchField<volScalarField>(psiName_);
|
||||
const auto& pU = patch().lookupPatchField<volVectorField>(UName_);
|
||||
const fvPatchScalarField& pmu =
|
||||
patch().lookupPatchField<volScalarField, scalar>(muName_);
|
||||
const fvPatchScalarField& prho =
|
||||
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
|
||||
const fvPatchField<scalar>& ppsi =
|
||||
patch().lookupPatchField<volScalarField, scalar>(psiName_);
|
||||
const fvPatchVectorField& pU =
|
||||
patch().lookupPatchField<volVectorField, vector>(UName_);
|
||||
|
||||
// Prandtl number reading consistent with rhoCentralFoam
|
||||
const dictionary& thermophysicalProperties =
|
||||
@ -197,7 +207,7 @@ void Foam::smoluchowskiJumpTFvPatchScalarField::updateCoeffs()
|
||||
// Write
|
||||
void Foam::smoluchowskiJumpTFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchField<scalar>::write(os);
|
||||
fvPatchScalarField::write(os);
|
||||
|
||||
os.writeEntryIfDifferent<word>("U", "U", UName_);
|
||||
os.writeEntryIfDifferent<word>("rho", "rho", rhoName_);
|
||||
@ -207,7 +217,7 @@ void Foam::smoluchowskiJumpTFvPatchScalarField::write(Ostream& os) const
|
||||
os.writeEntry("accommodationCoeff", accommodationCoeff_);
|
||||
Twall_.writeEntry("Twall", os);
|
||||
os.writeEntry("gamma", gamma_);
|
||||
fvPatchField<scalar>::writeValueEntry(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -110,6 +110,15 @@ public:
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new smoluchowskiJumpTFvPatchScalarField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
smoluchowskiJumpTFvPatchScalarField
|
||||
(
|
||||
@ -117,22 +126,18 @@ public:
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Return a clone
|
||||
virtual tmp<fvPatchField<scalar>> clone() const
|
||||
{
|
||||
return fvPatchField<scalar>::Clone(*this);
|
||||
}
|
||||
|
||||
//- Clone with an internal field reference
|
||||
virtual tmp<fvPatchField<scalar>> clone
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return fvPatchField<scalar>::Clone(*this, iF);
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new smoluchowskiJumpTFvPatchScalarField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
|
||||
@ -105,15 +105,18 @@ Foam::maxwellSlipUFvPatchVectorField::maxwellSlipUFvPatchVectorField
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
if (this->readValueEntry(dict))
|
||||
if (dict.found("value"))
|
||||
{
|
||||
const auto* hasRefValue = dict.findEntry("refValue", keyType::LITERAL);
|
||||
const auto* hasFrac = dict.findEntry("valueFraction", keyType::LITERAL);
|
||||
fvPatchField<vector>::operator=
|
||||
(
|
||||
vectorField("value", dict, p.size())
|
||||
);
|
||||
|
||||
if (hasRefValue && hasFrac)
|
||||
if (dict.found("refValue") && dict.found("valueFraction"))
|
||||
{
|
||||
this->refValue().assign(*hasRefValue, p.size());
|
||||
this->valueFraction().assign(*hasFrac, p.size());
|
||||
this->refValue() = vectorField("refValue", dict, p.size());
|
||||
this->valueFraction() =
|
||||
scalarField("valueFraction", dict, p.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -152,9 +155,12 @@ void Foam::maxwellSlipUFvPatchVectorField::updateCoeffs()
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& pmu = patch().lookupPatchField<volScalarField>(muName_);
|
||||
const auto& prho = patch().lookupPatchField<volScalarField>(rhoName_);
|
||||
const auto& ppsi = patch().lookupPatchField<volScalarField>(psiName_);
|
||||
const fvPatchScalarField& pmu =
|
||||
patch().lookupPatchField<volScalarField, scalar>(muName_);
|
||||
const fvPatchScalarField& prho =
|
||||
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
|
||||
const fvPatchField<scalar>& ppsi =
|
||||
patch().lookupPatchField<volScalarField, scalar>(psiName_);
|
||||
|
||||
Field<scalar> C1
|
||||
(
|
||||
@ -181,8 +187,8 @@ void Foam::maxwellSlipUFvPatchVectorField::updateCoeffs()
|
||||
|
||||
if (curvature_)
|
||||
{
|
||||
const auto& ptauMC =
|
||||
patch().lookupPatchField<volTensorField>(tauMCName_);
|
||||
const fvPatchTensorField& ptauMC =
|
||||
patch().lookupPatchField<volTensorField, tensor>(tauMCName_);
|
||||
vectorField n(patch().nf());
|
||||
|
||||
refValue() -= C1/prho*transform(I - n*n, (n & ptauMC));
|
||||
@ -194,7 +200,7 @@ void Foam::maxwellSlipUFvPatchVectorField::updateCoeffs()
|
||||
|
||||
void Foam::maxwellSlipUFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchField<vector>::write(os);
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeEntryIfDifferent<word>("T", "T", TName_);
|
||||
os.writeEntryIfDifferent<word>("rho", "rho", rhoName_);
|
||||
os.writeEntryIfDifferent<word>("psi", "thermo:psi", psiName_);
|
||||
@ -209,7 +215,7 @@ void Foam::maxwellSlipUFvPatchVectorField::write(Ostream& os) const
|
||||
refValue().writeEntry("refValue", os);
|
||||
valueFraction().writeEntry("valueFraction", os);
|
||||
|
||||
fvPatchField<vector>::writeValueEntry(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -118,6 +118,15 @@ public:
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchVectorField> clone() const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new maxwellSlipUFvPatchVectorField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
maxwellSlipUFvPatchVectorField
|
||||
(
|
||||
@ -125,19 +134,16 @@ public:
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Return a clone
|
||||
virtual tmp<fvPatchField<vector>> clone() const
|
||||
{
|
||||
return fvPatchField<vector>::Clone(*this);
|
||||
}
|
||||
|
||||
//- Clone with an internal field reference
|
||||
virtual tmp<fvPatchField<vector>> clone
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchVectorField> clone
|
||||
(
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return fvPatchField<vector>::Clone(*this, iF);
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new maxwellSlipUFvPatchVectorField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -104,8 +104,11 @@ void Foam::fixedRhoFvPatchScalarField::updateCoeffs()
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& psip = patch().lookupPatchField<volScalarField>(psiName_);
|
||||
const auto& pp = patch().lookupPatchField<volScalarField>(pName_);
|
||||
const fvPatchField<scalar>& psip =
|
||||
patch().lookupPatchField<volScalarField, scalar>(psiName_);
|
||||
|
||||
const fvPatchField<scalar>& pp =
|
||||
patch().lookupPatchField<volScalarField, scalar>(pName_);
|
||||
|
||||
operator==(psip*pp);
|
||||
|
||||
@ -115,10 +118,11 @@ void Foam::fixedRhoFvPatchScalarField::updateCoeffs()
|
||||
|
||||
void Foam::fixedRhoFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchField<scalar>::write(os);
|
||||
fvPatchScalarField::write(os);
|
||||
|
||||
os.writeEntryIfDifferent<word>("p", "p", pName_);
|
||||
os.writeEntryIfDifferent<word>("psi", "thermo:psi", psiName_);
|
||||
fvPatchField<scalar>::writeValueEntry(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -135,6 +135,15 @@ public:
|
||||
const fixedRhoFvPatchScalarField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new fixedRhoFvPatchScalarField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
fixedRhoFvPatchScalarField
|
||||
(
|
||||
@ -142,19 +151,16 @@ public:
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Return a clone
|
||||
virtual tmp<fvPatchField<scalar>> clone() const
|
||||
{
|
||||
return fvPatchField<scalar>::Clone(*this);
|
||||
}
|
||||
|
||||
//- Clone with an internal field reference
|
||||
virtual tmp<fvPatchField<scalar>> clone
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return fvPatchField<scalar>::Clone(*this, iF);
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new fixedRhoFvPatchScalarField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
@ -18,7 +18,4 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lrhoCentralFoam \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh
|
||||
-lcompressibleTurbulenceModels
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
volScalarField& p = thermo.p();
|
||||
const volScalarField& T = thermo.T();
|
||||
const volScalarField& psi = thermo.psi();
|
||||
const volScalarField& mu = thermo.mu();
|
||||
|
||||
bool inviscid(true);
|
||||
if (max(thermo.mu().cref().primitiveField()) > 0.0)
|
||||
if (max(mu.primitiveField()) > 0.0)
|
||||
{
|
||||
inviscid = false;
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ tmp<GeometricField<Type, fvsPatchField, surfaceMesh>> interpolate
|
||||
vf,
|
||||
dir,
|
||||
"reconstruct("
|
||||
+ (reconFieldName.empty() ? vf.name() : reconFieldName)
|
||||
+ (reconFieldName != word::null ? reconFieldName : vf.name())
|
||||
+ ')'
|
||||
)
|
||||
);
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
rhoCentralDyMFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/rhoCentralDyMFoam
|
||||
@ -0,0 +1,26 @@
|
||||
EXE_INC = \
|
||||
-I.. \
|
||||
-I../BCs/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-lfvOptions \
|
||||
-lmeshTools \
|
||||
-lcompressibleTransportModels \
|
||||
-lfluidThermophysicalModels \
|
||||
-lspecie \
|
||||
-lrhoCentralFoam \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-ldynamicMesh \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh
|
||||
@ -0,0 +1,288 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
-------------------------------------------------------------------------------
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
Application
|
||||
rhoCentralDyMFoam
|
||||
|
||||
Group
|
||||
grpCompressibleSolvers grpMovingMeshSolvers
|
||||
|
||||
Description
|
||||
Density-based compressible flow solver based on central-upwind
|
||||
schemes of Kurganov and Tadmor
|
||||
with support for mesh-motion and topology changes.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "psiThermo.H"
|
||||
#include "turbulentFluidThermoModel.H"
|
||||
#include "fixedRhoFvPatchScalarField.H"
|
||||
#include "directionInterpolate.H"
|
||||
#include "localEulerDdtScheme.H"
|
||||
#include "fvcSmooth.H"
|
||||
#include "motionSolver.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList::addNote
|
||||
(
|
||||
"Density-based compressible flow solver based on central-upwind"
|
||||
" schemes of Kurganov and Tadmor.\n"
|
||||
"With support for mesh-motion and topology changes."
|
||||
);
|
||||
|
||||
#define NO_CONTROL
|
||||
#include "postProcess.H"
|
||||
|
||||
#include "setRootCaseLists.H"
|
||||
#include "createTime.H"
|
||||
#include "createDynamicFvMesh.H"
|
||||
#include "createFields.H"
|
||||
#include "createFieldRefs.H"
|
||||
#include "createTimeControls.H"
|
||||
|
||||
turbulence->validate();
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "readFluxScheme.H"
|
||||
|
||||
const dimensionedScalar v_zero(dimVolume/dimTime, Zero);
|
||||
|
||||
// Courant numbers used to adjust the time-step
|
||||
scalar CoNum = 0.0;
|
||||
scalar meanCoNum = 0.0;
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readTimeControls.H"
|
||||
#include "setDeltaT.H"
|
||||
|
||||
++runTime;
|
||||
|
||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||
|
||||
// Do any mesh changes
|
||||
mesh.update();
|
||||
|
||||
// --- Directed interpolation of primitive fields onto faces
|
||||
|
||||
surfaceScalarField rho_pos(interpolate(rho, pos));
|
||||
surfaceScalarField rho_neg(interpolate(rho, neg));
|
||||
|
||||
surfaceVectorField rhoU_pos(interpolate(rhoU, pos, U.name()));
|
||||
surfaceVectorField rhoU_neg(interpolate(rhoU, neg, U.name()));
|
||||
|
||||
volScalarField rPsi("rPsi", 1.0/psi);
|
||||
surfaceScalarField rPsi_pos(interpolate(rPsi, pos, T.name()));
|
||||
surfaceScalarField rPsi_neg(interpolate(rPsi, neg, T.name()));
|
||||
|
||||
surfaceScalarField e_pos(interpolate(e, pos, T.name()));
|
||||
surfaceScalarField e_neg(interpolate(e, neg, T.name()));
|
||||
|
||||
surfaceVectorField U_pos("U_pos", rhoU_pos/rho_pos);
|
||||
surfaceVectorField U_neg("U_neg", rhoU_neg/rho_neg);
|
||||
|
||||
surfaceScalarField p_pos("p_pos", rho_pos*rPsi_pos);
|
||||
surfaceScalarField p_neg("p_neg", rho_neg*rPsi_neg);
|
||||
|
||||
surfaceScalarField phiv_pos("phiv_pos", U_pos & mesh.Sf());
|
||||
surfaceScalarField phiv_neg("phiv_neg", U_neg & mesh.Sf());
|
||||
|
||||
// Make fluxes relative to mesh-motion
|
||||
if (mesh.moving())
|
||||
{
|
||||
phiv_pos -= mesh.phi();
|
||||
phiv_neg -= mesh.phi();
|
||||
}
|
||||
// Note: extracted out the orientation so becomes unoriented
|
||||
phiv_pos.setOriented(false);
|
||||
phiv_neg.setOriented(false);
|
||||
|
||||
volScalarField c("c", sqrt(thermo.Cp()/thermo.Cv()*rPsi));
|
||||
surfaceScalarField cSf_pos
|
||||
(
|
||||
"cSf_pos",
|
||||
interpolate(c, pos, T.name())*mesh.magSf()
|
||||
);
|
||||
surfaceScalarField cSf_neg
|
||||
(
|
||||
"cSf_neg",
|
||||
interpolate(c, neg, T.name())*mesh.magSf()
|
||||
);
|
||||
|
||||
surfaceScalarField ap
|
||||
(
|
||||
"ap",
|
||||
max(max(phiv_pos + cSf_pos, phiv_neg + cSf_neg), v_zero)
|
||||
);
|
||||
surfaceScalarField am
|
||||
(
|
||||
"am",
|
||||
min(min(phiv_pos - cSf_pos, phiv_neg - cSf_neg), v_zero)
|
||||
);
|
||||
|
||||
surfaceScalarField a_pos("a_pos", ap/(ap - am));
|
||||
|
||||
surfaceScalarField amaxSf("amaxSf", max(mag(am), mag(ap)));
|
||||
|
||||
surfaceScalarField aSf("aSf", am*a_pos);
|
||||
|
||||
if (fluxScheme == "Tadmor")
|
||||
{
|
||||
aSf = -0.5*amaxSf;
|
||||
a_pos = 0.5;
|
||||
}
|
||||
|
||||
surfaceScalarField a_neg("a_neg", 1.0 - a_pos);
|
||||
|
||||
phiv_pos *= a_pos;
|
||||
phiv_neg *= a_neg;
|
||||
|
||||
surfaceScalarField aphiv_pos("aphiv_pos", phiv_pos - aSf);
|
||||
surfaceScalarField aphiv_neg("aphiv_neg", phiv_neg + aSf);
|
||||
|
||||
// Reuse amaxSf for the maximum positive and negative fluxes
|
||||
// estimated by the central scheme
|
||||
amaxSf = max(mag(aphiv_pos), mag(aphiv_neg));
|
||||
|
||||
#include "centralCourantNo.H"
|
||||
|
||||
phi = aphiv_pos*rho_pos + aphiv_neg*rho_neg;
|
||||
|
||||
surfaceVectorField phiU(aphiv_pos*rhoU_pos + aphiv_neg*rhoU_neg);
|
||||
// Note: reassembled orientation from the pos and neg parts so becomes
|
||||
// oriented
|
||||
phiU.setOriented(true);
|
||||
|
||||
surfaceVectorField phiUp(phiU + (a_pos*p_pos + a_neg*p_neg)*mesh.Sf());
|
||||
|
||||
surfaceScalarField phiEp
|
||||
(
|
||||
"phiEp",
|
||||
aphiv_pos*(rho_pos*(e_pos + 0.5*magSqr(U_pos)) + p_pos)
|
||||
+ aphiv_neg*(rho_neg*(e_neg + 0.5*magSqr(U_neg)) + p_neg)
|
||||
+ aSf*p_pos - aSf*p_neg
|
||||
);
|
||||
|
||||
// Make flux for pressure-work absolute
|
||||
if (mesh.moving())
|
||||
{
|
||||
surfaceScalarField phia(a_pos*p_pos + a_neg*p_neg);
|
||||
phia.setOriented(true);
|
||||
|
||||
phiEp += mesh.phi()*phia;
|
||||
}
|
||||
|
||||
volScalarField muEff("muEff", turbulence->muEff());
|
||||
volTensorField tauMC("tauMC", muEff*dev2(Foam::T(fvc::grad(U))));
|
||||
|
||||
// --- Solve density
|
||||
solve(fvm::ddt(rho) + fvc::div(phi));
|
||||
|
||||
// --- Solve momentum
|
||||
solve(fvm::ddt(rhoU) + fvc::div(phiUp));
|
||||
|
||||
U.ref() =
|
||||
rhoU()
|
||||
/rho();
|
||||
U.correctBoundaryConditions();
|
||||
rhoU.boundaryFieldRef() == rho.boundaryField()*U.boundaryField();
|
||||
|
||||
if (!inviscid)
|
||||
{
|
||||
solve
|
||||
(
|
||||
fvm::ddt(rho, U) - fvc::ddt(rho, U)
|
||||
- fvm::laplacian(muEff, U)
|
||||
- fvc::div(tauMC)
|
||||
);
|
||||
rhoU = rho*U;
|
||||
}
|
||||
|
||||
// --- Solve energy
|
||||
surfaceScalarField sigmaDotU
|
||||
(
|
||||
"sigmaDotU",
|
||||
(
|
||||
fvc::interpolate(muEff)*mesh.magSf()*fvc::snGrad(U)
|
||||
+ fvc::dotInterpolate(mesh.Sf(), tauMC)
|
||||
)
|
||||
& (a_pos*U_pos + a_neg*U_neg)
|
||||
);
|
||||
|
||||
solve
|
||||
(
|
||||
fvm::ddt(rhoE)
|
||||
+ fvc::div(phiEp)
|
||||
- fvc::div(sigmaDotU)
|
||||
);
|
||||
|
||||
e = rhoE/rho - 0.5*magSqr(U);
|
||||
e.correctBoundaryConditions();
|
||||
thermo.correct();
|
||||
rhoE.boundaryFieldRef() ==
|
||||
rho.boundaryField()*
|
||||
(
|
||||
e.boundaryField() + 0.5*magSqr(U.boundaryField())
|
||||
);
|
||||
|
||||
if (!inviscid)
|
||||
{
|
||||
solve
|
||||
(
|
||||
fvm::ddt(rho, e) - fvc::ddt(rho, e)
|
||||
- fvm::laplacian(turbulence->alphaEff(), e)
|
||||
);
|
||||
thermo.correct();
|
||||
rhoE = rho*(e + 0.5*magSqr(U));
|
||||
}
|
||||
|
||||
p.ref() =
|
||||
rho()
|
||||
/psi();
|
||||
p.correctBoundaryConditions();
|
||||
rho.boundaryFieldRef() == psi.boundaryField()*p.boundaryField();
|
||||
|
||||
turbulence->correct();
|
||||
|
||||
runTime.write();
|
||||
|
||||
runTime.printExecutionTime(Info);
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -6,7 +6,6 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2021 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -31,14 +30,12 @@ Group
|
||||
grpCompressibleSolvers
|
||||
|
||||
Description
|
||||
Density-based compressible flow solver based on
|
||||
central-upwind schemes of Kurganov and Tadmor with
|
||||
support for mesh-motion and topology changes.
|
||||
Density-based compressible flow solver based on central-upwind
|
||||
schemes of Kurganov and Tadmor.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "psiThermo.H"
|
||||
#include "turbulentFluidThermoModel.H"
|
||||
#include "fixedRhoFvPatchScalarField.H"
|
||||
@ -52,9 +49,8 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
argList::addNote
|
||||
(
|
||||
"Density-based compressible flow solver based on"
|
||||
" central-upwind schemes of Kurganov and Tadmor with"
|
||||
" support for mesh-motion and topology changes."
|
||||
"Density-based compressible flow solver based on central-upwind"
|
||||
" schemes of Kurganov and Tadmor."
|
||||
);
|
||||
|
||||
#define NO_CONTROL
|
||||
@ -63,7 +59,7 @@ int main(int argc, char *argv[])
|
||||
#include "addCheckCaseOptions.H"
|
||||
#include "setRootCaseLists.H"
|
||||
#include "createTime.H"
|
||||
#include "createDynamicFvMesh.H"
|
||||
#include "createMesh.H"
|
||||
#include "createFields.H"
|
||||
#include "createFieldRefs.H"
|
||||
#include "createTimeControls.H"
|
||||
@ -84,18 +80,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readTimeControls.H"
|
||||
|
||||
if (!LTS)
|
||||
{
|
||||
#include "setDeltaT.H"
|
||||
|
||||
++runTime;
|
||||
|
||||
// Do any mesh changes
|
||||
mesh.update();
|
||||
}
|
||||
|
||||
// --- Directed interpolation of primitive fields onto faces
|
||||
|
||||
surfaceScalarField rho_pos(interpolate(rho, pos));
|
||||
@ -123,15 +107,6 @@ int main(int argc, char *argv[])
|
||||
surfaceScalarField phiv_neg("phiv_neg", U_neg & mesh.Sf());
|
||||
phiv_neg.setOriented(false);
|
||||
|
||||
// Make fluxes relative to mesh-motion
|
||||
if (mesh.moving())
|
||||
{
|
||||
surfaceScalarField meshPhi(mesh.phi());
|
||||
meshPhi.setOriented(false);
|
||||
phiv_pos -= meshPhi;
|
||||
phiv_neg -= meshPhi;
|
||||
}
|
||||
|
||||
volScalarField c("c", sqrt(thermo.Cp()/thermo.Cv()*rPsi));
|
||||
surfaceScalarField cSf_pos
|
||||
(
|
||||
@ -182,13 +157,18 @@ int main(int argc, char *argv[])
|
||||
amaxSf = max(mag(aphiv_pos), mag(aphiv_neg));
|
||||
|
||||
#include "centralCourantNo.H"
|
||||
#include "readTimeControls.H"
|
||||
|
||||
if (LTS)
|
||||
{
|
||||
#include "setRDeltaT.H"
|
||||
|
||||
++runTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
#include "setDeltaT.H"
|
||||
}
|
||||
|
||||
++runTime;
|
||||
|
||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||
|
||||
@ -209,14 +189,6 @@ int main(int argc, char *argv[])
|
||||
+ aSf*p_pos - aSf*p_neg
|
||||
);
|
||||
|
||||
// Make flux for pressure-work absolute
|
||||
if (mesh.moving())
|
||||
{
|
||||
surfaceScalarField meshPhi(mesh.phi());
|
||||
meshPhi.setOriented(false);
|
||||
phiEp += meshPhi*(a_pos*p_pos + a_neg*p_neg);
|
||||
}
|
||||
|
||||
volScalarField muEff("muEff", turbulence->muEff());
|
||||
volTensorField tauMC("tauMC", muEff*dev2(Foam::T(fvc::grad(U))));
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/transportModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
@ -17,5 +17,4 @@ EXE_LIBS = \
|
||||
-lfluidThermophysicalModels \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools
|
||||
-lcompressibleTurbulenceModels
|
||||
|
||||
@ -63,7 +63,7 @@
|
||||
fvOptions(psi, p, rho.name())
|
||||
);
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
// Rhie & Chow interpolation (part 2)
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
|
||||
@ -9,7 +9,7 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/regionFaModels/lnInclude
|
||||
-I$(LIB_SRC)/regionFaModels\lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
@ -20,11 +20,9 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-ldynamicMesh \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh \
|
||||
-lsampling \
|
||||
-latmosphericModels \
|
||||
-lregionFaModels \
|
||||
-lfiniteArea
|
||||
-lregionFaModels
|
||||
|
||||
@ -21,7 +21,6 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh \
|
||||
-loverset
|
||||
|
||||
@ -29,7 +29,7 @@ if (mesh.changing())
|
||||
wordList pcorrTypes
|
||||
(
|
||||
p.boundaryField().size(),
|
||||
fvPatchFieldBase::zeroGradientType()
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
);
|
||||
|
||||
// Set BCs of pcorr to fixed-value for patches at which p is fixed
|
||||
@ -72,7 +72,7 @@ if (mesh.changing())
|
||||
divrhoU()
|
||||
);
|
||||
|
||||
pcorrEqn.solve(pcorr.select(pimple.finalInnerIter()));
|
||||
pcorrEqn.solve(mesh.solver(pcorr.select(pimple.finalInnerIter())));
|
||||
//Bypass virtual layer
|
||||
//mesh.fvMesh::solve(pcorrEqn, d);
|
||||
|
||||
|
||||
@ -0,0 +1,4 @@
|
||||
bool ddtCorr
|
||||
(
|
||||
pimple.dict().getOrDefault("ddtCorr", true)
|
||||
);
|
||||
@ -69,8 +69,6 @@ mesh.setFluxRequired(p.name());
|
||||
|
||||
// Mask field for zeroing out contributions on hole cells
|
||||
#include "createCellMask.H"
|
||||
// Create bool field with interpolated cells
|
||||
#include "createInterpolatedCells.H"
|
||||
|
||||
Info<< "Creating turbulence model\n" << endl;
|
||||
autoPtr<compressible::turbulenceModel> turbulence
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -43,6 +43,7 @@ Description
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "fluidThermo.H"
|
||||
#include "turbulentFluidThermoModel.H"
|
||||
#include "bound.H"
|
||||
#include "pimpleControl.H"
|
||||
#include "pressureControl.H"
|
||||
#include "CorrectPhi.H"
|
||||
@ -88,8 +89,10 @@ int main(int argc, char *argv[])
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readControls.H"
|
||||
#include "readDyMControls.H"
|
||||
|
||||
|
||||
// Store divrhoU from the previous mesh so that it can be mapped
|
||||
// and used in correctPhi to ensure the corrected phi has the
|
||||
// same divergence
|
||||
@ -125,6 +128,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
if (pimple.firstIter() || moveMeshOuterCorrectors)
|
||||
{
|
||||
|
||||
// Do any mesh changes
|
||||
mesh.update();
|
||||
|
||||
@ -133,22 +137,52 @@ int main(int argc, char *argv[])
|
||||
MRF.update();
|
||||
|
||||
#include "setCellMask.H"
|
||||
#include "setInterpolatedCells.H"
|
||||
#include "correctRhoPhiFaceMask.H"
|
||||
|
||||
const surfaceScalarField faceMaskOld
|
||||
(
|
||||
localMin<scalar>(mesh).interpolate(cellMask.oldTime())
|
||||
);
|
||||
|
||||
// Zero Uf on old faceMask (H-I)
|
||||
rhoUf() *= faceMaskOld;
|
||||
|
||||
surfaceVectorField rhoUfint(fvc::interpolate(rho*U));
|
||||
|
||||
// Update Uf and phi on new C-I faces
|
||||
rhoUf() += (1-faceMaskOld)*rhoUfint;
|
||||
|
||||
// Update Uf boundary
|
||||
forAll(rhoUf().boundaryField(), patchI)
|
||||
{
|
||||
rhoUf().boundaryFieldRef()[patchI] =
|
||||
rhoUfint.boundaryField()[patchI];
|
||||
}
|
||||
|
||||
// Calculate absolute flux from the mapped surface velocity
|
||||
phi = mesh.Sf() & rhoUf();
|
||||
|
||||
if (correctPhi)
|
||||
{
|
||||
// Corrects flux on separated regions
|
||||
#include "correctPhi.H"
|
||||
}
|
||||
|
||||
// Zero phi on current H-I
|
||||
const surfaceScalarField faceMask
|
||||
(
|
||||
localMin<scalar>(mesh).interpolate(cellMask)
|
||||
);
|
||||
|
||||
phi *= faceMask;
|
||||
U *= cellMask;
|
||||
|
||||
// Make the fluxes relative to the mesh-motion
|
||||
fvc::makeRelative(phi, rho, U);
|
||||
|
||||
if (checkMeshCourantNo)
|
||||
{
|
||||
#include "meshCourantNo.H"
|
||||
}
|
||||
}
|
||||
|
||||
if (checkMeshCourantNo)
|
||||
{
|
||||
#include "meshCourantNo.H"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,17 @@ surfaceScalarField phiHbyA
|
||||
fvc::interpolate(rho)*fvc::flux(HbyA)
|
||||
);
|
||||
|
||||
if (ddtCorr)
|
||||
{
|
||||
surfaceScalarField faceMaskOld
|
||||
(
|
||||
localMin<scalar>(mesh).interpolate(cellMask.oldTime())
|
||||
);
|
||||
|
||||
phiHbyA +=
|
||||
faceMaskOld*MRF.zeroFilter(rhorAUf*fvc::ddtCorr(rho, U, phi, rhoUf));
|
||||
}
|
||||
|
||||
fvc::makeRelative(phiHbyA, rho, U);
|
||||
MRF.makeRelative(fvc::interpolate(rho), phiHbyA);
|
||||
|
||||
@ -56,7 +67,7 @@ if (pimple.transonic())
|
||||
// Relax the pressure equation to ensure diagonal-dominance
|
||||
pEqn.relax();
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -78,7 +89,7 @@ else
|
||||
{
|
||||
fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAUf, p));
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -123,4 +134,8 @@ if (thermo.dpdt())
|
||||
}
|
||||
}
|
||||
|
||||
surfaceScalarField faceMask
|
||||
(
|
||||
localMin<scalar>(mesh).interpolate(cellMask)
|
||||
);
|
||||
phi *= faceMask;
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
#include "readTimeControls.H"
|
||||
|
||||
correctPhi = pimple.dict().getOrDefault("correctPhi", false);
|
||||
|
||||
checkMeshCourantNo =
|
||||
pimple.dict().getOrDefault("checkMeshCourantNo", false);
|
||||
|
||||
|
||||
ddtCorr = pimple.dict().getOrDefault("ddtCorr", true);
|
||||
@ -54,7 +54,7 @@ if (pimple.transonic())
|
||||
// Relax the pressure equation to ensure diagonal-dominance
|
||||
pEqn.relax();
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -76,7 +76,7 @@ else
|
||||
{
|
||||
fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAUf, p));
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -65,7 +65,7 @@ if (pimple.transonic())
|
||||
// Relax the pressure equation to ensure diagonal-dominance
|
||||
pEqn.relax();
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -90,7 +90,7 @@ else
|
||||
{
|
||||
fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAtU, p));
|
||||
|
||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -7,7 +7,7 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
|
||||
-I$(LIB_SRC)/regionFaModels/lnInclude
|
||||
-I$(LIB_SRC)/regionFaModels\lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
@ -19,7 +19,5 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-latmosphericModels \
|
||||
-lregionFaModels \
|
||||
-lfiniteArea
|
||||
-lregionFaModels
|
||||
|
||||
@ -21,7 +21,6 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh \
|
||||
-lsampling \
|
||||
|
||||
@ -1,52 +1,22 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
|
||||
Info<< "Create dynamic mesh for time = "
|
||||
<< runTime.timeName() << nl << endl;
|
||||
|
||||
Description
|
||||
Create a dynamicFvMesh, with init()
|
||||
|
||||
Required Variables
|
||||
- runTime [Time]
|
||||
|
||||
Provided Variables
|
||||
- mesh [dynamicFvMesh], meshPtr
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
Foam::autoPtr<Foam::dynamicFvMesh> meshPtr;
|
||||
|
||||
{
|
||||
Foam::Info << "Create dynamic mesh for time = "
|
||||
<< runTime.timeName() << Foam::nl;
|
||||
|
||||
meshPtr = dynamicFvMesh::New
|
||||
autoPtr<dynamicFvMesh> meshPtr
|
||||
(
|
||||
IOobject
|
||||
dynamicFvMesh::New
|
||||
(
|
||||
polyMesh::defaultRegion,
|
||||
runTime.timeName(),
|
||||
runTime,
|
||||
IOobject::MUST_READ
|
||||
IOobject
|
||||
(
|
||||
polyMesh::defaultRegion,
|
||||
runTime.timeName(),
|
||||
runTime,
|
||||
IOobject::MUST_READ
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
dynamicFvMesh& mesh = meshPtr();
|
||||
|
||||
dynamicFvMesh& mesh = meshPtr();
|
||||
|
||||
// Calculate initial mesh-to-mesh mapping. Note that this should be
|
||||
// done under the hood, e.g. as a MeshObject
|
||||
mesh.update();
|
||||
|
||||
Foam::Info << Foam::endl;
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
// Calculate initial mesh-to-mesh mapping. Note that this should be
|
||||
// done under the hood, e.g. as a MeshObject
|
||||
mesh.update();
|
||||
|
||||
@ -18,5 +18,4 @@ EXE_LIBS = \
|
||||
-lfluidThermophysicalModels \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools
|
||||
-lcompressibleTurbulenceModels
|
||||
|
||||
@ -16,5 +16,4 @@ EXE_LIBS = \
|
||||
-lfluidThermophysicalModels \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools
|
||||
-lcompressibleTurbulenceModels
|
||||
|
||||
@ -21,7 +21,6 @@ EXE_LIBS = \
|
||||
-lspecie \
|
||||
-lturbulenceModels \
|
||||
-lcompressibleTurbulenceModels \
|
||||
-lthermoTools \
|
||||
-ldynamicMesh \
|
||||
-ldynamicFvMesh \
|
||||
-ltopoChangerFvMesh \
|
||||
|
||||
@ -127,7 +127,7 @@ int main(int argc, char *argv[])
|
||||
);
|
||||
|
||||
pEqn.setReference(pRefCell, pRefValue);
|
||||
pEqn.solve(p.select(piso.finalInnerIter()));
|
||||
pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));
|
||||
|
||||
if (piso.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -167,7 +167,7 @@ int main(int argc, char *argv[])
|
||||
fvm::laplacian(rABf, pB) == fvc::div(phiB)
|
||||
);
|
||||
|
||||
pBEqn.solve(pB.select(bpiso.finalInnerIter()));
|
||||
pBEqn.solve(mesh.solver(pB.select(bpiso.finalInnerIter())));
|
||||
|
||||
if (bpiso.finalNonOrthogonalIter())
|
||||
{
|
||||
|
||||
@ -4,10 +4,10 @@
|
||||
sqrt
|
||||
(
|
||||
2*M_PI*sigma*sqr(aMesh.edgeInterpolation::deltaCoeffs())
|
||||
*mag(aMesh.edgeInterpolation::deltaCoeffs())
|
||||
*aMesh.edgeInterpolation::deltaCoeffs()
|
||||
/rhol
|
||||
)
|
||||
).value()*runTime.deltaTValue();
|
||||
).value()*runTime.deltaT().value();
|
||||
|
||||
Info<< "Max Capillary Courant Number = " << CoNumSigma << '\n' << endl;
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
(
|
||||
"h",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -20,7 +20,7 @@
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -34,7 +34,7 @@
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -48,7 +48,7 @@
|
||||
(
|
||||
"phi2s",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -67,7 +67,7 @@
|
||||
(
|
||||
"Sm",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
@ -82,7 +82,7 @@
|
||||
(
|
||||
"Sd",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
@ -96,7 +96,7 @@
|
||||
(
|
||||
"Sg",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
@ -112,7 +112,7 @@
|
||||
(
|
||||
"ps",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -134,7 +134,7 @@
|
||||
(
|
||||
"manningField",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -147,7 +147,7 @@
|
||||
(
|
||||
"frictionFactor",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
|
||||
@ -1,13 +1,10 @@
|
||||
// Volume-to surface mapping object
|
||||
const volSurfaceMapping vsm(aMesh);
|
||||
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -22,10 +19,13 @@ volScalarField H
|
||||
(
|
||||
"H",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar(dimLength, Zero)
|
||||
);
|
||||
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
|
||||
@ -87,13 +87,7 @@ int main(int argc, char *argv[])
|
||||
(
|
||||
fam::ddt(h, Us)
|
||||
+ fam::div(phi2s, Us)
|
||||
+ fam::Sp
|
||||
(
|
||||
0.0125
|
||||
*frictionFactor.internalField()
|
||||
*mag(Us.internalField()),
|
||||
Us
|
||||
)
|
||||
+ fam::Sp(0.0125*frictionFactor*mag(Us), Us)
|
||||
==
|
||||
Gs*h
|
||||
- fam::Sp(Sd, Us)
|
||||
|
||||
@ -47,10 +47,10 @@ if (aMesh.nInternalEdges())
|
||||
);
|
||||
|
||||
CoNum = max(SfUfbyDelta/aMesh.magLe())
|
||||
.value()*runTime.deltaTValue();
|
||||
.value()*runTime.deltaT().value();
|
||||
|
||||
meanCoNum = (sum(SfUfbyDelta)/sum(aMesh.magLe()))
|
||||
.value()*runTime.deltaTValue();
|
||||
.value()*runTime.deltaT().value();
|
||||
|
||||
velMag = max(mag(phis)/aMesh.magLe()).value();
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@ areaScalarField Cs
|
||||
(
|
||||
"Cs",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -26,7 +26,7 @@ areaVectorField Us
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
@ -47,7 +47,6 @@ forAll(Us, faceI)
|
||||
Us[faceI].z() =
|
||||
Uinf.value()*0.25*R[faceI].x()*R[faceI].z()/sqr(mag(R[faceI]));
|
||||
}
|
||||
Us.boundaryFieldRef().evaluateCoupled<coupledFaPatch>();
|
||||
|
||||
Us -= aMesh.faceAreaNormals()*(aMesh.faceAreaNormals() & Us);
|
||||
|
||||
@ -58,7 +57,7 @@ edgeScalarField phis
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
// Create Finite Area mesh
|
||||
faMesh aMesh(mesh);
|
||||
@ -1,5 +1,5 @@
|
||||
// Volume-to surface mapping object
|
||||
const volSurfaceMapping vsm(aMesh);
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
|
||||
volScalarField Cvf
|
||||
(
|
||||
@ -7,7 +7,7 @@
|
||||
(
|
||||
"Cvf",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -24,7 +24,7 @@
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
|
||||
@ -5,7 +5,7 @@ areaScalarField Cs
|
||||
(
|
||||
"Cs",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -37,7 +37,7 @@ areaVectorField Us
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
@ -51,7 +51,7 @@ edgeScalarField phis
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
aMesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
// Create Finite Area mesh
|
||||
faMesh aMesh(mesh);
|
||||
@ -1,5 +1,5 @@
|
||||
// Volume-to surface mapping object
|
||||
const volSurfaceMapping vsm(aMesh);
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
|
||||
volScalarField Cvf
|
||||
(
|
||||
@ -7,7 +7,7 @@
|
||||
(
|
||||
"Cvf",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
@ -24,7 +24,7 @@
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh.thisDb(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
EXE_INC = \
|
||||
-I../buoyantBoussinesqSimpleFoam \
|
||||
-I../../incompressible/pimpleFoam \
|
||||
-I$(LIB_SRC)/sampling/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels \
|
||||
@ -16,8 +13,6 @@ EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-lfvOptions \
|
||||
-lmeshTools \
|
||||
-ldynamicMesh \
|
||||
-ldynamicFvMesh \
|
||||
-lsampling \
|
||||
-lturbulenceModels \
|
||||
-lincompressibleTurbulenceModels \
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2021 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -31,8 +30,7 @@ Group
|
||||
grpHeatTransferSolvers
|
||||
|
||||
Description
|
||||
Transient solver for buoyant, turbulent flow of incompressible fluids,
|
||||
with optional mesh motion and mesh topology changes.
|
||||
Transient solver for buoyant, turbulent flow of incompressible fluids.
|
||||
|
||||
Uses the Boussinesq approximation:
|
||||
\f[
|
||||
@ -53,11 +51,9 @@ Description
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "singlePhaseTransportModel.H"
|
||||
#include "turbulentTransportModel.H"
|
||||
#include "radiationModel.H"
|
||||
#include "CorrectPhi.H"
|
||||
#include "fvOptions.H"
|
||||
#include "pimpleControl.H"
|
||||
|
||||
@ -68,8 +64,7 @@ int main(int argc, char *argv[])
|
||||
argList::addNote
|
||||
(
|
||||
"Transient solver for buoyant, turbulent flow"
|
||||
" of incompressible fluids, with optional mesh"
|
||||
" motion and mesh topology changes.\n"
|
||||
" of incompressible fluids.\n"
|
||||
"Uses the Boussinesq approximation."
|
||||
);
|
||||
|
||||
@ -78,10 +73,10 @@ int main(int argc, char *argv[])
|
||||
#include "addCheckCaseOptions.H"
|
||||
#include "setRootCaseLists.H"
|
||||
#include "createTime.H"
|
||||
#include "createDynamicFvMesh.H"
|
||||
#include "createDyMControls.H"
|
||||
#include "createMesh.H"
|
||||
#include "createControl.H"
|
||||
#include "createFields.H"
|
||||
#include "createUfIfPresent.H"
|
||||
#include "createTimeControls.H"
|
||||
#include "CourantNo.H"
|
||||
#include "setInitialDeltaT.H"
|
||||
#include "initContinuityErrs.H"
|
||||
@ -94,7 +89,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readDyMControls.H"
|
||||
#include "readTimeControls.H"
|
||||
#include "CourantNo.H"
|
||||
#include "setDeltaT.H"
|
||||
|
||||
@ -105,34 +100,6 @@ int main(int argc, char *argv[])
|
||||
// --- Pressure-velocity PIMPLE corrector loop
|
||||
while (pimple.loop())
|
||||
{
|
||||
if (pimple.firstIter() || moveMeshOuterCorrectors)
|
||||
{
|
||||
// Do any mesh changes
|
||||
mesh.controlledUpdate();
|
||||
|
||||
if (mesh.changing())
|
||||
{
|
||||
MRF.update();
|
||||
|
||||
if (correctPhi)
|
||||
{
|
||||
// Calculate absolute flux
|
||||
// from the mapped surface velocity
|
||||
phi = mesh.Sf() & Uf();
|
||||
|
||||
#include "correctPhi.H"
|
||||
|
||||
// Make the flux relative to the mesh motion
|
||||
fvc::makeRelative(phi, U);
|
||||
}
|
||||
|
||||
if (checkMeshCourantNo)
|
||||
{
|
||||
#include "meshCourantNo.H"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "UEqn.H"
|
||||
#include "TEqn.H"
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
|
||||
p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell));
|
||||
|
||||
p_rghEqn.solve(p_rgh.select(pimple.finalInnerIter()));
|
||||
p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
@ -42,12 +42,6 @@
|
||||
U = HbyA + rAU*fvc::reconstruct((phig - p_rghEqn.flux())/rAUf);
|
||||
U.correctBoundaryConditions();
|
||||
fvOptions.correct(U);
|
||||
|
||||
// Correct Uf if the mesh is moving
|
||||
fvc::correctUf(Uf, U, phi);
|
||||
|
||||
// Make the fluxes relative to the mesh motion
|
||||
fvc::makeRelative(phi, U);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user