Compare commits
5 Commits
develop.me
...
PDRFoam-rc
| Author | SHA1 | Date | |
|---|---|---|---|
| c5081a26ca | |||
| a8ce8ed6f3 | |||
| 6a78c3c84e | |||
| 30eb0014c7 | |||
| b38802ea0d |
@ -49,10 +49,10 @@
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Providing details of your set-up can help us identify any issues, e.g.
|
Providing details of your set-up can help us identify any issues, e.g.
|
||||||
OpenFOAM version : v2412|v2406|v2312|v2306|v2212 etc
|
OpenFOAM version : v1806|v1812|v1906 etc
|
||||||
Operating system : ubuntu|openSUSE|RedHat etc
|
Operating system : ubuntu|openSUSE|centos etc
|
||||||
Hardware info : any info that may help?
|
Hardware info : any info that may help?
|
||||||
Compiler : gcc|clang etc
|
Compiler : gcc|intel|clang etc
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- OpenFOAM version :
|
- OpenFOAM version :
|
||||||
|
|||||||
10
.gitmodules
vendored
10
.gitmodules
vendored
@ -1,8 +1,8 @@
|
|||||||
[submodule "cfmesh"]
|
[submodule "cfmesh"]
|
||||||
path = plugins/cfmesh
|
path = modules/cfmesh
|
||||||
url = https://develop.openfoam.com/Community/integration-cfmesh.git
|
url = https://develop.openfoam.com/Community/integration-cfmesh.git
|
||||||
[submodule "avalanche"]
|
[submodule "avalanche"]
|
||||||
path = plugins/avalanche
|
path = modules/avalanche
|
||||||
url = https://develop.openfoam.com/Community/avalanche.git
|
url = https://develop.openfoam.com/Community/avalanche.git
|
||||||
[submodule "adios"]
|
[submodule "adios"]
|
||||||
path = modules/adios
|
path = modules/adios
|
||||||
@ -17,9 +17,3 @@
|
|||||||
[submodule "external-solver"]
|
[submodule "external-solver"]
|
||||||
path = modules/external-solver
|
path = modules/external-solver
|
||||||
url = https://develop.openfoam.com/Modules/external-solver.git
|
url = https://develop.openfoam.com/Modules/external-solver.git
|
||||||
[submodule "turbulence-community"]
|
|
||||||
path = plugins/turbulence-community
|
|
||||||
url = https://gitlab.com/openfoam/community/tc-turbulence/turbulence-community.git
|
|
||||||
[submodule "plugins/data-community"]
|
|
||||||
path = plugins/data-community
|
|
||||||
url = https://gitlab.com/openfoam/community/sig-data-modelling/data-community.git
|
|
||||||
|
|||||||
71
Allwmake
71
Allwmake
@ -8,7 +8,7 @@ wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
|
|||||||
}
|
}
|
||||||
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
||||||
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
|
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
|
||||||
echo "Argument parse error"
|
echo "Argument parse error";
|
||||||
else
|
else
|
||||||
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
||||||
echo " Check your OpenFOAM environment and installation"
|
echo " Check your OpenFOAM environment and installation"
|
||||||
@ -23,23 +23,23 @@ else
|
|||||||
echo "mpirun=$(command -v mpirun || true)"
|
echo "mpirun=$(command -v mpirun || true)"
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
# Report compiler information. First non-blank line from --version output
|
# Report compiler information
|
||||||
compiler="$(wmake -show-path-cxx 2>/dev/null || true)"
|
compiler="$(wmake -show-path-cxx 2>/dev/null || true)"
|
||||||
if [ -x "$compiler" ]
|
if [ -x "$compiler" ]
|
||||||
then
|
then
|
||||||
echo "compiler=$compiler"
|
echo "compiler=$compiler"
|
||||||
"$compiler" --version 2>/dev/null | sed -e '/^$/d;q'
|
"$compiler" --version 2>/dev/null | sed -ne '1p'
|
||||||
else
|
else
|
||||||
echo "compiler=unknown"
|
echo "compiler=unknown"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo ========================================
|
echo "========================================"
|
||||||
date "+%Y-%m-%d %H:%M:%S %z" 2>/dev/null || echo "date is unknown"
|
date "+%Y-%m-%d %H:%M:%S %z" 2>/dev/null || echo "date is unknown"
|
||||||
echo "Starting compile ${WM_PROJECT_DIR##*/} ${0##*/}"
|
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 " ${WM_OPTIONS}, with ${WM_MPLIB} ${FOAM_MPI}"
|
||||||
echo ========================================
|
echo "========================================"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Compile tools for wmake
|
# Compile tools for wmake
|
||||||
@ -62,40 +62,27 @@ else
|
|||||||
echo "Skip ThirdParty (no directory)"
|
echo "Skip ThirdParty (no directory)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# OpenFOAM libraries
|
echo "========================================"
|
||||||
|
echo "Compile OpenFOAM libraries"
|
||||||
|
echo
|
||||||
src/Allwmake $targetType $*
|
src/Allwmake $targetType $*
|
||||||
|
|
||||||
# OpenFOAM applications
|
echo "========================================"
|
||||||
|
echo "Compile OpenFOAM applications"
|
||||||
|
echo
|
||||||
applications/Allwmake $targetType $*
|
applications/Allwmake $targetType $*
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
# Additional components/modules
|
||||||
# Additional components
|
if [ "$FOAM_MODULE_PREFIX" = false ]
|
||||||
|
then
|
||||||
|
echo "========================================"
|
||||||
|
echo "OpenFOAM modules disabled (prefix=false)"
|
||||||
|
echo
|
||||||
|
elif [ -d "$WM_PROJECT_DIR/modules" ]
|
||||||
|
then
|
||||||
|
(cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all)
|
||||||
|
fi
|
||||||
|
|
||||||
case "$FOAM_MODULE_PREFIX" in
|
|
||||||
(false | none)
|
|
||||||
echo ========================================
|
|
||||||
echo "OpenFOAM modules disabled (prefix=${FOAM_MODULE_PREFIX})"
|
|
||||||
echo "Can be built separately:"
|
|
||||||
echo
|
|
||||||
echo " ./Allwmake-modules -prefix=..."
|
|
||||||
echo
|
|
||||||
echo ========================================
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
(*)
|
|
||||||
# Use wmake -all instead of Allwmake to allow for overrides
|
|
||||||
( cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all )
|
|
||||||
|
|
||||||
echo ========================================
|
|
||||||
echo "The optional plugins can be built separately:"
|
|
||||||
echo
|
|
||||||
echo " ./Allwmake-plugins -prefix=..."
|
|
||||||
echo
|
|
||||||
echo ========================================
|
|
||||||
echo
|
|
||||||
esac
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
# Count files in given directory. Ignore "Test-*" binaries.
|
# Count files in given directory. Ignore "Test-*" binaries.
|
||||||
_foamCountDirEntries()
|
_foamCountDirEntries()
|
||||||
{
|
{
|
||||||
@ -106,18 +93,16 @@ _foamCountDirEntries()
|
|||||||
# Some summary information
|
# Some summary information
|
||||||
echo
|
echo
|
||||||
date "+%Y-%m-%d %H:%M:%S %z" 2>/dev/null || echo "date is unknown"
|
date "+%Y-%m-%d %H:%M:%S %z" 2>/dev/null || echo "date is unknown"
|
||||||
echo ========================================
|
echo "========================================"
|
||||||
echo " ${WM_PROJECT_DIR##*/}"
|
echo " ${WM_PROJECT_DIR##*/}"
|
||||||
echo " $WM_COMPILER ${WM_COMPILER_TYPE:-system} compiler"
|
echo " $WM_COMPILER ${WM_COMPILER_TYPE:-system} compiler"
|
||||||
echo " ${WM_OPTIONS}, with ${WM_MPLIB} ${FOAM_MPI}"
|
echo " ${WM_OPTIONS}, with ${WM_MPLIB} ${FOAM_MPI}"
|
||||||
echo
|
echo
|
||||||
|
echo " api = $(etc/openfoam -show-api 2>/dev/null)"
|
||||||
# The api/patch information
|
echo " patch = $(etc/openfoam -show-patch 2>/dev/null)"
|
||||||
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 " bin = $(_foamCountDirEntries "$FOAM_APPBIN") entries"
|
|
||||||
echo " lib = $(_foamCountDirEntries "$FOAM_LIBBIN") entries"
|
|
||||||
echo
|
echo
|
||||||
echo ========================================
|
echo "========================================"
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -1,37 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Run from OPENFOAM top-level directory only
|
|
||||||
cd "${0%/*}" || exit
|
|
||||||
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
|
|
||||||
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
|
|
||||||
echo " Check your OpenFOAM environment and installation"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
|
||||||
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
|
|
||||||
echo "Argument parse error"
|
|
||||||
else
|
|
||||||
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
|
||||||
echo " Check your OpenFOAM environment and installation"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
# Additional components
|
|
||||||
|
|
||||||
case "$FOAM_MODULE_PREFIX" in
|
|
||||||
(false | none)
|
|
||||||
echo ========================================
|
|
||||||
echo "OpenFOAM modules disabled (prefix=${FOAM_MODULE_PREFIX})"
|
|
||||||
echo "Can be built separately:"
|
|
||||||
echo
|
|
||||||
echo " ./Allwmake-modules -prefix=..."
|
|
||||||
echo
|
|
||||||
echo ========================================
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
(*)
|
|
||||||
# Use wmake -all instead of Allwmake to allow for overrides
|
|
||||||
( cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all )
|
|
||||||
esac
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Run from OPENFOAM top-level directory only
|
|
||||||
cd "${0%/*}" || exit
|
|
||||||
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
|
|
||||||
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
|
|
||||||
echo " Check your OpenFOAM environment and installation"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
|
||||||
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
|
|
||||||
echo "Argument parse error"
|
|
||||||
else
|
|
||||||
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
|
||||||
echo " Check your OpenFOAM environment and installation"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
# Additional components
|
|
||||||
|
|
||||||
case "$FOAM_MODULE_PREFIX" in
|
|
||||||
(false | none)
|
|
||||||
echo ========================================
|
|
||||||
echo "OpenFOAM plugins disabled (prefix=${FOAM_MODULE_PREFIX})"
|
|
||||||
echo "Can be built separately:"
|
|
||||||
echo
|
|
||||||
echo " ./Allwmake-plugins -prefix=..."
|
|
||||||
echo
|
|
||||||
echo ========================================
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
(*)
|
|
||||||
# Use wmake -all instead of Allwmake to allow for overrides
|
|
||||||
( cd "$WM_PROJECT_DIR/plugins" 2>/dev/null && wmake -all )
|
|
||||||
esac
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
@ -1,41 +1,29 @@
|
|||||||
# Contributors to OpenFOAM
|
# Contributors to OpenFOAM
|
||||||
|
|
||||||
The following is a list of known contributors to OpenFOAM.
|
The following is an list of known contributors to OpenFOAM.
|
||||||
It is likely incomplete...
|
It is likely incomplete...
|
||||||
|
|
||||||
## Contributors (alphabetical by surname)
|
## Contributors (alphabetical by surname)
|
||||||
|
|
||||||
- Horacio Aguerre
|
|
||||||
- Yu Ankun
|
|
||||||
- Tetsuo Aoyagi
|
|
||||||
- Akira Azami
|
|
||||||
- Pete Bachant
|
|
||||||
- William Bainbridge
|
- William Bainbridge
|
||||||
- Gabriel Barajas
|
- Gabriel Barajas
|
||||||
- Kutalmis Bercin
|
- Kutalmis Bercin
|
||||||
- Julius Bergmann
|
|
||||||
- Ivor Clifford
|
- Ivor Clifford
|
||||||
- Greg Collecutt
|
- Greg Collecutt
|
||||||
- Jonathan Cranford
|
- Jonathan Cranford
|
||||||
- Santiago Marquez Damian
|
|
||||||
- Sergio Ferraris
|
- Sergio Ferraris
|
||||||
- Matej Forman
|
- Matej Forman
|
||||||
- Marian Fuchs
|
- Marian Fuchs
|
||||||
- Gabriel Gerlero
|
|
||||||
- Pawan Ghildiyal
|
- Pawan Ghildiyal
|
||||||
- Chris Greenshields
|
- Chris Greenshields
|
||||||
- Bernhard Gschaider
|
- Bernhard Gschaider
|
||||||
- Andrew Heather
|
- Andrew Heather
|
||||||
- David Hill
|
- David Hill
|
||||||
- Crist<73>bal Ib<49><62>ez
|
|
||||||
- Yoshiaki Inoue
|
|
||||||
- Mattijs Janssens
|
- Mattijs Janssens
|
||||||
- Andrew Jackson
|
- Andrew Jackson
|
||||||
- Hrvoje Jasak
|
- Hrvoje Jasak
|
||||||
- Alexander Kabat vel Job
|
- Alexander Kabat vel Job
|
||||||
- Thilo Knacke
|
- Thilo Knacke
|
||||||
- Shannon Leakey
|
|
||||||
- Sergey Lesnik
|
|
||||||
- Tommaso Lucchini
|
- Tommaso Lucchini
|
||||||
- Graham Macpherson
|
- Graham Macpherson
|
||||||
- Alexey Matveichev
|
- Alexey Matveichev
|
||||||
@ -48,7 +36,6 @@ It is likely incomplete...
|
|||||||
- Victor Olesen
|
- Victor Olesen
|
||||||
- Evangelos Papoutsis-Kiachagias
|
- Evangelos Papoutsis-Kiachagias
|
||||||
- Juho Peltola
|
- Juho Peltola
|
||||||
- Josep Pocurull
|
|
||||||
- Johan Roenby
|
- Johan Roenby
|
||||||
- Henrik Rusche
|
- Henrik Rusche
|
||||||
- Bruno Santos
|
- Bruno Santos
|
||||||
@ -59,15 +46,11 @@ It is likely incomplete...
|
|||||||
- Gavin Tabor
|
- Gavin Tabor
|
||||||
- Zeljko Tukovic
|
- Zeljko Tukovic
|
||||||
- Eugene De Villiers
|
- Eugene De Villiers
|
||||||
- Louis Vittoz
|
|
||||||
- Vuko Vukcevic
|
|
||||||
- Yi Wang
|
- Yi Wang
|
||||||
- Norbert Weber
|
- Norbert Weber
|
||||||
- Gregor Weiss
|
|
||||||
- Volker Weissmann
|
|
||||||
- Henry Weller
|
- Henry Weller
|
||||||
- Niklas Wikstrom
|
- Niklas Wikstrom
|
||||||
- Guanyang Xue
|
|
||||||
- Thorsten Zirwes
|
- Thorsten Zirwes
|
||||||
|
|
||||||
|
|
||||||
<!----------------------------------------------------------------------------->
|
<!----------------------------------------------------------------------------->
|
||||||
|
|||||||
@ -3,9 +3,8 @@
|
|||||||
Meta-information is generally for OpenFOAM internal use only.
|
Meta-information is generally for OpenFOAM internal use only.
|
||||||
|
|
||||||
The format, content and meaning may be changed at anytime without
|
The format, content and meaning may be changed at anytime without
|
||||||
prior notice.
|
notice. If any of these are changed, these are some of places that
|
||||||
If any of these are changed, these are some of places that will need
|
will need to be updated accordingly:
|
||||||
to be updated accordingly:
|
|
||||||
|
|
||||||
- bin/foamEtcFile
|
- bin/foamEtcFile
|
||||||
- bin/tools/foamConfigurePaths
|
- bin/tools/foamConfigurePaths
|
||||||
@ -39,7 +38,7 @@ Format: `date +%y%m`
|
|||||||
|
|
||||||
- 4-digit year-month (YYMM) integer corresponding to the major
|
- 4-digit year-month (YYMM) integer corresponding to the major
|
||||||
release or in unusual cases an intermediate release.
|
release or in unusual cases an intermediate release.
|
||||||
Example, `2106` for the June-2021 release.
|
Example, `1712` for the Dec-2017 release.
|
||||||
|
|
||||||
|
|
||||||
#### patch
|
#### patch
|
||||||
@ -79,9 +78,9 @@ the saved information needs synchronization. The command
|
|||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
The saved information is split into two separate files.
|
The saved information is split into two separate files. The `api-info`
|
||||||
The `api-info` file contains more permanent information,
|
contains more permanent information, whereas the `build-info` is more
|
||||||
whereas the `build-info` is more transient in nature.
|
transient in nature.
|
||||||
|
|
||||||
----
|
----
|
||||||
2021-06-09
|
2020-06-23
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
api=2502
|
api=2012
|
||||||
patch=0
|
patch=210210
|
||||||
|
|||||||
70
README.md
70
README.md
@ -11,7 +11,7 @@ individual and group contributors, integrations
|
|||||||
[governance guided activities](https://www.openfoam.com/governance/).
|
[governance guided activities](https://www.openfoam.com/governance/).
|
||||||
|
|
||||||
|
|
||||||
## License
|
## Copyright
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
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
|
under the terms of the GNU General Public License as published by the
|
||||||
@ -27,11 +27,10 @@ may redistribute files.
|
|||||||
OpenCFD Ltd grants use of its OpenFOAM trademark by Third Parties on a
|
OpenCFD Ltd grants use of its OpenFOAM trademark by Third Parties on a
|
||||||
licence basis. ESI Group and OpenFOAM Foundation Ltd are currently
|
licence basis. ESI Group and OpenFOAM Foundation Ltd are currently
|
||||||
permitted to use the Name and agreed Domain Name. For information on
|
permitted to use the Name and agreed Domain Name. For information on
|
||||||
trademark use, please refer to the
|
trademark use, please refer to the [trademark policy guidelines](http://www.openfoam.com/legal/trademark-policy.php).
|
||||||
[trademark policy guidelines][link trademark].
|
|
||||||
|
|
||||||
Please [contact OpenCFD](http://www.openfoam.com/contact) if you have
|
Please [contact OpenCFD](http://www.openfoam.com/contact) if you have
|
||||||
any questions about the use of the OpenFOAM trademark.
|
any questions on the use of the OpenFOAM trademark.
|
||||||
|
|
||||||
Violations of the Trademark are monitored, and will be duly prosecuted.
|
Violations of the Trademark are monitored, and will be duly prosecuted.
|
||||||
|
|
||||||
@ -40,9 +39,9 @@ Violations of the Trademark are monitored, and will be duly prosecuted.
|
|||||||
|
|
||||||
If OpenFOAM has already been compiled on your system, simply source
|
If OpenFOAM has already been compiled on your system, simply source
|
||||||
the appropriate `etc/bashrc` or `etc/cshrc` file and get started.
|
the appropriate `etc/bashrc` or `etc/cshrc` file and get started.
|
||||||
For example, for the OpenFOAM-v2412 version:
|
For example, for the OpenFOAM-v1912 version:
|
||||||
```
|
```
|
||||||
source /installation/path/OpenFOAM-v2412/etc/bashrc
|
source /installation/path/OpenFOAM-v1912/etc/bashrc
|
||||||
```
|
```
|
||||||
|
|
||||||
## Compiling OpenFOAM
|
## Compiling OpenFOAM
|
||||||
@ -56,11 +55,6 @@ guides:
|
|||||||
| [ThirdParty][repo third] | [readme][link third-readme] | [system requirements][link third-require] | [build][link third-build] |
|
| [ThirdParty][repo third] | [readme][link third-readme] | [system requirements][link third-require] | [build][link third-build] |
|
||||||
|
|
||||||
|
|
||||||
If you need to modify the versions or locations of ThirdParty
|
|
||||||
software, please read how the
|
|
||||||
[OpenFOAM configuration][wiki-config] is structured.
|
|
||||||
|
|
||||||
|
|
||||||
## How do I know which version I am currently using?
|
## How do I know which version I am currently using?
|
||||||
|
|
||||||
The value of the `$WM_PROJECT_DIR` or even `$WM_PROJECT_VERSION` are
|
The value of the `$WM_PROJECT_DIR` or even `$WM_PROJECT_VERSION` are
|
||||||
@ -69,19 +63,19 @@ not guaranteed to have any correspondence to the OpenFOAM release
|
|||||||
information is embedded into each application. For example, as
|
information is embedded into each application. For example, as
|
||||||
displayed from `blockMesh -help`:
|
displayed from `blockMesh -help`:
|
||||||
```
|
```
|
||||||
Using: OpenFOAM-com (2012) - visit www.openfoam.com
|
Using: OpenFOAM-v1812.local (1812) - visit www.openfoam.com
|
||||||
Build: b830beb5ea-20210429 (patch=210414)
|
Build: 65d6551ff7-20190530 (patch=190531)
|
||||||
Arch: LSB;label=32;scalar=64
|
Arch: LSB;label=32;scalar=64
|
||||||
```
|
```
|
||||||
This output contains all of the more interesting information that we need:
|
This output contains all of the more interesting information that we need:
|
||||||
|
|
||||||
| item | value |
|
| item | value |
|
||||||
|-----------------------|---------------|
|
|-----------------------|---------------|
|
||||||
| version | com (eg, local development branch) |
|
| version | v1812.local |
|
||||||
| api | 2012 |
|
| api | 1812 |
|
||||||
| commit | b830beb5ea |
|
| commit | 65d6551ff7 |
|
||||||
| author date | 20210429 |
|
| author date | 20190530 |
|
||||||
| patch-level | (20)210414 |
|
| patch-level | (20)190531 |
|
||||||
| label/scalar size | 32/64 bits |
|
| label/scalar size | 32/64 bits |
|
||||||
|
|
||||||
The Arch information may also include the `solveScalar` size
|
The Arch information may also include the `solveScalar` size
|
||||||
@ -96,19 +90,19 @@ when OpenFOAM has not yet been compiled:
|
|||||||
```
|
```
|
||||||
$ wmake -build-info
|
$ wmake -build-info
|
||||||
make
|
make
|
||||||
api = 2012
|
api = 1812
|
||||||
patch = 210414
|
patch = 190531
|
||||||
branch = master
|
branch = master
|
||||||
build = 308af39136-20210426
|
build = 65d6551ff7-20190530
|
||||||
```
|
```
|
||||||
Similar information is available with `foamEtcFile`, using the
|
Similar information is available with `foamEtcFile`, using the
|
||||||
`-show-api` or `-show-patch` options. For example,
|
`-show-api` or `-show-patch` options. For example,
|
||||||
```
|
```
|
||||||
$ foamEtcFile -show-api
|
$ foamEtcFile -show-api
|
||||||
2012
|
1812
|
||||||
|
|
||||||
$ foamEtcFile -show-patch
|
$ foamEtcFile -show-patch
|
||||||
210414
|
190531
|
||||||
```
|
```
|
||||||
This output will generally be the easiest to parse for scripts.
|
This output will generally be the easiest to parse for scripts.
|
||||||
The `$FOAM_API` convenience environment variable may not reflect the
|
The `$FOAM_API` convenience environment variable may not reflect the
|
||||||
@ -127,8 +121,8 @@ These 3rd-party sources are normally located in a directory parallel
|
|||||||
to the OpenFOAM directory. For example,
|
to the OpenFOAM directory. For example,
|
||||||
```
|
```
|
||||||
/path/parent
|
/path/parent
|
||||||
|-- OpenFOAM-v2412
|
|-- OpenFOAM-v1912
|
||||||
\-- ThirdParty-v2412
|
\-- ThirdParty-v1912
|
||||||
```
|
```
|
||||||
There are, however, many cases where this simple convention is inadequate:
|
There are, however, many cases where this simple convention is inadequate:
|
||||||
|
|
||||||
@ -136,7 +130,7 @@ There are, however, many cases where this simple convention is inadequate:
|
|||||||
operating system or cluster installation provides it)
|
operating system or cluster installation provides it)
|
||||||
|
|
||||||
* When we have changed the OpenFOAM directory name to some arbitrary
|
* When we have changed the OpenFOAM directory name to some arbitrary
|
||||||
directory name, e.g. openfoam-sandbox2412, etc..
|
directory name, e.g. openfoam-sandbox1912, etc..
|
||||||
|
|
||||||
* When we would like any additional 3rd party software to be located
|
* When we would like any additional 3rd party software to be located
|
||||||
inside of the OpenFOAM directory to ensure that the installation is
|
inside of the OpenFOAM directory to ensure that the installation is
|
||||||
@ -156,14 +150,17 @@ when locating the ThirdParty directory with the following precedence:
|
|||||||
2. PREFIX/ThirdParty-VERSION
|
2. PREFIX/ThirdParty-VERSION
|
||||||
* this corresponds to the traditional approach
|
* this corresponds to the traditional approach
|
||||||
3. PREFIX/ThirdParty-vAPI
|
3. PREFIX/ThirdParty-vAPI
|
||||||
* allows for an updated value of VERSION, *eg*, `v2412-myCustom`,
|
* allows for an updated value of VERSION, *eg*, `v1912-myCustom`,
|
||||||
without requiring a renamed ThirdParty. The API value would still
|
without requiring a renamed ThirdParty. The API value would still
|
||||||
be `2412` and the original `ThirdParty-v2412/` would be found.
|
be `1912` and the original `ThirdParty-v1912/` would be found.
|
||||||
4. PREFIX/ThirdParty-API
|
4. PREFIX/ThirdParty-API
|
||||||
* same as the previous example, but using an unadorned API value.
|
* this is the same as the previous example, but using an unadorned
|
||||||
|
API value. This also makes sense if the chosen version name also
|
||||||
|
uses the unadorned API value in its naming, *eg*,
|
||||||
|
`1912-patch190131`, `1912.19W03`
|
||||||
5. PREFIX/ThirdParty-common
|
5. PREFIX/ThirdParty-common
|
||||||
* permits maximum reuse for various versions, for experienced
|
* permits maximum reuse for various versions, for experienced user
|
||||||
users who are aware of potential version incompatibilities
|
who are aware of potential version incompatibilities
|
||||||
|
|
||||||
If none of these directories are found to be suitable, it reverts to
|
If none of these directories are found to be suitable, it reverts to
|
||||||
using PROJECT/ThirdParty as a dummy location (even if the directory
|
using PROJECT/ThirdParty as a dummy location (even if the directory
|
||||||
@ -187,21 +184,18 @@ ThirdParty directory will contain either an `Allwmake` file or a
|
|||||||
|
|
||||||
<!-- OpenFOAM -->
|
<!-- OpenFOAM -->
|
||||||
|
|
||||||
[link trademark]: https://www.openfoam.com/opencfd-limited-trade-mark-policy
|
|
||||||
|
|
||||||
[repo openfoam]: https://develop.openfoam.com/Development/openfoam/
|
[repo openfoam]: https://develop.openfoam.com/Development/openfoam/
|
||||||
[repo third]: https://develop.openfoam.com/Development/ThirdParty-common/
|
[repo third]: https://develop.openfoam.com/Development/ThirdParty-common/
|
||||||
|
|
||||||
[link openfoam-readme]: https://develop.openfoam.com/Development/openfoam/blob/develop/README.md
|
[link openfoam-readme]: https://develop.openfoam.com/Development/openfoam/blob/develop/README.md
|
||||||
[link openfoam-issues]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/BuildIssues.md
|
[link openfoam-issues]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/BuildIssues.md
|
||||||
|
[link openfoam-config]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Config.md
|
||||||
[link openfoam-build]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Build.md
|
[link openfoam-build]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Build.md
|
||||||
[link openfoam-require]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Requirements.md
|
[link openfoam-require]: https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Requirements.md
|
||||||
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/README.md
|
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/README.md
|
||||||
[link third-build]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/BUILD.md
|
[link third-build]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/BUILD.md
|
||||||
[link third-require]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/Requirements.md
|
[link third-require]: https://develop.openfoam.com/Development/ThirdParty-common/blob/develop/Requirements.md
|
||||||
|
|
||||||
[wiki-config]: https://develop.openfoam.com/Development/openfoam/-/wikis/configuring
|
|
||||||
|
|
||||||
|
|
||||||
## Useful Links
|
## Useful Links
|
||||||
|
|
||||||
@ -209,8 +203,8 @@ ThirdParty directory will contain either an `Allwmake` file or a
|
|||||||
- [Documentation](http://www.openfoam.com/documentation)
|
- [Documentation](http://www.openfoam.com/documentation)
|
||||||
- [Reporting bugs/issues/feature requests](http://www.openfoam.com/code/bug-reporting.php)
|
- [Reporting bugs/issues/feature requests](http://www.openfoam.com/code/bug-reporting.php)
|
||||||
- [Issue tracker](https://develop.openfoam.com/Development/openfoam/-/issues)
|
- [Issue tracker](https://develop.openfoam.com/Development/openfoam/-/issues)
|
||||||
- [Code wiki](https://develop.openfoam.com/Development/openfoam/-/wikis/) and [General wiki](http://wiki.openfoam.com/)
|
- [Code wiki](https://develop.openfoam.com/Development/openfoam/-/wikis/) and [general wiki](http://wiki.openfoam.com/)
|
||||||
- [Governance](http://www.openfoam.com/governance/), [Governance Projects](https://www.openfoam.com/governance/projects)
|
- [Community](http://www.openfoam.com/community/), [Governance](http://www.openfoam.com/governance/)
|
||||||
- [Contacting OpenCFD](http://www.openfoam.com/contact/)
|
- [Contacting OpenCFD](http://www.openfoam.com/contact/)
|
||||||
|
|
||||||
Copyright 2016-2024 OpenCFD Ltd
|
Copyright 2016-2020 OpenCFD Ltd
|
||||||
|
|||||||
@ -8,29 +8,19 @@ wmake -check-dir "$WM_PROJECT_DIR/applications" 2>/dev/null || {
|
|||||||
}
|
}
|
||||||
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
|
||||||
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
|
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
|
||||||
echo "Argument parse error"
|
echo "Argument parse error";
|
||||||
else
|
else
|
||||||
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
|
||||||
echo " Check your OpenFOAM environment and installation"
|
echo " Check your OpenFOAM environment and installation"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ========================================
|
|
||||||
echo Compile OpenFOAM applications
|
|
||||||
echo ========================================
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
wmake -all $targetType utilities
|
|
||||||
wmake -all $targetType solvers
|
wmake -all $targetType solvers
|
||||||
|
wmake -all $targetType utilities
|
||||||
|
|
||||||
# Extra tools (optional)
|
# Optional
|
||||||
## wmake -all $targetType tools
|
## wmake -all $targetType tools
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
echo ========================================
|
|
||||||
echo Done OpenFOAM applications
|
|
||||||
echo ========================================
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
|
|||||||
@ -118,7 +118,7 @@ int main(int argc, char *argv[])
|
|||||||
fvm::laplacian(rAUf, p) == fvc::div(phiHbyA)
|
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();
|
phi = phiHbyA - pEqn.flux();
|
||||||
|
|
||||||
|
|||||||
@ -11,5 +11,4 @@ EXE_LIBS = \
|
|||||||
-lfvOptions \
|
-lfvOptions \
|
||||||
-lmeshTools \
|
-lmeshTools \
|
||||||
-lsampling \
|
-lsampling \
|
||||||
-lregionFaModels \
|
-lregionFaModels
|
||||||
-lfiniteArea
|
|
||||||
|
|||||||
@ -18,6 +18,6 @@ dimensionedScalar rho("rho", dimDensity, transportProperties);
|
|||||||
|
|
||||||
scalar MaxCo =
|
scalar MaxCo =
|
||||||
max(mesh.surfaceInterpolation::deltaCoeffs()*c0).value()
|
max(mesh.surfaceInterpolation::deltaCoeffs()*c0).value()
|
||||||
*runTime.deltaTValue();
|
*runTime.deltaT().value();
|
||||||
|
|
||||||
Info<< "Max acoustic Courant Number = " << MaxCo << endl;
|
Info<< "Max acoustic Courant Number = " << MaxCo << endl;
|
||||||
|
|||||||
@ -3,7 +3,6 @@ EXE_INC = \
|
|||||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
|
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
|
||||||
-I$(LIB_SRC)/overset/lnInclude \
|
-I$(LIB_SRC)/overset/lnInclude \
|
||||||
-I$(LIB_SRC)/overset/include/lnInclude
|
|
||||||
|
|
||||||
EXE_LIBS = \
|
EXE_LIBS = \
|
||||||
-lfiniteVolume \
|
-lfiniteVolume \
|
||||||
|
|||||||
@ -31,25 +31,3 @@
|
|||||||
Info<< "Reading diffusivity DT\n" << endl;
|
Info<< "Reading diffusivity DT\n" << endl;
|
||||||
|
|
||||||
dimensionedScalar DT("DT", dimViscosity, transportProperties);
|
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 |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -58,7 +58,6 @@ Description
|
|||||||
#include "fvOptions.H"
|
#include "fvOptions.H"
|
||||||
#include "simpleControl.H"
|
#include "simpleControl.H"
|
||||||
#include "dynamicFvMesh.H"
|
#include "dynamicFvMesh.H"
|
||||||
#include "oversetPatchPhiErr.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -100,11 +99,6 @@ int main(int argc, char *argv[])
|
|||||||
fvOptions.constrain(TEqn);
|
fvOptions.constrain(TEqn);
|
||||||
TEqn.solve();
|
TEqn.solve();
|
||||||
fvOptions.correct(T);
|
fvOptions.correct(T);
|
||||||
|
|
||||||
if (oversetPatchErrOutput)
|
|
||||||
{
|
|
||||||
oversetPatchPhiErr(TEqn, tdummyPhi.ref());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "write.H"
|
#include "write.H"
|
||||||
|
|||||||
@ -13,14 +13,7 @@ volVectorField U
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Initialise the velocity internal field to zero
|
// Initialise the velocity internal field to zero
|
||||||
// Note: explicitly bypass evaluation of contraint patch overrides
|
U = dimensionedVector(U.dimensions(), Zero);
|
||||||
// (e.g. swirlFanVelocity might lookup phi,rho)
|
|
||||||
//U = dimensionedVector(U.dimensions(), Zero);
|
|
||||||
{
|
|
||||||
const dimensionedVector dt(U.dimensions(), Zero);
|
|
||||||
U.internalFieldRef() = dt;
|
|
||||||
U.boundaryFieldRef() = dt.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
surfaceScalarField phi
|
surfaceScalarField phi
|
||||||
(
|
(
|
||||||
|
|||||||
@ -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
|
// Add solver-specific interpolations
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd
|
Copyright (C) 2017 OpenCFD Ltd
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -83,7 +83,6 @@ Description
|
|||||||
\heading Options
|
\heading Options
|
||||||
\plaintable
|
\plaintable
|
||||||
-writep | write the Euler pressure
|
-writep | write the Euler pressure
|
||||||
-writephi | Write the final volumetric flux
|
|
||||||
-writePhi | Write the final velocity potential
|
-writePhi | Write the final velocity potential
|
||||||
-initialiseUBCs | Update the velocity boundaries before solving for Phi
|
-initialiseUBCs | Update the velocity boundaries before solving for Phi
|
||||||
\endplaintable
|
\endplaintable
|
||||||
@ -118,12 +117,6 @@ int main(int argc, char *argv[])
|
|||||||
"Initialise U boundary conditions"
|
"Initialise U boundary conditions"
|
||||||
);
|
);
|
||||||
|
|
||||||
argList::addBoolOption
|
|
||||||
(
|
|
||||||
"writephi",
|
|
||||||
"Write the final volumetric flux field"
|
|
||||||
);
|
|
||||||
|
|
||||||
argList::addBoolOption
|
argList::addBoolOption
|
||||||
(
|
(
|
||||||
"writePhi",
|
"writePhi",
|
||||||
@ -142,8 +135,6 @@ int main(int argc, char *argv[])
|
|||||||
"Execute functionObjects"
|
"Execute functionObjects"
|
||||||
);
|
);
|
||||||
|
|
||||||
#include "addRegionOption.H"
|
|
||||||
#include "addCheckCaseOptions.H"
|
|
||||||
#include "setRootCaseLists.H"
|
#include "setRootCaseLists.H"
|
||||||
#include "createTime.H"
|
#include "createTime.H"
|
||||||
#include "createNamedDynamicFvMesh.H"
|
#include "createNamedDynamicFvMesh.H"
|
||||||
@ -158,6 +149,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
mesh.update();
|
mesh.update();
|
||||||
|
|
||||||
|
surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
|
||||||
|
|
||||||
// Since solver contains no time loop it would never execute
|
// Since solver contains no time loop it would never execute
|
||||||
// function objects so do it ourselves
|
// function objects so do it ourselves
|
||||||
@ -203,16 +195,11 @@ int main(int argc, char *argv[])
|
|||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write U
|
// Write U and phi
|
||||||
U.write();
|
U.write();
|
||||||
|
phi.write();
|
||||||
|
|
||||||
// Optionally write the volumetric flux, phi
|
// Optionally write Phi
|
||||||
if (args.found("writephi"))
|
|
||||||
{
|
|
||||||
phi.write();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optionally write velocity potential, Phi
|
|
||||||
if (args.found("writePhi"))
|
if (args.found("writePhi"))
|
||||||
{
|
{
|
||||||
Phi.write();
|
Phi.write();
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
)
|
)
|
||||||
: -betav*dpdt
|
: -betav*dpdt
|
||||||
)
|
)
|
||||||
- fvm::laplacian(Db, hea)
|
- fvm::laplacian(DbThermal, hea)
|
||||||
+ betav*fvOptions(rho, hea)
|
+ betav*fvOptions(rho, hea)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -16,13 +16,7 @@ if (ign.ignited())
|
|||||||
)*rho/thermo.rhou()
|
)*rho/thermo.rhou()
|
||||||
: -betav*dpdt*rho/thermo.rhou()
|
: -betav*dpdt*rho/thermo.rhou()
|
||||||
)
|
)
|
||||||
- fvm::laplacian(Db, heau)
|
- fvm::laplacian(DbThermal, heau)
|
||||||
|
|
||||||
// These terms cannot be used in partially-premixed combustion due to
|
|
||||||
// the resultant inconsistency between ft and heau transport.
|
|
||||||
// A possible solution would be to solve for ftu as well as ft.
|
|
||||||
//- fvm::div(muEff*fvc::grad(b)/(b + 0.001), heau)
|
|
||||||
//+ fvm::Sp(fvc::div(muEff*fvc::grad(b)/(b + 0.001)), heau)
|
|
||||||
==
|
==
|
||||||
betav*fvOptions(rho, heau)
|
betav*fvOptions(rho, heau)
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,33 +1,33 @@
|
|||||||
XiModels/XiModel/XiModel.C
|
XiModels/XiModel/XiModel.C
|
||||||
XiModels/XiModel/XiModelNew.C
|
XiModels/XiModel/XiModelNew.C
|
||||||
XiModels/fixed/fixed.C
|
|
||||||
XiModels/algebraic/algebraic.C
|
XiModels/transport/transportTwoEqs/transportTwoEqs.C
|
||||||
XiModels/transport/transport.C
|
|
||||||
|
|
||||||
XiModels/XiEqModels/XiEqModel/XiEqModel.C
|
XiModels/XiEqModels/XiEqModel/XiEqModel.C
|
||||||
XiModels/XiEqModels/XiEqModel/XiEqModelNew.C
|
XiModels/XiEqModels/XiEqModel/XiEqModelNew.C
|
||||||
|
|
||||||
XiModels/XiEqModels/Gulder/Gulder.C
|
XiModels/XiEqModels/Gulder/Gulder.C
|
||||||
XiModels/XiEqModels/instabilityXiEq/instabilityXiEq.C
|
XiModels/XiEqModels/instability2XiEq/instability2XiEq.C
|
||||||
XiModels/XiEqModels/SCOPEBlendXiEq/SCOPEBlendXiEq.C
|
XiModels/XiEqModels/BLMgMaXiEq/BLMgMaXiEq.C
|
||||||
XiModels/XiEqModels/SCOPEXiEq/SCOPEXiEq.C
|
|
||||||
|
|
||||||
XiModels/XiGModels/XiGModel/XiGModel.C
|
XiModels/XiGModels/XiGModel/XiGModel.C
|
||||||
XiModels/XiGModels/XiGModel/XiGModelNew.C
|
XiModels/XiGModels/XiGModel/XiGModelNew.C
|
||||||
XiModels/XiGModels/KTS/KTS.C
|
XiModels/XiGModels/KTS/KTS.C
|
||||||
XiModels/XiGModels/instabilityG/instabilityG.C
|
XiModels/XiGModels/instabilityG/instabilityG.C
|
||||||
|
XiModels/XiGModels/instability2G/instability2G.C
|
||||||
|
|
||||||
PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.C
|
PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.C
|
||||||
|
|
||||||
PDRModels/dragModels/PDRDragModel/PDRDragModel.C
|
PDRModels/dragModels/PDRDragModel/PDRDragModel.C
|
||||||
PDRModels/dragModels/PDRDragModel/PDRDragModelNew.C
|
PDRModels/dragModels/PDRDragModel/PDRDragModelNew.C
|
||||||
PDRModels/dragModels/basic/basic.C
|
PDRModels/dragModels/basic/basic.C
|
||||||
|
PDRModels/dragModels/basicSch/basicSch.C
|
||||||
|
|
||||||
PDRModels/XiEqModels/basicXiSubXiEq/basicXiSubXiEq.C
|
PDRModels/XiEqModels/normBasicXiSubXiEq/normBasicXiSubXiEq.C
|
||||||
PDRModels/XiGModels/basicXiSubG/basicXiSubG.C
|
PDRModels/XiGModels/normBasicXiSubG/normBasicXiSubG.C
|
||||||
|
|
||||||
laminarFlameSpeed/SCOPE/SCOPELaminarFlameSpeed.C
|
laminarFlameSpeed/SCOPE/SCOPELaminarFlameSpeed.C
|
||||||
|
|
||||||
/*PDRFoamAutoRefine.C*/
|
|
||||||
PDRFoam.C
|
PDRFoam.C
|
||||||
|
|
||||||
EXE = $(FOAM_APPBIN)/PDRFoam
|
EXE = $(FOAM_APPBIN)/PDRFoam
|
||||||
|
|||||||
@ -25,7 +25,6 @@ EXE_LIBS = \
|
|||||||
-lengine \
|
-lengine \
|
||||||
-lturbulenceModels \
|
-lturbulenceModels \
|
||||||
-lcompressibleTurbulenceModels \
|
-lcompressibleTurbulenceModels \
|
||||||
-lthermoTools \
|
|
||||||
-lcompressibleTransportModels \
|
-lcompressibleTransportModels \
|
||||||
-lfluidThermophysicalModels \
|
-lfluidThermophysicalModels \
|
||||||
-lreactionThermophysicalModels \
|
-lreactionThermophysicalModels \
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -81,8 +82,11 @@ Description
|
|||||||
#include "PDRDragModel.H"
|
#include "PDRDragModel.H"
|
||||||
#include "ignition.H"
|
#include "ignition.H"
|
||||||
#include "bound.H"
|
#include "bound.H"
|
||||||
|
#include "dynamicFvMesh.H"
|
||||||
|
#include "dynamicRefineFvMesh.H"
|
||||||
#include "pimpleControl.H"
|
#include "pimpleControl.H"
|
||||||
#include "fvOptions.H"
|
#include "fvOptions.H"
|
||||||
|
#include "fvcSmooth.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -95,22 +99,24 @@ int main(int argc, char *argv[])
|
|||||||
);
|
);
|
||||||
|
|
||||||
#include "postProcess.H"
|
#include "postProcess.H"
|
||||||
|
|
||||||
#include "addCheckCaseOptions.H"
|
#include "addCheckCaseOptions.H"
|
||||||
#include "setRootCaseLists.H"
|
#include "setRootCaseLists.H"
|
||||||
#include "createTime.H"
|
#include "createTime.H"
|
||||||
#include "createMesh.H"
|
|
||||||
#include "createControl.H"
|
#include "createDynamicFvMesh.H"
|
||||||
|
#include "createDyMControls.H"
|
||||||
|
#include "initContinuityErrs.H"
|
||||||
|
|
||||||
#include "readCombustionProperties.H"
|
#include "readCombustionProperties.H"
|
||||||
#include "readGravitationalAcceleration.H"
|
#include "readGravitationalAcceleration.H"
|
||||||
#include "createFields.H"
|
#include "createFields.H"
|
||||||
#include "createFieldRefs.H"
|
#include "createFieldRefs.H"
|
||||||
#include "initContinuityErrs.H"
|
|
||||||
#include "createTimeControls.H"
|
|
||||||
#include "compressibleCourantNo.H"
|
#include "compressibleCourantNo.H"
|
||||||
#include "setInitialDeltaT.H"
|
#include "setInitialDeltaT.H"
|
||||||
|
|
||||||
turbulence->validate();
|
turbulence->validate();
|
||||||
|
|
||||||
scalar StCoNum = 0.0;
|
scalar StCoNum = 0.0;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -119,33 +125,62 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
while (runTime.run())
|
while (runTime.run())
|
||||||
{
|
{
|
||||||
#include "readTimeControls.H"
|
#include "readDyMControls.H"
|
||||||
|
|
||||||
#include "compressibleCourantNo.H"
|
#include "compressibleCourantNo.H"
|
||||||
#include "setDeltaT.H"
|
#include "setDeltaT.H"
|
||||||
|
|
||||||
++runTime;
|
++runTime;
|
||||||
Info<< "\n\nTime = " << runTime.timeName() << endl;
|
|
||||||
|
|
||||||
#include "rhoEqn.H"
|
Info<< "\n\nTime = " << runTime.timeName() << endl;
|
||||||
|
|
||||||
// --- Pressure-velocity PIMPLE corrector loop
|
// --- Pressure-velocity PIMPLE corrector loop
|
||||||
while (pimple.loop())
|
while (pimple.loop())
|
||||||
{
|
{
|
||||||
|
if (pimple.firstIter() || moveMeshOuterCorrectors)
|
||||||
|
{
|
||||||
|
fvc::makeAbsolute(phi, rho, U);
|
||||||
|
|
||||||
|
// Flux estimate for introduced faces.
|
||||||
|
volVectorField rhoU("rhoU", rho*U);
|
||||||
|
|
||||||
|
bool meshChanged = mesh.controlledUpdate();
|
||||||
|
|
||||||
|
if (runTime.write() && meshChanged)
|
||||||
|
{
|
||||||
|
betav.write();
|
||||||
|
betai.write();
|
||||||
|
Blong.write();
|
||||||
|
Bv.write();
|
||||||
|
Lobs.write();
|
||||||
|
CT.write();
|
||||||
|
drag->writeFields();
|
||||||
|
flameWrinkling->writeFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the fluxes relative to the mesh motion
|
||||||
|
fvc::makeRelative(phi, rho, U);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pimple.firstIter())
|
||||||
|
{
|
||||||
|
#include "rhoEqn.H"
|
||||||
|
}
|
||||||
|
|
||||||
#include "UEqn.H"
|
#include "UEqn.H"
|
||||||
|
#include "bEqn.H"
|
||||||
|
#include "ftEqn.H"
|
||||||
|
#include "EauEqn.H"
|
||||||
|
#include "EaEqn.H"
|
||||||
|
|
||||||
|
if (!ign.ignited())
|
||||||
|
{
|
||||||
|
thermo.heu() == thermo.he();
|
||||||
|
}
|
||||||
|
|
||||||
// --- Pressure corrector loop
|
// --- Pressure corrector loop
|
||||||
while (pimple.correct())
|
while (pimple.correct())
|
||||||
{
|
{
|
||||||
#include "bEqn.H"
|
|
||||||
#include "ftEqn.H"
|
|
||||||
#include "EauEqn.H"
|
|
||||||
#include "EaEqn.H"
|
|
||||||
|
|
||||||
if (!ign.ignited())
|
|
||||||
{
|
|
||||||
thermo.heu() == thermo.he();
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "pEqn.H"
|
#include "pEqn.H"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,12 +190,14 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rho = thermo.rho();
|
||||||
|
|
||||||
runTime.write();
|
runTime.write();
|
||||||
|
|
||||||
runTime.printExecutionTime(Info);
|
runTime.printExecutionTime(Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< "End\n";
|
Info<< "\nEnd\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,216 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / 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
|
|
||||||
PDRFoam
|
|
||||||
|
|
||||||
Description
|
|
||||||
Solver for compressible premixed/partially-premixed combustion with
|
|
||||||
turbulence modelling.
|
|
||||||
|
|
||||||
Combusting RANS code using the b-Xi two-equation model.
|
|
||||||
Xi may be obtained by either the solution of the Xi transport
|
|
||||||
equation or from an algebraic expression. Both approaches are
|
|
||||||
based on Gulder's flame speed correlation which has been shown
|
|
||||||
to be appropriate by comparison with the results from the
|
|
||||||
spectral model.
|
|
||||||
|
|
||||||
Strain effects are incorporated directly into the Xi equation
|
|
||||||
but not in the algebraic approximation. Further work need to be
|
|
||||||
done on this issue, particularly regarding the enhanced removal rate
|
|
||||||
caused by flame compression. Analysis using results of the spectral
|
|
||||||
model will be required.
|
|
||||||
|
|
||||||
For cases involving very lean Propane flames or other flames which are
|
|
||||||
very strain-sensitive, a transport equation for the laminar flame
|
|
||||||
speed is present. This equation is derived using heuristic arguments
|
|
||||||
involving the strain time scale and the strain-rate at extinction.
|
|
||||||
the transport velocity is the same as that for the Xi equation.
|
|
||||||
|
|
||||||
For large flames e.g. explosions additional modelling for the flame
|
|
||||||
wrinkling due to surface instabilities may be applied.
|
|
||||||
|
|
||||||
PDR (porosity/distributed resistance) modelling is included to handle
|
|
||||||
regions containing blockages which cannot be resolved by the mesh.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "fvCFD.H"
|
|
||||||
#include "dynamicFvMesh.H"
|
|
||||||
#include "psiuReactionThermo.H"
|
|
||||||
#include "turbulentFluidThermoModel.H"
|
|
||||||
#include "laminarFlameSpeed.H"
|
|
||||||
#include "XiModel.H"
|
|
||||||
#include "PDRDragModel.H"
|
|
||||||
#include "ignition.H"
|
|
||||||
#include "bound.H"
|
|
||||||
#include "dynamicRefineFvMesh.H"
|
|
||||||
#include "pimpleControl.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
argList::addNote
|
|
||||||
(
|
|
||||||
"Solver for compressible premixed/partially-premixed combustion with"
|
|
||||||
" turbulence modelling."
|
|
||||||
);
|
|
||||||
|
|
||||||
#include "setRootCaseLists.H"
|
|
||||||
#include "createTime.H"
|
|
||||||
#include "createDynamicFvMesh.H"
|
|
||||||
|
|
||||||
pimpleControl pimple(mesh);
|
|
||||||
|
|
||||||
#include "readCombustionProperties.H"
|
|
||||||
#include "readGravitationalAcceleration.H"
|
|
||||||
#include "createFields.H"
|
|
||||||
#include "initContinuityErrs.H"
|
|
||||||
#include "createTimeControls.H"
|
|
||||||
#include "compressibleCourantNo.H"
|
|
||||||
#include "setInitialDeltaT.H"
|
|
||||||
|
|
||||||
turbulence->validate();
|
|
||||||
scalar StCoNum = 0.0;
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Info<< "\nStarting time loop\n" << endl;
|
|
||||||
|
|
||||||
bool hasChanged = false;
|
|
||||||
|
|
||||||
while (runTime.run())
|
|
||||||
{
|
|
||||||
#include "readTimeControls.H"
|
|
||||||
#include "compressibleCourantNo.H"
|
|
||||||
#include "setDeltaT.H"
|
|
||||||
|
|
||||||
// Indicators for refinement.
|
|
||||||
// Note: before ++runTime only for post-processing reasons.
|
|
||||||
tmp<volScalarField> tmagGradP = mag(fvc::grad(p));
|
|
||||||
volScalarField normalisedGradP
|
|
||||||
(
|
|
||||||
"normalisedGradP",
|
|
||||||
tmagGradP()/max(tmagGradP())
|
|
||||||
);
|
|
||||||
normalisedGradP.writeOpt(IOobject::AUTO_WRITE);
|
|
||||||
tmagGradP.clear();
|
|
||||||
|
|
||||||
++runTime;
|
|
||||||
|
|
||||||
Info<< "\n\nTime = " << runTime.timeName() << endl;
|
|
||||||
|
|
||||||
{
|
|
||||||
// Make the fluxes absolute
|
|
||||||
fvc::makeAbsolute(phi, rho, U);
|
|
||||||
|
|
||||||
// Test : disable refinement for some cells
|
|
||||||
bitSet& protectedCell =
|
|
||||||
refCast<dynamicRefineFvMesh>(mesh).protectedCell();
|
|
||||||
|
|
||||||
if (protectedCell.empty())
|
|
||||||
{
|
|
||||||
protectedCell.setSize(mesh.nCells());
|
|
||||||
protectedCell = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
forAll(betav, celli)
|
|
||||||
{
|
|
||||||
if (betav[celli] < 0.99)
|
|
||||||
{
|
|
||||||
protectedCell.set(celli);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flux estimate for introduced faces.
|
|
||||||
volVectorField rhoU("rhoU", rho*U);
|
|
||||||
|
|
||||||
// Do any mesh changes
|
|
||||||
bool meshChanged = mesh.update();
|
|
||||||
|
|
||||||
|
|
||||||
if (meshChanged)
|
|
||||||
{
|
|
||||||
hasChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (runTime.write() && hasChanged)
|
|
||||||
{
|
|
||||||
betav.write();
|
|
||||||
Lobs.write();
|
|
||||||
CT.write();
|
|
||||||
drag->writeFields();
|
|
||||||
flameWrinkling->writeFields();
|
|
||||||
hasChanged = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make the fluxes relative to the mesh motion
|
|
||||||
fvc::makeRelative(phi, rho, U);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#include "rhoEqn.H"
|
|
||||||
|
|
||||||
// --- Pressure-velocity PIMPLE corrector loop
|
|
||||||
while (pimple.loop())
|
|
||||||
{
|
|
||||||
#include "UEqn.H"
|
|
||||||
|
|
||||||
|
|
||||||
// --- Pressure corrector loop
|
|
||||||
while (pimple.correct())
|
|
||||||
{
|
|
||||||
#include "bEqn.H"
|
|
||||||
#include "ftEqn.H"
|
|
||||||
#include "huEqn.H"
|
|
||||||
#include "hEqn.H"
|
|
||||||
|
|
||||||
if (!ign.ignited())
|
|
||||||
{
|
|
||||||
hu == h;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "pEqn.H"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pimple.turbCorr())
|
|
||||||
{
|
|
||||||
turbulence->correct();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
runTime.write();
|
|
||||||
|
|
||||||
runTime.printExecutionTime(Info);
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "End\n";
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,150 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "basicXiSubXiEq.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(basicSubGrid, 0);
|
|
||||||
addToRunTimeSelectionTable(XiEqModel, basicSubGrid, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::basicSubGrid::basicSubGrid
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiEqModel(XiEqProperties, thermo, turbulence, Su),
|
|
||||||
|
|
||||||
B_
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"B",
|
|
||||||
Su.mesh().facesInstance(),
|
|
||||||
Su.mesh(),
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
Su.mesh()
|
|
||||||
),
|
|
||||||
|
|
||||||
XiEqModel_(XiEqModel::New(XiEqModelCoeffs_, thermo, turbulence, Su))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::basicSubGrid::~basicSubGrid()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::basicSubGrid::XiEq() const
|
|
||||||
{
|
|
||||||
const fvMesh& mesh = Su_.mesh();
|
|
||||||
const volVectorField& U = mesh.lookupObject<volVectorField>("U");
|
|
||||||
|
|
||||||
const volScalarField& Nv = mesh.lookupObject<volScalarField>("Nv");
|
|
||||||
const volSymmTensorField& nsv =
|
|
||||||
mesh.lookupObject<volSymmTensorField>("nsv");
|
|
||||||
|
|
||||||
volScalarField magU(mag(U));
|
|
||||||
volVectorField Uhat
|
|
||||||
(
|
|
||||||
U/(mag(U) + dimensionedScalar("Usmall", U.dimensions(), 1e-4))
|
|
||||||
);
|
|
||||||
|
|
||||||
const scalarField Cw = pow(mesh.V(), 2.0/3.0);
|
|
||||||
|
|
||||||
volScalarField N
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"N",
|
|
||||||
mesh.time().constant(),
|
|
||||||
mesh,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh,
|
|
||||||
dimensionedScalar(Nv.dimensions(), Zero)
|
|
||||||
);
|
|
||||||
N.primitiveFieldRef() = Nv.primitiveField()*Cw;
|
|
||||||
|
|
||||||
volSymmTensorField ns
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"ns",
|
|
||||||
U.mesh().time().timeName(),
|
|
||||||
U.mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
U.mesh(),
|
|
||||||
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
|
||||||
);
|
|
||||||
ns.primitiveFieldRef() = nsv.primitiveField()*Cw;
|
|
||||||
|
|
||||||
volScalarField n(max(N - (Uhat & ns & Uhat), scalar(1e-4)));
|
|
||||||
volScalarField b((Uhat & B_ & Uhat)/sqrt(n));
|
|
||||||
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
|
||||||
|
|
||||||
volScalarField XiSubEq
|
|
||||||
(
|
|
||||||
scalar(1)
|
|
||||||
+ max(2.2*sqrt(b), min(0.34*magU/up*sqrt(b), scalar(1.6)))
|
|
||||||
* min(n, scalar(1))
|
|
||||||
);
|
|
||||||
|
|
||||||
return (XiSubEq*XiEqModel_->XiEq());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiEqModels::basicSubGrid::read(const dictionary& XiEqProperties)
|
|
||||||
{
|
|
||||||
XiEqModel::read(XiEqProperties);
|
|
||||||
|
|
||||||
return XiEqModel_->read(XiEqModelCoeffs_);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2012 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiEqModels::basicSubGrid
|
|
||||||
|
|
||||||
Description
|
|
||||||
Basic sub-grid obstacle flame-wrinkling enhancement factor model.
|
|
||||||
Details supplied by J Puttock 2/7/06.
|
|
||||||
|
|
||||||
<b> Sub-grid flame area generation </b>
|
|
||||||
|
|
||||||
\f$ n = N - \hat{\dwea{\vec{U}}}.n_{s}.\hat{\dwea{\vec{U}}} \f$
|
|
||||||
\f$ n_{r} = \sqrt{n} \f$
|
|
||||||
|
|
||||||
where:
|
|
||||||
|
|
||||||
\f$ \hat{\dwea{\vec{U}}} = \dwea{\vec{U}} / \vert \dwea{\vec{U}}
|
|
||||||
\vert \f$
|
|
||||||
|
|
||||||
\f$ b = \hat{\dwea{\vec{U}}}.B.\hat{\dwea{\vec{U}}} / n_{r} \f$
|
|
||||||
|
|
||||||
where:
|
|
||||||
|
|
||||||
\f$ B \f$ is the file "B".
|
|
||||||
|
|
||||||
\f$ N \f$ is the file "N".
|
|
||||||
|
|
||||||
\f$ n_{s} \f$ is the file "ns".
|
|
||||||
|
|
||||||
The flame area enhancement factor \f$ \Xi_{sub} \f$ is expected to
|
|
||||||
approach:
|
|
||||||
|
|
||||||
\f[
|
|
||||||
\Xi_{{sub}_{eq}} =
|
|
||||||
1 + max(2.2 \sqrt{b}, min(0.34 \frac{\vert \dwea{\vec{U}}
|
|
||||||
\vert}{{\vec{U}}^{'}}, 1.6)) \times min(\frac{n}{4}, 1)
|
|
||||||
\f]
|
|
||||||
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
basicSubGrid.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef basicSubGrid_H
|
|
||||||
#define basicSubGrid_H
|
|
||||||
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class basicSubGrid Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class basicSubGrid
|
|
||||||
:
|
|
||||||
public XiEqModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- tblock
|
|
||||||
volSymmTensorField B_;
|
|
||||||
|
|
||||||
//- Equilibrium Xi model due to turbulence
|
|
||||||
autoPtr<XiEqModel> XiEqModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
basicSubGrid(const basicSubGrid&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const basicSubGrid&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("basicSubGrid");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
basicSubGrid
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~basicSubGrid();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame-wrinkling XiEq
|
|
||||||
virtual tmp<volScalarField> XiEq() const;
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiEqProperties);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiEqModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -0,0 +1,219 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "normBasicXiSubXiEq.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "ignition.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(normBasicSubGrid, 0);
|
||||||
|
addToRunTimeSelectionTable(XiEqModel, normBasicSubGrid, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiEqModels::normBasicSubGrid::normBasicSubGrid
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiEqModel(XiEqProperties, modelType,thermo, turbulence, Su),
|
||||||
|
Cxpe1_(XiEqModelCoeffs_.get<scalar>("Cxpe1")),
|
||||||
|
Cxpe2_(XiEqModelCoeffs_.get<scalar>("Cxpe2")),
|
||||||
|
Cxpe3_(XiEqModelCoeffs_.get<scalar>("Cxpe3")),
|
||||||
|
Cxpe4_(XiEqModelCoeffs_.get<scalar>("Cxpe4"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiEqModels::normBasicSubGrid::~normBasicSubGrid()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::normBasicSubGrid::XiEq() const
|
||||||
|
{
|
||||||
|
const fvMesh& mesh = Su_.mesh();
|
||||||
|
const volVectorField& U = mesh.lookupObject<volVectorField>("U");
|
||||||
|
const volScalarField& b = mesh.lookupObject<volScalarField>("b");
|
||||||
|
const volScalarField& Nv = mesh.lookupObject<volScalarField>("Nv");
|
||||||
|
const volSymmTensorField& nsv =
|
||||||
|
mesh.lookupObject<volSymmTensorField>("nsv");
|
||||||
|
const volSymmTensorField& Bv =
|
||||||
|
mesh.lookupObject<volSymmTensorField>("Bv");
|
||||||
|
|
||||||
|
volScalarField magU(mag(U));
|
||||||
|
|
||||||
|
const scalarField Cw(pow(mesh.V(), 2.0/3.0));
|
||||||
|
|
||||||
|
auto tN = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tN",
|
||||||
|
mesh.time().constant(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
dimensionedScalar(Nv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& N = tN.ref();
|
||||||
|
|
||||||
|
N.primitiveFieldRef() = Nv.primitiveField()*Cw;
|
||||||
|
|
||||||
|
auto tns = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tns",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& ns = tns.ref();
|
||||||
|
|
||||||
|
auto tB = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tB",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
dimensionedSymmTensor(Bv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& B = tB.ref();
|
||||||
|
|
||||||
|
//calculating flame normal
|
||||||
|
|
||||||
|
volVectorField flNormal
|
||||||
|
(
|
||||||
|
"flNormal",
|
||||||
|
fvc::reconstruct(fvc::snGrad(b)*mesh.magSf())
|
||||||
|
);
|
||||||
|
|
||||||
|
volScalarField mgb("mgb", mag(flNormal));
|
||||||
|
|
||||||
|
dimensionedScalar dMgb("dMgb", mgb.dimensions(), SMALL);
|
||||||
|
|
||||||
|
const volScalarField bc(b*(1.0-b));
|
||||||
|
|
||||||
|
dMgb += 1.0e-8*
|
||||||
|
(bc*mgb)().weightedAverage(mesh.V())
|
||||||
|
/(bc.weightedAverage(mesh.V()) + SMALL);
|
||||||
|
|
||||||
|
mgb += dMgb;
|
||||||
|
flNormal /= mgb;
|
||||||
|
|
||||||
|
B.primitiveFieldRef() = Bv.primitiveField()*sqrt(Cw);
|
||||||
|
volScalarField Ntemp("Ntemp", N);
|
||||||
|
volScalarField Np("Np", max(N - (flNormal & ns & flNormal), scalar(1)));
|
||||||
|
|
||||||
|
// B_ is Bv*sqrt(Cw)
|
||||||
|
volScalarField bl("bl",(flNormal & B & flNormal)/sqrt(Np));
|
||||||
|
bl.min(1.0);
|
||||||
|
|
||||||
|
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
||||||
|
|
||||||
|
IOdictionary combustionProperties
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
mesh.time().constant(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ignition ign(combustionProperties, mesh.time(), mesh);
|
||||||
|
|
||||||
|
dimensionedVector ignLoc("ignLoc", dimLength, ign.sites()[0].location());
|
||||||
|
|
||||||
|
dimensionedScalar filtRad2
|
||||||
|
(
|
||||||
|
"filtRad2",
|
||||||
|
dimLength,
|
||||||
|
6.0*ign.sites()[0].diameter()
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField filDist(mag(mesh.C() - ignLoc));
|
||||||
|
|
||||||
|
const volScalarField filterMult
|
||||||
|
(
|
||||||
|
pos(filDist - filtRad2)*neg(bl - 0.99)*pos(N - 1e-3)
|
||||||
|
);
|
||||||
|
|
||||||
|
tmp<volScalarField> XiSubEq
|
||||||
|
(
|
||||||
|
scalar(1)
|
||||||
|
+ min( min(Cxpe1_, Cxpe2_*magU/up)*sqrt(bl), Cxpe3_)
|
||||||
|
* filterMult
|
||||||
|
);
|
||||||
|
|
||||||
|
return XiSubEq;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiEqModels::normBasicSubGrid::read(const dictionary& XiEqProperties)
|
||||||
|
{
|
||||||
|
XiEqModel::read(XiEqProperties);
|
||||||
|
|
||||||
|
XiEqModelCoeffs_.readEntry("Cxpe1", Cxpe1_);
|
||||||
|
XiEqModelCoeffs_.readEntry("Cxpe2", Cxpe2_);
|
||||||
|
XiEqModelCoeffs_.readEntry("Cxpe3", Cxpe3_);
|
||||||
|
XiEqModelCoeffs_.readEntry("Cxpe4", Cxpe4_);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiEqModels::normBasicSubGrid
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
normBasicSubGrid.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef normBasicSubGrid_H
|
||||||
|
#define normBasicSubGrid_H
|
||||||
|
|
||||||
|
#include "XiEqModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class normBasicSubGrid Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class normBasicSubGrid
|
||||||
|
:
|
||||||
|
public XiEqModel
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
// Constants in the equilibrium Xp equation
|
||||||
|
scalar Cxpe1_;
|
||||||
|
scalar Cxpe2_;
|
||||||
|
scalar Cxpe3_;
|
||||||
|
scalar Cxpe4_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
normBasicSubGrid(const normBasicSubGrid&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const normBasicSubGrid&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("normBasicSubGrid");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
normBasicSubGrid
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~normBasicSubGrid();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame-wrinkling XiEq
|
||||||
|
virtual tmp<volScalarField> XiEq() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiEqProperties);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiEqModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -1,115 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "basicXiSubG.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiGModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(basicSubGrid, 0);
|
|
||||||
addToRunTimeSelectionTable(XiGModel, basicSubGrid, dictionary);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiGModels::basicSubGrid::basicSubGrid
|
|
||||||
(
|
|
||||||
const dictionary& XiGProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiGModel(XiGProperties, thermo, turbulence, Su),
|
|
||||||
k1(XiGModelCoeffs_.get<scalar>("k1")),
|
|
||||||
XiGModel_(XiGModel::New(XiGModelCoeffs_, thermo, turbulence, Su))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiGModels::basicSubGrid::~basicSubGrid()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiGModels::basicSubGrid::G() const
|
|
||||||
{
|
|
||||||
const objectRegistry& db = Su_.db();
|
|
||||||
const volVectorField& U = db.lookupObject<volVectorField>("U");
|
|
||||||
const volScalarField& Nv = db.lookupObject<volScalarField>("Nv");
|
|
||||||
const volScalarField& Lobs = db.lookupObject<volScalarField>("Lobs");
|
|
||||||
|
|
||||||
tmp<volScalarField> tGtot = XiGModel_->G();
|
|
||||||
volScalarField& Gtot = tGtot.ref();
|
|
||||||
|
|
||||||
const scalarField Cw = pow(Su_.mesh().V(), 2.0/3.0);
|
|
||||||
scalarField N(Nv.primitiveField()*Cw);
|
|
||||||
|
|
||||||
forAll(N, celli)
|
|
||||||
{
|
|
||||||
if (N[celli] > 1e-3)
|
|
||||||
{
|
|
||||||
Gtot[celli] += k1*mag(U[celli])/Lobs[celli];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tGtot;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiGModels::basicSubGrid::Db() const
|
|
||||||
{
|
|
||||||
const objectRegistry& db = Su_.db();
|
|
||||||
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
|
||||||
const volScalarField& rho = db.lookupObject<volScalarField>("rho");
|
|
||||||
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
|
||||||
const volScalarField& Lobs = db.lookupObject<volScalarField>("Lobs");
|
|
||||||
|
|
||||||
return XiGModel_->Db()
|
|
||||||
+ rho*Su_*(Xi - 1.0)*mgb*(0.5*Lobs)*Lobs/(mgb*Lobs + 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiGModels::basicSubGrid::read(const dictionary& XiGProperties)
|
|
||||||
{
|
|
||||||
XiGModel::read(XiGProperties);
|
|
||||||
|
|
||||||
XiGModelCoeffs_.readEntry("k1", k1);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,138 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2013 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiGModels::basicSubGrid
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
Basic sub-grid obstacle flame-wrinkling generation rate coefficient model.
|
|
||||||
Details supplied by J Puttock 2/7/06.
|
|
||||||
|
|
||||||
\f$ G_{sub} \f$ denotes the generation coefficient and it is given by
|
|
||||||
|
|
||||||
\f[
|
|
||||||
G_{sub} = k_{1} /frac{\vert \dwea{\vec{U}} \vert}{L_{obs}}
|
|
||||||
\frac{/Xi_{{sub}_{eq}}-1}{/Xi_{sub}}
|
|
||||||
\f]
|
|
||||||
|
|
||||||
and the removal:
|
|
||||||
|
|
||||||
\f[
|
|
||||||
- k_{1} /frac{\vert \dwea{\vec{U}} \vert}{L_{sub}}
|
|
||||||
\frac{\Xi_{sub}-1}{\Xi_{sub}}
|
|
||||||
\f]
|
|
||||||
|
|
||||||
Finally, \f$ G_{sub} \f$ is added to generation rate \f$ G_{in} \f$
|
|
||||||
due to the turbulence.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
basicSubGrid.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef basicSubGrid_H
|
|
||||||
#define basicSubGrid_H
|
|
||||||
|
|
||||||
#include "XiGModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiGModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class basicSubGrid Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class basicSubGrid
|
|
||||||
:
|
|
||||||
public XiGModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Sub-grid generation rate coefficient
|
|
||||||
scalar k1;
|
|
||||||
|
|
||||||
//- Xi generation rate model due to turbulence
|
|
||||||
autoPtr<XiGModel> XiGModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
basicSubGrid(const basicSubGrid&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const basicSubGrid&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("basicSubGridG");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
basicSubGrid
|
|
||||||
(
|
|
||||||
const dictionary& XiGProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~basicSubGrid();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame-wrinkling generation rate
|
|
||||||
virtual tmp<volScalarField> G() const;
|
|
||||||
|
|
||||||
//- Return the flame diffusivity
|
|
||||||
virtual tmp<volScalarField> Db() const;
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiGProperties);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiGModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -0,0 +1,270 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "normBasicXiSubG.H"
|
||||||
|
#include "zeroGradientFvPatchField.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiGModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(normBasicSubGrid, 0);
|
||||||
|
addToRunTimeSelectionTable(XiGModel, normBasicSubGrid, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiGModels::normBasicSubGrid::normBasicSubGrid
|
||||||
|
(
|
||||||
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiGModel(XiGProperties, modelType, thermo, turbulence, Su),
|
||||||
|
// Bv_
|
||||||
|
// (
|
||||||
|
// IOobject
|
||||||
|
// (
|
||||||
|
// "Bv",
|
||||||
|
// Su.mesh().facesInstance(),
|
||||||
|
// Su.mesh(),
|
||||||
|
// IOobject::MUST_READ,
|
||||||
|
// IOobject::NO_WRITE
|
||||||
|
// ),
|
||||||
|
// Su.mesh()
|
||||||
|
// ),
|
||||||
|
k1_(XiGModelCoeffs_.get<scalar>("k1")),
|
||||||
|
kb1_(XiGModelCoeffs_.get<scalar>("kb1")),
|
||||||
|
kbe_(XiGModelCoeffs_.get<scalar>("kbe")),
|
||||||
|
kbx_(XiGModelCoeffs_.get<scalar>("kbx")),
|
||||||
|
k2_(XiGModelCoeffs_.get<scalar>("k2")),
|
||||||
|
LOverCw_(XiGModelCoeffs_.get<scalar>("LOverCw"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::normBasicSubGrid::G() const
|
||||||
|
{
|
||||||
|
const objectRegistry& db = Su_.db();
|
||||||
|
const fvMesh& mesh = Su_.mesh();
|
||||||
|
const volVectorField& U = db.lookupObject<volVectorField>("U");
|
||||||
|
const volScalarField& b = db.lookupObject<volScalarField>("b");
|
||||||
|
const volScalarField& Nv = db.lookupObject<volScalarField>("Nv");
|
||||||
|
const volScalarField& St = db.lookupObject<volScalarField>("St");
|
||||||
|
const volSymmTensorField& nsv = db.lookupObject<volSymmTensorField>("nsv");
|
||||||
|
const volScalarField& Lobs = db.lookupObject<volScalarField>("Lobs");
|
||||||
|
const volSymmTensorField& Bv = db.lookupObject<volSymmTensorField>("Bv");
|
||||||
|
|
||||||
|
const scalarField Cw(pow(Su_.mesh().V(), 2.0/3.0));
|
||||||
|
volScalarField CwVol
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"CwVol",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
dimensionSet(dimLength),
|
||||||
|
Cw,
|
||||||
|
zeroGradientFvPatchField<scalar>::typeName
|
||||||
|
);
|
||||||
|
CwVol.correctBoundaryConditions();
|
||||||
|
|
||||||
|
if (!db.foundObject<volScalarField>("Ep"))
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "Looking for Ep in db that does not exist" << nl
|
||||||
|
<< Foam::abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const volScalarField& Ep = db.lookupObject<volScalarField>("Ep");
|
||||||
|
const volScalarField& Xp = db.lookupObject<volScalarField>("Xp");
|
||||||
|
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
||||||
|
|
||||||
|
//tmp<volScalarField> tGtot = XiGModel_->G();
|
||||||
|
auto tGtot = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tGtot",
|
||||||
|
Su_.mesh().time().timeName(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
Su_.mesh(),
|
||||||
|
dimensionedScalar(inv(dimTime), Zero)
|
||||||
|
);
|
||||||
|
auto& Gtot = tGtot.ref();
|
||||||
|
|
||||||
|
//calculating flame normal
|
||||||
|
|
||||||
|
volVectorField flNormal(fvc::reconstruct(fvc::snGrad(b)*mesh.magSf()));
|
||||||
|
volScalarField mgb("mgb", mag(flNormal));
|
||||||
|
dimensionedScalar dMgb("dMgb", mgb.dimensions(), SMALL);
|
||||||
|
{
|
||||||
|
volScalarField bc(b*(1.0-b));
|
||||||
|
|
||||||
|
dMgb += 1.0e-8*
|
||||||
|
(bc*mgb)().weightedAverage(mesh.V())
|
||||||
|
/(bc.weightedAverage(mesh.V()) + SMALL);
|
||||||
|
}
|
||||||
|
mgb += dMgb;
|
||||||
|
flNormal /= mgb;
|
||||||
|
|
||||||
|
|
||||||
|
auto tN = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tN",
|
||||||
|
Su_.mesh().time().timeName(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
Su_.mesh(),
|
||||||
|
dimensionedScalar(Nv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& N = tN.ref();
|
||||||
|
|
||||||
|
N.primitiveFieldRef() = Nv.primitiveField()*Cw;
|
||||||
|
|
||||||
|
auto tns = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tns",
|
||||||
|
Su_.mesh().time().timeName(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
Su_.mesh(),
|
||||||
|
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& ns = tns.ref();
|
||||||
|
|
||||||
|
ns.primitiveFieldRef() = nsv.primitiveField()*Cw;
|
||||||
|
|
||||||
|
auto tB = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tB",
|
||||||
|
Su_.mesh().time().timeName(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
Su_.mesh(),
|
||||||
|
dimensionedSymmTensor(Bv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& B = tB.ref();
|
||||||
|
|
||||||
|
B.primitiveFieldRef() = Bv.primitiveField()*sqrt(Cw);
|
||||||
|
|
||||||
|
volScalarField Np(max(N - (flNormal & ns & flNormal), scalar(1)));
|
||||||
|
|
||||||
|
// B_ is Bv*sqrt(Cw)
|
||||||
|
volScalarField bl("bl",(flNormal & B & flNormal)/sqrt(Np));
|
||||||
|
bl.min(1.0);
|
||||||
|
|
||||||
|
volScalarField flSpeed("flSpeed", ((U & flNormal) + St)*b/(b+SMALL)) ;
|
||||||
|
|
||||||
|
volScalarField up("up", sqrt((2.0/3.0)*turbulence_.k()));
|
||||||
|
|
||||||
|
const volScalarField Gtot1
|
||||||
|
(
|
||||||
|
"Gtot1",
|
||||||
|
(
|
||||||
|
k1_ + kb1_*min(pow(bl, kbe_), kbx_)
|
||||||
|
)*mag(flSpeed)/(max(Lobs, LOverCw_*CwVol))
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField Gtot2("Gtot2", k2_*Ep*Su_*Xi/(Xp - 0.999));
|
||||||
|
|
||||||
|
const volScalarField value(pos(N - 1.e-3)*neg(bl - 0.99));
|
||||||
|
|
||||||
|
Gtot = value*Gtot1+(1.0 - value)*Gtot2;
|
||||||
|
|
||||||
|
|
||||||
|
/// if (Xi.mesh().time().outputTime())
|
||||||
|
/// {
|
||||||
|
/// Gtot.write();
|
||||||
|
/// bl.write();
|
||||||
|
/// Lobs.write();
|
||||||
|
/// flSpeed.write();
|
||||||
|
/// N.write();
|
||||||
|
/// }
|
||||||
|
|
||||||
|
return tGtot;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::normBasicSubGrid::Db() const
|
||||||
|
{
|
||||||
|
// Not used //
|
||||||
|
const objectRegistry& db = Su_.db();
|
||||||
|
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
||||||
|
const volScalarField& rho = db.lookupObject<volScalarField>("rho");
|
||||||
|
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
||||||
|
const volScalarField& Lobs = db.lookupObject<volScalarField>("Lobs");
|
||||||
|
const volScalarField& Db = db.lookupObject<volScalarField>("Db");
|
||||||
|
|
||||||
|
//return turbulence_.muEff()
|
||||||
|
return Db + rho*Su_*(Xi - 1.0)*mgb*(0.5*Lobs)*Lobs/(mgb*Lobs + 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiGModels::normBasicSubGrid::read(const dictionary& XiGProperties)
|
||||||
|
{
|
||||||
|
XiGModel::read(XiGProperties);
|
||||||
|
|
||||||
|
XiGModelCoeffs_.readEntry("k1", k1_);
|
||||||
|
XiGModelCoeffs_.readEntry("kb1", kb1_);
|
||||||
|
XiGModelCoeffs_.readEntry("kbe", kbe_);
|
||||||
|
XiGModelCoeffs_.readEntry("kbx", kbx_);
|
||||||
|
XiGModelCoeffs_.readEntry("k2", k2_);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,132 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiGModel::normBasicSubGrid
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
normBasicSubGrid.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef normBasicSubGrid_H
|
||||||
|
#define normBasicSubGrid_H
|
||||||
|
|
||||||
|
#include "XiGModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiGModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class normBasicSubGrid Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class normBasicSubGrid
|
||||||
|
:
|
||||||
|
public XiGModel
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
//- Sub-grid generation rate coefficient
|
||||||
|
scalar k1_;
|
||||||
|
|
||||||
|
//- Sub-grid generation rate coefficient - * sqrt(b)
|
||||||
|
scalar kb1_;
|
||||||
|
|
||||||
|
//- Sub-grid generation rate coefficient - * b
|
||||||
|
scalar kbe_;
|
||||||
|
|
||||||
|
//- Sub-grid generation rate upper limit coefficient - * b
|
||||||
|
scalar kbx_;
|
||||||
|
|
||||||
|
//- Sub-grid generation rate coefficient
|
||||||
|
scalar k2_;
|
||||||
|
|
||||||
|
//- Maximum Lobs/CellWidth
|
||||||
|
scalar LOverCw_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
normBasicSubGrid(const normBasicSubGrid&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const normBasicSubGrid&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("normBasicSubGridG");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
normBasicSubGrid
|
||||||
|
(
|
||||||
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~normBasicSubGrid() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame-wrinkling generation rate
|
||||||
|
virtual tmp<volScalarField> G() const;
|
||||||
|
|
||||||
|
//- Return the flame diffusivity
|
||||||
|
virtual tmp<volScalarField> Db() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiGProperties);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiGModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -81,7 +81,7 @@ Foam::PDRDragModel::~PDRDragModel()
|
|||||||
|
|
||||||
bool Foam::PDRDragModel::read(const dictionary& PDRProperties)
|
bool Foam::PDRDragModel::read(const dictionary& PDRProperties)
|
||||||
{
|
{
|
||||||
PDRDragModelCoeffs_ = PDRProperties.optionalSubDict(type() + "Coeffs");
|
PDRDragModelCoeffs_ = PDRProperties.subDict(type() + "Coeffs");
|
||||||
|
|
||||||
PDRDragModelCoeffs_.readEntry("drag", on_);
|
PDRDragModelCoeffs_.readEntry("drag", on_);
|
||||||
|
|
||||||
@ -89,4 +89,10 @@ bool Foam::PDRDragModel::read(const dictionary& PDRProperties)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::PDRDragModel::writeFields() const
|
||||||
|
{
|
||||||
|
NotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -57,10 +57,9 @@ class PDRDragModel
|
|||||||
:
|
:
|
||||||
public regIOobject
|
public regIOobject
|
||||||
{
|
{
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected Data
|
||||||
|
|
||||||
dictionary PDRDragModelCoeffs_;
|
dictionary PDRDragModelCoeffs_;
|
||||||
|
|
||||||
@ -72,9 +71,7 @@ protected:
|
|||||||
bool on_;
|
bool on_;
|
||||||
|
|
||||||
|
|
||||||
private:
|
// Protected Member Functions
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
//- No copy construct
|
||||||
PDRDragModel(const PDRDragModel&) = delete;
|
PDRDragModel(const PDRDragModel&) = delete;
|
||||||
@ -146,7 +143,7 @@ public:
|
|||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
//- Return true if the drag model is switched on
|
//- Return true if the drag model is switched on
|
||||||
bool on() const
|
bool on() const noexcept
|
||||||
{
|
{
|
||||||
return on_;
|
return on_;
|
||||||
}
|
}
|
||||||
@ -161,17 +158,16 @@ public:
|
|||||||
using regIOobject::read;
|
using regIOobject::read;
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
//- Update properties from given dictionary
|
||||||
virtual bool read(const dictionary& PDRProperties) = 0;
|
virtual bool read(const dictionary& PDRProperties);
|
||||||
|
|
||||||
|
//- Write Data
|
||||||
virtual bool writeData(Ostream&) const
|
virtual bool writeData(Ostream&) const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void writeFields() const
|
//- Write fields
|
||||||
{
|
virtual void writeFields() const;
|
||||||
NotImplemented;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2019-2021 OpenCFD Ltd.
|
Copyright (C) 2019 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -43,9 +43,9 @@ Foam::autoPtr<Foam::PDRDragModel> Foam::PDRDragModel::New
|
|||||||
|
|
||||||
Info<< "Selecting drag model " << modelType << endl;
|
Info<< "Selecting drag model " << modelType << endl;
|
||||||
|
|
||||||
auto* ctorPtr = dictionaryConstructorTable(modelType);
|
auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
|
||||||
|
|
||||||
if (!ctorPtr)
|
if (!cstrIter.found())
|
||||||
{
|
{
|
||||||
FatalIOErrorInLookup
|
FatalIOErrorInLookup
|
||||||
(
|
(
|
||||||
@ -56,10 +56,7 @@ Foam::autoPtr<Foam::PDRDragModel> Foam::PDRDragModel::New
|
|||||||
) << exit(FatalIOError);
|
) << exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
return autoPtr<PDRDragModel>
|
return autoPtr<PDRDragModel>(cstrIter()(dict, turbulence, rho, U, phi));
|
||||||
(
|
|
||||||
ctorPtr(dict, turbulence, rho, U, phi)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -5,8 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011 OpenFOAM Foundation
|
||||||
Copyright (C) 2023 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -94,10 +93,16 @@ Foam::PDRDragModels::basic::~basic()
|
|||||||
|
|
||||||
Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basic::Dcu() const
|
Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basic::Dcu() const
|
||||||
{
|
{
|
||||||
auto tDragDcu = volSymmTensorField::New
|
auto tDragDcu = tmp<volSymmTensorField>::New
|
||||||
(
|
(
|
||||||
"tDragDcu",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"tDragDcu",
|
||||||
|
U_.mesh().time().constant(),
|
||||||
|
U_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
U_.mesh(),
|
U_.mesh(),
|
||||||
dimensionedSymmTensor(dimMass/dimTime/dimVolume, Zero)
|
dimensionedSymmTensor(dimMass/dimTime/dimVolume, Zero)
|
||||||
);
|
);
|
||||||
@ -118,10 +123,16 @@ Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basic::Dcu() const
|
|||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basic::Gk() const
|
Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basic::Gk() const
|
||||||
{
|
{
|
||||||
auto tGk = volScalarField::New
|
auto tGk = tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"tGk",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"tGk",
|
||||||
|
U_.mesh().time().constant(),
|
||||||
|
U_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
U_.mesh(),
|
U_.mesh(),
|
||||||
dimensionedScalar(dimMass/dimLength/pow3(dimTime), Zero)
|
dimensionedScalar(dimMass/dimLength/pow3(dimTime), Zero)
|
||||||
);
|
);
|
||||||
@ -140,6 +151,7 @@ Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basic::Gk() const
|
|||||||
+ Csk*betav*turbulence_.muEff()*sqr(Aw_)*magSqr(U_);
|
+ Csk*betav*turbulence_.muEff()*sqr(Aw_)*magSqr(U_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return tGk;
|
return tGk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,4 +173,5 @@ void Foam::PDRDragModels::basic::writeFields() const
|
|||||||
CR_.write();
|
CR_.write();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -99,7 +99,7 @@ class basic
|
|||||||
:
|
:
|
||||||
public PDRDragModel
|
public PDRDragModel
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
dimensionedScalar Csu;
|
dimensionedScalar Csu;
|
||||||
dimensionedScalar Csk;
|
dimensionedScalar Csk;
|
||||||
|
|||||||
@ -0,0 +1,296 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "basicSch.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace PDRDragModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(basicSch, 0);
|
||||||
|
addToRunTimeSelectionTable(PDRDragModel, basicSch, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::PDRDragModels::basicSch::basicSch
|
||||||
|
(
|
||||||
|
const dictionary& PDRProperties,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& rho,
|
||||||
|
const volVectorField& U,
|
||||||
|
const surfaceScalarField& phi
|
||||||
|
)
|
||||||
|
:
|
||||||
|
PDRDragModel(PDRProperties,turbulence, rho, U, phi),
|
||||||
|
Csu("Csu", dimless, PDRDragModelCoeffs_),
|
||||||
|
Csk("Csk", dimless, PDRDragModelCoeffs_),
|
||||||
|
Aw_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Aw",
|
||||||
|
U_.mesh().facesInstance(),
|
||||||
|
U_.mesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
U_.mesh()
|
||||||
|
),
|
||||||
|
|
||||||
|
CR_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"CR",
|
||||||
|
U_.mesh().facesInstance(),
|
||||||
|
U_.mesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
U_.mesh()
|
||||||
|
),
|
||||||
|
nrCoef_(PDRDragModelCoeffs_.get<scalar>("nrCoef")),
|
||||||
|
nrExp2_(PDRDragModelCoeffs_.get<scalar>("nrExp2")),
|
||||||
|
lCoef_(PDRDragModelCoeffs_.get<scalar>("lCoef")),
|
||||||
|
maxSchFac_(PDRDragModelCoeffs_.get<scalar>("maxSchFac")),
|
||||||
|
subGridSchelkin_(PDRDragModelCoeffs_.get<bool>("subGridSchelkin"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::PDRDragModels::basicSch::~basicSch()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volSymmTensorField> Foam::PDRDragModels::basicSch::Dcu() const
|
||||||
|
{
|
||||||
|
auto tDragDcu = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
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();
|
||||||
|
|
||||||
|
if (on_)
|
||||||
|
{
|
||||||
|
const volScalarField& betav =
|
||||||
|
U_.db().lookupObject<volScalarField>("betav");
|
||||||
|
|
||||||
|
DragDcu =
|
||||||
|
(0.5*rho_)*CR_*mag(U_) + (Csu*I)*betav*turbulence_.muEff()*sqr(Aw_);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tDragDcu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basicSch::Gk() const
|
||||||
|
{
|
||||||
|
auto tGk = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
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();
|
||||||
|
|
||||||
|
if (on_)
|
||||||
|
{
|
||||||
|
const volScalarField& betav =
|
||||||
|
U_.db().lookupObject<volScalarField>("betav");
|
||||||
|
|
||||||
|
const volSymmTensorField& CT =
|
||||||
|
U_.db().lookupObject<volSymmTensorField>("CT");
|
||||||
|
|
||||||
|
Gk =
|
||||||
|
(0.5*rho_)*mag(U_)*(U_ & CT & U_)
|
||||||
|
+ Csk*betav*turbulence_.muEff()*sqr(Aw_)*magSqr(U_);
|
||||||
|
|
||||||
|
if (subGridSchelkin_)
|
||||||
|
{
|
||||||
|
Gk *= this->SchelkinFactor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tGk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField>
|
||||||
|
Foam::PDRDragModels::basicSch::SchelkinFactor() const
|
||||||
|
{
|
||||||
|
const volScalarField& Su_ = U_.db().lookupObject<volScalarField>("Su");
|
||||||
|
const volScalarField& rhou_ = U_.db().lookupObject<volScalarField>("rhou");
|
||||||
|
const volScalarField& muu_ = U_.db().lookupObject<volScalarField>("muu");
|
||||||
|
|
||||||
|
auto tfac = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tfac",
|
||||||
|
U_.mesh().time().constant(),
|
||||||
|
U_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
U_.mesh(),
|
||||||
|
dimensionedScalar(dimless, Zero)
|
||||||
|
);
|
||||||
|
auto& schFac = tfac.ref();
|
||||||
|
|
||||||
|
const volScalarField& k = turbulence_.k();
|
||||||
|
const volScalarField& epsilon = turbulence_.epsilon();
|
||||||
|
|
||||||
|
const volScalarField up(sqrt((2.0/3.0)*k));
|
||||||
|
const volScalarField l(lCoef_*sqrt(3.0/2.0)*up*k/epsilon);
|
||||||
|
|
||||||
|
volScalarField Rs(Su_*l*rhou_/muu_);
|
||||||
|
|
||||||
|
if (subGridSchelkin_)
|
||||||
|
{
|
||||||
|
schFac = max
|
||||||
|
(
|
||||||
|
1.0,
|
||||||
|
min
|
||||||
|
(
|
||||||
|
maxSchFac_,
|
||||||
|
pow(Rs, 2.0 * SchelkinExponent(nrCoef_, nrExp2_, Su_))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tfac;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::PDRDragModels::basicSch::SchelkinExponent
|
||||||
|
(
|
||||||
|
const scalar nrCoef,
|
||||||
|
const scalar nrExp,
|
||||||
|
const volScalarField& Su
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const fvMesh& mesh = Su.mesh();
|
||||||
|
|
||||||
|
const volVectorField& U = mesh.lookupObject<volVectorField>("U");
|
||||||
|
|
||||||
|
const volScalarField& Nv = mesh.lookupObject<volScalarField>("Nv");
|
||||||
|
const volSymmTensorField& nsv =
|
||||||
|
mesh.lookupObject<volSymmTensorField>("nsv");
|
||||||
|
|
||||||
|
auto tN = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"tN",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
dimensionedScalar(Nv.dimensions(), Zero)
|
||||||
|
);
|
||||||
|
auto& N = tN.ref();
|
||||||
|
|
||||||
|
N.primitiveFieldRef() = Nv.primitiveField()*pow(mesh.V(), 2.0/3.0);
|
||||||
|
|
||||||
|
auto tns = tmp<volSymmTensorField>::New
|
||||||
|
(
|
||||||
|
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
|
||||||
|
(
|
||||||
|
U/(mag(U) + dimensionedScalar("Usmall", U.dimensions(), 1e-4))
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField nr(sqrt(max(N - (Uhat & ns & Uhat), scalar(1.0))));
|
||||||
|
|
||||||
|
//Re use tN
|
||||||
|
N.primitiveFieldRef() =
|
||||||
|
nrCoef*((scalar(1.0) - pow(nrExp, nr))/(1.0 - nrExp) - scalar(1.0));
|
||||||
|
|
||||||
|
return tN;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::PDRDragModels::basicSch::read(const dictionary& PDRProperties)
|
||||||
|
{
|
||||||
|
PDRDragModel::read(PDRProperties);
|
||||||
|
|
||||||
|
PDRDragModelCoeffs_.readEntry("Csu", Csu.value());
|
||||||
|
PDRDragModelCoeffs_.readEntry("Csk", Csk.value());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::PDRDragModels::basicSch::writeFields() const
|
||||||
|
{
|
||||||
|
Aw_.write();
|
||||||
|
CR_.write();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,141 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::PDRDragModels::basicSch
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
basicSch.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef basicSch_H
|
||||||
|
#define basicSch_H
|
||||||
|
|
||||||
|
#include "PDRDragModel.H"
|
||||||
|
#include "XiEqModel.H"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace PDRDragModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class basicSch Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class basicSch
|
||||||
|
:
|
||||||
|
public PDRDragModel
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
dimensionedScalar Csu;
|
||||||
|
dimensionedScalar Csk;
|
||||||
|
volScalarField Aw_;
|
||||||
|
volSymmTensorField CR_;
|
||||||
|
|
||||||
|
//- Schelkin effect Model constants
|
||||||
|
const scalar nrCoef_;
|
||||||
|
const scalar nrExp2_;
|
||||||
|
const scalar lCoef_;
|
||||||
|
const scalar maxSchFac_;
|
||||||
|
|
||||||
|
//- Use sub-grid Schelkin effect
|
||||||
|
bool subGridSchelkin_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
basicSch(const basicSch&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const basicSch&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("basicSch");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
basicSch
|
||||||
|
(
|
||||||
|
const dictionary& PDRProperties,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& rho,
|
||||||
|
const volVectorField& U,
|
||||||
|
const surfaceScalarField& phi
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~basicSch();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the momentum drag coefficient
|
||||||
|
virtual tmp<volSymmTensorField> Dcu() const;
|
||||||
|
|
||||||
|
//- Return the momentum drag turbulence generation rate
|
||||||
|
virtual tmp<volScalarField> Gk() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& PDRProperties);
|
||||||
|
|
||||||
|
//- Write fields
|
||||||
|
void writeFields() const;
|
||||||
|
|
||||||
|
//- Return the Schelkin factor for drag turbulence generation rate
|
||||||
|
tmp<volScalarField> SchelkinFactor() const;
|
||||||
|
|
||||||
|
//- Return the sub-grid Schelkin effect exponent
|
||||||
|
tmp<volScalarField> SchelkinExponent
|
||||||
|
(
|
||||||
|
const scalar,
|
||||||
|
const scalar,
|
||||||
|
const volScalarField&
|
||||||
|
) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace PDRDragModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -5,8 +5,8 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2019-2020,2023 OpenCFD Ltd.
|
Copyright (C) 2019-2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -29,6 +29,7 @@ License
|
|||||||
#include "PDRkEpsilon.H"
|
#include "PDRkEpsilon.H"
|
||||||
#include "PDRDragModel.H"
|
#include "PDRDragModel.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "Time.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -70,16 +71,40 @@ PDRkEpsilon::PDRkEpsilon
|
|||||||
modelName
|
modelName
|
||||||
),
|
),
|
||||||
|
|
||||||
C4_
|
C5_(coeffDict_.get<scalar>("C5")),
|
||||||
|
C6_(coeffDict_.get<scalar>("C6")),
|
||||||
|
maxLOverCellW_(coeffDict_.get<scalar>("maxLOverCellW")),
|
||||||
|
lCoef_(coeffDict_.get<scalar>("lCoef")),
|
||||||
|
noTurbUntil_
|
||||||
(
|
(
|
||||||
dimensioned<scalar>::getOrAddToDict
|
dimensioned<scalar>::lookupOrAddToDict
|
||||||
(
|
(
|
||||||
"C4",
|
"noTurbUntil",
|
||||||
coeffDict_,
|
coeffDict_,
|
||||||
0.1
|
0.0
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
{}
|
LOverLobs_
|
||||||
|
(
|
||||||
|
dimensioned<scalar>::lookupOrAddToDict
|
||||||
|
(
|
||||||
|
"LOverLobs",
|
||||||
|
coeffDict_,
|
||||||
|
0.2
|
||||||
|
)
|
||||||
|
),
|
||||||
|
LOverMobs_
|
||||||
|
(
|
||||||
|
dimensioned<scalar>::lookupOrAddToDict
|
||||||
|
(
|
||||||
|
"LOverMobs",
|
||||||
|
coeffDict_,
|
||||||
|
0.0
|
||||||
|
)
|
||||||
|
),
|
||||||
|
bMin_(coeffDict_.get<scalar>("bMin")),
|
||||||
|
flameFilteredG_(coeffDict_.get<bool>("flameFilteredG"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
|
||||||
@ -94,7 +119,9 @@ bool PDRkEpsilon::read()
|
|||||||
{
|
{
|
||||||
if (RASModel::read())
|
if (RASModel::read())
|
||||||
{
|
{
|
||||||
C4_.readIfPresent(coeffDict_);
|
noTurbUntil_.readIfPresent(coeffDict_);
|
||||||
|
LOverLobs_.readIfPresent(coeffDict_);
|
||||||
|
LOverMobs_.readIfPresent(coeffDict_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,16 +137,12 @@ void PDRkEpsilon::correct()
|
|||||||
nut_ = Cmu_*sqr(k_)/epsilon_;
|
nut_ = Cmu_*sqr(k_)/epsilon_;
|
||||||
nut_.correctBoundaryConditions();
|
nut_.correctBoundaryConditions();
|
||||||
|
|
||||||
// Re-calculate thermal diffusivity
|
|
||||||
//***HGWalphat_ = mut_/Prt_;
|
|
||||||
//alphat_.correctBoundaryConditions();
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RASModel::correct();
|
RASModel::correct();
|
||||||
|
|
||||||
volScalarField divU(fvc::div(phi_/fvc::interpolate(rho_)));
|
volScalarField divU("divU",fvc::div(phi_/fvc::interpolate(rho_)));
|
||||||
|
|
||||||
if (mesh_.moving())
|
if (mesh_.moving())
|
||||||
{
|
{
|
||||||
@ -127,16 +150,13 @@ void PDRkEpsilon::correct()
|
|||||||
}
|
}
|
||||||
|
|
||||||
tmp<volTensorField> tgradU = fvc::grad(U_);
|
tmp<volTensorField> tgradU = fvc::grad(U_);
|
||||||
|
|
||||||
volScalarField G(GName(), rho_*nut_*(tgradU() && dev(twoSymm(tgradU()))));
|
volScalarField G(GName(), rho_*nut_*(tgradU() && dev(twoSymm(tgradU()))));
|
||||||
|
|
||||||
tgradU.clear();
|
tgradU.clear();
|
||||||
|
|
||||||
// Update epsilon and G at the wall
|
// Update epsilon and G at the wall
|
||||||
epsilon_.boundaryFieldRef().updateCoeffs();
|
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
|
// Add the blockage generation term so that it is included consistently
|
||||||
// in both the k and epsilon equations
|
// in both the k and epsilon equations
|
||||||
@ -146,59 +166,102 @@ void PDRkEpsilon::correct()
|
|||||||
const volScalarField& Lobs =
|
const volScalarField& Lobs =
|
||||||
U_.db().lookupObject<volScalarField>("Lobs");
|
U_.db().lookupObject<volScalarField>("Lobs");
|
||||||
|
|
||||||
|
const volVectorField& U = mesh_.lookupObject<volVectorField>("U");
|
||||||
|
|
||||||
|
const volScalarField& b = mesh_.lookupObject<volScalarField>("b");
|
||||||
|
|
||||||
|
const scalarField Cw(pow(mesh_.V(), 2.0/3.0));
|
||||||
|
|
||||||
const PDRDragModel& drag =
|
const PDRDragModel& drag =
|
||||||
U_.db().lookupObject<PDRDragModel>("PDRDragModel");
|
U_.db().lookupObject<PDRDragModel>("PDRDragModel");
|
||||||
|
|
||||||
volScalarField GR(drag.Gk());
|
volScalarField GR(drag.Gk());
|
||||||
|
|
||||||
volScalarField LI
|
volScalarField LD
|
||||||
(C4_*(Lobs + dimensionedScalar("minLength", dimLength, VSMALL)));
|
|
||||||
|
|
||||||
// Dissipation equation
|
|
||||||
tmp<fvScalarMatrix> epsEqn
|
|
||||||
(
|
(
|
||||||
betav*fvm::ddt(rho_, epsilon_)
|
"LD",
|
||||||
+ fvm::div(phi_, epsilon_)
|
(LOverLobs_)*(Lobs + dimensionedScalar("minLength", dimLength, VSMALL))
|
||||||
- fvm::laplacian(rho_*DepsilonEff(), epsilon_)
|
|
||||||
==
|
|
||||||
C1_*betav*G*epsilon_/k_
|
|
||||||
+ 1.5*pow(Cmu_, 3.0/4.0)*GR*sqrt(k_)/LI
|
|
||||||
- fvm::SuSp(((2.0/3.0)*C1_)*betav*rho_*divU, epsilon_)
|
|
||||||
- fvm::Sp(C2_*betav*rho_*epsilon_/k_, epsilon_)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
epsEqn.ref().relax();
|
LD.primitiveFieldRef() = min(LD.primitiveField(), maxLOverCellW_*sqrt(Cw));
|
||||||
|
|
||||||
epsEqn.ref().boundaryManipulate(epsilon_.boundaryFieldRef());
|
const volScalarField LI(lCoef_*pow(k_, 3.0/2.0)/epsilon_);
|
||||||
|
|
||||||
solve(epsEqn);
|
IOdictionary combustionProperties
|
||||||
bound(epsilon_, epsilonMin_);
|
|
||||||
|
|
||||||
|
|
||||||
// Turbulent kinetic energy equation
|
|
||||||
|
|
||||||
tmp<fvScalarMatrix> kEqn
|
|
||||||
(
|
(
|
||||||
betav*fvm::ddt(rho_, k_)
|
IOobject
|
||||||
+ fvm::div(phi_, k_)
|
(
|
||||||
- fvm::laplacian(rho_*DkEff(), k_)
|
"combustionProperties",
|
||||||
==
|
mesh_.time().constant(),
|
||||||
betav*G + GR
|
mesh_,
|
||||||
- fvm::SuSp((2.0/3.0)*betav*rho_*divU, k_)
|
IOobject::MUST_READ,
|
||||||
- fvm::Sp(betav*rho_*epsilon_/k_, k_)
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
kEqn.ref().relax();
|
ignition ign(combustionProperties, mesh_.time(), U.mesh());
|
||||||
solve(kEqn);
|
|
||||||
bound(k_, kMin_);
|
|
||||||
|
|
||||||
|
dimensionedVector ignLoc("ignLoc", dimLength, ign.sites()[0].location());
|
||||||
|
|
||||||
|
dimensionedScalar filtRad2
|
||||||
|
(
|
||||||
|
"filtRad2",
|
||||||
|
dimLength,
|
||||||
|
6.0*ign.sites()[0].diameter()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (flameFilteredG_)
|
||||||
|
{
|
||||||
|
const volScalarField filDist(mag(mesh_.C() - ignLoc));
|
||||||
|
const volScalarField filterG(pos(filDist - filtRad2));
|
||||||
|
const volScalarField filterdivU(pos(filDist - filtRad2));
|
||||||
|
const volScalarField filterGR(pos(filDist - filtRad2)*pos(b - bMin_));
|
||||||
|
|
||||||
|
G *= filterG;
|
||||||
|
GR *= filterGR;
|
||||||
|
divU *= filterdivU;
|
||||||
|
}
|
||||||
|
|
||||||
|
volScalarField Cl(C5_ + (C6_*((LI - LD)/LI)));
|
||||||
|
Cl.max(0.0);
|
||||||
|
|
||||||
|
if (mesh_.time() > noTurbUntil_)
|
||||||
|
{
|
||||||
|
tmp<fvScalarMatrix> epsEqn
|
||||||
|
(
|
||||||
|
betav*fvm::ddt(rho_, epsilon_)
|
||||||
|
+ fvm::div(phi_, epsilon_)
|
||||||
|
- fvm::laplacian(rho_*DepsilonEff(), epsilon_)
|
||||||
|
==
|
||||||
|
C1_*betav*G*epsilon_/k_
|
||||||
|
+ Cl*(epsilon_/k_)*GR
|
||||||
|
- fvm::SuSp(((2.0/3.0)*C1_+C3_)*betav*rho_*divU, epsilon_)
|
||||||
|
- fvm::Sp(C2_*betav*rho_*epsilon_/k_, epsilon_)
|
||||||
|
);
|
||||||
|
|
||||||
|
epsEqn.ref().relax();
|
||||||
|
epsEqn.ref().boundaryManipulate(epsilon_.boundaryFieldRef());
|
||||||
|
solve(epsEqn);
|
||||||
|
bound(epsilon_, epsilonMin_);
|
||||||
|
|
||||||
|
tmp<fvScalarMatrix> kEqn
|
||||||
|
(
|
||||||
|
betav*fvm::ddt(rho_, k_)
|
||||||
|
+ fvm::div(phi_, k_)
|
||||||
|
- fvm::laplacian(rho_*DkEff(), k_)
|
||||||
|
==
|
||||||
|
(betav*G + GR)
|
||||||
|
- fvm::SuSp((2.0/3.0)*betav*rho_*divU, k_)
|
||||||
|
- fvm::Sp(betav*rho_*epsilon_/k_, k_)
|
||||||
|
);
|
||||||
|
|
||||||
|
kEqn.ref().relax();
|
||||||
|
solve(kEqn);
|
||||||
|
bound(k_, kMin_);
|
||||||
|
}
|
||||||
// Re-calculate viscosity
|
// Re-calculate viscosity
|
||||||
nut_ = Cmu_*sqr(k_)/epsilon_;
|
nut_ = Cmu_*sqr(k_)/epsilon_;
|
||||||
nut_.correctBoundaryConditions();
|
nut_.correctBoundaryConditions();
|
||||||
|
|
||||||
// Re-calculate thermal diffusivity
|
|
||||||
//***HGWalphat_ = mut_/Prt_;
|
|
||||||
//alphat_.correctBoundaryConditions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -30,30 +31,6 @@ Description
|
|||||||
Standard k-epsilon turbulence model with additional source terms
|
Standard k-epsilon turbulence model with additional source terms
|
||||||
corresponding to PDR basic drag model (\link basic.H \endlink)
|
corresponding to PDR basic drag model (\link basic.H \endlink)
|
||||||
|
|
||||||
The default model coefficients correspond to the following:
|
|
||||||
\verbatim
|
|
||||||
PDRkEpsilonCoeffs
|
|
||||||
{
|
|
||||||
Cmu 0.09;
|
|
||||||
C1 1.44;
|
|
||||||
C2 1.92;
|
|
||||||
C3 -0.33; // only for compressible
|
|
||||||
C4 0.1;
|
|
||||||
sigmak 1.0; // only for compressible
|
|
||||||
sigmaEps 1.3;
|
|
||||||
Prt 1.0; // only for compressible
|
|
||||||
}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
The turbulence source term \f$ G_{R} \f$ appears in the
|
|
||||||
\f$ \kappa-\epsilon \f$ equation for the generation of turbulence due to
|
|
||||||
interaction with unresolved obstacles.
|
|
||||||
|
|
||||||
In the \f$ \epsilon \f$ equation \f$ C_{1} G_{R} \f$ is added as a source
|
|
||||||
term.
|
|
||||||
|
|
||||||
In the \f$ \kappa \f$ equation \f$ G_{R} \f$ is added as a source term.
|
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
PDRkEpsilon.C
|
PDRkEpsilon.C
|
||||||
|
|
||||||
@ -63,6 +40,7 @@ SourceFiles
|
|||||||
#define compressiblePDRkEpsilon_H
|
#define compressiblePDRkEpsilon_H
|
||||||
|
|
||||||
#include "kEpsilon.H"
|
#include "kEpsilon.H"
|
||||||
|
#include "ignition.H"
|
||||||
#include "turbulentFluidThermoModel.H"
|
#include "turbulentFluidThermoModel.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -88,10 +66,18 @@ class PDRkEpsilon
|
|||||||
>
|
>
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
// Model coefficients
|
// Model coefficients
|
||||||
dimensionedScalar C4_;
|
scalar C5_;
|
||||||
|
scalar C6_;
|
||||||
|
scalar maxLOverCellW_;
|
||||||
|
scalar lCoef_;
|
||||||
|
dimensionedScalar noTurbUntil_;
|
||||||
|
dimensionedScalar LOverLobs_;
|
||||||
|
dimensionedScalar LOverMobs_;
|
||||||
|
scalar bMin_;
|
||||||
|
bool flameFilteredG_;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011 OpenFOAM Foundation
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -36,10 +36,9 @@ Description
|
|||||||
|
|
||||||
if (mesh.nInternalFaces())
|
if (mesh.nInternalFaces())
|
||||||
{
|
{
|
||||||
scalarField sumPhi
|
scalarField sumPhi
|
||||||
(
|
(
|
||||||
fvc::surfaceSum(mag(phiSt))().primitiveField()
|
fvc::surfaceSum(mag(phiSt))().primitiveField()/rho.primitiveField()
|
||||||
/ rho.primitiveField()
|
|
||||||
);
|
);
|
||||||
|
|
||||||
StCoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
|
StCoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
|
||||||
|
|||||||
@ -1,9 +1,6 @@
|
|||||||
MRF.correctBoundaryVelocity(U);
|
|
||||||
|
|
||||||
fvVectorMatrix UEqn
|
fvVectorMatrix UEqn
|
||||||
(
|
(
|
||||||
betav*fvm::ddt(rho, U) + fvm::div(phi, U)
|
betav*fvm::ddt(rho, U) + fvm::div(phi, U)
|
||||||
+ MRF.DDt(rho, U)
|
|
||||||
+ turbulence->divDevRhoReff(U)
|
+ turbulence->divDevRhoReff(U)
|
||||||
==
|
==
|
||||||
betav*rho*g
|
betav*rho*g
|
||||||
|
|||||||
@ -0,0 +1,258 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "BLMgMaXiEq.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(BLMgMaXiEq, 0);
|
||||||
|
addToRunTimeSelectionTable(XiEqModel, BLMgMaXiEq, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiEqModels::BLMgMaXiEq::BLMgMaXiEq
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiEqModel(XiEqProperties, modelType, thermo, turbulence, Su),
|
||||||
|
kaCoef_(XiEqModelCoeffs_.get<scalar>("kaCoef")),
|
||||||
|
lowK0_(XiEqModelCoeffs_.get<scalar>("lowK0")),
|
||||||
|
lowKg_(XiEqModelCoeffs_.get<scalar>("lowKg")),
|
||||||
|
XiEqCoef_(XiEqModelCoeffs_.get<scalar>("XiEqCoef")),
|
||||||
|
alphaCoefP_(XiEqModelCoeffs_.get<scalar>("alphaCoefP")),
|
||||||
|
betaCoefP_(XiEqModelCoeffs_.get<scalar>("betaCoefP")),
|
||||||
|
alphaCoefN_(XiEqModelCoeffs_.get<scalar>("alphaCoefN")),
|
||||||
|
betaCoefN_(XiEqModelCoeffs_.get<scalar>("betaCoefN")),
|
||||||
|
maLim_(XiEqModelCoeffs_.get<scalar>("maLim")),
|
||||||
|
maLim1_(XiEqModelCoeffs_.get<scalar>("maLim1")),
|
||||||
|
quenchCoef_(XiEqModelCoeffs_.get<scalar>("quenchCoef")),
|
||||||
|
quenchExp_(XiEqModelCoeffs_.get<scalar>("quenchExp")),
|
||||||
|
quenchM_(XiEqModelCoeffs_.get<scalar>("quenchM")),
|
||||||
|
quenchRate1_(XiEqModelCoeffs_.get<scalar>("quenchRate1")),
|
||||||
|
quenchRate2_(XiEqModelCoeffs_.get<scalar>("quenchRate2")),
|
||||||
|
lCoef_(XiEqModelCoeffs_.get<scalar>("lCoef")),
|
||||||
|
SuMin_(0.01*Su.average()),
|
||||||
|
uPrimeCoef_(XiEqModelCoeffs_.get<scalar>("uPrimeCoef")),
|
||||||
|
nrExp_(XiEqModelCoeffs_.get<scalar>("nrExp")),
|
||||||
|
subGridSchelkin_(XiEqModelCoeffs_.get<bool>("subGridSchelkin")),
|
||||||
|
MaModel
|
||||||
|
(
|
||||||
|
IOdictionary
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
Su.mesh().time().constant(),
|
||||||
|
Su.mesh(),
|
||||||
|
IOobject::MUST_READ
|
||||||
|
)
|
||||||
|
),
|
||||||
|
thermo
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiEqModels::BLMgMaXiEq::~BLMgMaXiEq()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::BLMgMaXiEq::XiEq() const
|
||||||
|
{
|
||||||
|
const volScalarField& k = turbulence_.k();
|
||||||
|
const volScalarField& epsilon = turbulence_.epsilon();
|
||||||
|
volScalarField up("up", sqrt((2.0/3.0)*k));
|
||||||
|
if (subGridSchelkin_)
|
||||||
|
{
|
||||||
|
up.primitiveFieldRef() +=
|
||||||
|
calculateSchelkinEffect(uPrimeCoef_, nrExp_);
|
||||||
|
}
|
||||||
|
|
||||||
|
volScalarField l(lCoef_*sqrt(3.0/2.0)*up*k/epsilon);
|
||||||
|
volScalarField Rl(up*l*thermo_.rhou()/thermo_.muu());
|
||||||
|
|
||||||
|
volScalarField upBySu("upBySu", up/(Su_ + SuMin_));
|
||||||
|
volScalarField K("K", kaCoef_*upBySu*upBySu/sqrt(Rl));
|
||||||
|
volScalarField Ma("Ma", MaModel.Ma());
|
||||||
|
|
||||||
|
volScalarField regime("regime", MaModel.Ma()*scalar(0.0));
|
||||||
|
|
||||||
|
auto tXiEq = tmp<volScalarField>::New
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"XiEq",
|
||||||
|
epsilon.time().timeName(),
|
||||||
|
epsilon.db(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
epsilon.mesh(),
|
||||||
|
dimensionedScalar(dimless, Zero)
|
||||||
|
);
|
||||||
|
|
||||||
|
const objectRegistry& db = Su_.db();
|
||||||
|
|
||||||
|
const volScalarField& b = db.lookupObject<volScalarField>("b");
|
||||||
|
|
||||||
|
const volScalarField multiP1(0.0*pos(b - 0.99) + 1.0*neg(b - 0.99));
|
||||||
|
const volScalarField multiP2(1.0*pos(b - 0.01) + 0.0*neg(b - 0.01));
|
||||||
|
|
||||||
|
volScalarField& xieq = tXiEq.ref();
|
||||||
|
|
||||||
|
forAll(xieq, celli)
|
||||||
|
{
|
||||||
|
scalar alpha;
|
||||||
|
scalar beta;
|
||||||
|
scalar gulderMa;
|
||||||
|
|
||||||
|
if (Ma[celli]>= 0)
|
||||||
|
{
|
||||||
|
gulderMa =
|
||||||
|
1.0
|
||||||
|
+ (0.1402 - 0.007*Ma[celli])
|
||||||
|
* upBySu[celli]*sqrt(upBySu[celli]/K[celli]);
|
||||||
|
|
||||||
|
regime[celli] = multiP1[celli]*multiP2[celli];
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gulderMa =
|
||||||
|
1.0
|
||||||
|
+ (0.005*Ma[celli]*Ma[celli]+0.01*Ma[celli] + 0.125)
|
||||||
|
* upBySu[celli]*sqrt(upBySu[celli]/K[celli]);
|
||||||
|
|
||||||
|
regime[celli] = 2*multiP1[celli]*multiP2[celli];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (K[celli] < (lowK0_ + lowKg_*Ma[celli]) )
|
||||||
|
{
|
||||||
|
xieq[celli] = gulderMa;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Ma[celli] >= 0.0)
|
||||||
|
{
|
||||||
|
alpha = alphaCoefP_*(maLim_ - Ma[celli]);
|
||||||
|
beta = betaCoefP_*(maLim_ - Ma[celli]);
|
||||||
|
regime[celli] = 3*multiP1[celli]*multiP2[celli];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alpha = alphaCoefN_*(maLim1_ - Ma[celli]) ;
|
||||||
|
beta = betaCoefN_*(maLim_ + Ma[celli]);
|
||||||
|
regime[celli] = 4*multiP1[celli]*multiP2[celli];
|
||||||
|
}
|
||||||
|
xieq[celli] = XiEqCoef_*alpha*pow(K[celli], beta)*upBySu[celli];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Ma[celli] > -3.0 && Ma[celli] < 11.0)
|
||||||
|
{
|
||||||
|
scalar K0p8 = quenchCoef_*pow( Ma[celli] - quenchM_, quenchExp_);
|
||||||
|
scalar quenchRate = quenchRate1_ + quenchRate2_*Ma[celli];
|
||||||
|
if (K[celli] > (K0p8 - 0.223/quenchRate))
|
||||||
|
{
|
||||||
|
xieq[celli] *= 0.8*exp(-quenchRate*(K[celli] - K0p8));
|
||||||
|
regime[celli] = 5*multiP1[celli]*multiP2[celli];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forAll(xieq.boundaryField(), patchi)
|
||||||
|
{
|
||||||
|
scalarField& xieqp = xieq.boundaryFieldRef()[patchi];
|
||||||
|
const scalarField& Kp = K.boundaryField()[patchi];
|
||||||
|
const scalarField& Map = Ma.boundaryField()[patchi];
|
||||||
|
const scalarField& upBySup = upBySu.boundaryField()[patchi];
|
||||||
|
|
||||||
|
forAll(xieqp, facei)
|
||||||
|
{
|
||||||
|
scalar alpha;
|
||||||
|
scalar beta;
|
||||||
|
|
||||||
|
if (Map[facei] > 0.0)
|
||||||
|
{
|
||||||
|
alpha = alphaCoefP_*(maLim_ - Map[facei]);
|
||||||
|
beta = betaCoefP_*(maLim_ - Map[facei]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alpha = alphaCoefN_*(maLim_ - Map[facei]);
|
||||||
|
beta = betaCoefN_*(maLim_ + Map[facei]);
|
||||||
|
}
|
||||||
|
xieqp[facei] =
|
||||||
|
XiEqCoef_*alpha*pow(Kp[facei], beta)*upBySup[facei];
|
||||||
|
|
||||||
|
if (Map[facei] > -3.0 && Map[facei] < 11.0)
|
||||||
|
{
|
||||||
|
scalar K0p8 = quenchCoef_*pow(Map[facei] - quenchM_, quenchExp_);
|
||||||
|
scalar quenchRate = quenchRate1_ + quenchRate2_*Ma[facei];
|
||||||
|
|
||||||
|
if (Kp[facei] > (K0p8 - 0.223/quenchRate))
|
||||||
|
{
|
||||||
|
xieqp[facei] *= 0.8*exp(-quenchRate*(Kp[facei] - K0p8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Info<<
|
||||||
|
"Markstein Number out of range for Quench Formulation" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tXiEq;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiEqModels::BLMgMaXiEq::read(const dictionary& XiEqProperties)
|
||||||
|
{
|
||||||
|
XiEqModel::read(XiEqProperties);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,147 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiEqModel::BLMgMaXiEq
|
||||||
|
|
||||||
|
Description
|
||||||
|
Model for XiEq based on Bradley, Lawes and Mansour (2011)
|
||||||
|
Cobustion and Falme, 158, 123 correlation
|
||||||
|
with a linear correction function to give a plausible profile for XiEq.
|
||||||
|
See \link SCOPELaminarFlameSpeed.H \endlink for details on the SCOPE laminar
|
||||||
|
flame speed model.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
BLMgMaXiEq.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef BLMgMaXiEq_H
|
||||||
|
#define BLMgMaXiEq_H
|
||||||
|
|
||||||
|
#include "XiEqModel.H"
|
||||||
|
#include "SCOPELaminarFlameSpeed.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class BLMgMaXiEq Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class BLMgMaXiEq
|
||||||
|
:
|
||||||
|
public XiEqModel
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
// Model constants
|
||||||
|
|
||||||
|
scalar kaCoef_;
|
||||||
|
scalar lowK0_;
|
||||||
|
scalar lowKg_;
|
||||||
|
scalar XiEqCoef_;
|
||||||
|
scalar alphaCoefP_;
|
||||||
|
scalar betaCoefP_;
|
||||||
|
scalar alphaCoefN_;
|
||||||
|
scalar betaCoefN_;
|
||||||
|
scalar maLim_;
|
||||||
|
scalar maLim1_;
|
||||||
|
scalar quenchCoef_, quenchExp_, quenchM_;
|
||||||
|
scalar quenchRate1_, quenchRate2_;
|
||||||
|
scalar lCoef_;
|
||||||
|
|
||||||
|
//- Minimum Su
|
||||||
|
dimensionedScalar SuMin_;
|
||||||
|
|
||||||
|
//- Schelkin effect Model constants
|
||||||
|
scalar uPrimeCoef_;
|
||||||
|
scalar nrExp_;
|
||||||
|
|
||||||
|
//- Use sub-grid Schelkin effect
|
||||||
|
bool subGridSchelkin_;
|
||||||
|
|
||||||
|
//- The SCOPE laminar flame speed model used to obtain the
|
||||||
|
// Marstein number. Note: the laminar flame speed need not be
|
||||||
|
// obtained form the same model.
|
||||||
|
laminarFlameSpeedModels::SCOPE MaModel;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
BLMgMaXiEq(const BLMgMaXiEq&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const BLMgMaXiEq&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("BLMgMaXiEq");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
BLMgMaXiEq
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~BLMgMaXiEq();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame-wrinkling XiEq
|
||||||
|
virtual tmp<volScalarField> XiEq() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiEqProperties);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiEqModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -5,7 +5,8 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -45,22 +46,21 @@ namespace XiEqModels
|
|||||||
Foam::XiEqModels::Gulder::Gulder
|
Foam::XiEqModels::Gulder::Gulder
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
XiEqModel(XiEqProperties, thermo, turbulence, Su),
|
XiEqModel(XiEqProperties, modelType, thermo, turbulence, Su),
|
||||||
XiEqCoef_(XiEqModelCoeffs_.get<scalar>("XiEqCoef")),
|
XiEqCoef_(XiEqModelCoeffs_.get<scalar>("XiEqCoef")),
|
||||||
SuMin_(0.01*Su.average()),
|
SuMin_(0.01*Su.average()),
|
||||||
uPrimeCoef_(XiEqModelCoeffs_.get<scalar>("uPrimeCoef")),
|
uPrimeCoef_(XiEqModelCoeffs_.get<scalar>("uPrimeCoef")),
|
||||||
subGridSchelkin_(XiEqModelCoeffs_.get<bool>("subGridSchelkin"))
|
nrExp_(XiEqModelCoeffs_.get<scalar>("nrExp")),
|
||||||
{}
|
subGridSchelkin_
|
||||||
|
(
|
||||||
|
XiEqModelCoeffs_.get<bool>("subGridSchelkin")
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
)
|
||||||
|
|
||||||
Foam::XiEqModels::Gulder::~Gulder()
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -69,12 +69,11 @@ Foam::XiEqModels::Gulder::~Gulder()
|
|||||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::Gulder::XiEq() const
|
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::Gulder::XiEq() const
|
||||||
{
|
{
|
||||||
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
||||||
const tmp<volScalarField> tepsilon(turbulence_.epsilon());
|
const volScalarField& epsilon = turbulence_.epsilon();
|
||||||
const volScalarField& epsilon = tepsilon();
|
|
||||||
|
|
||||||
if (subGridSchelkin_)
|
if (subGridSchelkin_)
|
||||||
{
|
{
|
||||||
up.primitiveFieldRef() += calculateSchelkinEffect(uPrimeCoef_);
|
up.primitiveFieldRef() += calculateSchelkinEffect(uPrimeCoef_, nrExp_);
|
||||||
}
|
}
|
||||||
|
|
||||||
volScalarField tauEta(sqrt(mag(thermo_.muu()/(thermo_.rhou()*epsilon))));
|
volScalarField tauEta(sqrt(mag(thermo_.muu()/(thermo_.rhou()*epsilon))));
|
||||||
@ -98,6 +97,7 @@ bool Foam::XiEqModels::Gulder::read(const dictionary& XiEqProperties)
|
|||||||
|
|
||||||
XiEqModelCoeffs_.readEntry("XiEqCoef", XiEqCoef_);
|
XiEqModelCoeffs_.readEntry("XiEqCoef", XiEqCoef_);
|
||||||
XiEqModelCoeffs_.readEntry("uPrimeCoef", uPrimeCoef_);
|
XiEqModelCoeffs_.readEntry("uPrimeCoef", uPrimeCoef_);
|
||||||
|
XiEqModelCoeffs_.readEntry("nrExp", nrExp_);
|
||||||
XiEqModelCoeffs_.readEntry("subGridSchelkin", subGridSchelkin_);
|
XiEqModelCoeffs_.readEntry("subGridSchelkin", subGridSchelkin_);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -55,7 +55,7 @@ class Gulder
|
|||||||
:
|
:
|
||||||
public XiEqModel
|
public XiEqModel
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- Model constant
|
//- Model constant
|
||||||
scalar XiEqCoef_;
|
scalar XiEqCoef_;
|
||||||
@ -66,6 +66,8 @@ class Gulder
|
|||||||
//- Schelkin effect Model constant
|
//- Schelkin effect Model constant
|
||||||
scalar uPrimeCoef_;
|
scalar uPrimeCoef_;
|
||||||
|
|
||||||
|
scalar nrExp_;
|
||||||
|
|
||||||
//- Use sub-grid Schelkin effect
|
//- Use sub-grid Schelkin effect
|
||||||
bool subGridSchelkin_;
|
bool subGridSchelkin_;
|
||||||
|
|
||||||
@ -91,6 +93,7 @@ public:
|
|||||||
Gulder
|
Gulder
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -98,7 +101,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~Gulder();
|
virtual ~Gulder() = default;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
@ -108,7 +111,6 @@ public:
|
|||||||
|
|
||||||
//- Update properties from given dictionary
|
//- Update properties from given dictionary
|
||||||
virtual bool read(const dictionary& XiEqProperties);
|
virtual bool read(const dictionary& XiEqProperties);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,95 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "SCOPEBlendXiEq.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(SCOPEBlend, 0);
|
|
||||||
addToRunTimeSelectionTable(XiEqModel, SCOPEBlend, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::SCOPEBlend::SCOPEBlend
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiEqModel(XiEqProperties, thermo, turbulence, Su),
|
|
||||||
XiEqModelL_
|
|
||||||
(
|
|
||||||
XiEqModel::New
|
|
||||||
(
|
|
||||||
XiEqModelCoeffs_.subDict("XiEqModelL"),
|
|
||||||
thermo,
|
|
||||||
turbulence,
|
|
||||||
Su
|
|
||||||
)
|
|
||||||
),
|
|
||||||
XiEqModelH_
|
|
||||||
(
|
|
||||||
XiEqModel::New
|
|
||||||
(
|
|
||||||
XiEqModelCoeffs_.subDict("XiEqModelH"),
|
|
||||||
thermo,
|
|
||||||
turbulence,
|
|
||||||
Su
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::SCOPEBlend::~SCOPEBlend()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::SCOPEBlend::XiEq() const
|
|
||||||
{
|
|
||||||
return pow
|
|
||||||
(
|
|
||||||
pow4(1.0/XiEqModelL_->XiEq()) + pow4(1.0/XiEqModelH_->XiEq()),
|
|
||||||
-0.25
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,123 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2012 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiEqModels::SCOPEBlend
|
|
||||||
|
|
||||||
Description
|
|
||||||
Simple SCOPEBlendXiEq model for XiEq based on SCOPEXiEqs correlation
|
|
||||||
with a linear correction function to give a plausible profile for XiEq.
|
|
||||||
See \link SCOPELaminarFlameSpeed.H \endlink for details on the SCOPE
|
|
||||||
laminar flame speed model.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
SCOPEBlend.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef SCOPEBlend_H
|
|
||||||
#define SCOPEBlend_H
|
|
||||||
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class SCOPEBlend Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class SCOPEBlend
|
|
||||||
:
|
|
||||||
public XiEqModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Low turbulence intensity equilibrium Xi model
|
|
||||||
autoPtr<XiEqModel> XiEqModelL_;
|
|
||||||
|
|
||||||
//- High turbulence intensity equilibrium Xi model
|
|
||||||
autoPtr<XiEqModel> XiEqModelH_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
SCOPEBlend(const SCOPEBlend&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const SCOPEBlend&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("SCOPEBlend");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
SCOPEBlend
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~SCOPEBlend();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame-wrinkling XiEq
|
|
||||||
virtual tmp<volScalarField> XiEq() const;
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiEqProperties)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiEqModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
Copyright (C) 2023 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "SCOPEXiEq.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(SCOPEXiEq, 0);
|
|
||||||
addToRunTimeSelectionTable(XiEqModel, SCOPEXiEq, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::SCOPEXiEq::SCOPEXiEq
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiEqModel(XiEqProperties, thermo, turbulence, Su),
|
|
||||||
XiEqCoef_(XiEqModelCoeffs_.get<scalar>("XiEqCoef")),
|
|
||||||
XiEqExp_(XiEqModelCoeffs_.get<scalar>("XiEqExp")),
|
|
||||||
lCoef_(XiEqModelCoeffs_.get<scalar>("lCoef")),
|
|
||||||
SuMin_(0.01*Su.average()),
|
|
||||||
uPrimeCoef_(XiEqModelCoeffs_.get<scalar>("uPrimeCoef")),
|
|
||||||
subGridSchelkin_(XiEqModelCoeffs_.get<bool>("subGridSchelkin")),
|
|
||||||
MaModel
|
|
||||||
(
|
|
||||||
Su.mesh().lookupObject<IOdictionary>("combustionProperties"),
|
|
||||||
thermo
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::SCOPEXiEq::~SCOPEXiEq()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
volScalarField up(sqrt((2.0/3.0)*k));
|
|
||||||
if (subGridSchelkin_)
|
|
||||||
{
|
|
||||||
up.primitiveFieldRef() += calculateSchelkinEffect(uPrimeCoef_);
|
|
||||||
}
|
|
||||||
|
|
||||||
volScalarField l(lCoef_*sqrt(3.0/2.0)*up*k/epsilon);
|
|
||||||
volScalarField Rl(up*l*thermo_.rhou()/thermo_.muu());
|
|
||||||
|
|
||||||
volScalarField upBySu(up/(Su_ + SuMin_));
|
|
||||||
volScalarField K(0.157*upBySu/sqrt(Rl));
|
|
||||||
volScalarField Ma(MaModel.Ma());
|
|
||||||
|
|
||||||
auto tXiEq = volScalarField::New
|
|
||||||
(
|
|
||||||
"XiEq",
|
|
||||||
IOobject::NO_REGISTER,
|
|
||||||
epsilon.mesh(),
|
|
||||||
dimensionedScalar(dimless, Zero)
|
|
||||||
);
|
|
||||||
auto& xieq = tXiEq.ref();
|
|
||||||
|
|
||||||
forAll(xieq, celli)
|
|
||||||
{
|
|
||||||
if (Ma[celli] > 0.01)
|
|
||||||
{
|
|
||||||
xieq[celli] =
|
|
||||||
XiEqCoef_*pow(K[celli]*Ma[celli], -XiEqExp_)*upBySu[celli];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
volScalarField::Boundary& xieqBf = xieq.boundaryFieldRef();
|
|
||||||
|
|
||||||
forAll(xieq.boundaryField(), patchi)
|
|
||||||
{
|
|
||||||
scalarField& xieqp = xieqBf[patchi];
|
|
||||||
const scalarField& Kp = K.boundaryField()[patchi];
|
|
||||||
const scalarField& Map = Ma.boundaryField()[patchi];
|
|
||||||
const scalarField& upBySup = upBySu.boundaryField()[patchi];
|
|
||||||
|
|
||||||
forAll(xieqp, facei)
|
|
||||||
{
|
|
||||||
if (Ma[facei] > 0.01)
|
|
||||||
{
|
|
||||||
xieqp[facei] =
|
|
||||||
XiEqCoef_*pow(Kp[facei]*Map[facei], -XiEqExp_)
|
|
||||||
*upBySup[facei];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tXiEq;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiEqModels::SCOPEXiEq::read(const dictionary& XiEqProperties)
|
|
||||||
{
|
|
||||||
XiEqModel::read(XiEqProperties);
|
|
||||||
|
|
||||||
XiEqModelCoeffs_.readEntry("XiEqCoef", XiEqCoef_);
|
|
||||||
XiEqModelCoeffs_.readEntry("XiEqExp", XiEqExp_);
|
|
||||||
XiEqModelCoeffs_.readEntry("lCoef", lCoef_);
|
|
||||||
XiEqModelCoeffs_.readEntry("uPrimeCoef", uPrimeCoef_);
|
|
||||||
XiEqModelCoeffs_.readEntry("subGridSchelkin", subGridSchelkin_);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,137 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2013 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiEqModels::SCOPEXiEq
|
|
||||||
|
|
||||||
Description
|
|
||||||
Simple SCOPEXiEq model for XiEq based on SCOPEXiEqs correlation
|
|
||||||
with a linear correction function to give a plausible profile for XiEq.
|
|
||||||
See \link SCOPELaminarFlameSpeed.H \endlink for details on the SCOPE laminar
|
|
||||||
flame speed model.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
SCOPEXiEq.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef SCOPEXiEq_H
|
|
||||||
#define SCOPEXiEq_H
|
|
||||||
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
#include "SCOPELaminarFlameSpeed.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class SCOPEXiEq Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class SCOPEXiEq
|
|
||||||
:
|
|
||||||
public XiEqModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
// Model constant
|
|
||||||
scalar XiEqCoef_;
|
|
||||||
|
|
||||||
// Model constant
|
|
||||||
scalar XiEqExp_;
|
|
||||||
|
|
||||||
// Model constant
|
|
||||||
scalar lCoef_;
|
|
||||||
|
|
||||||
//- Minimum Su
|
|
||||||
dimensionedScalar SuMin_;
|
|
||||||
|
|
||||||
//- Schelkin effect Model constant
|
|
||||||
scalar uPrimeCoef_;
|
|
||||||
|
|
||||||
//- Use sub-grid Schelkin effect
|
|
||||||
bool subGridSchelkin_;
|
|
||||||
|
|
||||||
//- The SCOPE laminar flame speed model used to obtain the
|
|
||||||
// Marstein number. Note: the laminar flame speed need not be
|
|
||||||
// obtained form the same model.
|
|
||||||
laminarFlameSpeedModels::SCOPE MaModel;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
SCOPEXiEq(const SCOPEXiEq&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const SCOPEXiEq&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("SCOPEXiEq");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
SCOPEXiEq
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~SCOPEXiEq();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame-wrinkling XiEq
|
|
||||||
virtual tmp<volScalarField> XiEq() const;
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiEqProperties);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiEqModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -5,7 +5,8 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -41,6 +42,7 @@ namespace Foam
|
|||||||
Foam::XiEqModel::XiEqModel
|
Foam::XiEqModel::XiEqModel
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -50,7 +52,7 @@ Foam::XiEqModel::XiEqModel
|
|||||||
(
|
(
|
||||||
XiEqProperties.subDict
|
XiEqProperties.subDict
|
||||||
(
|
(
|
||||||
XiEqProperties.get<word>("XiEqModel") + "Coeffs"
|
XiEqProperties.get<word>(modelType) + "Coeffs"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
thermo_(thermo),
|
thermo_(thermo),
|
||||||
@ -69,38 +71,43 @@ Foam::XiEqModel::~XiEqModel()
|
|||||||
|
|
||||||
bool Foam::XiEqModel::read(const dictionary& XiEqProperties)
|
bool Foam::XiEqModel::read(const dictionary& XiEqProperties)
|
||||||
{
|
{
|
||||||
XiEqModelCoeffs_ = XiEqProperties.optionalSubDict(type() + "Coeffs");
|
|
||||||
|
XiEqModelCoeffs_ = XiEqProperties.subDict(type() + "Coeffs");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::XiEqModel::writeFields() const
|
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)
|
|
||||||
{
|
|
||||||
B->write();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField>
|
Foam::tmp<Foam::volScalarField>Foam::XiEqModel::calculateSchelkinEffect
|
||||||
Foam::XiEqModel::calculateSchelkinEffect(const scalar uPrimeCoef) const
|
(
|
||||||
|
const scalar uPrimeCoef,
|
||||||
|
const scalar nrExp
|
||||||
|
) const
|
||||||
{
|
{
|
||||||
const fvMesh& mesh = Su_.mesh();
|
const fvMesh& mesh = Su_.mesh();
|
||||||
|
|
||||||
const volVectorField& U = mesh.lookupObject<volVectorField>("U");
|
const volVectorField& U = mesh.lookupObject<volVectorField>("U");
|
||||||
|
|
||||||
const volSymmTensorField& CT = mesh.lookupObject<volSymmTensorField>("CT");
|
const volSymmTensorField& CT = mesh.lookupObject<volSymmTensorField>("CT");
|
||||||
const volScalarField& Nv = mesh.lookupObject<volScalarField>("Nv");
|
const volScalarField& Nv = mesh.lookupObject<volScalarField>("Nv");
|
||||||
const volSymmTensorField& nsv =
|
const volSymmTensorField& nsv =
|
||||||
mesh.lookupObject<volSymmTensorField>("nsv");
|
mesh.lookupObject<volSymmTensorField>("nsv");
|
||||||
|
|
||||||
auto tN = volScalarField::New
|
auto tN = tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"tN",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"tN",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedScalar(Nv.dimensions(), Zero)
|
dimensionedScalar(Nv.dimensions(), Zero)
|
||||||
);
|
);
|
||||||
@ -108,10 +115,16 @@ Foam::XiEqModel::calculateSchelkinEffect(const scalar uPrimeCoef) const
|
|||||||
|
|
||||||
N.primitiveFieldRef() = Nv.primitiveField()*pow(mesh.V(), 2.0/3.0);
|
N.primitiveFieldRef() = Nv.primitiveField()*pow(mesh.V(), 2.0/3.0);
|
||||||
|
|
||||||
auto tns = volSymmTensorField::New
|
auto tns = tmp<volSymmTensorField>::New
|
||||||
(
|
(
|
||||||
"tns",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"tns",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
dimensionedSymmTensor(nsv.dimensions(), Zero)
|
||||||
);
|
);
|
||||||
@ -130,10 +143,8 @@ Foam::XiEqModel::calculateSchelkinEffect(const scalar uPrimeCoef) const
|
|||||||
|
|
||||||
const scalarField upLocal(uPrimeCoef*sqrt((U & CT & U)*cellWidth));
|
const scalarField upLocal(uPrimeCoef*sqrt((U & CT & U)*cellWidth));
|
||||||
|
|
||||||
const scalarField deltaUp(upLocal*(max(scalar(1), pow(nr, 0.5)) - 1.0));
|
//Re use tN
|
||||||
|
N.primitiveFieldRef() = upLocal*(max(scalar(1.0), pow(nr, nrExp)) - 1.0);
|
||||||
// Re use tN
|
|
||||||
N.primitiveFieldRef() = upLocal*(max(scalar(1), pow(nr, 0.5)) - 1.0);
|
|
||||||
|
|
||||||
return tN;
|
return tN;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -28,12 +29,6 @@ Class
|
|||||||
|
|
||||||
Description
|
Description
|
||||||
Base-class for all XiEq models used by the b-XiEq combustion model.
|
Base-class for all XiEq models used by the b-XiEq combustion model.
|
||||||
The available models are :
|
|
||||||
\link basicXiSubXiEq.H \endlink
|
|
||||||
\link Gulder.H \endlink
|
|
||||||
\link instabilityXiEq.H \endlink
|
|
||||||
\link SCOPEBlendXiEq.H \endlink
|
|
||||||
\link SCOPEXiEq.H \endlink
|
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
XiEqModel.C
|
XiEqModel.C
|
||||||
@ -59,10 +54,9 @@ namespace Foam
|
|||||||
|
|
||||||
class XiEqModel
|
class XiEqModel
|
||||||
{
|
{
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected Data
|
||||||
|
|
||||||
//- Dictionary
|
//- Dictionary
|
||||||
dictionary XiEqModelCoeffs_;
|
dictionary XiEqModelCoeffs_;
|
||||||
@ -77,9 +71,7 @@ protected:
|
|||||||
const volScalarField& Su_;
|
const volScalarField& Su_;
|
||||||
|
|
||||||
|
|
||||||
private:
|
// Protected Member Functions
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
//- No copy construct
|
||||||
XiEqModel(const XiEqModel&) = delete;
|
XiEqModel(const XiEqModel&) = delete;
|
||||||
@ -103,12 +95,14 @@ public:
|
|||||||
dictionary,
|
dictionary,
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
XiEqProperties,
|
XiEqProperties,
|
||||||
|
modelType,
|
||||||
thermo,
|
thermo,
|
||||||
turbulence,
|
turbulence,
|
||||||
Su
|
Su
|
||||||
@ -122,6 +116,7 @@ public:
|
|||||||
static autoPtr<XiEqModel> New
|
static autoPtr<XiEqModel> New
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -134,6 +129,7 @@ public:
|
|||||||
XiEqModel
|
XiEqModel
|
||||||
(
|
(
|
||||||
const dictionary& XiEqProperties,
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -147,13 +143,14 @@ public:
|
|||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
//- Return the flame-wrinkling XiEq
|
//- Return the flame-wrinkling XiEq
|
||||||
virtual tmp<volScalarField> XiEq() const
|
virtual tmp<volScalarField> XiEq() const = 0;
|
||||||
{
|
|
||||||
return turbulence_.muEff();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return the sub-grid Schelkin effect
|
// Only used by sperseded modles
|
||||||
tmp<volScalarField> calculateSchelkinEffect(const scalar) const;
|
tmp<volScalarField> calculateSchelkinEffect
|
||||||
|
(
|
||||||
|
const scalar uPrimeCoef,
|
||||||
|
const scalar nrExp
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
//- Update properties from given dictionary
|
||||||
virtual bool read(const dictionary& XiEqProperties) = 0;
|
virtual bool read(const dictionary& XiEqProperties) = 0;
|
||||||
|
|||||||
@ -33,29 +33,33 @@ License
|
|||||||
Foam::autoPtr<Foam::XiEqModel> Foam::XiEqModel::New
|
Foam::autoPtr<Foam::XiEqModel> Foam::XiEqModel::New
|
||||||
(
|
(
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
|
const word& modelName,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const word modelType(dict.get<word>("XiEqModel"));
|
const word modelType(dict.get<word>(modelName));
|
||||||
|
|
||||||
Info<< "Selecting flame-wrinkling model " << modelType << endl;
|
Info<< "Selecting flame-wrinkling model Eq " << modelType << endl;
|
||||||
|
|
||||||
auto* ctorPtr = dictionaryConstructorTable(modelType);
|
auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
|
||||||
|
|
||||||
if (!ctorPtr)
|
if (!cstrIter.found())
|
||||||
{
|
{
|
||||||
FatalIOErrorInLookup
|
FatalIOErrorInLookup
|
||||||
(
|
(
|
||||||
dict,
|
dict,
|
||||||
"XiEqModel",
|
modelName,
|
||||||
modelType,
|
modelType,
|
||||||
*dictionaryConstructorTablePtr_
|
*dictionaryConstructorTablePtr_
|
||||||
) << exit(FatalIOError);
|
) << exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
return autoPtr<XiEqModel>(ctorPtr(dict, thermo, turbulence, Su));
|
return autoPtr<XiEqModel>(cstrIter()
|
||||||
|
(
|
||||||
|
dict, modelName, thermo, turbulence, Su)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,133 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "instability2XiEq.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(instability2XiEq, 0);
|
||||||
|
addToRunTimeSelectionTable(XiEqModel, instability2XiEq, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiEqModels::instability2XiEq::instability2XiEq
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiEqModel(XiEqProperties, modelType, thermo, turbulence, Su),
|
||||||
|
saModel_
|
||||||
|
(
|
||||||
|
IOdictionary
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
Su.mesh().time().constant(),
|
||||||
|
Su.mesh(),
|
||||||
|
IOobject::MUST_READ
|
||||||
|
)
|
||||||
|
),
|
||||||
|
thermo
|
||||||
|
),
|
||||||
|
CIn_(saModel_.CIn()),
|
||||||
|
defaultCIn_(XiEqModelCoeffs_.get<scalar>("defaultCIn")),
|
||||||
|
XiEqInFade_(XiEqModelCoeffs_.get<scalar>("XiEqInFade")),
|
||||||
|
XiEqModel_
|
||||||
|
(
|
||||||
|
XiEqModel::New(XiEqModelCoeffs_, modelType, thermo, turbulence, Su)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (CIn_ <= 0.0)
|
||||||
|
{
|
||||||
|
CIn_ = defaultCIn_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::instability2XiEq::XiEq() const
|
||||||
|
{
|
||||||
|
IOdictionary combustionProperties
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
Su_.mesh().time().constant(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
ignition ign(combustionProperties, Su_.mesh().time(), Su_.mesh());
|
||||||
|
|
||||||
|
//const scalar ignTim = ign.sites()[0].tmIgn();
|
||||||
|
const scalar curTime = Su_.mesh().time().value();
|
||||||
|
const scalar deltaT = Su_.mesh().time().deltaTValue();
|
||||||
|
const scalar ignTim = curTime - deltaT - ign.sites()[0].time();
|
||||||
|
|
||||||
|
volScalarField turbXiEq(XiEqModel_->XiEq());
|
||||||
|
|
||||||
|
volScalarField XiEqIn1("XiEqIn1", 0.0*turbXiEq);
|
||||||
|
|
||||||
|
dimensionedScalar CIn("CIn", dimensionSet(0, -2, 1, 0, 0, 0, 0), CIn_);
|
||||||
|
dimensionedScalar ignTm("ignTm", dimTime, ignTim);
|
||||||
|
XiEqIn1 = exp(CIn*Su_*Su_*ignTm) - 1.0;
|
||||||
|
|
||||||
|
return
|
||||||
|
(
|
||||||
|
1.0 + sqrt(XiEqInFade_*sqr(XiEqIn1) + sqr(turbXiEq - 1.0))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiEqModels::instability2XiEq::read(const dictionary& XiEqProperties)
|
||||||
|
{
|
||||||
|
XiEqModel::read(XiEqProperties);
|
||||||
|
|
||||||
|
XiEqModelCoeffs_.readEntry("defaultCIn", defaultCIn_);
|
||||||
|
XiEqModelCoeffs_.readEntry("XiEqInFade", XiEqInFade_);
|
||||||
|
|
||||||
|
return XiEqModel_->read(XiEqModelCoeffs_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,132 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiEqModels::instability2XiEq
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
instability2XiEq.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef instability2XiEq_H
|
||||||
|
#define instability2XiEq_H
|
||||||
|
|
||||||
|
#include "laminarFlameSpeed.H"
|
||||||
|
#include "SCOPELaminarFlameSpeed.H"
|
||||||
|
#include "ignitionSite.H"
|
||||||
|
#include "ignition.H"
|
||||||
|
#include "Time.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
#include "XiEqModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiEqModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class instability2 Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class instability2XiEq
|
||||||
|
:
|
||||||
|
public XiEqModel
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Laminar burning speed
|
||||||
|
laminarFlameSpeedModels::SCOPE saModel_;
|
||||||
|
|
||||||
|
//- GIn (initial instability G)divided by Su^2. Read from fuel file
|
||||||
|
scalar CIn_;
|
||||||
|
|
||||||
|
//- Default CIn if not in fuel file
|
||||||
|
scalar defaultCIn_;
|
||||||
|
|
||||||
|
//- Determines how fast XiEqIn fades out as turbulence comes in
|
||||||
|
scalar XiEqInFade_;
|
||||||
|
|
||||||
|
//- Equilibrium Xi model due to all other effects
|
||||||
|
autoPtr<XiEqModel> XiEqModel_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
instability2XiEq(const instability2XiEq&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const instability2XiEq&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("instability2XiEq");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
instability2XiEq
|
||||||
|
(
|
||||||
|
const dictionary& XiEqProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~instability2XiEq() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame-wrinkling XiEq
|
||||||
|
virtual tmp<volScalarField> XiEq() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiEqProperties);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiEqModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -1,84 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "instabilityXiEq.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(instability, 0);
|
|
||||||
addToRunTimeSelectionTable(XiEqModel, instability, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::instability::instability
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiEqModel(XiEqProperties, thermo, turbulence, Su),
|
|
||||||
XiEqIn(XiEqModelCoeffs_.get<scalar>("XiEqIn")),
|
|
||||||
XiEqModel_(XiEqModel::New(XiEqModelCoeffs_, thermo, turbulence, Su))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiEqModels::instability::~instability()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiEqModels::instability::XiEq() const
|
|
||||||
{
|
|
||||||
volScalarField turbXiEq(XiEqModel_->XiEq());
|
|
||||||
return XiEqIn/turbXiEq + turbXiEq;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiEqModels::instability::read(const dictionary& XiEqProperties)
|
|
||||||
{
|
|
||||||
XiEqModel::read(XiEqProperties);
|
|
||||||
|
|
||||||
XiEqModelCoeffs_.readEntry("XiEqIn", XiEqIn);
|
|
||||||
|
|
||||||
return XiEqModel_->read(XiEqModelCoeffs_);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,119 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2012 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiEqModels::instability
|
|
||||||
|
|
||||||
Description
|
|
||||||
This is the equilibrium level of the flame wrinkling generated by
|
|
||||||
instability. It is a constant (default 2.5). It is used in
|
|
||||||
\link XiModel.H \endlink.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
instability.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef instability_H
|
|
||||||
#define instability_H
|
|
||||||
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiEqModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class instability Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class instability
|
|
||||||
:
|
|
||||||
public XiEqModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Equilibrium Xi due to instability only
|
|
||||||
scalar XiEqIn;
|
|
||||||
|
|
||||||
//- Equilibrium Xi model due to all other effects
|
|
||||||
autoPtr<XiEqModel> XiEqModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
instability(const instability&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const instability&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("instability");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
instability
|
|
||||||
(
|
|
||||||
const dictionary& XiEqProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~instability();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame-wrinkling XiEq
|
|
||||||
virtual tmp<volScalarField> XiEq() const;
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiEqProperties);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiEqModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -45,29 +46,23 @@ namespace XiGModels
|
|||||||
Foam::XiGModels::KTS::KTS
|
Foam::XiGModels::KTS::KTS
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
XiGModel(XiGProperties, thermo, turbulence, Su),
|
XiGModel(XiGProperties, modelType, thermo, turbulence, Su),
|
||||||
GEtaCoef_(XiGModelCoeffs_.get<scalar>("GEtaCoef"))
|
GEtaCoef_(XiGModelCoeffs_.get<scalar>("GEtaCoef"))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiGModels::KTS::~KTS()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiGModels::KTS::G() const
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::KTS::G() const
|
||||||
{
|
{
|
||||||
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
volScalarField up(sqrt((2.0/3.0)*turbulence_.k()));
|
||||||
const tmp<volScalarField> tepsilon(turbulence_.epsilon());
|
const volScalarField& epsilon = turbulence_.epsilon();
|
||||||
const volScalarField& epsilon = tepsilon();
|
|
||||||
|
|
||||||
volScalarField tauEta(sqrt(mag(thermo_.muu()/(thermo_.rhou()*epsilon))));
|
volScalarField tauEta(sqrt(mag(thermo_.muu()/(thermo_.rhou()*epsilon))));
|
||||||
|
|
||||||
@ -75,6 +70,15 @@ Foam::tmp<Foam::volScalarField> Foam::XiGModels::KTS::G() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::KTS::Db() const
|
||||||
|
{
|
||||||
|
const objectRegistry& db = Su_.db();
|
||||||
|
const volScalarField& Db1 = db.lookupObject<volScalarField>("Db");
|
||||||
|
//return turbulence_.muEff();
|
||||||
|
return Db1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiGModels::KTS::read(const dictionary& XiGProperties)
|
bool Foam::XiGModels::KTS::read(const dictionary& XiGProperties)
|
||||||
{
|
{
|
||||||
XiGModel::read(XiGProperties);
|
XiGModel::read(XiGProperties);
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2012 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -27,8 +28,8 @@ Class
|
|||||||
Foam::XiGModels::KTS
|
Foam::XiGModels::KTS
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Simple Kolmogorov time-scale (KTS) model for the flame-wrinling generation
|
Simple Kolmogorov time-scale (KTS) model for the flame-wrinkling
|
||||||
rate.
|
generation rate.
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
KTS.C
|
KTS.C
|
||||||
@ -55,7 +56,7 @@ class KTS
|
|||||||
:
|
:
|
||||||
public XiGModel
|
public XiGModel
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
scalar GEtaCoef_;
|
scalar GEtaCoef_;
|
||||||
|
|
||||||
@ -81,6 +82,7 @@ public:
|
|||||||
KTS
|
KTS
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -88,7 +90,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~KTS();
|
virtual ~KTS() = default;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
@ -96,6 +98,9 @@ public:
|
|||||||
//- Return the flame-wrinkling generation rate
|
//- Return the flame-wrinkling generation rate
|
||||||
virtual tmp<volScalarField> G() const;
|
virtual tmp<volScalarField> G() const;
|
||||||
|
|
||||||
|
//- Return the flame diffusivity
|
||||||
|
virtual tmp<volScalarField> Db() const;
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
//- Update properties from given dictionary
|
||||||
virtual bool read(const dictionary& XiGProperties);
|
virtual bool read(const dictionary& XiGProperties);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -41,6 +41,7 @@ namespace Foam
|
|||||||
Foam::XiGModel::XiGModel
|
Foam::XiGModel::XiGModel
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -50,7 +51,7 @@ Foam::XiGModel::XiGModel
|
|||||||
(
|
(
|
||||||
XiGProperties.subDict
|
XiGProperties.subDict
|
||||||
(
|
(
|
||||||
XiGProperties.get<word>("XiGModel") + "Coeffs"
|
XiGProperties.get<word>(modelType) + "Coeffs"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
thermo_(thermo),
|
thermo_(thermo),
|
||||||
@ -69,7 +70,7 @@ Foam::XiGModel::~XiGModel()
|
|||||||
|
|
||||||
bool Foam::XiGModel::read(const dictionary& XiGProperties)
|
bool Foam::XiGModel::read(const dictionary& XiGProperties)
|
||||||
{
|
{
|
||||||
XiGModelCoeffs_ = XiGProperties.optionalSubDict(type() + "Coeffs");
|
XiGModelCoeffs_ = XiGProperties.subDict(type() + "Coeffs");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,9 +28,6 @@ Class
|
|||||||
|
|
||||||
Description
|
Description
|
||||||
Base-class for all Xi generation models used by the b-Xi combustion model.
|
Base-class for all Xi generation models used by the b-Xi combustion model.
|
||||||
See Technical Report SH/RE/01R for details on the PDR modelling. For details
|
|
||||||
on the use of XiGModel see \link XiModel.H \endlink. The model available is
|
|
||||||
\link instabilityG.H \endlink
|
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
XiGModel.C
|
XiGModel.C
|
||||||
@ -56,10 +53,9 @@ namespace Foam
|
|||||||
|
|
||||||
class XiGModel
|
class XiGModel
|
||||||
{
|
{
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected Data
|
||||||
|
|
||||||
dictionary XiGModelCoeffs_;
|
dictionary XiGModelCoeffs_;
|
||||||
|
|
||||||
@ -68,9 +64,7 @@ protected:
|
|||||||
const volScalarField& Su_;
|
const volScalarField& Su_;
|
||||||
|
|
||||||
|
|
||||||
private:
|
// Protected Member Functions
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
//- No copy construct
|
||||||
XiGModel(const XiGModel&) = delete;
|
XiGModel(const XiGModel&) = delete;
|
||||||
@ -94,12 +88,14 @@ public:
|
|||||||
dictionary,
|
dictionary,
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
XiGProperties,
|
XiGProperties,
|
||||||
|
modelType,
|
||||||
thermo,
|
thermo,
|
||||||
turbulence,
|
turbulence,
|
||||||
Su
|
Su
|
||||||
@ -113,6 +109,7 @@ public:
|
|||||||
static autoPtr<XiGModel> New
|
static autoPtr<XiGModel> New
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -125,6 +122,7 @@ public:
|
|||||||
XiGModel
|
XiGModel
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -137,14 +135,11 @@ public:
|
|||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
//- Return the flame-wrinkling generation rate
|
//- Return the flame-wrinkling genration rate
|
||||||
virtual tmp<volScalarField> G() const = 0;
|
virtual tmp<volScalarField> G() const = 0;
|
||||||
|
|
||||||
//- Return the flame diffusivity
|
//- Return the flame diffusivity
|
||||||
virtual tmp<volScalarField> Db() const
|
virtual tmp<volScalarField> Db() const = 0;
|
||||||
{
|
|
||||||
return turbulence_.muEff();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
//- Update properties from given dictionary
|
||||||
virtual bool read(const dictionary& XiGProperties) = 0;
|
virtual bool read(const dictionary& XiGProperties) = 0;
|
||||||
|
|||||||
@ -33,29 +33,33 @@ License
|
|||||||
Foam::autoPtr<Foam::XiGModel> Foam::XiGModel::New
|
Foam::autoPtr<Foam::XiGModel> Foam::XiGModel::New
|
||||||
(
|
(
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
|
const word& modelName,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const word modelType(dict.get<word>("XiGModel"));
|
const word modelType(dict.get<word>(modelName));
|
||||||
|
|
||||||
Info<< "Selecting flame-wrinkling model " << modelType << endl;
|
Info<< "Selecting flame-wrinkling model for G " << modelType << endl;
|
||||||
|
|
||||||
auto* ctorPtr = dictionaryConstructorTable(modelType);
|
auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
|
||||||
|
|
||||||
if (!ctorPtr)
|
if (!cstrIter.found())
|
||||||
{
|
{
|
||||||
FatalIOErrorInLookup
|
FatalIOErrorInLookup
|
||||||
(
|
(
|
||||||
dict,
|
dict,
|
||||||
"XiGModel",
|
modelName,
|
||||||
modelType,
|
modelType,
|
||||||
*dictionaryConstructorTablePtr_
|
*dictionaryConstructorTablePtr_
|
||||||
) << exit(FatalIOError);
|
) << exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
return autoPtr<XiGModel>(ctorPtr(dict, thermo, turbulence, Su));
|
return autoPtr<XiGModel>(cstrIter()
|
||||||
|
(
|
||||||
|
dict, modelName, thermo, turbulence, Su)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,165 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "IFstream.H"
|
||||||
|
#include "instability2G.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "fvCFD.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiGModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(instability2G, 0);
|
||||||
|
addToRunTimeSelectionTable(XiGModel, instability2G, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiGModels::instability2G::instability2G
|
||||||
|
(
|
||||||
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiGModel(XiGProperties, modelType, thermo, turbulence, Su),
|
||||||
|
saModel_
|
||||||
|
(
|
||||||
|
IOdictionary
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
Su.mesh().time().constant(),
|
||||||
|
Su.mesh(),
|
||||||
|
IOobject::MUST_READ
|
||||||
|
)
|
||||||
|
),
|
||||||
|
thermo
|
||||||
|
),
|
||||||
|
CIn_(saModel_.CIn()),
|
||||||
|
defaultCIn_(XiGModelCoeffs_.get<scalar>("defaultCIn")),
|
||||||
|
GInFade_(XiGModelCoeffs_.get<scalar>("GInFade")),
|
||||||
|
GInMult_(XiGModelCoeffs_.get<scalar>("GInMult")),
|
||||||
|
lambdaIn_("lambdaIn", XiGModelCoeffs_),
|
||||||
|
XiGModel_
|
||||||
|
(
|
||||||
|
XiGModel::New(XiGModelCoeffs_, modelType, thermo, turbulence, Su)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (CIn_ <= 0.0)
|
||||||
|
{
|
||||||
|
CIn_ = defaultCIn_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::instability2G::G() const
|
||||||
|
{
|
||||||
|
IOdictionary combustionProperties
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustionProperties",
|
||||||
|
Su_.mesh().time().constant(),
|
||||||
|
Su_.mesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
ignition ign(combustionProperties, Su_.mesh().time(), Su_.mesh());
|
||||||
|
|
||||||
|
scalar curTime = Su_.mesh().time().value();
|
||||||
|
scalar deltaT = Su_.mesh().time().deltaTValue();
|
||||||
|
const scalar ignTim = curTime - deltaT - ign.sites()[0].time();
|
||||||
|
|
||||||
|
volScalarField turbXiG(XiGModel_->G());
|
||||||
|
|
||||||
|
volScalarField GIn("GIn", 0.0*turbXiG);
|
||||||
|
|
||||||
|
forAll (GIn, i)
|
||||||
|
{
|
||||||
|
GIn[i] = CIn_*Su_[i]*Su_[i]*exp(CIn_*Su_[i]*Su_[i]*ignTim)*GInMult_;
|
||||||
|
}
|
||||||
|
|
||||||
|
dimensionedScalar CIn("CIn", dimensionSet(0, -2, 1, 0, 0, 0, 0), CIn_);
|
||||||
|
dimensionedScalar ignTm("ignTm", dimTime, ignTim);
|
||||||
|
|
||||||
|
GIn = CIn*Su_*Su_*exp(CIn*Su_*Su_*ignTm)*GInMult_;
|
||||||
|
|
||||||
|
GIn *=
|
||||||
|
(
|
||||||
|
GIn /
|
||||||
|
(
|
||||||
|
GIn
|
||||||
|
+ GInFade_*turbXiG
|
||||||
|
+ dimensionedScalar("GSmall", inv(dimTime), SMALL)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (GIn + turbXiG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiGModels::instability2G::Db() const
|
||||||
|
{
|
||||||
|
const objectRegistry& db = Su_.db();
|
||||||
|
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
||||||
|
const volScalarField& rho = db.lookupObject<volScalarField>("rho");
|
||||||
|
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
||||||
|
const volScalarField& Db1 = db.lookupObject<volScalarField>("Db");
|
||||||
|
|
||||||
|
//return turbulence_.muEff()
|
||||||
|
return Db1
|
||||||
|
+ rho*Su_*(Xi - 1.0)*mgb*(0.5*lambdaIn_)/(mgb + 1.0/lambdaIn_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiGModels::instability2G::read(const dictionary& XiGProperties)
|
||||||
|
{
|
||||||
|
XiGModel::read(XiGProperties);
|
||||||
|
|
||||||
|
XiGModelCoeffs_.readEntry("defaultCIn", defaultCIn_);
|
||||||
|
XiGModelCoeffs_.readEntry("GInFade", GInFade_);
|
||||||
|
XiGModelCoeffs_.readEntry("GInMult", GInMult_);
|
||||||
|
XiGModelCoeffs_.readEntry("lambdaIn", lambdaIn_);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,142 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiGModels::instability2G
|
||||||
|
|
||||||
|
Description
|
||||||
|
Flame-surface instabilityG flame-wrinkling generation rate coefficient model
|
||||||
|
used in \link XiModel.H \endlink.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
instability2G.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef instability2G_H
|
||||||
|
#define instability2G_H
|
||||||
|
|
||||||
|
#include "laminarFlameSpeed.H"
|
||||||
|
#include "SCOPELaminarFlameSpeed.H"
|
||||||
|
#include "XiGModel.H"
|
||||||
|
#include "ignitionSite.H"
|
||||||
|
#include "ignition.H"
|
||||||
|
#include "Time.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiGModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class instability2G Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class instability2G
|
||||||
|
:
|
||||||
|
public XiGModel
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
laminarFlameSpeedModels::SCOPE saModel_;
|
||||||
|
|
||||||
|
// GIn (inituial instability G)divided by Su^2. Read from fuel file
|
||||||
|
scalar CIn_;
|
||||||
|
|
||||||
|
//- Default CIn if not in fuel file
|
||||||
|
scalar defaultCIn_;
|
||||||
|
|
||||||
|
// Determine how fast GIn fades out as turbulence starts
|
||||||
|
scalar GInFade_;
|
||||||
|
|
||||||
|
// Set GIn large so that XiEq determines Xi value.
|
||||||
|
// Son increase byfactor:
|
||||||
|
scalar GInMult_;
|
||||||
|
|
||||||
|
//- The instability2G length-scale
|
||||||
|
dimensionedScalar lambdaIn_;
|
||||||
|
|
||||||
|
//- Xi generation rate model due to all other processes
|
||||||
|
autoPtr<XiGModel> XiGModel_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
instability2G(const instability2G&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const instability2G&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("instability2G");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
instability2G
|
||||||
|
(
|
||||||
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~instability2G() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame-wrinkling generation rate
|
||||||
|
virtual tmp<volScalarField> G() const;
|
||||||
|
|
||||||
|
//- Return the flame diffusivity
|
||||||
|
virtual tmp<volScalarField> Db() const;
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiGProperties);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiGModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -45,21 +45,16 @@ namespace XiGModels
|
|||||||
Foam::XiGModels::instabilityG::instabilityG
|
Foam::XiGModels::instabilityG::instabilityG
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
XiGModel(XiGProperties, thermo, turbulence, Su),
|
XiGModel(XiGProperties, modelType, thermo, turbulence, Su),
|
||||||
GIn_("GIn", dimless/dimTime, XiGModelCoeffs_),
|
GIn_("GIn", XiGModelCoeffs_),
|
||||||
lambdaIn_("lambdaIn", dimLength, XiGModelCoeffs_),
|
lambdaIn_("lambdaIn", XiGModelCoeffs_),
|
||||||
XiGModel_(XiGModel::New(XiGModelCoeffs_, thermo, turbulence, Su))
|
XiGModel_(XiGModel::New(XiGModelCoeffs_,modelType,thermo, turbulence, Su))
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiGModels::instabilityG::~instabilityG()
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -76,11 +71,14 @@ Foam::tmp<Foam::volScalarField> Foam::XiGModels::instabilityG::Db() const
|
|||||||
{
|
{
|
||||||
const objectRegistry& db = Su_.db();
|
const objectRegistry& db = Su_.db();
|
||||||
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
const volScalarField& Xi = db.lookupObject<volScalarField>("Xi");
|
||||||
|
const volScalarField& Xp = db.lookupObject<volScalarField>("Xp");
|
||||||
const volScalarField& rho = db.lookupObject<volScalarField>("rho");
|
const volScalarField& rho = db.lookupObject<volScalarField>("rho");
|
||||||
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
||||||
|
const volScalarField& Db1 = db.lookupObject<volScalarField>("Db");
|
||||||
|
|
||||||
return XiGModel_->Db()
|
//// OLD return turbulence_.muEff()
|
||||||
+ rho*Su_*(Xi - 1.0)*mgb*(0.5*lambdaIn_)/(mgb + 1.0/lambdaIn_);
|
return Db1
|
||||||
|
+ rho*Su_*(Xp*Xi - 1.0)*mgb*(0.5*lambdaIn_)/(mgb + 1.0/lambdaIn_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2012 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -30,8 +31,6 @@ Description
|
|||||||
Flame-surface instabilityG flame-wrinkling generation rate coefficient model
|
Flame-surface instabilityG flame-wrinkling generation rate coefficient model
|
||||||
used in \link XiModel.H \endlink.
|
used in \link XiModel.H \endlink.
|
||||||
|
|
||||||
See Technical Report SH/RE/01R for details on the PDR modelling.
|
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
instabilityG.C
|
instabilityG.C
|
||||||
|
|
||||||
@ -57,9 +56,9 @@ class instabilityG
|
|||||||
:
|
:
|
||||||
public XiGModel
|
public XiGModel
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- Flame instabilityG wrinkling generation rate coefficient
|
//- Flame instabilityG wrinling generation rate coefficient
|
||||||
dimensionedScalar GIn_;
|
dimensionedScalar GIn_;
|
||||||
|
|
||||||
//- InstabilityG length-scale
|
//- InstabilityG length-scale
|
||||||
@ -90,6 +89,7 @@ public:
|
|||||||
instabilityG
|
instabilityG
|
||||||
(
|
(
|
||||||
const dictionary& XiGProperties,
|
const dictionary& XiGProperties,
|
||||||
|
const word& modelType,
|
||||||
const psiuReactionThermo& thermo,
|
const psiuReactionThermo& thermo,
|
||||||
const compressible::RASModel& turbulence,
|
const compressible::RASModel& turbulence,
|
||||||
const volScalarField& Su
|
const volScalarField& Su
|
||||||
@ -97,7 +97,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~instabilityG();
|
virtual ~instabilityG() = default;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -73,7 +73,19 @@ Foam::XiModel::XiModel
|
|||||||
IOobject::AUTO_WRITE
|
IOobject::AUTO_WRITE
|
||||||
),
|
),
|
||||||
b.mesh()
|
b.mesh()
|
||||||
)
|
),
|
||||||
|
Xp_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Xp",
|
||||||
|
b.time().timeName(),
|
||||||
|
b.db(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
b.mesh()
|
||||||
|
)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -95,8 +95,8 @@ SourceFiles
|
|||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
#include "psiuReactionThermo.H"
|
#include "psiuReactionThermo.H"
|
||||||
#include "turbulentFluidThermoModel.H"
|
#include "turbulentFluidThermoModel.H"
|
||||||
#include "multivariateSurfaceInterpolationScheme.H"
|
|
||||||
#include "fvcDiv.H"
|
#include "fvcDiv.H"
|
||||||
|
#include "multivariateSurfaceInterpolationScheme.H"
|
||||||
#include "runTimeSelectionTables.H"
|
#include "runTimeSelectionTables.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -110,10 +110,9 @@ namespace Foam
|
|||||||
|
|
||||||
class XiModel
|
class XiModel
|
||||||
{
|
{
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected Data
|
||||||
|
|
||||||
dictionary XiModelCoeffs_;
|
dictionary XiModelCoeffs_;
|
||||||
|
|
||||||
@ -127,10 +126,11 @@ protected:
|
|||||||
//- Flame wrinkling field
|
//- Flame wrinkling field
|
||||||
volScalarField Xi_;
|
volScalarField Xi_;
|
||||||
|
|
||||||
|
//- Flame wrinkling field for the subgrid obstacles
|
||||||
|
volScalarField Xp_;
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Protected Member Functions
|
||||||
|
|
||||||
//- No copy construct
|
//- No copy construct
|
||||||
XiModel(const XiModel&) = delete;
|
XiModel(const XiModel&) = delete;
|
||||||
@ -215,19 +215,31 @@ public:
|
|||||||
return Xi_;
|
return Xi_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- Return the obstacle-flame-wrinkling Xp
|
||||||
|
virtual const volScalarField& Xp() const
|
||||||
|
{
|
||||||
|
return Xp_;
|
||||||
|
}
|
||||||
|
|
||||||
//- Return the flame diffusivity
|
//- Return the flame diffusivity
|
||||||
virtual tmp<volScalarField> Db() const
|
virtual tmp<volScalarField> Db() const
|
||||||
{
|
{
|
||||||
return turbulence_.muEff();
|
const objectRegistry& db = Su_.db();
|
||||||
|
const volScalarField& Db1 = db.lookupObject<volScalarField>("Db");
|
||||||
|
//return turbulence_.muEff();
|
||||||
|
return Db1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Add Xi to the multivariateSurfaceInterpolationScheme table
|
//- Add Xi to the multivariateSurfaceInterpolationScheme table
|
||||||
// if required
|
// if required
|
||||||
virtual void addXi
|
void addXi
|
||||||
(
|
(
|
||||||
multivariateSurfaceInterpolationScheme<scalar>::fieldTable&
|
multivariateSurfaceInterpolationScheme<scalar>::fieldTable& fields
|
||||||
)
|
)
|
||||||
{}
|
{
|
||||||
|
fields.add(Xi_);
|
||||||
|
fields.add(Xp_);
|
||||||
|
}
|
||||||
|
|
||||||
//- Correct the flame-wrinkling Xi
|
//- Correct the flame-wrinkling Xi
|
||||||
virtual void correct() = 0;
|
virtual void correct() = 0;
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2019-2021 OpenCFD Ltd.
|
Copyright (C) 2019 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -45,9 +45,9 @@ Foam::autoPtr<Foam::XiModel> Foam::XiModel::New
|
|||||||
|
|
||||||
Info<< "Selecting flame-wrinkling model " << modelType << endl;
|
Info<< "Selecting flame-wrinkling model " << modelType << endl;
|
||||||
|
|
||||||
auto* ctorPtr = dictionaryConstructorTable(modelType);
|
auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
|
||||||
|
|
||||||
if (!ctorPtr)
|
if (!cstrIter.found())
|
||||||
{
|
{
|
||||||
FatalIOErrorInLookup
|
FatalIOErrorInLookup
|
||||||
(
|
(
|
||||||
@ -59,9 +59,7 @@ Foam::autoPtr<Foam::XiModel> Foam::XiModel::New
|
|||||||
}
|
}
|
||||||
|
|
||||||
return autoPtr<XiModel>
|
return autoPtr<XiModel>
|
||||||
(
|
(cstrIter()(dict, thermo, turbulence, Su, rho, b, phi));
|
||||||
ctorPtr(dict, thermo, turbulence, Su, rho, b, phi)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,100 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "algebraic.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(algebraic, 0);
|
|
||||||
addToRunTimeSelectionTable(XiModel, algebraic, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::algebraic::algebraic
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiModel(XiProperties, thermo, turbulence, Su, rho, b, phi),
|
|
||||||
XiShapeCoef(XiModelCoeffs_.get<scalar>("XiShapeCoef")),
|
|
||||||
XiEqModel_(XiEqModel::New(XiProperties, thermo, turbulence, Su)),
|
|
||||||
XiGModel_(XiGModel::New(XiProperties, thermo, turbulence, Su))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::algebraic::~algebraic()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiModels::algebraic::Db() const
|
|
||||||
{
|
|
||||||
return XiGModel_->Db();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::XiModels::algebraic::correct()
|
|
||||||
{
|
|
||||||
volScalarField XiEqEta(XiEqModel_->XiEq());
|
|
||||||
volScalarField GEta(XiGModel_->G());
|
|
||||||
|
|
||||||
volScalarField R(GEta*XiEqEta/(XiEqEta - 0.999));
|
|
||||||
|
|
||||||
volScalarField XiEqStar(R/(R - GEta));
|
|
||||||
|
|
||||||
Xi_ == 1.0 + (1.0 + (2*XiShapeCoef)*(0.5 - b_))*(XiEqStar - 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiModels::algebraic::read(const dictionary& XiProperties)
|
|
||||||
{
|
|
||||||
XiModel::read(XiProperties);
|
|
||||||
|
|
||||||
XiModelCoeffs_.readEntry("XiShapeCoef", XiShapeCoef);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,133 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2012 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiModels::algebraic
|
|
||||||
|
|
||||||
Description
|
|
||||||
Simple algebraic model for Xi based on Gulders correlation
|
|
||||||
with a linear correction function to give a plausible profile for Xi.
|
|
||||||
See report TR/HGW/10 for details on the Weller two equations model.
|
|
||||||
See \link XiModel.H \endlink for more details on flame wrinkling modelling.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
algebraic.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef algebraic_H
|
|
||||||
#define algebraic_H
|
|
||||||
|
|
||||||
#include "XiModel.H"
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
#include "XiGModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class algebraic Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class algebraic
|
|
||||||
:
|
|
||||||
public XiModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
scalar XiShapeCoef;
|
|
||||||
|
|
||||||
autoPtr<XiEqModel> XiEqModel_;
|
|
||||||
autoPtr<XiGModel> XiGModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
algebraic(const algebraic&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const algebraic&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("algebraic");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
algebraic
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~algebraic();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame diffusivity
|
|
||||||
virtual tmp<volScalarField> Db() const;
|
|
||||||
|
|
||||||
//- Correct the flame-wrinkling Xi
|
|
||||||
virtual void correct();
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiProperties);
|
|
||||||
|
|
||||||
//- Write fields of the XiEq model
|
|
||||||
virtual void writeFields()
|
|
||||||
{
|
|
||||||
XiEqModel_().writeFields();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "fixed.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(fixed, 0);
|
|
||||||
addToRunTimeSelectionTable(XiModel, fixed, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::fixed::fixed
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiModel(XiProperties, thermo, turbulence, Su, rho, b, phi)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::fixed::~fixed()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
bool Foam::XiModels::fixed::read(const dictionary& XiProperties)
|
|
||||||
{
|
|
||||||
return XiModel::read(XiProperties);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,117 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2012 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiModels::fixed
|
|
||||||
|
|
||||||
Description
|
|
||||||
Fixed value model for Xi. See \link XiModel.H \endlink for more details
|
|
||||||
on flame wrinkling modelling.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
fixed.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef fixed_H
|
|
||||||
#define fixed_H
|
|
||||||
|
|
||||||
#include "XiModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class fixed Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class fixed
|
|
||||||
:
|
|
||||||
public XiModel
|
|
||||||
{
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
fixed(const fixed&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const fixed&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("fixed");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
fixed
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~fixed();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Correct the flame-wrinkling Xi
|
|
||||||
virtual void correct()
|
|
||||||
{}
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiProperties);
|
|
||||||
|
|
||||||
//- Write fields of the XiEq model
|
|
||||||
virtual void writeFields()
|
|
||||||
{}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "transport.H"
|
|
||||||
#include "surfaceInterpolate.H"
|
|
||||||
#include "fvmDdt.H"
|
|
||||||
#include "fvcLaplacian.H"
|
|
||||||
#include "fvmDiv.H"
|
|
||||||
#include "fvmSup.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(transport, 0);
|
|
||||||
addToRunTimeSelectionTable(XiModel, transport, dictionary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::transport::transport
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
)
|
|
||||||
:
|
|
||||||
XiModel(XiProperties, thermo, turbulence, Su, rho, b, phi),
|
|
||||||
XiShapeCoef(XiModelCoeffs_.get<scalar>("XiShapeCoef")),
|
|
||||||
XiEqModel_(XiEqModel::New(XiProperties, thermo, turbulence, Su)),
|
|
||||||
XiGModel_(XiGModel::New(XiProperties, thermo, turbulence, Su))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::XiModels::transport::~transport()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::XiModels::transport::Db() const
|
|
||||||
{
|
|
||||||
return XiGModel_->Db();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::XiModels::transport::correct
|
|
||||||
(
|
|
||||||
const fv::convectionScheme<scalar>& mvConvection
|
|
||||||
)
|
|
||||||
{
|
|
||||||
volScalarField XiEqEta(XiEqModel_->XiEq());
|
|
||||||
volScalarField GEta(XiGModel_->G());
|
|
||||||
|
|
||||||
volScalarField R(GEta*XiEqEta/(XiEqEta - 0.999));
|
|
||||||
|
|
||||||
volScalarField XiEqStar(R/(R - GEta));
|
|
||||||
|
|
||||||
volScalarField XiEq
|
|
||||||
(
|
|
||||||
1.0 + (1.0 + (2*XiShapeCoef)*(0.5 - b_))*(XiEqStar - 1.0)
|
|
||||||
);
|
|
||||||
|
|
||||||
volScalarField G(R*(XiEq - 1.0)/XiEq);
|
|
||||||
|
|
||||||
const objectRegistry& db = b_.db();
|
|
||||||
const volScalarField& betav = db.lookupObject<volScalarField>("betav");
|
|
||||||
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
|
||||||
const surfaceScalarField& phiSt =
|
|
||||||
db.lookupObject<surfaceScalarField>("phiSt");
|
|
||||||
const volScalarField& Db = db.lookupObject<volScalarField>("Db");
|
|
||||||
const surfaceScalarField& nf = db.lookupObject<surfaceScalarField>("nf");
|
|
||||||
|
|
||||||
surfaceScalarField phiXi
|
|
||||||
(
|
|
||||||
"phiXi",
|
|
||||||
phiSt
|
|
||||||
+ (
|
|
||||||
- fvc::interpolate(fvc::laplacian(Db, b_)/mgb)*nf
|
|
||||||
+ fvc::interpolate(rho_)*fvc::interpolate(Su_*(1.0/Xi_ - Xi_))*nf
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
solve
|
|
||||||
(
|
|
||||||
betav*fvm::ddt(rho_, Xi_)
|
|
||||||
+ mvConvection.fvmDiv(phi_, Xi_)
|
|
||||||
+ fvm::div(phiXi, Xi_)
|
|
||||||
- fvm::Sp(fvc::div(phiXi), Xi_)
|
|
||||||
==
|
|
||||||
betav*rho_*R
|
|
||||||
- fvm::Sp(betav*rho_*(R - G), Xi_)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Correct boundedness of Xi
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
Xi_.max(1.0);
|
|
||||||
Xi_ = min(Xi_, 2.0*XiEq);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::XiModels::transport::read(const dictionary& XiProperties)
|
|
||||||
{
|
|
||||||
XiModel::read(XiProperties);
|
|
||||||
|
|
||||||
XiModelCoeffs_.readEntry("XiShapeCoef", XiShapeCoef);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011-2015 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/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::XiModels::transport
|
|
||||||
|
|
||||||
Description
|
|
||||||
Simple transport model for Xi based on Gulders correlation
|
|
||||||
with a linear correction function to give a plausible profile for Xi.
|
|
||||||
See report TR/HGW/10 for details on the Weller two equations model.
|
|
||||||
See \link XiModel.H \endlink for more details on flame wrinkling modelling.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
transport.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef transport_H
|
|
||||||
#define transport_H
|
|
||||||
|
|
||||||
#include "XiModel.H"
|
|
||||||
#include "XiEqModel.H"
|
|
||||||
#include "XiGModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
namespace XiModels
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class transport Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class transport
|
|
||||||
:
|
|
||||||
public XiModel
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
scalar XiShapeCoef;
|
|
||||||
|
|
||||||
autoPtr<XiEqModel> XiEqModel_;
|
|
||||||
autoPtr<XiGModel> XiGModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
transport(const transport&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const transport&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("transport");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
transport
|
|
||||||
(
|
|
||||||
const dictionary& XiProperties,
|
|
||||||
const psiuReactionThermo& thermo,
|
|
||||||
const compressible::RASModel& turbulence,
|
|
||||||
const volScalarField& Su,
|
|
||||||
const volScalarField& rho,
|
|
||||||
const volScalarField& b,
|
|
||||||
const surfaceScalarField& phi
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~transport();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the flame diffusivity
|
|
||||||
virtual tmp<volScalarField> Db() const;
|
|
||||||
|
|
||||||
//- Add Xi to the multivariateSurfaceInterpolationScheme table
|
|
||||||
virtual void addXi
|
|
||||||
(
|
|
||||||
multivariateSurfaceInterpolationScheme<scalar>::fieldTable& fields
|
|
||||||
)
|
|
||||||
{
|
|
||||||
fields.add(Xi_);
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Correct the flame-wrinkling Xi
|
|
||||||
virtual void correct()
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Correct the flame-wrinkling Xi using the given convection scheme
|
|
||||||
virtual void correct(const fv::convectionScheme<scalar>& mvConvection);
|
|
||||||
|
|
||||||
//- Update properties from given dictionary
|
|
||||||
virtual bool read(const dictionary& XiProperties);
|
|
||||||
|
|
||||||
//- Write fields of the XiEq model
|
|
||||||
virtual void writeFields()
|
|
||||||
{
|
|
||||||
XiEqModel_().writeFields();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace XiModels
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -0,0 +1,258 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "transportTwoEqs.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiModels
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(transportTwoEqs, 0);
|
||||||
|
addToRunTimeSelectionTable(XiModel, transportTwoEqs, dictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiModels::transportTwoEqs::transportTwoEqs
|
||||||
|
(
|
||||||
|
const dictionary& XiProperties,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su,
|
||||||
|
const volScalarField& rho,
|
||||||
|
const volScalarField& b,
|
||||||
|
const surfaceScalarField& phi
|
||||||
|
)
|
||||||
|
:
|
||||||
|
XiModel(XiProperties, thermo, turbulence, Su, rho, b, phi),
|
||||||
|
XiShapeCoef_(XiModelCoeffs_.get<scalar>("XiShapeCoef")),
|
||||||
|
CpfiDot_(XiModelCoeffs_.get<scalar>("CpfiDot")),
|
||||||
|
CpfiCross_(XiModelCoeffs_.get<scalar>("CpfiCross")),
|
||||||
|
GEtaExp_(XiModelCoeffs_.get<scalar>("GEtaExp")),
|
||||||
|
LOverCw_(XiModelCoeffs_.get<scalar>("LOverCw")),
|
||||||
|
XiEqModel_
|
||||||
|
(
|
||||||
|
XiEqModel::New(XiProperties, "XiEqModel", thermo, turbulence, Su)
|
||||||
|
),
|
||||||
|
XiGModel_(XiGModel::New(XiProperties, "XiGModel", thermo, turbulence, Su)),
|
||||||
|
XpEqModel_
|
||||||
|
(
|
||||||
|
XiEqModel::New(XiProperties, "XpEqModel", thermo, turbulence, Su)
|
||||||
|
),
|
||||||
|
XpGModel_
|
||||||
|
(
|
||||||
|
XiGModel::New(XiProperties, "XpGModel", thermo, turbulence, Su)
|
||||||
|
),
|
||||||
|
Ep_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Ep",
|
||||||
|
b.time().timeName(),
|
||||||
|
b.db(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
b.mesh()
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::XiModels::transportTwoEqs::~transportTwoEqs()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::XiModels::transportTwoEqs::Db() const
|
||||||
|
{
|
||||||
|
return XiGModel_->Db();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::XiModels::transportTwoEqs::correct
|
||||||
|
(
|
||||||
|
const fv::convectionScheme<scalar>& mvConvection
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const volScalarField XiEqEta(XiEqModel_->XiEq());
|
||||||
|
volScalarField GEta(XiGModel_->G());
|
||||||
|
|
||||||
|
GEta *= max( 1.0, exp( GEtaExp_*(1.0 - (Xi_ - 1.0)/(XiEqEta - 0.999)))) ;
|
||||||
|
|
||||||
|
const volScalarField R(GEta*XiEqEta/(XiEqEta - 0.999));
|
||||||
|
|
||||||
|
const volScalarField XiEqStar(R/(R - GEta));
|
||||||
|
|
||||||
|
const volScalarField XiEq
|
||||||
|
(
|
||||||
|
1.0 + (1.0 + (2*XiShapeCoef_)*(0.5 - b_))*(XiEqStar - 1.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField G(R*(XiEq - 1.0)/XiEq);
|
||||||
|
|
||||||
|
|
||||||
|
const objectRegistry& db = b_.db();
|
||||||
|
const volScalarField& betav = db.lookupObject<volScalarField>("betav");
|
||||||
|
const volScalarField& p = db.lookupObject<volScalarField>("p");
|
||||||
|
const volScalarField& mgb = db.lookupObject<volScalarField>("mgb");
|
||||||
|
const surfaceScalarField& phiSt =
|
||||||
|
db.lookupObject<surfaceScalarField>("phiSt");
|
||||||
|
const volScalarField& Db = db.lookupObject<volScalarField>("Db");
|
||||||
|
const surfaceScalarField& nf = db.lookupObject<surfaceScalarField>("nf");
|
||||||
|
|
||||||
|
surfaceScalarField phiXi
|
||||||
|
(
|
||||||
|
"phiXi",
|
||||||
|
phiSt
|
||||||
|
+ (
|
||||||
|
- fvc::interpolate(fvc::laplacian(Db, b_)/mgb)*nf
|
||||||
|
+ fvc::interpolate(rho_)
|
||||||
|
* fvc::interpolate(Su_*(1.0/(Xi_*Xp_) - (Xi_*Xp_)))*nf
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
dimensionedScalar zero
|
||||||
|
(
|
||||||
|
"zero",
|
||||||
|
dimensionSet(2, -6, -2, 0, 0, 0, 0),
|
||||||
|
scalar(0.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField Gpfi
|
||||||
|
(
|
||||||
|
CpfiDot_
|
||||||
|
* sqrt(max(fvc::grad(rho_)&fvc::grad(p), zero))
|
||||||
|
/ rho_*b_*(1.0-b_)
|
||||||
|
|
||||||
|
+ CpfiCross_
|
||||||
|
* sqrt(mag(fvc::grad(rho_)^fvc::grad(p)))
|
||||||
|
/ rho_*b_*(1.0-b_)
|
||||||
|
);
|
||||||
|
|
||||||
|
fvScalarMatrix XiEqn_
|
||||||
|
(
|
||||||
|
betav*fvm::ddt(rho_, Xi_)
|
||||||
|
+ mvConvection.fvmDiv(phi_, Xi_)
|
||||||
|
+ fvm::div(phiXi, Xi_)
|
||||||
|
- fvm::Sp(fvc::div(phiXi), Xi_)
|
||||||
|
==
|
||||||
|
betav*rho_*(R + Gpfi )
|
||||||
|
- fvm::Sp(betav*rho_*(R - G), Xi_)
|
||||||
|
);
|
||||||
|
|
||||||
|
XiEqn_.relax();
|
||||||
|
XiEqn_.solve();
|
||||||
|
|
||||||
|
// Correct boundedness of Xi
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Xi_.max(1.0);
|
||||||
|
Xi_ = min(Xi_, 2.0*XiEq);
|
||||||
|
|
||||||
|
// Calculation of Xp generated by obstacles
|
||||||
|
volScalarField XpEqEta("XpEqEta",XpEqModel_->XiEq());
|
||||||
|
|
||||||
|
const volScalarField GpEta("GpEta", XpGModel_->G());
|
||||||
|
|
||||||
|
const volScalarField Rp("Rp", GpEta*XpEqEta/(XpEqEta - 0.999));
|
||||||
|
|
||||||
|
const volScalarField XpEq
|
||||||
|
(
|
||||||
|
"XpEq",
|
||||||
|
1.0 + (1.0 + (2*XiShapeCoef_)*(0.5 - b_))*(XpEqEta - 1.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField Gpp("Gpp", Rp*(XpEq - 1.0)/XpEq);
|
||||||
|
|
||||||
|
|
||||||
|
fvScalarMatrix XpEqn_
|
||||||
|
(
|
||||||
|
betav*fvm::ddt(rho_, Xp_)
|
||||||
|
+ mvConvection.fvmDiv(phi_, Xp_)
|
||||||
|
+ fvm::div(phiXi, Xp_)
|
||||||
|
- fvm::Sp(fvc::div(phiXi), Xp_)
|
||||||
|
==
|
||||||
|
betav*rho_*Rp
|
||||||
|
- fvm::Sp(betav*rho_*(Rp - Gpp), Xp_)
|
||||||
|
);
|
||||||
|
|
||||||
|
XpEqn_.relax();
|
||||||
|
XpEqn_.solve();
|
||||||
|
|
||||||
|
Xp_.max(1.0);
|
||||||
|
Xp_ = min(Xp_, 20.0*XpEq);
|
||||||
|
|
||||||
|
// Calculate Ep
|
||||||
|
const volScalarField& Lobs = db.lookupObject<volScalarField>("Lobs");
|
||||||
|
const scalarField Cw(pow(Su_.mesh().V(), 2.0/3.0));
|
||||||
|
volScalarField LI(Lobs);
|
||||||
|
|
||||||
|
LI.primitiveFieldRef() = max(LI.primitiveField(),LOverCw_*sqrt(Cw));
|
||||||
|
|
||||||
|
fvScalarMatrix EpEqn_
|
||||||
|
(
|
||||||
|
betav*fvm::ddt(rho_, Ep_)
|
||||||
|
+ mvConvection.fvmDiv(phi_, Ep_)
|
||||||
|
+ fvm::div(phiXi, Ep_)
|
||||||
|
- fvm::Sp(fvc::div(phiXi), Ep_)
|
||||||
|
==
|
||||||
|
betav*rho_*Gpp*Xp_/LI
|
||||||
|
- fvm::Sp(betav*rho_*Rp, Ep_)
|
||||||
|
);
|
||||||
|
|
||||||
|
EpEqn_.relax();
|
||||||
|
EpEqn_.solve();
|
||||||
|
|
||||||
|
Ep_.max(0.0);
|
||||||
|
Ep_.min(100000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::XiModels::transportTwoEqs::read(const dictionary& XiProperties)
|
||||||
|
{
|
||||||
|
XiModel::read(XiProperties);
|
||||||
|
|
||||||
|
XiModelCoeffs_.readEntry("XiShapeCoef", XiShapeCoef_);
|
||||||
|
XiModelCoeffs_.readEntry("CpfiDot", CpfiDot_);
|
||||||
|
XiModelCoeffs_.readEntry("CpfiCross", CpfiCross_);
|
||||||
|
XiModelCoeffs_.readEntry("GEtaExp", GEtaExp_);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,154 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::XiModels::transportTwoEqs
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
transportTwoEqs.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef transportTwoEqs_H
|
||||||
|
#define transportTwoEqs_H
|
||||||
|
|
||||||
|
#include "XiModel.H"
|
||||||
|
#include "XiEqModel.H"
|
||||||
|
#include "XiGModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace XiModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class transportTwoEqs Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class transportTwoEqs
|
||||||
|
:
|
||||||
|
public XiModel
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
scalar XiShapeCoef_;
|
||||||
|
scalar CpfiDot_;
|
||||||
|
scalar CpfiCross_;
|
||||||
|
scalar GEtaExp_;
|
||||||
|
|
||||||
|
//- Maximum Lobs/CellWidth
|
||||||
|
scalar LOverCw_;
|
||||||
|
|
||||||
|
//- Equilibrium for Xi (turbulence)
|
||||||
|
autoPtr<XiEqModel> XiEqModel_;
|
||||||
|
|
||||||
|
//- Generation for Xi (turbulence)
|
||||||
|
autoPtr<XiGModel> XiGModel_;
|
||||||
|
|
||||||
|
//- Equilibrium for Xp (obstacles)
|
||||||
|
autoPtr<XiEqModel> XpEqModel_;
|
||||||
|
|
||||||
|
//- Generation for Xp (obstacles)
|
||||||
|
autoPtr<XiGModel> XpGModel_;
|
||||||
|
|
||||||
|
//- Dissipation length scale for subgrid obstacles
|
||||||
|
volScalarField Ep_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
transportTwoEqs(const transportTwoEqs&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const transportTwoEqs&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("transportTwoEqs");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
transportTwoEqs
|
||||||
|
(
|
||||||
|
const dictionary& XiProperties,
|
||||||
|
const psiuReactionThermo& thermo,
|
||||||
|
const compressible::RASModel& turbulence,
|
||||||
|
const volScalarField& Su,
|
||||||
|
const volScalarField& rho,
|
||||||
|
const volScalarField& b,
|
||||||
|
const surfaceScalarField& phi
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~transportTwoEqs();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the flame diffusivity
|
||||||
|
virtual tmp<volScalarField> Db() const;
|
||||||
|
|
||||||
|
//- Correct the flame-wrinkling Xi
|
||||||
|
virtual void correct()
|
||||||
|
{
|
||||||
|
NotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Correct the flame-wrinkling Xi using the given convection scheme
|
||||||
|
virtual void correct(const fv::convectionScheme<scalar>& mvConvection);
|
||||||
|
|
||||||
|
//- Update properties from given dictionary
|
||||||
|
virtual bool read(const dictionary& XiProperties);
|
||||||
|
|
||||||
|
//- Write fields of the XiEq model
|
||||||
|
virtual void writeFields()
|
||||||
|
{
|
||||||
|
XiEqModel_().writeFields();
|
||||||
|
XpEqModel_().writeFields();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace XiModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -5,11 +5,20 @@ tmp<fv::convectionScheme<scalar>> mvConvection
|
|||||||
mesh,
|
mesh,
|
||||||
fields,
|
fields,
|
||||||
phi,
|
phi,
|
||||||
mesh.divScheme("div(phi,ft_b_ha_hau)")
|
mesh.divScheme("div(phi,ft_b_h_hu)")
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
volScalarField Db("Db", turbulence->muEff());
|
rhou = thermo.rhou();
|
||||||
|
muu = thermo.muu();
|
||||||
|
|
||||||
|
volScalarField Db("Db", turbulence->mut());
|
||||||
|
const volScalarField DbThermal
|
||||||
|
(
|
||||||
|
"DbAlpha",
|
||||||
|
turbulence->alphaEff()
|
||||||
|
//thermo.alpha() + turbulence->mut()/Prt
|
||||||
|
);
|
||||||
|
|
||||||
if (ign.ignited())
|
if (ign.ignited())
|
||||||
{
|
{
|
||||||
@ -17,30 +26,31 @@ if (ign.ignited())
|
|||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
Su = unstrainedLaminarFlameSpeed()();
|
Su = unstrainedLaminarFlameSpeed()();
|
||||||
|
|
||||||
|
// Wrinkling due to turbulence
|
||||||
const volScalarField& Xi = flameWrinkling->Xi();
|
const volScalarField& Xi = flameWrinkling->Xi();
|
||||||
|
|
||||||
// progress variable
|
// Wrinkling due to obstacles
|
||||||
// ~~~~~~~~~~~~~~~~~
|
const volScalarField& Xp = flameWrinkling->Xp();
|
||||||
volScalarField c("c", 1.0 - b);
|
|
||||||
|
// Progress variable
|
||||||
|
// ~~~~~~~~~~~~~~~~~
|
||||||
|
c = (1.0 - b);
|
||||||
|
|
||||||
// Unburnt gas density
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~
|
|
||||||
volScalarField rhou(thermo.rhou());
|
|
||||||
|
|
||||||
// Calculate flame normal etc.
|
// Calculate flame normal etc.
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
//volVectorField n(fvc::grad(b));
|
|
||||||
volVectorField n(fvc::reconstruct(fvc::snGrad(b)*mesh.magSf()));
|
volVectorField n(fvc::reconstruct(fvc::snGrad(b)*mesh.magSf()));
|
||||||
|
|
||||||
volScalarField mgb("mgb", mag(n));
|
volScalarField mgb("mgb", mag(n));
|
||||||
|
volScalarField ddtb("ddtb",fvc::ddt(b));
|
||||||
|
|
||||||
dimensionedScalar dMgb("dMgb", mgb.dimensions(), SMALL);
|
dimensionedScalar dMgb("dMgb", mgb.dimensions(), SMALL);
|
||||||
|
|
||||||
{
|
{
|
||||||
volScalarField bc(b*c);
|
volScalarField bc(b*c);
|
||||||
|
|
||||||
dMgb += 1.0e-3*
|
dMgb += 1.0e-8*
|
||||||
(bc*mgb)().weightedAverage(mesh.V())
|
(bc*mgb)().weightedAverage(mesh.V())
|
||||||
/(bc.weightedAverage(mesh.V()) + SMALL);
|
/(bc.weightedAverage(mesh.V()) + SMALL);
|
||||||
}
|
}
|
||||||
@ -54,6 +64,7 @@ if (ign.ignited())
|
|||||||
surfaceScalarField nf("nf", mesh.Sf() & nfVec);
|
surfaceScalarField nf("nf", mesh.Sf() & nfVec);
|
||||||
n /= mgb;
|
n /= mgb;
|
||||||
|
|
||||||
|
|
||||||
#include "StCorr.H"
|
#include "StCorr.H"
|
||||||
|
|
||||||
// Calculate turbulent flame speed flux
|
// Calculate turbulent flame speed flux
|
||||||
@ -64,8 +75,6 @@ if (ign.ignited())
|
|||||||
|
|
||||||
Db = flameWrinkling->Db();
|
Db = flameWrinkling->Db();
|
||||||
|
|
||||||
// Create b equation
|
|
||||||
// ~~~~~~~~~~~~~~~~~
|
|
||||||
fvScalarMatrix bEqn
|
fvScalarMatrix bEqn
|
||||||
(
|
(
|
||||||
betav*fvm::ddt(rho, b)
|
betav*fvm::ddt(rho, b)
|
||||||
@ -75,6 +84,7 @@ if (ign.ignited())
|
|||||||
- fvm::laplacian(Db, b)
|
- fvm::laplacian(Db, b)
|
||||||
==
|
==
|
||||||
betav*fvOptions(rho, b)
|
betav*fvOptions(rho, b)
|
||||||
|
// + betav*rhou*St*StCorr*mag(fvc::grad(b))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -82,17 +92,16 @@ if (ign.ignited())
|
|||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
#include "ignite.H"
|
#include "ignite.H"
|
||||||
|
|
||||||
// Solve for b
|
|
||||||
// ~~~~~~~~~~~
|
|
||||||
bEqn.relax();
|
bEqn.relax();
|
||||||
|
|
||||||
fvOptions.constrain(bEqn);
|
fvOptions.constrain(bEqn);
|
||||||
|
|
||||||
bEqn.solve();
|
bEqn.solve();
|
||||||
|
b.max(0.0);
|
||||||
|
b.min(1.0);
|
||||||
|
|
||||||
fvOptions.correct(b);
|
fvOptions.correct(b);
|
||||||
|
|
||||||
Info<< "min(b) = " << min(b).value() << endl;
|
Info<< "min(b) = " << min(b).value() << nl
|
||||||
|
<< "max(b) = " << max(b).value() << endl;
|
||||||
|
|
||||||
if (composition.contains("ft"))
|
if (composition.contains("ft"))
|
||||||
{
|
{
|
||||||
@ -109,8 +118,14 @@ if (ign.ignited())
|
|||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Correct the flame-wrinkling
|
|
||||||
flameWrinkling->correct(mvConvection);
|
|
||||||
|
|
||||||
St = Xi*Su;
|
// Correct the flame-wrinkling, smoothing
|
||||||
|
flameWrinkling->correct(mvConvection);
|
||||||
|
St = Xp*Xi*Su*combustFlag;
|
||||||
|
|
||||||
|
if (PDRProperties.getOrDefault("smoothSt", false))
|
||||||
|
{
|
||||||
|
const scalar coeff = PDRProperties.get<scalar>("smoothStCoeff");
|
||||||
|
fvc::smooth(St, coeff);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
const volScalarField& psi = thermo.psi();
|
const volScalarField& psi = thermo.psi();
|
||||||
|
scalar pMin = thermo.getOrDefault<scalar>("pMin", 0);
|
||||||
|
|||||||
@ -1,218 +1,303 @@
|
|||||||
Info<< "Reading thermophysical properties\n" << endl;
|
Info<< "Reading thermophysical properties\n" << endl;
|
||||||
|
|
||||||
autoPtr<psiuReactionThermo> pThermo
|
autoPtr<psiuReactionThermo> pThermo
|
||||||
(
|
|
||||||
psiuReactionThermo::New(mesh)
|
|
||||||
);
|
|
||||||
psiuReactionThermo& thermo = pThermo();
|
|
||||||
thermo.validate(args.executable(), "ha", "ea");
|
|
||||||
|
|
||||||
basicSpecieMixture& composition = thermo.composition();
|
|
||||||
|
|
||||||
volScalarField rho
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
(
|
||||||
"rho",
|
psiuReactionThermo::New(mesh)
|
||||||
runTime.timeName(),
|
);
|
||||||
mesh,
|
psiuReactionThermo& thermo = pThermo();
|
||||||
IOobject::NO_READ,
|
thermo.validate(args.executable(), "ha", "ea");
|
||||||
IOobject::AUTO_WRITE
|
basicMultiComponentMixture& composition = thermo.composition();
|
||||||
),
|
|
||||||
thermo.rho()
|
|
||||||
);
|
|
||||||
|
|
||||||
volScalarField& p = thermo.p();
|
volScalarField rho
|
||||||
|
|
||||||
volScalarField& b = composition.Y("b");
|
|
||||||
Info<< "min(b) = " << min(b).value() << endl;
|
|
||||||
|
|
||||||
Info<< "\nReading field U\n" << endl;
|
|
||||||
volVectorField U
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
(
|
||||||
"U",
|
IOobject
|
||||||
runTime.timeName(),
|
(
|
||||||
mesh,
|
"rho",
|
||||||
IOobject::MUST_READ,
|
runTime.timeName(),
|
||||||
IOobject::AUTO_WRITE
|
mesh,
|
||||||
),
|
IOobject::NO_READ,
|
||||||
mesh
|
IOobject::AUTO_WRITE
|
||||||
);
|
),
|
||||||
|
thermo.rho()
|
||||||
#include "compressibleCreatePhi.H"
|
);
|
||||||
|
volScalarField rhou
|
||||||
mesh.setFluxRequired(p.name());
|
|
||||||
|
|
||||||
Info<< "Creating turbulence model\n" << endl;
|
|
||||||
autoPtr<compressible::RASModel> turbulence
|
|
||||||
(
|
|
||||||
compressible::New<compressible::RASModel>
|
|
||||||
(
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"rhou",
|
||||||
|
runTime.timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
thermo.rhou()
|
||||||
|
);
|
||||||
|
volScalarField muu
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"muu",
|
||||||
|
runTime.timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
thermo.muu()
|
||||||
|
);
|
||||||
|
|
||||||
|
volScalarField& p = thermo.p();
|
||||||
|
|
||||||
|
volScalarField& b = composition.Y("b");
|
||||||
|
|
||||||
|
volScalarField combustFlag
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"combustFlag",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading fields betav, betai\n" << endl;
|
||||||
|
volScalarField betav
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"betav",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
volSymmTensorField betai
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"betai",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading field Bv\n" << endl;
|
||||||
|
volSymmTensorField Bv
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Bv",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading fields Nv,nsv\n" << endl;
|
||||||
|
volScalarField Nv
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Nv",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
volSymmTensorField nsv
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"nsv",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading fields Blong\n" << endl;
|
||||||
|
volSymmTensorField Blong
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Blong",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "\nCreating field U\n" << endl;
|
||||||
|
volVectorField U
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"U",
|
||||||
|
runTime.timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
#include "compressibleCreatePhi.H"
|
||||||
|
mesh.setFluxRequired(p.name());
|
||||||
|
|
||||||
|
Info<< "Creating turbulence model\n" << endl;
|
||||||
|
autoPtr<compressible::RASModel> turbulence
|
||||||
|
(
|
||||||
|
compressible::New<compressible::RASModel>
|
||||||
|
(
|
||||||
|
rho,
|
||||||
|
U,
|
||||||
|
phi,
|
||||||
|
thermo
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
#include "createDpdt.H"
|
||||||
|
|
||||||
|
#include "createK.H"
|
||||||
|
|
||||||
|
Info<< "Creating the unstrained laminar flame speed\n" << endl;
|
||||||
|
autoPtr<laminarFlameSpeed> unstrainedLaminarFlameSpeed
|
||||||
|
(
|
||||||
|
laminarFlameSpeed::New(thermo)
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading strained laminar flame speed field Su\n" << endl;
|
||||||
|
volScalarField Su
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Su",
|
||||||
|
runTime.timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Info<< "Reading field Lobs\n" << endl;
|
||||||
|
volScalarField Lobs
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"Lobs",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "Reading field CT\n" << endl;
|
||||||
|
volSymmTensorField CT
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"CT",
|
||||||
|
mesh.facesInstance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh
|
||||||
|
);
|
||||||
|
|
||||||
|
IOdictionary PDRProperties
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"PDRProperties",
|
||||||
|
runTime.constant(),
|
||||||
|
mesh,
|
||||||
|
IOobject::MUST_READ_IF_MODIFIED,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Create the drag model
|
||||||
|
autoPtr<PDRDragModel> drag = PDRDragModel::New
|
||||||
|
(
|
||||||
|
PDRProperties,
|
||||||
|
turbulence,
|
||||||
rho,
|
rho,
|
||||||
U,
|
U,
|
||||||
phi,
|
phi
|
||||||
thermo
|
);
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
//- Create the flame-wrinkling model
|
||||||
Info<< "Creating the unstrained laminar flame speed\n" << endl;
|
autoPtr<XiModel> flameWrinkling = XiModel::New
|
||||||
autoPtr<laminarFlameSpeed> unstrainedLaminarFlameSpeed
|
|
||||||
(
|
|
||||||
laminarFlameSpeed::New(thermo)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Info<< "Reading strained laminar flame speed field Su\n" << endl;
|
|
||||||
volScalarField Su
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
(
|
||||||
"Su",
|
PDRProperties,
|
||||||
runTime.timeName(),
|
thermo,
|
||||||
mesh,
|
turbulence,
|
||||||
IOobject::MUST_READ,
|
Su,
|
||||||
IOobject::AUTO_WRITE
|
rho,
|
||||||
),
|
b,
|
||||||
mesh
|
phi
|
||||||
);
|
);
|
||||||
|
|
||||||
Info<< "Reading field betav\n" << endl;
|
Info<< "Calculating turbulent flame speed field St\n" << endl;
|
||||||
volScalarField betav
|
volScalarField St
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
(
|
||||||
"betav",
|
IOobject
|
||||||
mesh.facesInstance(),
|
(
|
||||||
mesh,
|
"St",
|
||||||
IOobject::MUST_READ,
|
runTime.timeName(),
|
||||||
IOobject::NO_WRITE
|
mesh,
|
||||||
),
|
IOobject::NO_READ,
|
||||||
mesh
|
IOobject::AUTO_WRITE
|
||||||
);
|
),
|
||||||
|
flameWrinkling->Xi()*Su
|
||||||
|
);
|
||||||
|
|
||||||
Info<< "Reading field Lobs\n" << endl;
|
multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields;
|
||||||
volScalarField Lobs
|
|
||||||
(
|
if (composition.contains("ft"))
|
||||||
IOobject
|
{
|
||||||
|
fields.add(composition.Y("ft"));
|
||||||
|
}
|
||||||
|
|
||||||
|
fields.add(b);
|
||||||
|
fields.add(thermo.he());
|
||||||
|
fields.add(thermo.heu());
|
||||||
|
flameWrinkling->addXi(fields);
|
||||||
|
|
||||||
|
#include "createMRF.H"
|
||||||
|
#include "createFvOptions.H"
|
||||||
|
|
||||||
|
volScalarField c
|
||||||
(
|
(
|
||||||
"Lobs",
|
IOobject
|
||||||
mesh.facesInstance(),
|
(
|
||||||
mesh,
|
"c",
|
||||||
IOobject::MUST_READ,
|
runTime.timeName(),
|
||||||
IOobject::NO_WRITE
|
mesh,
|
||||||
),
|
IOobject::NO_READ,
|
||||||
mesh
|
IOobject::NO_WRITE
|
||||||
);
|
),
|
||||||
|
scalar(1) - b
|
||||||
Info<< "Reading field CT\n" << endl;
|
);
|
||||||
volSymmTensorField CT
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"CT",
|
|
||||||
mesh.facesInstance(),
|
|
||||||
mesh,
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh
|
|
||||||
);
|
|
||||||
|
|
||||||
Info<< "Reading field Nv\n" << endl;
|
|
||||||
volScalarField Nv
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"Nv",
|
|
||||||
mesh.facesInstance(),
|
|
||||||
mesh,
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh
|
|
||||||
);
|
|
||||||
|
|
||||||
Info<< "Reading field nsv\n" << endl;
|
|
||||||
volSymmTensorField nsv
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"nsv",
|
|
||||||
mesh.facesInstance(),
|
|
||||||
mesh,
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh
|
|
||||||
);
|
|
||||||
|
|
||||||
IOdictionary PDRProperties
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"PDRProperties",
|
|
||||||
runTime.constant(),
|
|
||||||
mesh,
|
|
||||||
IOobject::MUST_READ_IF_MODIFIED,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Create the drag model
|
|
||||||
autoPtr<PDRDragModel> drag = PDRDragModel::New
|
|
||||||
(
|
|
||||||
PDRProperties,
|
|
||||||
*turbulence,
|
|
||||||
rho,
|
|
||||||
U,
|
|
||||||
phi
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Create the flame-wrinkling model
|
|
||||||
autoPtr<XiModel> flameWrinkling = XiModel::New
|
|
||||||
(
|
|
||||||
PDRProperties,
|
|
||||||
thermo,
|
|
||||||
*turbulence,
|
|
||||||
Su,
|
|
||||||
rho,
|
|
||||||
b,
|
|
||||||
phi
|
|
||||||
);
|
|
||||||
|
|
||||||
Info<< "Calculating turbulent flame speed field St\n" << endl;
|
|
||||||
volScalarField St
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"St",
|
|
||||||
runTime.timeName(),
|
|
||||||
mesh,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::AUTO_WRITE
|
|
||||||
),
|
|
||||||
flameWrinkling->Xi()*Su
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields;
|
|
||||||
|
|
||||||
if (composition.contains("ft"))
|
|
||||||
{
|
|
||||||
fields.add(composition.Y("ft"));
|
|
||||||
}
|
|
||||||
|
|
||||||
fields.add(b);
|
|
||||||
fields.add(thermo.he());
|
|
||||||
fields.add(thermo.heu());
|
|
||||||
flameWrinkling->addXi(fields);
|
|
||||||
|
|
||||||
#include "createDpdt.H"
|
|
||||||
|
|
||||||
#include "createK.H"
|
|
||||||
|
|
||||||
#include "createMRF.H"
|
|
||||||
#include "createFvOptions.H"
|
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
Copyright (C) 2023 OpenCFD Ltd.
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -48,6 +48,34 @@ namespace laminarFlameSpeedModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
static void readPolynomialCoeffs
|
||||||
|
(
|
||||||
|
Polynomial<7>& coeffs,
|
||||||
|
const word& keyword,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
coeffs[0] = dict.get<scalar>(keyword + "0");
|
||||||
|
coeffs[1] = dict.get<scalar>(keyword + "1");
|
||||||
|
coeffs[2] = dict.get<scalar>(keyword + "2");
|
||||||
|
coeffs[3] = dict.get<scalar>(keyword + "3");
|
||||||
|
coeffs[4] = dict.get<scalar>(keyword + "4");
|
||||||
|
coeffs[5] = dict.get<scalar>(keyword + "5");
|
||||||
|
coeffs[6] = dict.get<scalar>(keyword + "6");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TBD: support direct reading of all coeffs?
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::laminarFlameSpeedModels::SCOPE::polynomial::polynomial
|
Foam::laminarFlameSpeedModels::SCOPE::polynomial::polynomial
|
||||||
@ -76,35 +104,22 @@ Foam::laminarFlameSpeedModels::SCOPE::SCOPE
|
|||||||
(
|
(
|
||||||
dictionary
|
dictionary
|
||||||
(
|
(
|
||||||
IFstream
|
IFstream(dict.get<fileName>("fuelFile"))()
|
||||||
(
|
).subDict(typeName + "Coeffs")
|
||||||
dict.get<fileName>("fuelFile")
|
|
||||||
)()
|
|
||||||
).optionalSubDict(typeName + "Coeffs")
|
|
||||||
),
|
|
||||||
LFL_
|
|
||||||
(
|
|
||||||
coeffsDict_.getCompat<scalar>
|
|
||||||
(
|
|
||||||
"lowerFlammabilityLimit",
|
|
||||||
{{"lowerFlamabilityLimit", 1712}}
|
|
||||||
)
|
|
||||||
),
|
|
||||||
UFL_
|
|
||||||
(
|
|
||||||
coeffsDict_.getCompat<scalar>
|
|
||||||
(
|
|
||||||
"upperFlammabilityLimit",
|
|
||||||
{{"upperFlamabilityLimit", 1712}}
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
|
LFL_(coeffsDict_.get<scalar>("lowerFlamabilityLimit")),
|
||||||
|
UFL_(coeffsDict_.get<scalar>("upperFlamabilityLimit")),
|
||||||
SuPolyL_(coeffsDict_.subDict("lowerSuPolynomial")),
|
SuPolyL_(coeffsDict_.subDict("lowerSuPolynomial")),
|
||||||
SuPolyU_(coeffsDict_.subDict("upperSuPolynomial")),
|
SuPolyU_(coeffsDict_.subDict("upperSuPolynomial")),
|
||||||
Texp_(coeffsDict_.get<scalar>("Texp")),
|
Texp_(),
|
||||||
pexp_(coeffsDict_.get<scalar>("pexp")),
|
pexp_(),
|
||||||
|
CIn_(coeffsDict_.getOrDefault<scalar>("CIn", 0)),
|
||||||
MaPolyL_(coeffsDict_.subDict("lowerMaPolynomial")),
|
MaPolyL_(coeffsDict_.subDict("lowerMaPolynomial")),
|
||||||
MaPolyU_(coeffsDict_.subDict("upperMaPolynomial"))
|
MaPolyU_(coeffsDict_.subDict("upperMaPolynomial"))
|
||||||
{
|
{
|
||||||
|
readPolynomialCoeffs(Texp_, "Texp", coeffsDict_);
|
||||||
|
readPolynomialCoeffs(pexp_, "pexp", coeffsDict_);
|
||||||
|
|
||||||
SuPolyL_.ll = max(SuPolyL_.ll, LFL_) + SMALL;
|
SuPolyL_.ll = max(SuPolyL_.ll, LFL_) + SMALL;
|
||||||
SuPolyU_.ul = min(SuPolyU_.ul, UFL_) - SMALL;
|
SuPolyU_.ul = min(SuPolyU_.ul, UFL_) - SMALL;
|
||||||
|
|
||||||
@ -117,7 +132,7 @@ Foam::laminarFlameSpeedModels::SCOPE::SCOPE
|
|||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Info<< "phi Su (T = Tref, p = pref)" << endl;
|
Info<< "phi Su (T = Tref, p = pref)" << endl;
|
||||||
label n = 200;
|
const label n = 200;
|
||||||
for (int i=0; i<n; i++)
|
for (int i=0; i<n; i++)
|
||||||
{
|
{
|
||||||
scalar phi = (2.0*i)/n;
|
scalar phi = (2.0*i)/n;
|
||||||
@ -141,7 +156,7 @@ inline Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::polyPhi
|
|||||||
const polynomial& a
|
const polynomial& a
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
scalar x = phi - 1.0;
|
const scalar x = phi - 1.0;
|
||||||
|
|
||||||
return
|
return
|
||||||
a[0]
|
a[0]
|
||||||
@ -196,28 +211,34 @@ inline Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::SuRef
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::Ma
|
inline Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::Ma
|
||||||
(
|
(
|
||||||
scalar phi
|
scalar phi
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if (phi < MaPolyL_.ll)
|
if (phi < LFL_ || phi > UFL_)
|
||||||
{
|
{
|
||||||
// Beyond the lower limit assume Ma is constant
|
// Return 0 beyond the flamibility limits
|
||||||
return MaPolyL_.llv;
|
return scalar(0);
|
||||||
|
}
|
||||||
|
else if (phi < MaPolyL_.ll)
|
||||||
|
{
|
||||||
|
// Use linear interpolation between the low end of the
|
||||||
|
// lower polynomial and the lower flammability limit
|
||||||
|
return MaPolyL_.llv*(phi - LFL_)/(MaPolyL_.ll - LFL_);
|
||||||
}
|
}
|
||||||
else if (phi > MaPolyU_.ul)
|
else if (phi > MaPolyU_.ul)
|
||||||
{
|
{
|
||||||
// Beyond the upper limit assume Ma is constant
|
// Use linear interpolation between the upper end of the
|
||||||
return MaPolyU_.ulv;
|
// upper polynomial and the upper flammability limit
|
||||||
|
return MaPolyU_.ulv*(UFL_ - phi)/(UFL_ - MaPolyU_.ul);
|
||||||
}
|
}
|
||||||
else if (phi < SuPolyL_.lu)
|
else if (phi < MaPolyL_.lu)
|
||||||
{
|
{
|
||||||
// Evaluate the lower polynomial
|
// Evaluate the lower polynomial
|
||||||
return polyPhi(phi, MaPolyL_);
|
return polyPhi(phi, MaPolyL_);
|
||||||
}
|
}
|
||||||
else if (phi > SuPolyU_.lu)
|
else if (phi > MaPolyU_.lu)
|
||||||
{
|
{
|
||||||
// Evaluate the upper polynomial
|
// Evaluate the upper polynomial
|
||||||
return polyPhi(phi, MaPolyU_);
|
return polyPhi(phi, MaPolyU_);
|
||||||
@ -242,10 +263,13 @@ inline Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
scalar phi
|
scalar phi
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
static const scalar Tref = 300.0;
|
constexpr scalar Tref = 300.0;
|
||||||
static const scalar pRef = 1.013e5;
|
constexpr scalar pRef = 1.013e5;
|
||||||
|
|
||||||
return SuRef(phi)*pow((Tu/Tref), Texp_)*pow((p/pRef), pexp_);
|
const scalar Texp = Texp_.value(phi-1.0);
|
||||||
|
const scalar pexp = pexp_.value(phi-1.0);
|
||||||
|
|
||||||
|
return SuRef(phi)*pow((Tu/Tref), Texp)*pow((p/pRef), pexp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -256,10 +280,16 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
scalar phi
|
scalar phi
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
auto tSu0 = volScalarField::New
|
auto tSu0 = tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"Su0",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"Su0",
|
||||||
|
p.time().timeName(),
|
||||||
|
p.db(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
p.mesh(),
|
p.mesh(),
|
||||||
dimensionedScalar(dimVelocity, Zero)
|
dimensionedScalar(dimVelocity, Zero)
|
||||||
);
|
);
|
||||||
@ -270,11 +300,9 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
Su0[celli] = Su0pTphi(p[celli], Tu[celli], phi);
|
Su0[celli] = Su0pTphi(p[celli], Tu[celli], phi);
|
||||||
}
|
}
|
||||||
|
|
||||||
volScalarField::Boundary& Su0Bf = Su0.boundaryFieldRef();
|
forAll(Su0.boundaryField(), patchi)
|
||||||
|
|
||||||
forAll(Su0Bf, patchi)
|
|
||||||
{
|
{
|
||||||
scalarField& Su0p = Su0Bf[patchi];
|
scalarField& Su0p = Su0.boundaryFieldRef()[patchi];
|
||||||
const scalarField& pp = p.boundaryField()[patchi];
|
const scalarField& pp = p.boundaryField()[patchi];
|
||||||
const scalarField& Tup = Tu.boundaryField()[patchi];
|
const scalarField& Tup = Tu.boundaryField()[patchi];
|
||||||
|
|
||||||
@ -295,10 +323,16 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
const volScalarField& phi
|
const volScalarField& phi
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
auto tSu0 = volScalarField::New
|
auto tSu0 = tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"Su0",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"Su0",
|
||||||
|
p.time().timeName(),
|
||||||
|
p.db(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
p.mesh(),
|
p.mesh(),
|
||||||
dimensionedScalar(dimVelocity, Zero)
|
dimensionedScalar(dimVelocity, Zero)
|
||||||
);
|
);
|
||||||
@ -309,11 +343,9 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
Su0[celli] = Su0pTphi(p[celli], Tu[celli], phi[celli]);
|
Su0[celli] = Su0pTphi(p[celli], Tu[celli], phi[celli]);
|
||||||
}
|
}
|
||||||
|
|
||||||
volScalarField::Boundary& Su0Bf = Su0.boundaryFieldRef();
|
forAll(Su0.boundaryField(), patchi)
|
||||||
|
|
||||||
forAll(Su0Bf, patchi)
|
|
||||||
{
|
{
|
||||||
scalarField& Su0p = Su0Bf[patchi];
|
scalarField& Su0p = Su0.boundaryFieldRef()[patchi];
|
||||||
const scalarField& pp = p.boundaryField()[patchi];
|
const scalarField& pp = p.boundaryField()[patchi];
|
||||||
const scalarField& Tup = Tu.boundaryField()[patchi];
|
const scalarField& Tup = Tu.boundaryField()[patchi];
|
||||||
const scalarField& phip = phi.boundaryField()[patchi];
|
const scalarField& phip = phi.boundaryField()[patchi];
|
||||||
@ -334,15 +366,27 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Su0pTphi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::scalar Foam::laminarFlameSpeedModels::SCOPE::CIn() const noexcept
|
||||||
|
{
|
||||||
|
return CIn_ ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Ma
|
Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Ma
|
||||||
(
|
(
|
||||||
const volScalarField& phi
|
const volScalarField& phi
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
auto tMa = volScalarField::New
|
auto tMa = tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"Ma",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"Ma",
|
||||||
|
phi.time().timeName(),
|
||||||
|
phi.db(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
phi.mesh(),
|
phi.mesh(),
|
||||||
dimensionedScalar(dimless, Zero)
|
dimensionedScalar(dimless, Zero)
|
||||||
);
|
);
|
||||||
@ -353,11 +397,9 @@ Foam::tmp<Foam::volScalarField> Foam::laminarFlameSpeedModels::SCOPE::Ma
|
|||||||
ma[celli] = Ma(phi[celli]);
|
ma[celli] = Ma(phi[celli]);
|
||||||
}
|
}
|
||||||
|
|
||||||
volScalarField::Boundary& maBf = ma.boundaryFieldRef();
|
forAll(ma.boundaryField(), patchi)
|
||||||
|
|
||||||
forAll(maBf, patchi)
|
|
||||||
{
|
{
|
||||||
scalarField& map = maBf[patchi];
|
scalarField& map = ma.boundaryFieldRef()[patchi];
|
||||||
const scalarField& phip = phi.boundaryField()[patchi];
|
const scalarField& phip = phi.boundaryField()[patchi];
|
||||||
|
|
||||||
forAll(map, facei)
|
forAll(map, facei)
|
||||||
@ -381,7 +423,8 @@ Foam::laminarFlameSpeedModels::SCOPE::Ma() const
|
|||||||
(
|
(
|
||||||
dimensionedScalar
|
dimensionedScalar
|
||||||
(
|
(
|
||||||
"stoichiometricAirFuelMassRatio", dimless, psiuReactionThermo_
|
"stoichiometricAirFuelMassRatio",
|
||||||
|
psiuReactionThermo_
|
||||||
)*ft/(scalar(1) - ft)
|
)*ft/(scalar(1) - ft)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -389,10 +432,16 @@ Foam::laminarFlameSpeedModels::SCOPE::Ma() const
|
|||||||
{
|
{
|
||||||
const fvMesh& mesh = psiuReactionThermo_.p().mesh();
|
const fvMesh& mesh = psiuReactionThermo_.p().mesh();
|
||||||
|
|
||||||
return volScalarField::New
|
return tmp<volScalarField>::New
|
||||||
(
|
(
|
||||||
"Ma",
|
IOobject
|
||||||
IOobject::NO_REGISTER,
|
(
|
||||||
|
"Ma",
|
||||||
|
mesh.time().timeName(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedScalar("Ma", dimless, Ma(equivalenceRatio_))
|
dimensionedScalar("Ma", dimless, Ma(equivalenceRatio_))
|
||||||
);
|
);
|
||||||
@ -413,7 +462,8 @@ Foam::laminarFlameSpeedModels::SCOPE::operator()() const
|
|||||||
psiuReactionThermo_.Tu(),
|
psiuReactionThermo_.Tu(),
|
||||||
dimensionedScalar
|
dimensionedScalar
|
||||||
(
|
(
|
||||||
"stoichiometricAirFuelMassRatio", dimless, psiuReactionThermo_
|
"stoichiometricAirFuelMassRatio",
|
||||||
|
psiuReactionThermo_
|
||||||
)*ft/(scalar(1) - ft)
|
)*ft/(scalar(1) - ft)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2012 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -65,6 +66,7 @@ SourceFiles
|
|||||||
#define SCOPE_H
|
#define SCOPE_H
|
||||||
|
|
||||||
#include "laminarFlameSpeed.H"
|
#include "laminarFlameSpeed.H"
|
||||||
|
#include "Polynomial.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -105,7 +107,7 @@ class SCOPE
|
|||||||
scalar lu;
|
scalar lu;
|
||||||
|
|
||||||
//- Construct from dictionary
|
//- Construct from dictionary
|
||||||
polynomial(const dictionary& polyDict);
|
explicit polynomial(const dictionary& polyDict);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -123,11 +125,14 @@ class SCOPE
|
|||||||
//- Upper Su polynomial
|
//- Upper Su polynomial
|
||||||
polynomial SuPolyU_;
|
polynomial SuPolyU_;
|
||||||
|
|
||||||
//- Temperature correction exponent
|
//- Temperature correction exponents
|
||||||
scalar Texp_;
|
Polynomial<7> Texp_;
|
||||||
|
|
||||||
//- Pressure correction exponent
|
//- Pressure correction exponents
|
||||||
scalar pexp_;
|
Polynomial<7> pexp_;
|
||||||
|
|
||||||
|
//- Additional coefficient
|
||||||
|
scalar CIn_;
|
||||||
|
|
||||||
//- Lower Ma polynomial
|
//- Lower Ma polynomial
|
||||||
polynomial MaPolyL_;
|
polynomial MaPolyL_;
|
||||||
@ -136,25 +141,25 @@ class SCOPE
|
|||||||
polynomial MaPolyU_;
|
polynomial MaPolyU_;
|
||||||
|
|
||||||
|
|
||||||
// Private member functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Polynomial evaluated from the given equivalence ratio
|
//- Polynomial evaluated from the given equivalence ratio
|
||||||
// and polynomial coefficients
|
//- and polynomial coefficients
|
||||||
static inline scalar polyPhi(scalar phi, const polynomial& a);
|
static inline scalar polyPhi(scalar phi, const polynomial& a);
|
||||||
|
|
||||||
//- Laminar flame speed evaluated from the given equivalence ratio
|
//- Laminar flame speed evaluated from the given equivalence ratio
|
||||||
// at the reference temperature and pressure
|
//- at the reference temperature and pressure
|
||||||
inline scalar SuRef(scalar phi) const;
|
inline scalar SuRef(scalar phi) const;
|
||||||
|
|
||||||
//- Markstein evaluated from the given equivalence ratio
|
//- Markstein evaluated from the given equivalence ratio
|
||||||
inline scalar Ma(scalar phi) const;
|
inline scalar Ma(scalar phi) const;
|
||||||
|
|
||||||
//- Laminar flame speed evaluated from the given equivalence ratio
|
//- Laminar flame speed evaluated from the given equivalence ratio
|
||||||
// corrected for temperature and pressure dependence
|
//- corrected for temperature and pressure dependence
|
||||||
inline scalar Su0pTphi(scalar p, scalar Tu, scalar phi) const;
|
inline scalar Su0pTphi(scalar p, scalar Tu, scalar phi) const;
|
||||||
|
|
||||||
//- Laminar flame speed evaluated from the given uniform
|
//- Laminar flame speed evaluated from the given uniform
|
||||||
// equivalence ratio corrected for temperature and pressure dependence
|
//- equivalence ratio corrected for temperature and pressure dependence
|
||||||
tmp<volScalarField> Su0pTphi
|
tmp<volScalarField> Su0pTphi
|
||||||
(
|
(
|
||||||
const volScalarField& p,
|
const volScalarField& p,
|
||||||
@ -163,7 +168,7 @@ class SCOPE
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Laminar flame speed evaluated from the given equivalence ratio
|
//- Laminar flame speed evaluated from the given equivalence ratio
|
||||||
// distribution corrected for temperature and pressure dependence
|
//- distribution corrected for temperature and pressure dependence
|
||||||
tmp<volScalarField> Su0pTphi
|
tmp<volScalarField> Su0pTphi
|
||||||
(
|
(
|
||||||
const volScalarField& p,
|
const volScalarField& p,
|
||||||
@ -172,13 +177,14 @@ class SCOPE
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Return the Markstein number
|
//- Return the Markstein number
|
||||||
// evaluated from the given equivalence ratio
|
//- evaluated from the given equivalence ratio
|
||||||
tmp<volScalarField> Ma(const volScalarField& phi) const;
|
tmp<volScalarField> Ma(const volScalarField& phi) const;
|
||||||
|
|
||||||
//- Construct as copy (not implemented)
|
//- No copy construct
|
||||||
SCOPE(const SCOPE&);
|
SCOPE(const SCOPE&) = delete;
|
||||||
|
|
||||||
void operator=(const SCOPE&);
|
//- No copy assignment
|
||||||
|
void operator=(const SCOPE&) = delete;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -191,8 +197,8 @@ public:
|
|||||||
//- Construct from dictionary and psiuReactionThermo
|
//- Construct from dictionary and psiuReactionThermo
|
||||||
SCOPE
|
SCOPE
|
||||||
(
|
(
|
||||||
const dictionary&,
|
const dictionary& dict,
|
||||||
const psiuReactionThermo&
|
const psiuReactionThermo& ct
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -202,6 +208,9 @@ public:
|
|||||||
|
|
||||||
// Member functions
|
// Member functions
|
||||||
|
|
||||||
|
//- Return CIn
|
||||||
|
scalar CIn() const noexcept;
|
||||||
|
|
||||||
//- Return the Markstein number
|
//- Return the Markstein number
|
||||||
tmp<volScalarField> Ma() const;
|
tmp<volScalarField> Ma() const;
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
rho = thermo.rho();
|
rho = thermo.rho();
|
||||||
|
|
||||||
volScalarField rAU(1.0/UEqn.A());
|
volScalarField rAU(1.0/UEqn.A());
|
||||||
|
|
||||||
volVectorField HbyA(constrainHbyA(invA & UEqn.H(), U, p));
|
volVectorField HbyA(constrainHbyA(invA & UEqn.H(), U, p));
|
||||||
|
|
||||||
if (pimple.transonic())
|
if (pimple.transonic())
|
||||||
@ -8,12 +9,7 @@ if (pimple.transonic())
|
|||||||
surfaceScalarField phid
|
surfaceScalarField phid
|
||||||
(
|
(
|
||||||
"phid",
|
"phid",
|
||||||
fvc::interpolate(psi)
|
fvc::interpolate(psi)*(fvc::flux(HbyA))
|
||||||
*(
|
|
||||||
fvc::flux(HbyA)
|
|
||||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(rho, U, phi)
|
|
||||||
/fvc::interpolate(rho)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
while (pimple.correctNonOrthogonal())
|
while (pimple.correctNonOrthogonal())
|
||||||
@ -27,7 +23,7 @@ if (pimple.transonic())
|
|||||||
betav*fvOptions(psi, p, rho.name())
|
betav*fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
@ -40,10 +36,7 @@ else
|
|||||||
surfaceScalarField phiHbyA
|
surfaceScalarField phiHbyA
|
||||||
(
|
(
|
||||||
"phiHbyA",
|
"phiHbyA",
|
||||||
(
|
fvc::flux(rho*HbyA)
|
||||||
fvc::flux(rho*HbyA)
|
|
||||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(rho, U, phi)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
while (pimple.correctNonOrthogonal())
|
while (pimple.correctNonOrthogonal())
|
||||||
@ -57,7 +50,7 @@ else
|
|||||||
betav*fvOptions(psi, p, rho.name())
|
betav*fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
@ -66,6 +59,8 @@ else
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.max(pMin);
|
||||||
|
|
||||||
#include "rhoEqn.H"
|
#include "rhoEqn.H"
|
||||||
#include "continuityErrs.H"
|
#include "continuityErrs.H"
|
||||||
|
|
||||||
|
|||||||
49
applications/solvers/combustion/PDRFoam/readTimeControls.H
Normal file
49
applications/solvers/combustion/PDRFoam/readTimeControls.H
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2021 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Global
|
||||||
|
readTimeControls
|
||||||
|
|
||||||
|
Description
|
||||||
|
Read the control parameters used by setDeltaT.
|
||||||
|
Modified for PDRFoam to include maxDeltaTRatio.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
const bool adjustTimeStep =
|
||||||
|
runTime.controlDict().getOrDefault("adjustTimeStep", false);
|
||||||
|
|
||||||
|
scalar maxCo =
|
||||||
|
runTime.controlDict().getOrDefault<scalar>("maxCo", 1);
|
||||||
|
|
||||||
|
scalar maxDeltaT =
|
||||||
|
runTime.controlDict().getOrDefault<scalar>("maxDeltaT", GREAT);
|
||||||
|
|
||||||
|
scalar maxDeltaTRatio =
|
||||||
|
runTime.controlDict().getOrDefault<scalar>("maxDeltaTRatio", 1.2);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -1,38 +1,3 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | www.openfoam.com
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Copyright (C) 2011 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/>.
|
|
||||||
|
|
||||||
Global
|
|
||||||
rhoEqn
|
|
||||||
|
|
||||||
Description
|
|
||||||
Solve the continuity for density.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
{
|
{
|
||||||
solve(betav*fvm::ddt(rho) + fvc::div(phi));
|
solve(betav*fvm::ddt(rho) + fvc::div(phi));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
|
|||||||
@ -36,13 +36,12 @@ Description
|
|||||||
if (adjustTimeStep)
|
if (adjustTimeStep)
|
||||||
{
|
{
|
||||||
scalar maxDeltaTFact = maxCo/(CoNum + StCoNum + SMALL);
|
scalar maxDeltaTFact = maxCo/(CoNum + StCoNum + SMALL);
|
||||||
|
scalar deltaTFact =
|
||||||
const scalar deltaTFact =
|
min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), maxDeltaTRatio);
|
||||||
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
|
|
||||||
|
|
||||||
runTime.setDeltaT
|
runTime.setDeltaT
|
||||||
(
|
(
|
||||||
Foam::min
|
min
|
||||||
(
|
(
|
||||||
deltaTFact*runTime.deltaTValue(),
|
deltaTFact*runTime.deltaTValue(),
|
||||||
maxDeltaT
|
maxDeltaT
|
||||||
|
|||||||
@ -19,7 +19,6 @@ EXE_LIBS = \
|
|||||||
-lengine \
|
-lengine \
|
||||||
-lturbulenceModels \
|
-lturbulenceModels \
|
||||||
-lcompressibleTurbulenceModels \
|
-lcompressibleTurbulenceModels \
|
||||||
-lthermoTools \
|
|
||||||
-lcompressibleTransportModels \
|
-lcompressibleTransportModels \
|
||||||
-lfluidThermophysicalModels \
|
-lfluidThermophysicalModels \
|
||||||
-lreactionThermophysicalModels \
|
-lreactionThermophysicalModels \
|
||||||
|
|||||||
@ -26,7 +26,6 @@ EXE_LIBS = \
|
|||||||
-lengine \
|
-lengine \
|
||||||
-lturbulenceModels \
|
-lturbulenceModels \
|
||||||
-lcompressibleTurbulenceModels \
|
-lcompressibleTurbulenceModels \
|
||||||
-lthermoTools \
|
|
||||||
-lcompressibleTransportModels \
|
-lcompressibleTransportModels \
|
||||||
-lfluidThermophysicalModels \
|
-lfluidThermophysicalModels \
|
||||||
-lreactionThermophysicalModels \
|
-lreactionThermophysicalModels \
|
||||||
|
|||||||
@ -30,7 +30,7 @@ if (pimple.transonic())
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ else
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
|||||||
-lengine \
|
-lengine \
|
||||||
-lturbulenceModels \
|
-lturbulenceModels \
|
||||||
-lcompressibleTurbulenceModels \
|
-lcompressibleTurbulenceModels \
|
||||||
-lthermoTools \
|
|
||||||
-lcompressibleTransportModels \
|
-lcompressibleTransportModels \
|
||||||
-lfluidThermophysicalModels \
|
-lfluidThermophysicalModels \
|
||||||
-lreactionThermophysicalModels \
|
-lreactionThermophysicalModels \
|
||||||
|
|||||||
@ -35,7 +35,7 @@ if (pimple.transonic())
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
@ -71,7 +71,7 @@ else
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -171,7 +171,10 @@ if (ign.ignited())
|
|||||||
|
|
||||||
fvOptions.correct(Su);
|
fvOptions.correct(Su);
|
||||||
|
|
||||||
Su.clamp_range(SuMin, SuMax);
|
// Limit the maximum Su
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Su.min(SuMax);
|
||||||
|
Su.max(SuMin);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -215,7 +218,7 @@ if (ign.ignited())
|
|||||||
+ (
|
+ (
|
||||||
scalar(1)
|
scalar(1)
|
||||||
+ (2*XiShapeCoef)
|
+ (2*XiShapeCoef)
|
||||||
*(scalar(0.5) - clamp(b, zero_one{}))
|
*(scalar(0.5) - min(max(b, scalar(0)), scalar(1)))
|
||||||
)*(XiEqStar - scalar(1.001))
|
)*(XiEqStar - scalar(1.001))
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -223,7 +226,7 @@ if (ign.ignited())
|
|||||||
volScalarField R(Gstar*XiEqStar/(XiEqStar - scalar(1)));
|
volScalarField R(Gstar*XiEqStar/(XiEqStar - scalar(1)));
|
||||||
volScalarField G(R*(XiEq - scalar(1.001))/XiEq);
|
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
|
// Solve for the flame wrinkling
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|||||||
@ -29,7 +29,7 @@ if (pimple.transonic())
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
@ -64,7 +64,7 @@ else
|
|||||||
fvOptions(psi, p, rho.name())
|
fvOptions(psi, p, rho.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
pEqn.solve(p.select(pimple.finalInnerIter()));
|
pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
|
||||||
|
|
||||||
if (pimple.finalNonOrthogonalIter())
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
solve
|
solve
|
||||||
(
|
(
|
||||||
fvm::ddt(rho, Yi) - chemistry.RR(specieI),
|
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,
|
mesh,
|
||||||
IOobject::READ_IF_PRESENT,
|
IOobject::READ_IF_PRESENT,
|
||||||
IOobject::NO_WRITE,
|
IOobject::NO_WRITE,
|
||||||
IOobject::NO_REGISTER
|
false
|
||||||
),
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedScalar("Ydefault", dimless, 1)
|
dimensionedScalar("Ydefault", dimless, 1)
|
||||||
@ -29,7 +29,7 @@ Info<< "Creating base fields for time " << runTime.timeName() << endl;
|
|||||||
mesh,
|
mesh,
|
||||||
IOobject::READ_IF_PRESENT,
|
IOobject::READ_IF_PRESENT,
|
||||||
IOobject::NO_WRITE,
|
IOobject::NO_WRITE,
|
||||||
IOobject::NO_REGISTER
|
false
|
||||||
),
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedScalar("p", dimPressure, p0)
|
dimensionedScalar("p", dimPressure, p0)
|
||||||
@ -46,7 +46,7 @@ Info<< "Creating base fields for time " << runTime.timeName() << endl;
|
|||||||
mesh,
|
mesh,
|
||||||
IOobject::READ_IF_PRESENT,
|
IOobject::READ_IF_PRESENT,
|
||||||
IOobject::NO_WRITE,
|
IOobject::NO_WRITE,
|
||||||
IOobject::NO_REGISTER
|
false
|
||||||
),
|
),
|
||||||
mesh,
|
mesh,
|
||||||
dimensionedScalar("T", dimTemperature, T0)
|
dimensionedScalar("T", dimTemperature, T0)
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
if (adjustTimeStep)
|
if (adjustTimeStep)
|
||||||
{
|
{
|
||||||
runTime.setDeltaT(Foam::min(dtChem, maxDeltaT));
|
runTime.setDeltaT(min(dtChem, maxDeltaT));
|
||||||
|
Info<< "deltaT = " << runTime.deltaT().value() << endl;
|
||||||
Info<< "deltaT = " << runTime.deltaTValue() << endl;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
dtChem = chemistry.solve(runTime.deltaTValue());
|
dtChem = chemistry.solve(runTime.deltaT().value());
|
||||||
scalar Qdot = chemistry.Qdot()()[0]/rho[0];
|
scalar Qdot = chemistry.Qdot()()[0]/rho[0];
|
||||||
integratedHeat += Qdot*runTime.deltaTValue();
|
integratedHeat += Qdot*runTime.deltaT().value();
|
||||||
|
|||||||
@ -20,7 +20,6 @@ EXE_LIBS = \
|
|||||||
-lengine \
|
-lengine \
|
||||||
-lturbulenceModels \
|
-lturbulenceModels \
|
||||||
-lcompressibleTurbulenceModels \
|
-lcompressibleTurbulenceModels \
|
||||||
-lthermoTools \
|
|
||||||
-lcompressibleTransportModels \
|
-lcompressibleTransportModels \
|
||||||
-lfluidThermophysicalModels \
|
-lfluidThermophysicalModels \
|
||||||
-lspecie
|
-lspecie
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user