Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Development
openfoam
Commits
b18dd0cb
Commit
b18dd0cb
authored
Dec 15, 2021
by
Andrew Heather
Browse files
Merge branch 'feature-dynamic-solvers' into 'develop'
ENH: Adding dynamic-mesh motion capabilities to various solvers See merge request
!505
parents
ee36fe8c
18bc876c
Changes
26
Hide whitespace changes
Inline
Side-by-side
applications/solvers/compressible/rhoCentralFoam/Allwclean
View file @
b18dd0cb
...
...
@@ -4,6 +4,5 @@ cd "${0%/*}" || exit # Run from this directory
wclean libso BCs
wclean
wclean rhoCentralDyMFoam
#------------------------------------------------------------------------------
applications/solvers/compressible/rhoCentralFoam/Allwmake
View file @
b18dd0cb
...
...
@@ -5,8 +5,7 @@ cd "${0%/*}" || exit # Run from this directory
(
wmake
$targetType
BCs
\
&&
wmake
$targetType
\
&&
wmake
$targetType
rhoCentralDyMFoam
\
&&
wmake
$targetType
)
#------------------------------------------------------------------------------
applications/solvers/compressible/rhoCentralFoam/Make/options
View file @
b18dd0cb
...
...
@@ -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)/dynamicMesh/lnInclude
-I$(LIB_SRC)/dynamic
Fv
Mesh/lnInclude
EXE_LIBS = \
-lfiniteVolume \
...
...
@@ -18,4 +18,6 @@ EXE_LIBS = \
-lspecie \
-lrhoCentralFoam \
-lturbulenceModels \
-lcompressibleTurbulenceModels
-lcompressibleTurbulenceModels \
-ldynamicFvMesh \
-ltopoChangerFvMesh
applications/solvers/compressible/rhoCentralFoam/rhoCentralDyMFoam/Make/files
deleted
100644 → 0
View file @
ee36fe8c
rhoCentralDyMFoam.C
EXE = $(FOAM_APPBIN)/rhoCentralDyMFoam
applications/solvers/compressible/rhoCentralFoam/rhoCentralDyMFoam/Make/options
deleted
100644 → 0
View file @
ee36fe8c
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
applications/solvers/compressible/rhoCentralFoam/rhoCentralDyMFoam/rhoCentralDyMFoam.C
deleted
100644 → 0
View file @
ee36fe8c
/*---------------------------------------------------------------------------*\
========= |
\\ / 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
<<
"
\n
Starting 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
;
}
// ************************************************************************* //
applications/solvers/compressible/rhoCentralFoam/rhoCentralFoam.C
View file @
b18dd0cb
...
...
@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
...
...
@@ -30,12 +31,14 @@ Group
grpCompressibleSolvers
Description
Density-based compressible flow solver based on central-upwind
schemes of Kurganov and Tadmor.
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"
...
...
@@ -49,8 +52,9 @@ int main(int argc, char *argv[])
{
argList
::
addNote
(
"Density-based compressible flow solver based on central-upwind"
" schemes of Kurganov and Tadmor."
"Density-based compressible flow solver based on"
" central-upwind schemes of Kurganov and Tadmor with"
" support for mesh-motion and topology changes."
);
#define NO_CONTROL
...
...
@@ -59,7 +63,7 @@ int main(int argc, char *argv[])
#include "addCheckCaseOptions.H"
#include "setRootCaseLists.H"
#include "createTime.H"
#include "createMesh.H"
#include "create
DynamicFv
Mesh.H"
#include "createFields.H"
#include "createFieldRefs.H"
#include "createTimeControls.H"
...
...
@@ -80,6 +84,18 @@ 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
));
...
...
@@ -107,6 +123,15 @@ 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
(
...
...
@@ -157,18 +182,13 @@ 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"
}
else
{
#include "setDeltaT.H"
}
++
runTime
;
++
runTime
;
}
Info
<<
"Time = "
<<
runTime
.
timeName
()
<<
nl
<<
endl
;
...
...
@@ -189,6 +209,14 @@ 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
))));
...
...
applications/solvers/heatTransfer/buoyantBoussinesqPimpleFoam/Make/options
View file @
b18dd0cb
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 \
...
...
@@ -13,6 +16,8 @@ EXE_LIBS = \
-lfiniteVolume \
-lfvOptions \
-lmeshTools \
-ldynamicMesh \
-ldynamicFvMesh \
-lsampling \
-lturbulenceModels \
-lincompressibleTurbulenceModels \
...
...
applications/solvers/heatTransfer/buoyantBoussinesqPimpleFoam/buoyantBoussinesqPimpleFoam.C
View file @
b18dd0cb
...
...
@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
...
...
@@ -30,7 +31,8 @@ Group
grpHeatTransferSolvers
Description
Transient solver for buoyant, turbulent flow of incompressible fluids.
Transient solver for buoyant, turbulent flow of incompressible fluids,
with optional mesh motion and mesh topology changes.
Uses the Boussinesq approximation:
\f[
...
...
@@ -51,9 +53,11 @@ 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"
...
...
@@ -64,7 +68,8 @@ int main(int argc, char *argv[])
argList
::
addNote
(
"Transient solver for buoyant, turbulent flow"
" of incompressible fluids.
\n
"
" of incompressible fluids, with optional mesh"
" motion and mesh topology changes.
\n
"
"Uses the Boussinesq approximation."
);
...
...
@@ -73,10 +78,10 @@ int main(int argc, char *argv[])
#include "addCheckCaseOptions.H"
#include "setRootCaseLists.H"
#include "createTime.H"
#include "createMesh.H"
#include "createControl.H"
#include "create
DynamicFv
Mesh.H"
#include "create
DyM
Control
s
.H"
#include "createFields.H"
#include "create
TimeControls
.H"
#include "create
UfIfPresent
.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"
#include "initContinuityErrs.H"
...
...
@@ -89,7 +94,7 @@ int main(int argc, char *argv[])
while
(
runTime
.
run
())
{
#include "read
Time
Controls.H"
#include "read
DyM
Controls.H"
#include "CourantNo.H"
#include "setDeltaT.H"
...
...
@@ -100,6 +105,34 @@ 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"
...
...
applications/solvers/heatTransfer/buoyantBoussinesqPimpleFoam/pEqn.H
View file @
b18dd0cb
...
...
@@ -42,6 +42,12 @@
U
=
HbyA
+
rAU
*
fvc
::
reconstruct
((
phig
-
p_rghEqn
.
flux
())
/
rAUf
);
U
.
correctBoundaryConditions
();
fvOptions
.
correct
(
U
);
// Correct Uf if the mesh is moving