mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'master' into molecularDynamics
This commit is contained in:
4
README
4
README
@ -2,9 +2,9 @@
|
||||
#
|
||||
#+TITLE: *OpenFOAM README for version 1.5*
|
||||
#+AUTHOR: OpenCFD Ltd.
|
||||
#+DATE: 14 July 2008
|
||||
#+DATE: 26 August 2008
|
||||
#+LINK: http://www.opencfd.co.uk
|
||||
#+OPTIONS: author:nil
|
||||
#+OPTIONS: author:nil ^:{}
|
||||
|
||||
* Copyright
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it under the
|
||||
|
||||
484
README.html
484
README.html
@ -1,42 +1,26 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en" xml:lang="en">
|
||||
<head>
|
||||
<title><b>OpenFOAM README for version 1.5</b></title>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
|
||||
<meta name="generator" content="Org-mode"/>
|
||||
<meta name="generated" content="14 July 2008"/>
|
||||
<meta name="author" content="OpenCFD Ltd."/>
|
||||
<style type="text/css">
|
||||
html {
|
||||
font-family: Times, serif;
|
||||
font-size: 12pt;
|
||||
}
|
||||
.title { text-align: center; }
|
||||
.todo { color: red; }
|
||||
.done { color: green; }
|
||||
.timestamp { color: grey }
|
||||
.timestamp-kwd { color: CadetBlue }
|
||||
.tag { background-color:lightblue; font-weight:normal }
|
||||
.target { }
|
||||
pre {
|
||||
border: 1pt solid #AEBDCC;
|
||||
background-color: #F3F5F7;
|
||||
padding: 5pt;
|
||||
font-family: courier, monospace;
|
||||
font-size: 90%;
|
||||
}
|
||||
table { border-collapse: collapse; }
|
||||
td, th {
|
||||
vertical-align: top;
|
||||
<!--border: 1pt solid #ADB9CC;-->
|
||||
}
|
||||
dt { font-weight: bold; }
|
||||
</style>
|
||||
</head><body>
|
||||
<h1 class="title"><b>OpenFOAM README for version 1.5</b></h1>
|
||||
<div id="table-of-contents">
|
||||
OpenFOAM README for version 1.5
|
||||
|
||||
1 Copyright
|
||||
|
||||
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 2 of the License, or (at your option) any later version.
|
||||
See the file COPYING in this directory, for a description of the GNU General Public License terms under which you can
|
||||
copy the files.
|
||||
|
||||
2 System requirements
|
||||
|
||||
OpenFOAM is developed and tested on Linux, but should work with other Unix style systems. To check your system setup,
|
||||
execute the foamSystemCheck script in the bin/ directory of the OpenFOAM installation. If no problems are reported,
|
||||
proceed to "3. Installation"; otherwise contact your system administrator.
|
||||
|
||||
If the user wishes to run OpenFOAM in 32/64-bit mode they should consult the section "Running OpenFOAM in 32-bit mode".
|
||||
|
||||
2.1 Qt (from http://trolltech.com/products/qt)
|
||||
|
||||
The ParaView 3.3 visualisation package requires that Qt version 4.3.x MUST be installed on the system. Earlier or more
|
||||
recent versions (4.2.x or 4.4.x) will NOT work. To check whether Qt4 is installed, and the version, type:
|
||||
|
||||
* qmake <div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
@ -62,384 +46,152 @@ lang="en" xml:lang="en">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
–version
|
||||
|
||||
<div id="outline-container-1" class="outline-2">
|
||||
<h2 id="sec-1">1 Copyright</h2>
|
||||
<div id="text-1">
|
||||
The ParaView binary executables in the ThirdParty distribution will only work with PRECISELY the same version of Qt
|
||||
with which it was compiled. The 64-bit version of ParaView was compiled with Qt-4.3.1 (with openSuSE-10.3) and the
|
||||
32-bit version of ParaView was compiled with Qt-4.3.2 (with ubuntu-7.10). If the user finds that a ParaView binary
|
||||
fails to run, then it is almost certainly due to a conflict in compiled and installed Qt versions and they will need to
|
||||
consult the section below on "Compiling ParaView and the PV3FoamReader module."
|
||||
|
||||
<p>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 2 of the License, or (at your option) any later
|
||||
version. See the file COPYING in this directory, for a description of the GNU
|
||||
General Public License terms under which you can copy the files.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-2" class="outline-2">
|
||||
<h2 id="sec-2">2 System requirements</h2>
|
||||
<div id="text-2">
|
||||
|
||||
<p>OpenFOAM is developed and tested on Linux, but should work with other Unix
|
||||
style systems. To check your system setup, execute the foamSystemCheck script
|
||||
in the bin/ directory of the OpenFOAM installation. If no problems are
|
||||
reported, proceed to "3. Installation"; otherwise contact your system
|
||||
administrator.
|
||||
</p>
|
||||
<p>
|
||||
If the user wishes to run OpenFOAM in 32/64-bit mode they should consult the
|
||||
section "Running OpenFOAM in 32-bit mode".
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-2.1" class="outline-3">
|
||||
<h3 id="sec-2.1">2.1 Qt (from <a href="http://trolltech.com/products/qt">http://trolltech.com/products/qt</a>)</h3>
|
||||
<div id="text-2.1">
|
||||
|
||||
<p>The ParaView 3.3 visualisation package requires that Qt version 4.3.x MUST
|
||||
be installed on the system. Earlier or more recent versions (4.2.x or
|
||||
4.4.x) will NOT work. To check whether Qt4 is installed, and the version,
|
||||
type:
|
||||
</p><ul>
|
||||
<li>
|
||||
qmake –version
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>The ParaView binary executables in the ThirdParty distribution will only
|
||||
work with PRECISELY the same version of Qt with which it was compiled. The
|
||||
64-bit version of ParaView was compiled with Qt-4.3.1 (with openSuSE-10.3)
|
||||
and the 32-bit version of ParaView was compiled with Qt-4.3.2 (with
|
||||
ubuntu-7.10). If the user finds that a ParaView binary fails to run, then
|
||||
it is almost certainly due to a conflict in compiled and installed Qt
|
||||
versions and they will need to consult the section below on "Compiling
|
||||
ParaView and the PV3FoamReader module."
|
||||
</p>
|
||||
<p>
|
||||
The default versions of Qt used by some GNU/Linux releases are as follows.
|
||||
</p><ul>
|
||||
<li>
|
||||
ubuntu-7.10: Version 4.3.2
|
||||
</li>
|
||||
<li>
|
||||
ubuntu-8.04: Version 4.3.4
|
||||
</li>
|
||||
<li>
|
||||
openSuSE-10.2: Version 4.2.1 - too old
|
||||
</li>
|
||||
<li>
|
||||
openSuSE-10.3: Version 4.3.1
|
||||
</li>
|
||||
<li>
|
||||
openSuSE-11.0: Version 4.4.0 - too new
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
* ubuntu-7.10: Version 4.3.2
|
||||
* ubuntu-8.04: Version 4.3.4
|
||||
* openSuSE-10.2: Version 4.2.1 - too old
|
||||
* openSuSE-10.3: Version 4.3.1
|
||||
* openSuSE-11.0: Version 4.4.0 - too new
|
||||
|
||||
<p>Compilation and running of ParaView has been successful using the libraries
|
||||
downloaded in the "libqt4-dev" package on ubuntu.
|
||||
</p>
|
||||
<p>
|
||||
If you don't have an appropriate version of Qt installed you can download
|
||||
the sources from TrollTech e.g.:
|
||||
<a href="ftp://ftp.trolltech.com/qt/source/qt-x11-opensource-src-4.3.5.tar.bz2">ftp://ftp.trolltech.com/qt/source/qt-x11-opensource-src-4.3.5.tar.bz2</a>
|
||||
and compile and install in /usr/local or some other location that does to
|
||||
conflict with the pre-installed version.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
Compilation and running of ParaView has been successful using the libraries downloaded in the "libqt4-dev" package on
|
||||
ubuntu.
|
||||
|
||||
</div>
|
||||
If you don't have an appropriate version of Qt installed you can download the sources from TrollTech e.g.: ftp://
|
||||
ftp.trolltech.com/qt/source/qt-x11-opensource-src-4.3.5.tar.bz2 and compile and install in /usr/local or some other
|
||||
location that does to conflict with the pre-installed version.
|
||||
|
||||
<div id="outline-container-3" class="outline-2">
|
||||
<h2 id="sec-3">3 Installation</h2>
|
||||
<div id="text-3">
|
||||
3 Installation
|
||||
|
||||
<p>Download and unpack the files in the $HOME/OpenFOAM directory as described in:
|
||||
<a href="http://www.OpenFOAM.org/download.html">http://www.OpenFOAM.org/download.html</a>
|
||||
</p>
|
||||
<p>
|
||||
The environment variable settings are contained in files in an etc/ directory
|
||||
in the OpenFOAM release. e.g. in
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
$HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/
|
||||
</li>
|
||||
<li>
|
||||
where <VERSION> corresponds to the version 1.4, 1.5, …
|
||||
Download and unpack the files in the $HOME/OpenFOAM directory as described in: http://www.OpenFOAM.org/download.html
|
||||
|
||||
</li>
|
||||
<li>
|
||||
EITHER, if running bash or ksh (if in doubt type 'echo $SHELL'), source the
|
||||
etc/bashrc file by adding the following line to the end of your
|
||||
$HOME/.bashrc file:
|
||||
The environment variable settings are contained in files in an etc/ directory in the OpenFOAM release. e.g. in
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
. $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/bashrc
|
||||
* $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/
|
||||
* where <VERSION> corresponds to the version 1.4, 1.5, …
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
* EITHER, if running bash or ksh (if in doubt type 'echo $SHELL'), source the etc/bashrc file by adding the following
|
||||
line to the end of your $HOME/.bashrc file:
|
||||
|
||||
<p>Then update the environment variables by sourcing the $HOME/.bashrc file by
|
||||
typing in the terminal:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
. $HOME/.bashrc
|
||||
+ . $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/bashrc
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
OR, if running tcsh or csh, source the etc/cshrc file by adding the
|
||||
following line to the end of your $HOME/.cshrc file:
|
||||
Then update the environment variables by sourcing the $HOME/.bashrc file by typing in the terminal:
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
source $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/cshrc
|
||||
+ . $HOME/.bashrc
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
* OR, if running tcsh or csh, source the etc/cshrc file by adding the following line to the end of your $HOME/.cshrc
|
||||
file:
|
||||
|
||||
<p>Then update the environment variables by sourcing the $HOME/.cshrc file by
|
||||
typing in the terminal:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
source $HOME/.cshrc
|
||||
+ source $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/cshrc
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
Then update the environment variables by sourcing the $HOME/.cshrc file by typing in the terminal:
|
||||
|
||||
</div>
|
||||
+ source $HOME/.cshrc
|
||||
|
||||
<div id="outline-container-3.1" class="outline-3">
|
||||
<h3 id="sec-3.1">3.1 Installation in alternative locations</h3>
|
||||
<div id="text-3.1">
|
||||
3.1 Installation in alternative locations
|
||||
|
||||
<p>OpenFOAM may also be installed in alternative locations. However, the
|
||||
installation directory should be network available (e.g., NFS) if parallel
|
||||
calculations are planned.
|
||||
</p>
|
||||
<p>
|
||||
The environment variable 'FOAM_INST_DIR' can be used to find and source the
|
||||
appropriate resource file. Here is a bash/ksh/sh example:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
export FOAM_INST_DIR=/data/app/OpenFOAM
|
||||
</li>
|
||||
<li>
|
||||
foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
|
||||
</li>
|
||||
<li>
|
||||
[ -f $foamDotFile ] && . $foamDotFile
|
||||
OpenFOAM may also be installed in alternative locations. However, the installation directory should be network
|
||||
available (e.g., NFS) if parallel calculations are planned.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
The environment variable 'FOAM_INST_DIR' can be used to find and source the appropriate resource file. Here is a bash/
|
||||
ksh/sh example:
|
||||
|
||||
<p>and a csh/tcsh example:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
setenv FOAM_INST_DIR /data/app/OpenFOAM
|
||||
</li>
|
||||
<li>
|
||||
foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
|
||||
</li>
|
||||
<li>
|
||||
if ( -f $foamDotFile ) source $foamDotFile
|
||||
* export FOAM_INST_DIR=/data/app/OpenFOAM
|
||||
* foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
|
||||
* [ -f $foamDotFile ] && . $foamDotFile
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
and a csh/tcsh example:
|
||||
|
||||
<p>The value set in '$FOAM_INST_DIR' will be used to locate the remaining parts
|
||||
of the OpenFOAM installation.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
* setenv FOAM_INST_DIR /data/app/OpenFOAM
|
||||
* foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
|
||||
* if ( -f $foamDotFile ) source $foamDotFile
|
||||
|
||||
</div>
|
||||
The value set in '$FOAM_INST_DIR' will be used to locate the remaining parts of the OpenFOAM installation.
|
||||
|
||||
<div id="outline-container-4" class="outline-2">
|
||||
<h2 id="sec-4">4 Building from Sources (Optional)</h2>
|
||||
<div id="text-4">
|
||||
4 Building from Sources (Optional)
|
||||
|
||||
<p>If you cannot find an appropriate binary pack for your platform, you can build
|
||||
the complete OpenFOAM from the source-pack. You will first need to compile or
|
||||
obtain a recent version of gcc (we recomend gcc-4.3.?) for your platform,
|
||||
which may be obtained from <a href="http://gcc.gnu.org/">http://gcc.gnu.org/</a>.
|
||||
</p>
|
||||
<p>
|
||||
Install the compiler in
|
||||
$WM_PROJECT_INST_DIR/ThirdParty/gcc-<GCC_VERSION>/platforms/$WM_ARCH$WM_COMPILER_ARCH/
|
||||
and change the gcc version number in $WM_PROJECT_DIR/etc/settings.sh and
|
||||
$WM_PROJECT_DIR/etc/settings.csh appropriately and finally update the
|
||||
environment variables as in section 3.
|
||||
</p>
|
||||
<p>
|
||||
Now go to the top-level source directory $WM_PROJECT_DIR and execute the
|
||||
top-level build script './Allwmake'. In principle this will build everything,
|
||||
but if problems occur with the build order it may be necessary to update the
|
||||
environment variables and re-execute 'Allwmake'. If you experience
|
||||
difficulties with building the source-pack, or your platform is not currently
|
||||
supported, please contact <enquiries@OpenCFD.co.uk> to negotiate a support
|
||||
contract and we will do the port and maintain it for future releases.
|
||||
</p>
|
||||
</div>
|
||||
If you cannot find an appropriate binary pack for your platform, you can build the complete OpenFOAM from the
|
||||
source-pack. You will first need to compile or obtain a recent version of gcc (we recomend gcc-4.3.?) for your
|
||||
platform, which may be obtained from http://gcc.gnu.org/.
|
||||
|
||||
</div>
|
||||
Install the compiler in $WM_PROJECT_INST_DIR/ThirdParty/gcc-<GCC_VERSION>/platforms/$WM_ARCH$WM_COMPILER_ARCH/ and
|
||||
change the gcc version number in $WM_PROJECT_DIR/etc/settings.sh and $WM_PROJECT_DIR/etc/settings.csh appropriately and
|
||||
finally update the environment variables as in section 3.
|
||||
|
||||
<div id="outline-container-5" class="outline-2">
|
||||
<h2 id="sec-5">5 Testing the installation</h2>
|
||||
<div id="text-5">
|
||||
Now go to the top-level source directory $WM_PROJECT_DIR and execute the top-level build script './Allwmake'. In
|
||||
principle this will build everything, but if problems occur with the build order it may be necessary to update the
|
||||
environment variables and re-execute 'Allwmake'. If you experience difficulties with building the source-pack, or your
|
||||
platform is not currently supported, please contact <enquiries@OpenCFD.co.uk> to negotiate a support contract and we
|
||||
will do the port and maintain it for future releases.
|
||||
|
||||
<p>To check your installation setup, execute the 'foamInstallationTest' script
|
||||
(in the bin/ directory of the OpenFOAM installation). If no problems are
|
||||
reported, proceed to getting started with OpenFOAM; otherwise, go back and
|
||||
check you have installed the software correctly and/or contact your system
|
||||
administrator.
|
||||
</p>
|
||||
</div>
|
||||
5 Testing the installation
|
||||
|
||||
</div>
|
||||
To check your installation setup, execute the 'foamInstallationTest' script (in the bin/ directory of the OpenFOAM
|
||||
installation). If no problems are reported, proceed to getting started with OpenFOAM; otherwise, go back and check you
|
||||
have installed the software correctly and/or contact your system administrator.
|
||||
|
||||
<div id="outline-container-6" class="outline-2">
|
||||
<h2 id="sec-6">6 Getting Started</h2>
|
||||
<div id="text-6">
|
||||
6 Getting Started
|
||||
|
||||
<p>Create a project directory within the $HOME/OpenFOAM directory named
|
||||
<USER>-<VERSION> (e.g. 'chris-1.5' for user chris and OpenFOAM version 1.5)
|
||||
and create a directory named 'run' within it, e.g. by typing:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
|
||||
Create a project directory within the $HOME/OpenFOAM directory named <USER>-<VERSION> (e.g. 'chris-1.5' for user chris
|
||||
and OpenFOAM version 1.5) and create a directory named 'run' within it, e.g. by typing:
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
* mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
|
||||
|
||||
<p>Copy the 'tutorial' examples directory in the OpenFOAM distribution to the
|
||||
'run' directory. If the OpenFOAM environment variables are set correctly,
|
||||
then the following command will be correct:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
cp -r $WM_PROJECT_DIR/tutorials
|
||||
$HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
|
||||
Copy the 'tutorial' examples directory in the OpenFOAM distribution to the 'run' directory. If the OpenFOAM environment
|
||||
variables are set correctly, then the following command will be correct:
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
* cp -r $WM_PROJECT_DIR/tutorials $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
|
||||
|
||||
<p>Run the first example case of incompressible laminar flow in a cavity:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
cd $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run/tutorials/icoFoam/cavity
|
||||
</li>
|
||||
<li>
|
||||
blockMesh
|
||||
</li>
|
||||
<li>
|
||||
icoFoam
|
||||
</li>
|
||||
<li>
|
||||
paraFoam
|
||||
Run the first example case of incompressible laminar flow in a cavity:
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
* cd $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run/tutorials/icoFoam/cavity
|
||||
* blockMesh
|
||||
* icoFoam
|
||||
* paraFoam
|
||||
|
||||
</div>
|
||||
7 Compiling Paraview 3.3 and the PV3FoamReader module
|
||||
|
||||
<div id="outline-container-7" class="outline-2">
|
||||
<h2 id="sec-7">7 Compiling Paraview 3.3 and the PV3FoamReader module</h2>
|
||||
<div id="text-7">
|
||||
A version of Qt 4.3.x must be installed to compile ParaView. The compilation is a fairly simple process using the
|
||||
supplied buildParaView3.3-cvs script that has worked is our tests with other packages supplied in the ThirdParty
|
||||
directory, namely cmake-2.4.6 and gcc-4.3.1. Execute the following:
|
||||
|
||||
<p>A version of Qt 4.3.x must be installed to compile ParaView. The compilation
|
||||
is a fairly simple process using the supplied buildParaView3.3-cvs script that
|
||||
has worked is our tests with other packages supplied in the ThirdParty
|
||||
directory, namely cmake-2.4.6 and gcc-4.3.1. Execute the following:
|
||||
</p><ul>
|
||||
<li>
|
||||
cd $FOAM_INST_DIR/ThirdParty
|
||||
</li>
|
||||
<li>
|
||||
rm -rf ParaView3.3-cvs/platforms
|
||||
</li>
|
||||
<li>
|
||||
buildParaView3.3-cvs
|
||||
* cd $FOAM_INST_DIR/ThirdParty
|
||||
* rm -rf ParaView3.3-cvs/platforms
|
||||
* buildParaView3.3-cvs
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
The PV3FoamReader module is an OpenFOAM utility that can be compiled in the usual manner as follows:
|
||||
|
||||
<p>The PV3FoamReader module is an OpenFOAM utility that can be compiled in the
|
||||
usual manner as follows:
|
||||
</p><ul>
|
||||
<li>
|
||||
cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader
|
||||
</li>
|
||||
<li>
|
||||
./Allwclean
|
||||
</li>
|
||||
<li>
|
||||
./Allwmake
|
||||
* cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader
|
||||
* ./Allwclean
|
||||
* ./Allwmake
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
8 Documentation
|
||||
|
||||
</div>
|
||||
http://www.OpenFOAM.org/doc
|
||||
|
||||
<div id="outline-container-8" class="outline-2">
|
||||
<h2 id="sec-8">8 Documentation</h2>
|
||||
<div id="text-8">
|
||||
9 Help
|
||||
|
||||
<p><a href="http://www.OpenFOAM.org/doc">http://www.OpenFOAM.org/doc</a>
|
||||
</p>
|
||||
</div>
|
||||
http://www.OpenFOAM.org http://www.OpenFOAM.org/discussion.html
|
||||
|
||||
</div>
|
||||
10 Reporting Bugs in OpenFOAM
|
||||
|
||||
<div id="outline-container-9" class="outline-2">
|
||||
<h2 id="sec-9">9 Help</h2>
|
||||
<div id="text-9">
|
||||
http://www.OpenFOAM.org/bugs.html
|
||||
|
||||
<p><a href="http://www.OpenFOAM.org">http://www.OpenFOAM.org</a> <a href="http://www.OpenFOAM.org/discussion.html">http://www.OpenFOAM.org/discussion.html</a>
|
||||
</p>
|
||||
</div>
|
||||
11 Running OpenFOAM in 32-bit mode on 64-bit machines
|
||||
|
||||
</div>
|
||||
Linux users with a 64-bit machine may install either the OpenFOAM 32-bit version (linux) or the OpenFOAM 64-bit version
|
||||
(linux64), or both. The 64-bit is the default mode on a 64-bit machine. To use an installed 32-bit version, the user
|
||||
must set the environment variable WM_ARCH_OPTION to 32 before sourcing the etc/bashrc (or etc/cshrc) file.
|
||||
|
||||
<div id="outline-container-10" class="outline-2">
|
||||
<h2 id="sec-10">10 Reporting Bugs in OpenFOAM</h2>
|
||||
<div id="text-10">
|
||||
Date: 26 August 2008
|
||||
|
||||
<p><a href="http://www.OpenFOAM.org/bugs.html">http://www.OpenFOAM.org/bugs.html</a>
|
||||
</p>
|
||||
</div>
|
||||
HTML generated by org-mode 6.06b in emacs 23
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-11" class="outline-2">
|
||||
<h2 id="sec-11">11 Running OpenFOAM in 32-bit mode on 64-bit machines</h2>
|
||||
<div id="text-11">
|
||||
|
||||
<p>Linux users with a 64-bit machine may install either the OpenFOAM 32-bit
|
||||
version (linux) or the OpenFOAM 64-bit version (linux64), or both. The 64-bit
|
||||
is the default mode on a 64-bit machine. To use an installed 32-bit version,
|
||||
the user must set the environment variable $WM_32 (to anything, e.g. "on")
|
||||
before sourcing the etc/bashrc (or etc/cshrc) file.
|
||||
</p></div>
|
||||
</div>
|
||||
<div id="postamble"><p class="date"> Date: 14 July 2008</p>
|
||||
<p>HTML generated by org-mode 6.05a in emacs 23<p>
|
||||
</div></body>
|
||||
</html>
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
#
|
||||
#+TITLE: *OpenFOAM release notes for version 1.5*
|
||||
#+AUTHOR: OpenCFD Ltd.
|
||||
#+DATE: 14 July 2008
|
||||
#+DATE: 26 August 2008
|
||||
#+LINK: http://www.opencfd.co.uk
|
||||
#+OPTIONS: author:nil
|
||||
#+OPTIONS: author:nil ^:{}
|
||||
|
||||
* Overview
|
||||
OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are
|
||||
|
||||
@ -1,42 +1,27 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en" xml:lang="en">
|
||||
<head>
|
||||
<title><b>OpenFOAM release notes for version 1.5</b></title>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
|
||||
<meta name="generator" content="Org-mode"/>
|
||||
<meta name="generated" content="14 July 2008"/>
|
||||
<meta name="author" content="OpenCFD Ltd."/>
|
||||
<style type="text/css">
|
||||
html {
|
||||
font-family: Times, serif;
|
||||
font-size: 12pt;
|
||||
}
|
||||
.title { text-align: center; }
|
||||
.todo { color: red; }
|
||||
.done { color: green; }
|
||||
.timestamp { color: grey }
|
||||
.timestamp-kwd { color: CadetBlue }
|
||||
.tag { background-color:lightblue; font-weight:normal }
|
||||
.target { }
|
||||
pre {
|
||||
border: 1pt solid #AEBDCC;
|
||||
background-color: #F3F5F7;
|
||||
padding: 5pt;
|
||||
font-family: courier, monospace;
|
||||
font-size: 90%;
|
||||
}
|
||||
table { border-collapse: collapse; }
|
||||
td, th {
|
||||
vertical-align: top;
|
||||
<!--border: 1pt solid #ADB9CC;-->
|
||||
}
|
||||
dt { font-weight: bold; }
|
||||
</style>
|
||||
</head><body>
|
||||
<h1 class="title"><b>OpenFOAM release notes for version 1.5</b></h1>
|
||||
<div id="table-of-contents">
|
||||
OpenFOAM release notes for version 1.5
|
||||
|
||||
1 Overview
|
||||
|
||||
OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are
|
||||
outlined below. This release passes all our standard tests and the tutorials
|
||||
have been broadly checked. If there are any bugs, please report them using the
|
||||
instructions set out in: http://www.openfoam.org/bugs.html.
|
||||
|
||||
Most of the developments for this release are in: new applications, e.g. for
|
||||
multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed
|
||||
flows and even molecular dynamics; new utilities, e.g. for meshing and case
|
||||
monitoring; and, new modelling, e.g. in Lagrangian particle tracking,
|
||||
radiation and rotating frames of reference. With these new applications come
|
||||
numerous new example cases.
|
||||
|
||||
2 GNU/Linux version
|
||||
|
||||
The 64bit binary packs of the OpenFOAM release were compiled on a machine
|
||||
running SuSE GNU/Linux version 10.3 and the 32bit on a machine running Ubuntu
|
||||
GNU/Linux version 7.1 and also tested on Ubuntu 8.04. We recommend that users
|
||||
run OpenFOAM on one of these or a similar recent version of GNU/Linux. This
|
||||
release has also been successfully compiled and tested on older GNU/Linux
|
||||
releases but this re<div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
@ -54,376 +39,170 @@ lang="en" xml:lang="en">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
quires the installation of Qt 4.3.? for ParaView-3 to run.
|
||||
|
||||
<div id="outline-container-1" class="outline-2">
|
||||
<h2 id="sec-1">1 Overview</h2>
|
||||
<div id="text-1">
|
||||
3 C++ Compiler version
|
||||
|
||||
<p>OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are
|
||||
outlined below. This release passes all our standard tests and the tutorials
|
||||
have been broadly checked. If there are any bugs, please report them using
|
||||
the instructions set out in: <a href="http://www.openfoam.org/bugs.html">http://www.openfoam.org/bugs.html</a>.
|
||||
</p>
|
||||
<p>
|
||||
Most of the developments for this release are in: new applications, e.g. for
|
||||
multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed
|
||||
flows and even molecular dynamics; new utilities, e.g. for meshing and case
|
||||
monitoring; and, new modelling, e.g. in Lagrangian particle tracking,
|
||||
radiation and rotating frames of reference. With these new applications come
|
||||
numerous new example cases.
|
||||
</p>
|
||||
</div>
|
||||
* Released compiled with GCC 4.3.1, the latest version.
|
||||
* Built in support for the Intel C++ 10.? compiler (untested).
|
||||
* The choice of the compiler is controlled by the setting of the
|
||||
$WM_COMPILER and $WM_COMPILER_ARCH environment variables in the
|
||||
OpenFOAM-1.5/etc/bashrc (or cshrc) file.
|
||||
* The location of the installation of the compiler is controlled by the
|
||||
$WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh
|
||||
(or settings.csh) file.
|
||||
|
||||
</div>
|
||||
4 Developments to solvers (applications)
|
||||
|
||||
<div id="outline-container-2" class="outline-2">
|
||||
<h2 id="sec-2">2 GNU/Linux version</h2>
|
||||
<div id="text-2">
|
||||
* New rhoCentralFoam solver for high-speed, viscous, compressible flows
|
||||
using non-oscillatory, central-upwind schemes.
|
||||
* New interDyMFoam solver for 2 incompressible, isothermal, immiscible
|
||||
fluids using a VoF phase-fraction based interface capturing approach, with
|
||||
optional mesh motion and mesh topology changes including adaptive mesh
|
||||
(un)refinement. Useful for simulations such as tank filling, sloshing ---
|
||||
using solid body motion e.g. SDA or SKA (6DoF) — and slamming (using the
|
||||
mesh motion solver) and other large-scale applications that benefit from
|
||||
the efficiency gain of adaptive mesh (un)refinement of the interface.
|
||||
* New compressibleInterFoam solver for 2 compressible, isothermal,
|
||||
immiscible fluids using a volume of fluid (VoF) phase-fraction approach
|
||||
for interface-capturing. The momentum and other fluid properties are of
|
||||
the "mixture" and a single momentum equation is solved. Turbulence is
|
||||
modelled using a run-time selectable incompressible LES model.
|
||||
* New interPhaseChangeFoam solver for 2 incompressible, isothermal,
|
||||
immiscible fluids with phase-change, e.g. cavitation. Uses VoF interface
|
||||
capturing, with momentum and other fluid properties described for the
|
||||
``mixture'' and a single momentum equation is solved. The set of
|
||||
phase-change models provided are designed to simulate cavitation but other
|
||||
mechanisms of phase-change are supported within this solver framework.
|
||||
* New rasCavitatingFoam solver for transient cavitation using a barotropic
|
||||
compressibility model, with RAS turbulence.
|
||||
* New lesCavitatingFoam solver for transient cavitation using a barotropic
|
||||
compressibility model, with LES turbulence.
|
||||
* New chtMultiRegionFoam solver that couples conjugate heat transfer in a
|
||||
solid to a buoyancy-driven flow simulation.
|
||||
* New PDRFoam solver for compressible premixed/partially-premixed turbulent
|
||||
combustion that includes porosity/distributed resistance (PDR) modelling
|
||||
to handle regions containing solid blockages which cannot be resolved by
|
||||
the mesh. Requires the PDR fields.
|
||||
* New lesBuoyantFoam solver for transient, buoyant, turbulent flow of
|
||||
compressible fluids for ventilation and heat-transfer. Turbulence is
|
||||
modelled using a run-time selectable compressible LES model.
|
||||
* New rhoPimpleFoam solver for transient, turbulent flow of compressible
|
||||
fluids for ventilation and heat-transfer. Uses the flexible PIMPLE
|
||||
(PISO-SIMPLE) solution for time-resolved and pseudo-transient simulations.
|
||||
* New buoyantSimpleRadiationFoam solver for steady-state, buoyant, turbulent
|
||||
flow of compressible fluids with radiation, for ventilation and
|
||||
heat-transfer.
|
||||
* New rhoTurbTwinParcelFoam solver for transient for compressible, turbulent
|
||||
flow with two thermo-clouds.
|
||||
* New gnemdFOAM solver for general purpose molecular dynamics that simulates
|
||||
atoms in arbitrary shaped domains and average atomic/molecular quantities
|
||||
to the mesh to create field data.
|
||||
* New mdEqulibrationFoam solver to equilibrates and/or preconditions
|
||||
molecular dynamics systems.
|
||||
* Demonstration SRFSimpleFoam solver based on simpleFoam that incorporates
|
||||
the SRF extensions (see below) for rotating flows.
|
||||
|
||||
<p>The 64bit binary packs of the OpenFOAM release were compiled on a machine
|
||||
running SuSE GNU/Linux version 10.3 and the 32bit on a machine running Ubuntu
|
||||
GNU/Linux version 7.1 and also tested on Ubuntu 8.04. We recommend that
|
||||
users run OpenFOAM on one of these or a similar recent version of GNU/Linux.
|
||||
This release has also been successfully compiled and tested on older GNU/Linux
|
||||
releases but this requires the installation of Qt 4.3.? for ParaView-3 to run.
|
||||
</p>
|
||||
</div>
|
||||
5 Automatic mesher
|
||||
|
||||
</div>
|
||||
New snappyHexMesh utility that generates split-hex meshes automatically from
|
||||
triangulated (STL) surface geometries. The mesh approximately conforms to the
|
||||
surface by iteratively refining a starting mesh and morphing the resulting
|
||||
split-hex mesh to the surface. An optional phase will shrink back the
|
||||
resulting mesh and insert cell layers. It has a flexible specification of mesh
|
||||
refinement level and robust surface handling with a pre-specified final mesh
|
||||
quality. It runs in parallel with a load balancing step every iteration.
|
||||
|
||||
<div id="outline-container-3" class="outline-2">
|
||||
<h2 id="sec-3">3 C++ Compiler version</h2>
|
||||
<div id="text-3">
|
||||
6 Developments to utilities
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Released compiled with GCC 4.3.1, the latest version.
|
||||
</li>
|
||||
<li>
|
||||
Built in support for the Intel C++ 10.? compiler (untested).
|
||||
</li>
|
||||
<li>
|
||||
The choice of the compiler is controlled by the setting of the $WM_COMPILER
|
||||
and $WM_COMPILER_ARCH environment variables in the OpenFOAM-1.5/etc/bashrc
|
||||
(or cshrc) file.
|
||||
</li>
|
||||
<li>
|
||||
The location of the installation of the compiler is controlled by the
|
||||
$WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh
|
||||
(or settings.csh) file.
|
||||
* New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D
|
||||
meshes are described by faces with 2 points, so can be used in combination
|
||||
with 2D meshes converted with ccm26ToFoam.
|
||||
* New couplePatches functionality integrated into createPatch, which
|
||||
optionally synchronises ("couples") points and faces of coupled (cyclic,
|
||||
processor) patches.
|
||||
* New applyBoundaryLayer pre-processing utility to apply 1/7th power-law
|
||||
boundary layers at walls, starting from uniform or potential flow
|
||||
solutions.
|
||||
* New execFlowFunctionObjects utility executes functionObjects as a
|
||||
post-processing activity, e.g. probes, sampling, force calculation.
|
||||
* New changeDictionary utility makes batch changes to OpenFOAM input files,
|
||||
e.g. to change boundary conditions of field files.
|
||||
* New foamCalc utility, a generic post-processing field calculator tool
|
||||
* New molConfig pre-processing utility for molecular dynamics cases. Fills
|
||||
zones of a mesh with single crystal lattices of specified structure,
|
||||
density, orientation, alignment and temperature.
|
||||
* Extended splitMeshRegions utility to split multi-zone meshes, e.g. defined
|
||||
through cellZones, into separate meshes.
|
||||
* Extended the foamToVTK, decomposePar, reconstructPar and mapFields
|
||||
utilities to include support for multiple particle clouds in parallel
|
||||
processing.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
7 Migration from ParaView 2.4 to ParaView 3.x
|
||||
|
||||
</div>
|
||||
* Rewritten OpenFOAM Reader Module for version 3, a major redesign of
|
||||
ParaView.
|
||||
* New features include viewing patch names, reading of Lagrangian data,
|
||||
handling of cell, face and point sets, multiple views.
|
||||
|
||||
<div id="outline-container-4" class="outline-2">
|
||||
<h2 id="sec-4">4 Developments to solvers (applications)</h2>
|
||||
<div id="text-4">
|
||||
8 Model development
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
New rhoCentralFoam solver for high-speed, viscous, compressible flows using
|
||||
non-oscillatory, central-upwind schemes.
|
||||
</li>
|
||||
<li>
|
||||
New interDyMFoam solver for 2 incompressible, isothermal, immiscible fluids
|
||||
using a VoF phase-fraction based interface capturing approach, with optional
|
||||
mesh motion and mesh topology changes including adaptive mesh
|
||||
(un)refinement. Useful for simulations such as tank filling, sloshing ---
|
||||
using solid body motion e.g. SDA or SKA (6DoF) — and slamming (using the
|
||||
mesh motion solver) and other large-scale applications that benefit from the
|
||||
efficiency gain of adaptive mesh (un)refinement of the interface.
|
||||
</li>
|
||||
<li>
|
||||
New compressibleInterFoam solver for 2 compressible, isothermal, immiscible
|
||||
fluids using a volume of fluid (VoF) phase-fraction approach for
|
||||
interface-capturing. The momentum and other fluid properties are of the
|
||||
"mixture" and a single momentum equation is solved. Turbulence is modelled
|
||||
using a run-time selectable incompressible LES model.
|
||||
</li>
|
||||
<li>
|
||||
New interPhaseChangeFoam solver for 2 incompressible, isothermal, immiscible
|
||||
fluids with phase-change, e.g. cavitation. Uses VoF interface capturing,
|
||||
with momentum and other fluid properties described for the ``mixture'' and a
|
||||
single momentum equation is solved. The set of phase-change models provided
|
||||
are designed to simulate cavitation but other mechanisms of phase-change are
|
||||
supported within this solver framework.
|
||||
</li>
|
||||
<li>
|
||||
New rasCavitatingFoam solver for transient cavitation using a barotropic
|
||||
compressibility model, with RAS turbulence.
|
||||
</li>
|
||||
<li>
|
||||
New lesCavitatingFoam solver for transient cavitation using a barotropic
|
||||
compressibility model, with LES turbulence.
|
||||
</li>
|
||||
<li>
|
||||
New chtMultiRegionFoam solver that couples conjugate heat transfer in a
|
||||
solid to a buoyancy-driven flow simulation.
|
||||
</li>
|
||||
<li>
|
||||
New PDRFoam solver for compressible premixed/partially-premixed turbulent
|
||||
combustion that includes porosity/distributed resistance (PDR) modelling to
|
||||
handle regions containing solid blockages which cannot be resolved by the
|
||||
mesh. Requires the PDR fields.
|
||||
</li>
|
||||
<li>
|
||||
New lesBuoyantFoam solver for transient, buoyant, turbulent flow of
|
||||
compressible fluids for ventilation and heat-transfer. Turbulence is
|
||||
modelled using a run-time selectable compressible LES model.
|
||||
</li>
|
||||
<li>
|
||||
New rhoPimpleFoam solver for transient, turbulent flow of compressible
|
||||
fluids for ventilation and heat-transfer. Uses the flexible PIMPLE
|
||||
(PISO-SIMPLE) solution for time-resolved and pseudo-transient simulations.
|
||||
</li>
|
||||
<li>
|
||||
New buoyantSimpleRadiationFoam solver for steady-state, buoyant, turbulent
|
||||
flow of compressible fluids with radiation, for ventilation and
|
||||
heat-transfer.
|
||||
</li>
|
||||
<li>
|
||||
New rhoTurbTwinParcelFoam solver for transient for compressible, turbulent
|
||||
flow with two thermo-clouds.
|
||||
</li>
|
||||
<li>
|
||||
New gnemdFOAM solver for general purpose molecular dynamics that simulates
|
||||
atoms in arbitrary shaped domains and average atomic/molecular quantities to
|
||||
the mesh to create field data.
|
||||
</li>
|
||||
<li>
|
||||
New mdEqulibrationFoam solver to equilibrates and/or preconditions molecular
|
||||
dynamics systems.
|
||||
</li>
|
||||
<li>
|
||||
Demonstration SRFSimpleFoam solver based on simpleFoam that incorporates the
|
||||
SRF extensions (see below) for rotating flows.
|
||||
* Overhauled the lagrangian library to support multiple clouds.
|
||||
* New lagrangianIntermediate library incorporating a hierarchy of parcel and
|
||||
cloud types, accommodating kinematic, thermodynamic and reacting
|
||||
applications, including coupling to the new radiation library. Sub-models
|
||||
are added at the relevant level of physics, e.g.:
|
||||
+ kinematic: injection, wall interaction, drag, dispersion;
|
||||
+ thermo: heat transfer;
|
||||
+ reacting: reacting composition, mass transfer, surface reactions.
|
||||
* New single rotating frame of reference (SRF) library for rotating flow
|
||||
applications, e.g. turbo-machinery.
|
||||
* New radiation library including the P1 model and associated Marshak
|
||||
boundary conditions for incident radiation.
|
||||
* New displacementInterpolation motion solver for flexible mesh scaling.
|
||||
* New molecularDynamics Lagrangian library to calculate intermolecular
|
||||
forces between spherically symmetrical monatomic species in arbitrary
|
||||
geometries.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
9 New functionObjects
|
||||
|
||||
</div>
|
||||
To aid common monitoring and post-processing activities.
|
||||
|
||||
<div id="outline-container-5" class="outline-2">
|
||||
<h2 id="sec-5">5 Automatic mesher</h2>
|
||||
<div id="text-5">
|
||||
* forces: calculate the force and moment on a patch or set of patches, e.g.
|
||||
to calculate the lift, drag and moment of an object in the flow.
|
||||
* forceCoeffs: calculate the normalised force and moment on a patch or set
|
||||
of patches, e.g. to calculate the lift, drag and moment coefficients of an
|
||||
object in the flow.
|
||||
* fieldAverage: calculate field arithmetic mean and prime-squared averages
|
||||
for a list of fields.
|
||||
* foamCalcFunctions: calculate field components, div, mag, magGrad or
|
||||
magSqr.
|
||||
|
||||
<p>New snappyHexMesh utility that generates split-hex meshes automatically from
|
||||
triangulated (STL) surface geometries. The mesh approximately conforms to
|
||||
the surface by iteratively refining a starting mesh and morphing the
|
||||
resulting split-hex mesh to the surface. An optional phase will shrink back
|
||||
the resulting mesh and insert cell layers. It has a flexible specification
|
||||
of mesh refinement level and robust surface handling with a pre-specified
|
||||
final mesh quality. It runs in parallel with a load balancing step every
|
||||
iteration.
|
||||
</p>
|
||||
</div>
|
||||
10 Improvements to boundary conditions
|
||||
|
||||
</div>
|
||||
* Generalised jumpCyclic type: cyclic condition with an additional
|
||||
prescribed jump in value.
|
||||
* fan type: specialisation of jumpCyclic, applying a prescribed jump in
|
||||
pressure to simulate a fan within a mesh.
|
||||
* Generalised advective outflow boundary condition based on solving D/Dt
|
||||
(psi, U) = 0 at the boundary.
|
||||
* Additional turbulent flow inlet to specify mixing length and frequency.
|
||||
* Generalisation of time varying set of boundary conditions.
|
||||
|
||||
<div id="outline-container-6" class="outline-2">
|
||||
<h2 id="sec-6">6 Developments to utilities</h2>
|
||||
<div id="text-6">
|
||||
11 Other
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D meshes
|
||||
are described by faces with 2 points, so can be used in combination with 2D
|
||||
meshes converted with ccm26ToFoam.
|
||||
</li>
|
||||
<li>
|
||||
New couplePatches functionality integrated into createPatch, which
|
||||
optionally synchronises ("couples") points and faces of coupled (cyclic,
|
||||
processor) patches.
|
||||
</li>
|
||||
<li>
|
||||
New applyBoundaryLayer pre-processing utility to apply 1/7th power-law
|
||||
boundary layers at walls, starting from uniform or potential flow solutions.
|
||||
</li>
|
||||
<li>
|
||||
New execFlowFunctionObjects utility executes functionObjects as a
|
||||
post-processing activity, e.g. probes, sampling, force calculation.
|
||||
</li>
|
||||
<li>
|
||||
New changeDictionary utility makes batch changes to OpenFOAM input files,
|
||||
e.g. to change boundary conditions of field files.
|
||||
</li>
|
||||
<li>
|
||||
New foamCalc utility, a generic post-processing field calculator tool
|
||||
</li>
|
||||
<li>
|
||||
New molConfig pre-processing utility for molecular dynamics cases. Fills
|
||||
zones of a mesh with single crystal lattices of specified structure,
|
||||
density, orientation, alignment and temperature.
|
||||
</li>
|
||||
<li>
|
||||
Extended splitMeshRegions utility to split multi-zone meshes, e.g. defined
|
||||
through cellZones, into separate meshes.
|
||||
</li>
|
||||
<li>
|
||||
Extended the foamToVTK, decomposePar, reconstructPar and mapFields utilities
|
||||
to include support for multiple particle clouds in parallel processing.
|
||||
* New argument-free command execution, e.g typing "icoFoam" without root and
|
||||
case directory arguments.
|
||||
* Extended time command line options.
|
||||
* Many enhancements to dictionary including macro substitution, optional
|
||||
merging and default/overwrite behaviour, enhanced "#include" file handling
|
||||
and the framework to support function evaluation.
|
||||
* Cross-links between applications and Doxygen documentation with the "-doc"
|
||||
argument.
|
||||
* Non-blocking, non-buffered, parallel transfers with potential scaling
|
||||
benefits for larger number of processors.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
Date: 26 August 2008
|
||||
|
||||
</div>
|
||||
HTML generated by org-mode 6.06b in emacs 23
|
||||
|
||||
<div id="outline-container-7" class="outline-2">
|
||||
<h2 id="sec-7">7 Migration from ParaView 2.4 to ParaView 3.x</h2>
|
||||
<div id="text-7">
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Rewritten OpenFOAM Reader Module for version 3, a major redesign of
|
||||
ParaView.
|
||||
</li>
|
||||
<li>
|
||||
New features include viewing patch names, reading of Lagrangian data,
|
||||
handling of cell, face and point sets, multiple views.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-8" class="outline-2">
|
||||
<h2 id="sec-8">8 Model development</h2>
|
||||
<div id="text-8">
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Overhauled the lagrangian library to support multiple clouds.
|
||||
</li>
|
||||
<li>
|
||||
New lagrangianIntermediate library incorporating a hierarchy of parcel and
|
||||
cloud types, accommodating kinematic, thermodynamic and reacting
|
||||
applications, including coupling to the new radiation library. Sub-models
|
||||
are added at the relevant level of physics, e.g.:
|
||||
<ul>
|
||||
<li>
|
||||
kinematic: injection, wall interaction, drag, dispersion;
|
||||
</li>
|
||||
<li>
|
||||
thermo: heat transfer;
|
||||
</li>
|
||||
<li>
|
||||
reacting: reacting composition, mass transfer, surface reactions.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
New single rotating frame of reference (SRF) library for rotating flow
|
||||
applications, e.g. turbo-machinery.
|
||||
</li>
|
||||
<li>
|
||||
New radiation library including the P1 model and associated Marshak boundary
|
||||
conditions for incident radiation.
|
||||
</li>
|
||||
<li>
|
||||
New displacementInterpolation motion solver for flexible mesh scaling.
|
||||
</li>
|
||||
<li>
|
||||
New molecularDynamics Lagrangian library to calculate intermolecular forces
|
||||
between spherically symmetrical monatomic species in arbitrary geometries.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-9" class="outline-2">
|
||||
<h2 id="sec-9">9 New functionObjects</h2>
|
||||
<div id="text-9">
|
||||
|
||||
<p>To aid common monitoring and post-processing activities.
|
||||
</p><ul>
|
||||
<li>
|
||||
forces: calculate the force and moment on a patch or set of patches, e.g. to
|
||||
calculate the lift, drag and moment of an object in the flow.
|
||||
</li>
|
||||
<li>
|
||||
forceCoeffs: calculate the normalised force and moment on a patch or set of
|
||||
patches, e.g. to calculate the lift, drag and moment coefficients of an
|
||||
object in the flow.
|
||||
</li>
|
||||
<li>
|
||||
fieldAverage: calculate field arithmetic mean and prime-squared averages for
|
||||
a list of fields.
|
||||
</li>
|
||||
<li>
|
||||
foamCalcFunctions: calculate field components, div, mag, magGrad or magSqr.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-10" class="outline-2">
|
||||
<h2 id="sec-10">10 Improvements to boundary conditions</h2>
|
||||
<div id="text-10">
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Generalised jumpCyclic type: cyclic condition with an additional prescribed
|
||||
jump in value.
|
||||
</li>
|
||||
<li>
|
||||
fan type: specialisation of jumpCyclic, applying a prescribed jump in
|
||||
pressure to simulate a fan within a mesh.
|
||||
</li>
|
||||
<li>
|
||||
Generalised advective outflow boundary condition based on solving D/Dt(psi,
|
||||
U) = 0 at the boundary.
|
||||
</li>
|
||||
<li>
|
||||
Additional turbulent flow inlet to specify mixing length and frequency.
|
||||
</li>
|
||||
<li>
|
||||
Generalisation of time varying set of boundary conditions.
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="outline-container-11" class="outline-2">
|
||||
<h2 id="sec-11">11 Other</h2>
|
||||
<div id="text-11">
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
New argument-free command execution, e.g typing "icoFoam" without root and
|
||||
case directory arguments.
|
||||
</li>
|
||||
<li>
|
||||
Extended time command line options.
|
||||
</li>
|
||||
<li>
|
||||
Many enhancements to dictionary including macro substitution, optional
|
||||
merging and default/overwrite behaviour, enhanced "#include" file handling
|
||||
and the framework to support function evaluation.
|
||||
</li>
|
||||
<li>
|
||||
Cross-links between applications and Doxygen documentation with the "-doc"
|
||||
argument.
|
||||
</li>
|
||||
<li>
|
||||
Non-blocking, non-buffered, parallel transfers with potential scaling
|
||||
benefits for larger number of processors.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="postamble"><p class="date"> Date: 14 July 2008</p>
|
||||
<p>HTML generated by org-mode 6.05a in emacs 23<p>
|
||||
</div></body>
|
||||
</html>
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
kinematicParcelFoam.C
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/kinematicParcelFoam
|
||||
@ -0,0 +1,21 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/intermediate/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/combustion/lnInclude \
|
||||
-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \
|
||||
-I$(LIB_SRC)/turbulenceModels/RAS
|
||||
|
||||
EXE_LIBS = \
|
||||
-llagrangian \
|
||||
-llagrangianIntermediate \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools \
|
||||
-lthermophysicalFunctions \
|
||||
-lbasicThermophysicalModels \
|
||||
/* -lcombustionThermophysicalModels */ \
|
||||
-lspecie \
|
||||
-lradiation \
|
||||
-lcompressibleRASModels
|
||||
@ -0,0 +1,68 @@
|
||||
Info<< "Reading thermophysical properties\n" << endl;
|
||||
|
||||
autoPtr<basicThermo> thermo
|
||||
(
|
||||
basicThermo::New(mesh)
|
||||
);
|
||||
|
||||
volScalarField rho
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
thermo->rho()
|
||||
);
|
||||
|
||||
Info<< "\nReading field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
# include "compressibleCreatePhi.H"
|
||||
|
||||
Info<< "Creating turbulence model\n" << endl;
|
||||
autoPtr<compressible::RASModel> turbulence
|
||||
(
|
||||
compressible::RASModel::New
|
||||
(
|
||||
rho,
|
||||
U,
|
||||
phi,
|
||||
thermo()
|
||||
)
|
||||
);
|
||||
|
||||
pointMesh pMesh(mesh);
|
||||
volPointInterpolation vpi(mesh, pMesh);
|
||||
|
||||
word kinematicCloudName("kinematicCloud");
|
||||
|
||||
if (args.options().found("cloudName"))
|
||||
{
|
||||
kinematicCloudName = args.options()["cloudName"];
|
||||
}
|
||||
|
||||
Info<< "Constructing kinematicCloud " << kinematicCloudName << endl;
|
||||
basicKinematicCloud kinematicCloud
|
||||
(
|
||||
kinematicCloudName,
|
||||
vpi,
|
||||
rho,
|
||||
U,
|
||||
thermo().mu(),
|
||||
g
|
||||
);
|
||||
@ -0,0 +1,78 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Application
|
||||
kinematicParcelFoam
|
||||
|
||||
Description
|
||||
Transient solver a single kinematicCloud.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "basicThermo.H"
|
||||
#include "compressible/RASModel/RASModel.H"
|
||||
#include "basicKinematicCloud.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList::validOptions.insert("cloudName", "cloud name");
|
||||
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
#include "createMesh.H"
|
||||
#include "readEnvironmentalProperties.H"
|
||||
#include "createFields.H"
|
||||
#include "compressibleCourantNo.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
runTime++;
|
||||
|
||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||
|
||||
Info<< "Evolving " << kinematicCloud.name() << endl;
|
||||
kinematicCloud.evolve();
|
||||
kinematicCloud.info();
|
||||
|
||||
runTime.write();
|
||||
|
||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||
<< nl << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -16,12 +16,13 @@ if (transonic)
|
||||
|
||||
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
|
||||
{
|
||||
fvScalarMatrix pEqn0
|
||||
fvScalarMatrix pEqn
|
||||
(
|
||||
fvm::div(phid, p)
|
||||
- fvm::laplacian(rho*rUA, p)
|
||||
);
|
||||
fvScalarMatrix pEqn = pEqn0;
|
||||
|
||||
// Relax the pressure equation to ensure diagonal-dominance
|
||||
pEqn.relax(mesh.relaxationFactor("pEqn"));
|
||||
|
||||
pEqn.setReference(pRefCell, pRefValue);
|
||||
@ -39,14 +40,13 @@ if (transonic)
|
||||
|
||||
if (nonOrth == nNonOrthCorr)
|
||||
{
|
||||
phi == pEqn0.flux();
|
||||
phi == pEqn.flux();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
phi = fvc::interpolate(rho)*(fvc::interpolate(U) & mesh.Sf());
|
||||
//phi = fvc::interpolate(rho*U) & mesh.Sf();
|
||||
closedVolume = adjustPhi(phi, U, p);
|
||||
|
||||
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
|
||||
@ -58,7 +58,7 @@ else
|
||||
|
||||
pEqn.setReference(pRefCell, pRefValue);
|
||||
|
||||
// retain the residual from the first iteration
|
||||
// Retain the residual from the first iteration
|
||||
if (nonOrth == 0)
|
||||
{
|
||||
eqnResidual = pEqn.solve().initialResidual();
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
EXE_INC = \
|
||||
-I../rasInterFoam \
|
||||
-I../interFoam \
|
||||
-I$(LIB_SRC)/transportModels \
|
||||
-I$(LIB_SRC)/transportModels/incompressible/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
surfaceScalarField muEff
|
||||
(
|
||||
"muEff",
|
||||
twoPhaseProperties.muf()
|
||||
+ fvc::interpolate(rho*turbulence->nut())
|
||||
);
|
||||
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
fvm::ddt(rho, U)
|
||||
+ fvm::div(rhoPhi, U)
|
||||
- fvm::laplacian(muEff, U)
|
||||
- (fvc::grad(U) & fvc::grad(muEff))
|
||||
//- fvc::div(muEff*(fvc::interpolate(dev(fvc::grad(U))) & mesh.Sf()))
|
||||
);
|
||||
|
||||
UEqn.relax();
|
||||
|
||||
if (momentumPredictor)
|
||||
{
|
||||
solve
|
||||
(
|
||||
UEqn
|
||||
==
|
||||
fvc::reconstruct
|
||||
(
|
||||
(
|
||||
fvc::interpolate(interface.sigmaK())*fvc::snGrad(gamma)
|
||||
- ghf*fvc::snGrad(rho)
|
||||
- fvc::snGrad(pd)
|
||||
)*mesh.magSf()
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1,35 +0,0 @@
|
||||
{
|
||||
word gammaScheme("div(phi,gamma)");
|
||||
word gammarScheme("div(phirb,gamma)");
|
||||
|
||||
surfaceScalarField phic = mag(phi/mesh.magSf());
|
||||
phic = min(interface.cGamma()*phic, max(phic));
|
||||
surfaceScalarField phir = phic*interface.nHatf();
|
||||
|
||||
for (int gCorr=0; gCorr<nGammaCorr; gCorr++)
|
||||
{
|
||||
surfaceScalarField phiGamma =
|
||||
fvc::flux
|
||||
(
|
||||
phi,
|
||||
gamma,
|
||||
gammaScheme
|
||||
)
|
||||
+ fvc::flux
|
||||
(
|
||||
-fvc::flux(-phir, scalar(1) - gamma, gammarScheme),
|
||||
gamma,
|
||||
gammarScheme
|
||||
);
|
||||
|
||||
MULES::explicitSolve(gamma, phi, phiGamma, 1, 0);
|
||||
|
||||
rhoPhi = phiGamma*(rho1 - rho2) + phi*rho2;
|
||||
}
|
||||
|
||||
Info<< "Liquid phase volume fraction = "
|
||||
<< gamma.weightedAverage(mesh.V()).value()
|
||||
<< " Min(gamma) = " << min(gamma).value()
|
||||
<< " Max(gamma) = " << max(gamma).value()
|
||||
<< endl;
|
||||
}
|
||||
@ -1,35 +0,0 @@
|
||||
label nGammaCorr
|
||||
(
|
||||
readLabel(piso.lookup("nGammaCorr"))
|
||||
);
|
||||
|
||||
label nGammaSubCycles
|
||||
(
|
||||
readLabel(piso.lookup("nGammaSubCycles"))
|
||||
);
|
||||
|
||||
if (nGammaSubCycles > 1)
|
||||
{
|
||||
dimensionedScalar totalDeltaT = runTime.deltaT();
|
||||
surfaceScalarField rhoPhiSum = 0.0*rhoPhi;
|
||||
|
||||
for
|
||||
(
|
||||
subCycle<volScalarField> gammaSubCycle(gamma, nGammaSubCycles);
|
||||
!(++gammaSubCycle).end();
|
||||
)
|
||||
{
|
||||
# include "gammaEqn.H"
|
||||
rhoPhiSum += (runTime.deltaT()/totalDeltaT)*rhoPhi;
|
||||
}
|
||||
|
||||
rhoPhi = rhoPhiSum;
|
||||
}
|
||||
else
|
||||
{
|
||||
# include "gammaEqn.H"
|
||||
}
|
||||
|
||||
interface.correct();
|
||||
|
||||
rho == gamma*rho1 + (scalar(1) - gamma)*rho2;
|
||||
@ -41,7 +41,6 @@ Description
|
||||
#include "twoPhaseMixture.H"
|
||||
#include "incompressible/RASModel/RASModel.H"
|
||||
#include "probes.H"
|
||||
#include "EulerDdtScheme.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -504,7 +504,7 @@ int main(int argc, char *argv[])
|
||||
!bbsTargetSet[procITarget]
|
||||
|| (
|
||||
bbsTargetSet[procITarget]
|
||||
&& bbsTarget[procITarget].intersects(bbSource)
|
||||
&& bbsTarget[procITarget].overlaps(bbSource)
|
||||
)
|
||||
)
|
||||
{
|
||||
@ -533,7 +533,7 @@ int main(int argc, char *argv[])
|
||||
bbsTarget[procITarget] = meshTarget.bounds();
|
||||
bbsTargetSet[procITarget] = true;
|
||||
|
||||
if (bbsTarget[procITarget].intersects(bbSource))
|
||||
if (bbsTarget[procITarget].overlaps(bbSource))
|
||||
{
|
||||
if (consistent)
|
||||
{
|
||||
|
||||
@ -86,28 +86,7 @@ void Foam::SortableList<Type>::sort()
|
||||
indices_[i] = i;
|
||||
}
|
||||
|
||||
Foam::sort(indices_, less(*this));
|
||||
|
||||
List<Type> tmpValues(this->size());
|
||||
|
||||
forAll(indices_, i)
|
||||
{
|
||||
tmpValues[i] = this->operator[](indices_[i]);
|
||||
}
|
||||
|
||||
List<Type>::transfer(tmpValues);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <class Type>
|
||||
void Foam::SortableList<Type>::stableSort()
|
||||
{
|
||||
forAll(indices_, i)
|
||||
{
|
||||
indices_[i] = i;
|
||||
}
|
||||
|
||||
//Foam::sort(indices_, less(*this));
|
||||
Foam::stableSort(indices_, less(*this));
|
||||
|
||||
List<Type> tmpValues(this->size());
|
||||
|
||||
@ -109,12 +109,9 @@ public:
|
||||
//- Size the list. If grow can cause undefined indices (until next sort)
|
||||
void setSize(const label);
|
||||
|
||||
//- Sort the list (if changed after construction time)
|
||||
//- (stable) sort the list (if changed after construction time)
|
||||
void sort();
|
||||
|
||||
//- Sort the list (if changed after construction time)
|
||||
void stableSort();
|
||||
|
||||
|
||||
// Member Operators
|
||||
|
||||
|
||||
@ -118,7 +118,7 @@ public:
|
||||
// Query
|
||||
|
||||
//- Intersects other boundingbox?
|
||||
bool intersects(const boundBox& bb) const
|
||||
bool overlaps(const boundBox& bb) const
|
||||
{
|
||||
if
|
||||
(
|
||||
|
||||
@ -31,7 +31,11 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::mapDistribute::calcSchedule() const
|
||||
Foam::List<Foam::labelPair> Foam::mapDistribute::schedule
|
||||
(
|
||||
const labelListList& subMap,
|
||||
const labelListList& constructMap
|
||||
)
|
||||
{
|
||||
// Communications: send and receive processor
|
||||
List<labelPair> allComms;
|
||||
@ -40,16 +44,16 @@ void Foam::mapDistribute::calcSchedule() const
|
||||
HashSet<labelPair, labelPair::Hash<> > commsSet(Pstream::nProcs());
|
||||
|
||||
// Find what communication is required
|
||||
forAll(subMap_, procI)
|
||||
forAll(subMap, procI)
|
||||
{
|
||||
if (procI != Pstream::myProcNo())
|
||||
{
|
||||
if (subMap_[procI].size() > 0)
|
||||
if (subMap[procI].size() > 0)
|
||||
{
|
||||
// I need to send to procI
|
||||
commsSet.insert(labelPair(Pstream::myProcNo(), procI));
|
||||
}
|
||||
if (constructMap_[procI].size() > 0)
|
||||
if (constructMap[procI].size() > 0)
|
||||
{
|
||||
// I need to receive from procI
|
||||
commsSet.insert(labelPair(procI, Pstream::myProcNo()));
|
||||
@ -120,13 +124,7 @@ void Foam::mapDistribute::calcSchedule() const
|
||||
);
|
||||
|
||||
// Processors involved in my schedule
|
||||
schedulePtr_.reset
|
||||
(
|
||||
new List<labelPair>
|
||||
(
|
||||
IndirectList<labelPair>(allComms, mySchedule)
|
||||
)
|
||||
);
|
||||
return IndirectList<labelPair>(allComms, mySchedule);
|
||||
|
||||
|
||||
//if (debug)
|
||||
@ -152,6 +150,22 @@ void Foam::mapDistribute::calcSchedule() const
|
||||
}
|
||||
|
||||
|
||||
const Foam::List<Foam::labelPair>& Foam::mapDistribute::schedule() const
|
||||
{
|
||||
if (!schedulePtr_.valid())
|
||||
{
|
||||
schedulePtr_.reset
|
||||
(
|
||||
new List<labelPair>
|
||||
(
|
||||
schedule(subMap_, constructMap_)
|
||||
)
|
||||
);
|
||||
}
|
||||
return schedulePtr_();
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
//- Construct from components
|
||||
@ -257,13 +271,4 @@ Foam::mapDistribute::mapDistribute
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -36,6 +36,8 @@ Note:
|
||||
Schedule is a list of processor pairs (one send, one receive. One of
|
||||
them will be myself) which forms a scheduled (i.e. non-buffered) exchange.
|
||||
See distribute on how to use it.
|
||||
Note2: number of items send on one processor have to equal the number
|
||||
of items received on the other processor.
|
||||
|
||||
|
||||
SourceFiles
|
||||
@ -80,8 +82,6 @@ class mapDistribute
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
void calcSchedule() const;
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
mapDistribute(const mapDistribute&);
|
||||
|
||||
@ -142,15 +142,15 @@ public:
|
||||
return constructMap_;
|
||||
}
|
||||
|
||||
//- Calculate a schedule. See above.
|
||||
static List<labelPair> schedule
|
||||
(
|
||||
const labelListList& subMap,
|
||||
const labelListList& constructMap
|
||||
);
|
||||
|
||||
//- Return a schedule. Demand driven. See above.
|
||||
const List<labelPair>& schedule() const
|
||||
{
|
||||
if (!schedulePtr_.valid())
|
||||
{
|
||||
calcSchedule();
|
||||
}
|
||||
return schedulePtr_();
|
||||
}
|
||||
const List<labelPair>& schedule() const;
|
||||
|
||||
|
||||
// Other
|
||||
|
||||
@ -48,15 +48,28 @@ void Foam::mapDistribute::distribute
|
||||
// Send sub field to neighbour
|
||||
for (label domain = 0; domain < Pstream::nProcs(); domain++)
|
||||
{
|
||||
if (domain != Pstream::myProcNo())
|
||||
const labelList& map = subMap[domain];
|
||||
|
||||
if (domain != Pstream::myProcNo() && map.size() > 0)
|
||||
{
|
||||
List<T> subField(map.size());
|
||||
forAll(map, i)
|
||||
{
|
||||
subField[i] = field[map[i]];
|
||||
}
|
||||
OPstream toNbr(Pstream::blocking, domain);
|
||||
toNbr << IndirectList<T>(field, subMap[domain])();
|
||||
toNbr << subField;
|
||||
}
|
||||
}
|
||||
|
||||
// Subset myself
|
||||
List<T> subField(IndirectList<T>(field, subMap[Pstream::myProcNo()]));
|
||||
const labelList& mySubMap = subMap[Pstream::myProcNo()];
|
||||
|
||||
List<T> subField(mySubMap.size());
|
||||
forAll(mySubMap, i)
|
||||
{
|
||||
subField[i] = field[mySubMap[i]];
|
||||
}
|
||||
|
||||
// Receive sub field from myself (subField)
|
||||
const labelList& map = constructMap[Pstream::myProcNo()];
|
||||
@ -71,7 +84,11 @@ void Foam::mapDistribute::distribute
|
||||
// Receive sub field from neighbour
|
||||
for (label domain = 0; domain < Pstream::nProcs(); domain++)
|
||||
{
|
||||
if (domain != Pstream::myProcNo())
|
||||
if
|
||||
(
|
||||
domain != Pstream::myProcNo()
|
||||
&& constructMap[domain].size() > 0
|
||||
)
|
||||
{
|
||||
IPstream fromNbr(Pstream::blocking, domain);
|
||||
List<T> subField(fromNbr);
|
||||
@ -93,7 +110,13 @@ void Foam::mapDistribute::distribute
|
||||
List<T> newField(constructSize);
|
||||
|
||||
// Subset myself
|
||||
List<T> subField(IndirectList<T>(field, subMap[Pstream::myProcNo()]));
|
||||
const labelList& mySubMap = subMap[Pstream::myProcNo()];
|
||||
|
||||
List<T> subField(mySubMap.size());
|
||||
forAll(mySubMap, i)
|
||||
{
|
||||
subField[i] = field[mySubMap[i]];
|
||||
}
|
||||
|
||||
// Receive sub field from myself (subField)
|
||||
const labelList& map = constructMap[Pstream::myProcNo()];
|
||||
@ -112,8 +135,16 @@ void Foam::mapDistribute::distribute
|
||||
if (Pstream::myProcNo() == sendProc)
|
||||
{
|
||||
// I am sender. Send to recvProc.
|
||||
const labelList& map = subMap[recvProc];
|
||||
|
||||
List<T> subField(map.size());
|
||||
forAll(map, i)
|
||||
{
|
||||
subField[i] = field[map[i]];
|
||||
}
|
||||
|
||||
OPstream toNbr(Pstream::scheduled, recvProc);
|
||||
toNbr << IndirectList<T>(field, subMap[recvProc])();
|
||||
toNbr << subField;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -136,7 +167,13 @@ void Foam::mapDistribute::distribute
|
||||
List<T> newField(constructSize);
|
||||
|
||||
// Subset myself
|
||||
List<T> subField(IndirectList<T>(field, subMap[Pstream::myProcNo()]));
|
||||
const labelList& mySubMap = subMap[Pstream::myProcNo()];
|
||||
|
||||
List<T> subField(mySubMap.size());
|
||||
forAll(mySubMap, i)
|
||||
{
|
||||
subField[i] = field[mySubMap[i]];
|
||||
}
|
||||
|
||||
// Receive sub field from myself (subField)
|
||||
const labelList& map = constructMap[Pstream::myProcNo()];
|
||||
@ -149,10 +186,19 @@ void Foam::mapDistribute::distribute
|
||||
// Send sub field to neighbour
|
||||
for (label domain = 0; domain < Pstream::nProcs(); domain++)
|
||||
{
|
||||
if (domain != Pstream::myProcNo())
|
||||
const labelList& map = subMap[domain];
|
||||
|
||||
if (domain != Pstream::myProcNo() && map.size() > 0)
|
||||
{
|
||||
|
||||
List<T> subField(map.size());
|
||||
forAll(map, i)
|
||||
{
|
||||
subField[i] = field[map[i]];
|
||||
}
|
||||
|
||||
OPstream toNbr(Pstream::nonBlocking, domain);
|
||||
toNbr << IndirectList<T>(field, subMap[domain])();
|
||||
toNbr << subField;
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,13 +206,13 @@ void Foam::mapDistribute::distribute
|
||||
// Receive sub field from neighbour
|
||||
for (label domain = 0; domain < Pstream::nProcs(); domain++)
|
||||
{
|
||||
if (domain != Pstream::myProcNo())
|
||||
const labelList& map = constructMap[domain];
|
||||
|
||||
if (domain != Pstream::myProcNo() && map.size() > 0)
|
||||
{
|
||||
IPstream fromNbr(Pstream::nonBlocking, domain);
|
||||
List<T> subField(fromNbr);
|
||||
|
||||
const labelList& map = constructMap[domain];
|
||||
|
||||
forAll(map, i)
|
||||
{
|
||||
newField[map[i]] = subField[i];
|
||||
|
||||
@ -25,7 +25,6 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "coupledPolyPatch.H"
|
||||
#include "SortableList.H"
|
||||
#include "ListOps.H"
|
||||
#include "transform.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
@ -68,6 +68,42 @@ PrimitivePatch<Face, FaceList, PointField, PointType>::PrimitivePatch
|
||||
{}
|
||||
|
||||
|
||||
// Construct from components
|
||||
template
|
||||
<
|
||||
class Face,
|
||||
template<class> class FaceList,
|
||||
class PointField,
|
||||
class PointType
|
||||
>
|
||||
PrimitivePatch<Face, FaceList, PointField, PointType>::PrimitivePatch
|
||||
(
|
||||
FaceList<Face>& faces,
|
||||
Field<PointType>& points,
|
||||
const bool reUse
|
||||
)
|
||||
:
|
||||
FaceList<Face>(faces, reUse),
|
||||
points_(points, reUse),
|
||||
edgesPtr_(NULL),
|
||||
nInternalEdges_(-1),
|
||||
boundaryPointsPtr_(NULL),
|
||||
faceFacesPtr_(NULL),
|
||||
edgeFacesPtr_(NULL),
|
||||
faceEdgesPtr_(NULL),
|
||||
pointEdgesPtr_(NULL),
|
||||
pointFacesPtr_(NULL),
|
||||
localFacesPtr_(NULL),
|
||||
meshPointsPtr_(NULL),
|
||||
meshPointMapPtr_(NULL),
|
||||
edgeLoopsPtr_(NULL),
|
||||
localPointsPtr_(NULL),
|
||||
localPointOrderPtr_(NULL),
|
||||
faceNormalsPtr_(NULL),
|
||||
pointNormalsPtr_(NULL)
|
||||
{}
|
||||
|
||||
|
||||
// Construct as copy
|
||||
template
|
||||
<
|
||||
|
||||
@ -235,6 +235,14 @@ public:
|
||||
const Field<PointType>& points
|
||||
);
|
||||
|
||||
//- Construct from components, reuse storage
|
||||
PrimitivePatch
|
||||
(
|
||||
FaceList<Face>& faces,
|
||||
Field<PointType>& points,
|
||||
const bool reUse
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
PrimitivePatch
|
||||
(
|
||||
|
||||
@ -467,7 +467,8 @@ const edgeList& primitiveMesh::edges() const
|
||||
{
|
||||
if (!edgesPtr_)
|
||||
{
|
||||
calcEdges(true);
|
||||
//calcEdges(true);
|
||||
calcEdges(false);
|
||||
}
|
||||
|
||||
return *edgesPtr_;
|
||||
@ -477,10 +478,8 @@ const labelListList& primitiveMesh::pointEdges() const
|
||||
{
|
||||
if (!pePtr_)
|
||||
{
|
||||
//// Invert edges
|
||||
//pePtr_ = new labelListList(nPoints());
|
||||
//invertManyToMany(nPoints(), edges(), *pePtr_);
|
||||
calcEdges(true);
|
||||
//calcEdges(true);
|
||||
calcEdges(false);
|
||||
}
|
||||
|
||||
return *pePtr_;
|
||||
@ -491,12 +490,53 @@ const labelListList& primitiveMesh::faceEdges() const
|
||||
{
|
||||
if (!fePtr_)
|
||||
{
|
||||
calcEdges(true);
|
||||
if (debug)
|
||||
{
|
||||
Pout<< "primitiveMesh::faceEdges() : "
|
||||
<< "calculating faceEdges" << endl;
|
||||
}
|
||||
|
||||
//calcEdges(true);
|
||||
const faceList& fcs = faces();
|
||||
const labelListList& pe = pointEdges();
|
||||
const edgeList& es = edges();
|
||||
|
||||
fePtr_ = new labelListList(fcs.size());
|
||||
labelListList& faceEdges = *fePtr_;
|
||||
|
||||
forAll(fcs, faceI)
|
||||
{
|
||||
const face& f = fcs[faceI];
|
||||
|
||||
labelList& fEdges = faceEdges[faceI];
|
||||
fEdges.setSize(f.size());
|
||||
|
||||
forAll(f, fp)
|
||||
{
|
||||
label pointI = f[fp];
|
||||
label nextPointI = f[f.fcIndex(fp)];
|
||||
|
||||
// Find edge between pointI, nextPontI
|
||||
const labelList& pEdges = pe[pointI];
|
||||
|
||||
forAll(pEdges, i)
|
||||
{
|
||||
label edgeI = pEdges[i];
|
||||
|
||||
if (es[edgeI].otherVertex(pointI) == nextPointI)
|
||||
{
|
||||
fEdges[fp] = edgeI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return *fePtr_;
|
||||
}
|
||||
|
||||
|
||||
void primitiveMesh::clearOutEdges()
|
||||
{
|
||||
deleteDemandDrivenData(edgesPtr_);
|
||||
|
||||
@ -41,8 +41,7 @@ extern "C"
|
||||
# include "parmetis.h"
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
@ -57,6 +56,8 @@ namespace Foam
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
//- Does prevention of 0 cell domains and calls parmetis.
|
||||
Foam::label Foam::parMetisDecomp::decompose
|
||||
(
|
||||
@ -76,6 +77,16 @@ Foam::label Foam::parMetisDecomp::decompose
|
||||
// Number of dimensions
|
||||
int nDims = 3;
|
||||
|
||||
|
||||
if (cellCentres.size() != xadj.size()-1)
|
||||
{
|
||||
FatalErrorIn("parMetisDecomp::decompose(..)")
|
||||
<< "cellCentres:" << cellCentres.size()
|
||||
<< " xadj:" << xadj.size()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
|
||||
// Get number of cells on all processors
|
||||
List<int> nLocalCells(Pstream::nProcs());
|
||||
nLocalCells[Pstream::myProcNo()] = xadj.size()-1;
|
||||
@ -106,12 +117,12 @@ Foam::label Foam::parMetisDecomp::decompose
|
||||
// Make sure every domain has at least one cell
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// (Metis falls over with zero sized domains)
|
||||
// Trickle cells from processors that have them down to those that
|
||||
// Trickle cells from processors that have them up to those that
|
||||
// don't.
|
||||
|
||||
|
||||
// Number of cells to send down (is same as number of cells next processor
|
||||
// has to receive)
|
||||
// Number of cells to send to the next processor
|
||||
// (is same as number of cells next processor has to receive)
|
||||
List<int> nSendCells(Pstream::nProcs(), 0);
|
||||
|
||||
for (label procI = nLocalCells.size()-1; procI >=1; procI--)
|
||||
@ -135,6 +146,15 @@ Foam::label Foam::parMetisDecomp::decompose
|
||||
Field<int> prevCellWeights(fromPrevProc);
|
||||
Field<int> prevFaceWeights(fromPrevProc);
|
||||
|
||||
if (prevXadj.size() != nSendCells[Pstream::myProcNo()-1])
|
||||
{
|
||||
FatalErrorIn("parMetisDecomp::decompose(..)")
|
||||
<< "Expected from processor " << Pstream::myProcNo()-1
|
||||
<< " connectivity for " << nSendCells[Pstream::myProcNo()-1]
|
||||
<< " nCells but only received " << prevXadj.size()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Insert adjncy
|
||||
prepend(prevAdjncy, adjncy);
|
||||
// Adapt offsets and prepend xadj
|
||||
@ -222,6 +242,14 @@ Foam::label Foam::parMetisDecomp::decompose
|
||||
}
|
||||
|
||||
|
||||
if (nLocalCells[Pstream::myProcNo()] != (xadj.size()-1))
|
||||
{
|
||||
FatalErrorIn("parMetisDecomp::decompose(..)")
|
||||
<< "Have connectivity for " << xadj.size()-1
|
||||
<< " cells but nLocalCells:" << nLocalCells[Pstream::myProcNo()]
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Weight info
|
||||
int wgtFlag = 0;
|
||||
int* vwgtPtr = NULL;
|
||||
@ -292,6 +320,15 @@ Foam::label Foam::parMetisDecomp::decompose
|
||||
|
||||
List<int> nextFinalDecomp(fromNextProc);
|
||||
|
||||
if (nextFinalDecomp.size() != nSendCells[Pstream::myProcNo()])
|
||||
{
|
||||
FatalErrorIn("parMetisDecomp::decompose(..)")
|
||||
<< "Expected from processor " << Pstream::myProcNo()+1
|
||||
<< " decomposition for " << nSendCells[Pstream::myProcNo()]
|
||||
<< " nCells but only received " << nextFinalDecomp.size()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
append(nextFinalDecomp, finalDecomp);
|
||||
}
|
||||
|
||||
|
||||
@ -24,7 +24,6 @@ License
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "SortableList.H"
|
||||
#include "dynamicRefineFvMesh.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "volFields.H"
|
||||
@ -32,7 +31,6 @@ License
|
||||
#include "surfaceFields.H"
|
||||
#include "fvCFD.H"
|
||||
#include "syncTools.H"
|
||||
#include "ListListOps.H"
|
||||
#include "pointFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -399,7 +399,7 @@ bool Foam::octreeDataFaceList::overlaps
|
||||
const treeBoundBox& sampleBb
|
||||
) const
|
||||
{
|
||||
return sampleBb.intersects(allBb_[index]);
|
||||
return sampleBb.overlaps(allBb_[index]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -32,7 +32,6 @@ License
|
||||
#include "octreeDataFace.H"
|
||||
#include "octree.H"
|
||||
#include "OFstream.H"
|
||||
#include "SortableList.H"
|
||||
#include "IndirectList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
@ -84,6 +84,7 @@ $(derivedFvPatchFields)/oscillatingFixedValue/oscillatingFixedValueFvPatchFields
|
||||
$(derivedFvPatchFields)/outletInlet/outletInletFvPatchFields.C
|
||||
$(derivedFvPatchFields)/partialSlip/partialSlipFvPatchFields.C
|
||||
$(derivedFvPatchFields)/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C
|
||||
$(derivedFvPatchFields)/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C
|
||||
$(derivedFvPatchFields)/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C
|
||||
$(derivedFvPatchFields)/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.C
|
||||
$(derivedFvPatchFields)/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C
|
||||
|
||||
@ -74,20 +74,10 @@ fluxCorrectedVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
zeroGradientFvPatchVectorField(p, iF),
|
||||
phiName_("phi"),
|
||||
rhoName_("rho")
|
||||
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
|
||||
rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
|
||||
if (dict.found("phi"))
|
||||
{
|
||||
dict.lookup("phi") >> phiName_;
|
||||
}
|
||||
|
||||
if (dict.found("rho"))
|
||||
{
|
||||
dict.lookup("rho") >> rhoName_;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -118,10 +108,8 @@ void fluxCorrectedVelocityFvPatchVectorField::evaluate
|
||||
|
||||
zeroGradientFvPatchVectorField::evaluate();
|
||||
|
||||
const surfaceScalarField& phi = db().lookupObject<surfaceScalarField>
|
||||
(
|
||||
phiName_
|
||||
);
|
||||
const surfaceScalarField& phi =
|
||||
db().lookupObject<surfaceScalarField>(phiName_);
|
||||
|
||||
const fvsPatchField<scalar>& phip =
|
||||
patch().patchField<surfaceScalarField, scalar>(phi);
|
||||
|
||||
@ -26,7 +26,10 @@ Class
|
||||
Foam::fluxCorrectedVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::fluxCorrectedVelocityFvPatchVectorField
|
||||
Velocity outlet boundary condition for patches where the pressure is
|
||||
specified. The outflow velocity is obtained by "zeroGradient" and then
|
||||
corrected from the flux. If reverse flow is possible or expected use
|
||||
the "pressureInletOutletVelocityFvPatchVectorField" BC instead.
|
||||
|
||||
SourceFiles
|
||||
fluxCorrectedVelocityFvPatchVectorField.C
|
||||
|
||||
@ -158,6 +158,22 @@ void inletOutletFvPatchField<Type>::write(Ostream& os) const
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
template<class Type>
|
||||
void inletOutletFvPatchField<Type>::operator=
|
||||
(
|
||||
const fvPatchField<Type>& ptf
|
||||
)
|
||||
{
|
||||
fvPatchField<Type>::operator=
|
||||
(
|
||||
this->valueFraction()*this->refValue()
|
||||
+ (1 - this->valueFraction())*ptf
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
@ -134,6 +134,11 @@ public:
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<Type>& pvf);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -45,6 +45,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(p, iF),
|
||||
phiName_("phi"),
|
||||
rhoName_("rho"),
|
||||
inletDir_(p.size())
|
||||
{
|
||||
refValue() = *this;
|
||||
@ -63,6 +65,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(ptf, p, iF, mapper),
|
||||
phiName_(ptf.phiName_),
|
||||
rhoName_(ptf.rhoName_),
|
||||
inletDir_(ptf.inletDir_, mapper)
|
||||
{}
|
||||
|
||||
@ -76,6 +80,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(p, iF),
|
||||
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
|
||||
rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
|
||||
inletDir_("inletDirection", dict, p.size())
|
||||
{
|
||||
fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
|
||||
@ -92,6 +98,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(pivpvf),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_),
|
||||
inletDir_(pivpvf.inletDir_)
|
||||
{}
|
||||
|
||||
@ -104,6 +112,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(pivpvf, iF),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_),
|
||||
inletDir_(pivpvf.inletDir_)
|
||||
{}
|
||||
|
||||
@ -129,7 +139,8 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::rmap
|
||||
mixedFvPatchVectorField::rmap(ptf, addr);
|
||||
|
||||
const pressureDirectedInletOutletVelocityFvPatchVectorField& tiptf =
|
||||
refCast<const pressureDirectedInletOutletVelocityFvPatchVectorField>(ptf);
|
||||
refCast<const pressureDirectedInletOutletVelocityFvPatchVectorField>
|
||||
(ptf);
|
||||
|
||||
inletDir_.rmap(tiptf.inletDir_, addr);
|
||||
}
|
||||
@ -143,7 +154,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs()
|
||||
}
|
||||
|
||||
const surfaceScalarField& phi =
|
||||
db().lookupObject<surfaceScalarField>("phi");
|
||||
db().lookupObject<surfaceScalarField>(phiName_);
|
||||
|
||||
const fvsPatchField<scalar>& phip =
|
||||
patch().patchField<surfaceScalarField, scalar>(phi);
|
||||
@ -158,7 +169,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs()
|
||||
else if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
|
||||
{
|
||||
const fvPatchField<scalar>& rhop =
|
||||
patch().lookupPatchField<volScalarField, scalar>("rho");
|
||||
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
|
||||
|
||||
refValue() = inletDir_*phip/(rhop*ndmagS);
|
||||
}
|
||||
@ -185,11 +196,28 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::
|
||||
write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
|
||||
inletDir_.writeEntry("inletDirection", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
void pressureDirectedInletOutletVelocityFvPatchVectorField::operator=
|
||||
(
|
||||
const fvPatchField<vector>& pvf
|
||||
)
|
||||
{
|
||||
fvPatchField<vector>::operator=
|
||||
(
|
||||
valueFraction()*(inletDir_*(inletDir_ & pvf))
|
||||
+ (1 - valueFraction())*pvf
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
|
||||
@ -26,7 +26,10 @@ Class
|
||||
Foam::pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
Velocity inlet/outlet boundary condition for pressure boundary where the
|
||||
pressure is specified. zero-gradient is applied for outflow (as defined
|
||||
by the flux) and for inflow the velocity is obtained from the flux with
|
||||
the specified `inletDirection'.
|
||||
|
||||
SourceFiles
|
||||
pressureDirectedInletOutletVelocityFvPatchVectorField.C
|
||||
@ -54,6 +57,8 @@ class pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
{
|
||||
// Private data
|
||||
|
||||
word phiName_;
|
||||
word rhoName_;
|
||||
vectorField inletDir_;
|
||||
|
||||
|
||||
@ -133,9 +138,35 @@ public:
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return the name of rho
|
||||
const word& rhoName() const
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of rho to allow adjustment
|
||||
word& rhoName()
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return the name of phi
|
||||
const word& phiName() const
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of phi to allow adjustment
|
||||
word& phiName()
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
@ -157,6 +188,11 @@ public:
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<vector>& pvf);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -45,6 +45,8 @@ pressureDirectedInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(p, iF),
|
||||
phiName_("phi"),
|
||||
rhoName_("rho"),
|
||||
inletDir_(p.size())
|
||||
{}
|
||||
|
||||
@ -59,6 +61,8 @@ pressureDirectedInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(ptf, p, iF, mapper),
|
||||
phiName_(ptf.phiName_),
|
||||
rhoName_(ptf.rhoName_),
|
||||
inletDir_(ptf.inletDir_, mapper)
|
||||
{}
|
||||
|
||||
@ -72,6 +76,8 @@ pressureDirectedInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(p, iF),
|
||||
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
|
||||
rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
|
||||
inletDir_("inletDirection", dict, p.size())
|
||||
{
|
||||
fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
|
||||
@ -85,6 +91,8 @@ pressureDirectedInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(pivpvf),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_),
|
||||
inletDir_(pivpvf.inletDir_)
|
||||
{}
|
||||
|
||||
@ -97,6 +105,8 @@ pressureDirectedInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(pivpvf, iF),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_),
|
||||
inletDir_(pivpvf.inletDir_)
|
||||
{}
|
||||
|
||||
@ -136,7 +146,7 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
|
||||
}
|
||||
|
||||
const surfaceScalarField& phi =
|
||||
db().lookupObject<surfaceScalarField>("phi");
|
||||
db().lookupObject<surfaceScalarField>(phiName_);
|
||||
|
||||
const fvsPatchField<scalar>& phip =
|
||||
patch().patchField<surfaceScalarField, scalar>(phi);
|
||||
@ -151,7 +161,7 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
|
||||
else if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
|
||||
{
|
||||
const fvPatchField<scalar>& rhop =
|
||||
patch().lookupPatchField<volScalarField, scalar>("rho");
|
||||
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
|
||||
|
||||
operator==(inletDir_*phip/(rhop*ndmagS));
|
||||
}
|
||||
@ -174,11 +184,24 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
|
||||
void pressureDirectedInletVelocityFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
|
||||
inletDir_.writeEntry("inletDirection", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
void pressureDirectedInletVelocityFvPatchVectorField::operator=
|
||||
(
|
||||
const fvPatchField<vector>& pvf
|
||||
)
|
||||
{
|
||||
fvPatchField<vector>::operator=(inletDir_*(inletDir_ & pvf));
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
|
||||
@ -23,10 +23,14 @@ License
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::pressureDirectedInletVelocityFvPatchVectorField
|
||||
Foam::pressureDirectedInletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::pressureDirectedInletOutletVelocityFvPatchVectorField
|
||||
Velocity inlet boundary condition for patches where the pressure is
|
||||
specified. The inflow velocity is obtained from the flux with the
|
||||
specified "inletDirection" direction. If reverse flow is possible or
|
||||
expected use the "pressureDirectedInletOutletVelocityFvPatchVectorField"
|
||||
BC instead.
|
||||
|
||||
SourceFiles
|
||||
pressureDirectedInletVelocityFvPatchVectorField.C
|
||||
@ -54,6 +58,8 @@ class pressureDirectedInletVelocityFvPatchVectorField
|
||||
{
|
||||
// Private data
|
||||
|
||||
word phiName_;
|
||||
word rhoName_;
|
||||
vectorField inletDir_;
|
||||
|
||||
|
||||
@ -130,9 +136,35 @@ public:
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return the name of rho
|
||||
const word& rhoName() const
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of rho to allow adjustment
|
||||
word& rhoName()
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return the name of phi
|
||||
const word& phiName() const
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of phi to allow adjustment
|
||||
word& phiName()
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
@ -154,6 +186,11 @@ public:
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<vector>& pvf);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -26,7 +26,10 @@ Class
|
||||
Foam::pressureInletOutletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::pressureInletOutletVelocityFvPatchVectorField
|
||||
Velocity inlet/outlet boundary condition patches for where the pressure is
|
||||
specified. zero-gradient is applied for outflow (as defined by the flux)
|
||||
and for inflow the velocity is obtained from the patch-face normal
|
||||
component of the internal-cell value.
|
||||
|
||||
SourceFiles
|
||||
pressureInletOutletVelocityFvPatchVectorField.C
|
||||
|
||||
@ -108,6 +108,17 @@ void pressureInletUniformVelocityFvPatchVectorField::updateCoeffs()
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
void pressureInletUniformVelocityFvPatchVectorField::operator=
|
||||
(
|
||||
const fvPatchField<vector>& pvf
|
||||
)
|
||||
{
|
||||
operator==(patch().nf()*sum(patch().Sf() & pvf)/sum(patch().magSf()));
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
|
||||
@ -26,7 +26,9 @@ Class
|
||||
Foam::pressureInletUniformVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::pressureInletUniformVelocityFvPatchVectorField
|
||||
Velocity inlet boundary condition for patches where the pressure is
|
||||
specified. The uniform inflow velocity is obtained by averaging the flux
|
||||
over the patch and apply it in the direction normal to the patch faces.
|
||||
|
||||
SourceFiles
|
||||
pressureInletUniformVelocityFvPatchVectorField.C
|
||||
@ -124,6 +126,11 @@ public:
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<vector>& pvf);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -70,20 +70,10 @@ pressureInletVelocityFvPatchVectorField::pressureInletVelocityFvPatchVectorField
|
||||
)
|
||||
:
|
||||
fixedValueFvPatchVectorField(p, iF),
|
||||
phiName_("phi"),
|
||||
rhoName_("rho")
|
||||
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
|
||||
rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
|
||||
{
|
||||
fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
|
||||
|
||||
if (dict.found("phi"))
|
||||
{
|
||||
dict.lookup("phi") >> phiName_;
|
||||
}
|
||||
|
||||
if (dict.found("rho"))
|
||||
{
|
||||
dict.lookup("rho") >> rhoName_;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -164,6 +154,17 @@ void pressureInletVelocityFvPatchVectorField::write(Ostream& os) const
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
void pressureInletVelocityFvPatchVectorField::operator=
|
||||
(
|
||||
const fvPatchField<vector>& pvf
|
||||
)
|
||||
{
|
||||
fvPatchField<vector>::operator=(patch().nf()*(patch().nf() & pvf));
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
|
||||
@ -26,7 +26,10 @@ Class
|
||||
Foam::pressureInletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::pressureInletVelocityFvPatchVectorField
|
||||
Velocity inlet boundary condition for patches where the pressure is
|
||||
specified. The inflow velocity is obtained from the flux with a direction
|
||||
normal to the patch faces. If reverse flow is possible or expected use
|
||||
the "pressureInletOutletVelocityFvPatchVectorField" BC instead.
|
||||
|
||||
SourceFiles
|
||||
pressureInletVelocityFvPatchVectorField.C
|
||||
@ -57,6 +60,7 @@ class pressureInletVelocityFvPatchVectorField
|
||||
word phiName_;
|
||||
word rhoName_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
@ -127,6 +131,33 @@ public:
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return the name of rho
|
||||
const word& rhoName() const
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of rho to allow adjustment
|
||||
word& rhoName()
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return the name of phi
|
||||
const word& phiName() const
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of phi to allow adjustment
|
||||
word& phiName()
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
@ -136,10 +167,7 @@ public:
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<vector>& pvf)
|
||||
{
|
||||
fvPatchField<vector>::operator=(pvf);
|
||||
}
|
||||
virtual void operator=(const fvPatchField<vector>& pvf);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,201 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "pressureNormalInletOutletVelocityFvPatchVectorField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "volFields.H"
|
||||
#include "surfaceFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(p, iF),
|
||||
phiName_("phi"),
|
||||
rhoName_("rho")
|
||||
{
|
||||
refValue() = *this;
|
||||
refGrad() = vector::zero;
|
||||
valueFraction() = 0.0;
|
||||
}
|
||||
|
||||
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField& ptf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(ptf, p, iF, mapper),
|
||||
phiName_(ptf.phiName_),
|
||||
rhoName_(ptf.rhoName_)
|
||||
{}
|
||||
|
||||
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(p, iF),
|
||||
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
|
||||
rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
|
||||
{
|
||||
fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
|
||||
refValue() = *this;
|
||||
refGrad() = vector::zero;
|
||||
valueFraction() = 0.0;
|
||||
}
|
||||
|
||||
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField& pivpvf
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(pivpvf),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_)
|
||||
{}
|
||||
|
||||
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField& pivpvf,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
mixedFvPatchVectorField(pivpvf, iF),
|
||||
phiName_(pivpvf.phiName_),
|
||||
rhoName_(pivpvf.rhoName_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void pressureNormalInletOutletVelocityFvPatchVectorField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const surfaceScalarField& phi =
|
||||
db().lookupObject<surfaceScalarField>(phiName_);
|
||||
|
||||
const fvsPatchField<scalar>& phip =
|
||||
patch().patchField<surfaceScalarField, scalar>(phi);
|
||||
|
||||
vectorField n = patch().nf();
|
||||
const Field<scalar>& magS = patch().magSf();
|
||||
|
||||
if (phi.dimensions() == dimVelocity*dimArea)
|
||||
{
|
||||
refValue() = n*phip/magS;
|
||||
}
|
||||
else if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
|
||||
{
|
||||
const fvPatchField<scalar>& rhop =
|
||||
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
|
||||
|
||||
refValue() = n*phip/(rhop*magS);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"pressureNormalInletOutletVelocityFvPatchVectorField::"
|
||||
"updateCoeffs()"
|
||||
) << "dimensions of phi are not correct"
|
||||
<< "\n on patch " << this->patch().name()
|
||||
<< " of field " << this->dimensionedInternalField().name()
|
||||
<< " in file " << this->dimensionedInternalField().objectPath()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
valueFraction() = 1.0 - pos(phip);
|
||||
|
||||
mixedFvPatchVectorField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
void pressureNormalInletOutletVelocityFvPatchVectorField::
|
||||
write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
void pressureNormalInletOutletVelocityFvPatchVectorField::operator=
|
||||
(
|
||||
const fvPatchField<vector>& pvf
|
||||
)
|
||||
{
|
||||
fvPatchField<vector>::operator=
|
||||
(
|
||||
valueFraction()*(patch().nf()*(patch().nf() & pvf))
|
||||
+ (1 - valueFraction())*pvf
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
(
|
||||
fvPatchVectorField,
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,191 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Velocity inlet/outlet boundary condition for patches where the pressure is
|
||||
specified. zero-gradient is applied for outflow (as defined by the flux)
|
||||
and for inflow the velocity is obtained from the flux with a direction
|
||||
normal to the patch faces.
|
||||
|
||||
SourceFiles
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef pressureNormalInletOutletVelocityFvPatchVectorField_H
|
||||
#define pressureNormalInletOutletVelocityFvPatchVectorField_H
|
||||
|
||||
#include "fvPatchFields.H"
|
||||
#include "mixedFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class pressureNormalInletOutletVelocityFvPatch Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
:
|
||||
public mixedFvPatchVectorField
|
||||
{
|
||||
// Private data
|
||||
|
||||
word phiName_;
|
||||
word rhoName_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("pressureNormalInletOutletVelocity");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
// onto a new patch
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchVectorField> clone() const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
*this
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
const pressureNormalInletOutletVelocityFvPatchVectorField&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchVectorField> clone
|
||||
(
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new pressureNormalInletOutletVelocityFvPatchVectorField
|
||||
(
|
||||
*this,
|
||||
iF
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return the name of rho
|
||||
const word& rhoName() const
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return reference to the name of rho to allow adjustment
|
||||
word& rhoName()
|
||||
{
|
||||
return rhoName_;
|
||||
}
|
||||
|
||||
//- Return the name of phi
|
||||
const word& phiName() const
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
|
||||
//- Return reference to the name of phi to allow adjustment
|
||||
word& phiName()
|
||||
{
|
||||
return phiName_;
|
||||
}
|
||||
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<vector>& pvf);
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -26,7 +26,10 @@ Class
|
||||
Foam::rotatingPressureInletOutletVelocityFvPatchVectorField
|
||||
|
||||
Description
|
||||
Foam::rotatingPressureInletOutletVelocityFvPatchVectorField
|
||||
Velocity inlet/outlet boundary condition in a rotating frame
|
||||
for patches where the pressure is specified. zero-gradient is applied for
|
||||
outflow (as defined by the flux) and for inflow the velocity is obtained
|
||||
from the flux with a direction normal to the patch faces.
|
||||
|
||||
SourceFiles
|
||||
rotatingPressureInletOutletVelocityFvPatchVectorField.C
|
||||
|
||||
@ -22,8 +22,6 @@ License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "gaussConvectionScheme.H"
|
||||
|
||||
@ -978,14 +978,14 @@ CrankNicholsonDdtScheme<Type>::fvcDdtPhiCorr
|
||||
ddt0_<GeometricField<Type, fvPatchField, volMesh> >
|
||||
(
|
||||
"ddt0(" + U.name() + ')',
|
||||
rho.dimensions()*U.dimensions()
|
||||
U.dimensions()
|
||||
);
|
||||
|
||||
DDt0Field<fluxFieldType>& dphidt0 =
|
||||
ddt0_<fluxFieldType>
|
||||
(
|
||||
"ddt0(" + phi.name() + ')',
|
||||
phi.dimensions()
|
||||
U.dimensions()*dimArea
|
||||
);
|
||||
|
||||
IOobject ddtIOobject
|
||||
|
||||
@ -109,7 +109,6 @@ private:
|
||||
|
||||
//- References to the mesh and time databases
|
||||
const fvMesh& mesh_;
|
||||
// const Time& runTime_;
|
||||
|
||||
//- Reference to the interpolation for the carrier phase to the parcels
|
||||
const volPointInterpolation& vpi_;
|
||||
@ -263,9 +262,6 @@ protected:
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
// TypeName("KinematicCloud");
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct given carrier gas fields
|
||||
@ -280,9 +276,8 @@ public:
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~KinematicCloud();
|
||||
//- Destructor
|
||||
virtual ~KinematicCloud();
|
||||
|
||||
|
||||
// Member Functions
|
||||
@ -391,7 +386,6 @@ public:
|
||||
inline tmp<fvVectorMatrix> SU2(volVectorField& U) const;
|
||||
|
||||
|
||||
|
||||
// Check
|
||||
|
||||
//- Total mass injected
|
||||
|
||||
@ -191,13 +191,13 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
|
||||
+ YMixture_[2]*td.cloud().composition().cpSolid(YSolid_);
|
||||
|
||||
// Update particle density or diameter
|
||||
if (td.cloud().massTransfer().changesVolume())
|
||||
if (td.constProps().constantVolume())
|
||||
{
|
||||
this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi);
|
||||
this->rho_ = mass1/this->volume();
|
||||
}
|
||||
else
|
||||
{
|
||||
this->rho_ = mass1/this->volume();
|
||||
this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -296,13 +296,13 @@ void Foam::ReactingParcel<ParcelType>::calcUncoupled
|
||||
this->cp_ = cp1;
|
||||
|
||||
// Update particle density or diameter
|
||||
if (td.cloud().massTransfer().changesVolume())
|
||||
if (td.constProps().constantVolume())
|
||||
{
|
||||
this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi);
|
||||
this->rho_ = mass1/this->volume();
|
||||
}
|
||||
else
|
||||
{
|
||||
this->rho_ = mass1/this->volume();
|
||||
this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,6 +92,9 @@ public:
|
||||
//- Latent heat of devolatilisation [J/kg]
|
||||
const scalar Ldevol_;
|
||||
|
||||
//- Constant volume flag - e.g. during mass transfer
|
||||
Switch constantVolume_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
@ -108,6 +111,9 @@ public:
|
||||
|
||||
//- Return const access to the latent heat of devolatilisation
|
||||
inline scalar Ldevol() const;
|
||||
|
||||
//- Return const access to the constant volume flag
|
||||
inline Switch constantVolume() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -35,7 +35,8 @@ inline Foam::ReactingParcel<ParcelType>::constantProperties::constantProperties
|
||||
ThermoParcel<ParcelType>::constantProperties(dict),
|
||||
Tvap_(dimensionedScalar(dict.lookup("Tvap")).value()),
|
||||
Tbp_(dimensionedScalar(dict.lookup("Tbp")).value()),
|
||||
Ldevol_(dimensionedScalar(dict.lookup("Ldevol")).value())
|
||||
Ldevol_(dimensionedScalar(dict.lookup("Ldevol")).value()),
|
||||
constantVolume_(dict.lookup("constantVolume"))
|
||||
{}
|
||||
|
||||
|
||||
@ -136,6 +137,14 @@ Foam::ReactingParcel<ParcelType>::constantProperties::Ldevol() const
|
||||
}
|
||||
|
||||
|
||||
template<class ParcelType>
|
||||
inline Foam::Switch
|
||||
Foam::ReactingParcel<ParcelType>::constantProperties::constantVolume() const
|
||||
{
|
||||
return constantVolume_;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * //
|
||||
|
||||
template<class ParcelType>
|
||||
|
||||
@ -60,13 +60,6 @@ bool Foam::ConstantRateDevolatilisation<CloudType>::active() const
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
bool Foam::ConstantRateDevolatilisation<CloudType>::changesVolume() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
Foam::scalar Foam::ConstantRateDevolatilisation<CloudType>::calculate
|
||||
(
|
||||
|
||||
@ -89,9 +89,6 @@ public:
|
||||
//- Flag to indicate whether model activates mass transfer model
|
||||
bool active() const;
|
||||
|
||||
//- Flag to indicate whether model changes particle volume
|
||||
bool changesVolume() const;
|
||||
|
||||
//- Update model
|
||||
scalar calculate
|
||||
(
|
||||
|
||||
@ -130,9 +130,6 @@ public:
|
||||
//- Flag to indicate whether model activates mass transfer model
|
||||
virtual bool active() const = 0;
|
||||
|
||||
//- Flag to indicate whether model changes particle volume
|
||||
virtual bool changesVolume() const = 0;
|
||||
|
||||
//- Update model
|
||||
virtual scalar calculate
|
||||
(
|
||||
|
||||
@ -55,13 +55,6 @@ bool Foam::NoMassTransfer<CloudType>::active() const
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
bool Foam::NoMassTransfer<CloudType>::changesVolume() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
Foam::scalar Foam::NoMassTransfer<CloudType>::calculate
|
||||
(
|
||||
|
||||
@ -75,9 +75,6 @@ public:
|
||||
//- Flag to indicate whether model activates mass transfer model
|
||||
bool active() const;
|
||||
|
||||
//- Flag to indicate whether model changes particle volume
|
||||
bool changesVolume() const;
|
||||
|
||||
//- Update model
|
||||
scalar calculate
|
||||
(
|
||||
|
||||
@ -62,13 +62,6 @@ bool Foam::SingleKineticRateDevolatilisation<CloudType>::active() const
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
bool Foam::SingleKineticRateDevolatilisation<CloudType>::changesVolume() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
Foam::scalar Foam::SingleKineticRateDevolatilisation<CloudType>::calculate
|
||||
(
|
||||
|
||||
@ -91,9 +91,6 @@ public:
|
||||
//- Flag to indicate whether model activates mass transfer model
|
||||
bool active() const;
|
||||
|
||||
//- Flag to indicate whether model changes particle volume
|
||||
bool changesVolume() const;
|
||||
|
||||
//- Update model
|
||||
scalar calculate
|
||||
(
|
||||
|
||||
@ -29,6 +29,8 @@ License
|
||||
#include "ListListOps.H"
|
||||
#include "meshSearch.H"
|
||||
#include "mapDistribute.H"
|
||||
#include "meshTools.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -47,16 +49,18 @@ void Foam::directMappedPolyPatch::collectSamples
|
||||
(
|
||||
pointField& samples,
|
||||
labelList& patchFaceProcs,
|
||||
labelList& patchFaces
|
||||
labelList& patchFaces,
|
||||
pointField& patchFc
|
||||
) const
|
||||
{
|
||||
const vectorField::subField fc = this->faceCentres();
|
||||
|
||||
// Collect all sample points and the faces they come from.
|
||||
List<pointField> globalFc(Pstream::nProcs());
|
||||
List<pointField> globalSamples(Pstream::nProcs());
|
||||
labelListList globalFaces(Pstream::nProcs());
|
||||
|
||||
globalSamples[Pstream::myProcNo()] = fc+offset_;
|
||||
globalFc[Pstream::myProcNo()] = this->faceCentres();
|
||||
globalSamples[Pstream::myProcNo()] = globalFc[Pstream::myProcNo()]+offset_;
|
||||
globalFaces[Pstream::myProcNo()] = identity(size());
|
||||
|
||||
// Distribute to all processors
|
||||
@ -64,6 +68,8 @@ void Foam::directMappedPolyPatch::collectSamples
|
||||
Pstream::scatterList(globalSamples);
|
||||
Pstream::gatherList(globalFaces);
|
||||
Pstream::scatterList(globalFaces);
|
||||
Pstream::gatherList(globalFc);
|
||||
Pstream::scatterList(globalFc);
|
||||
|
||||
// Rework into straight list
|
||||
samples = ListListOps::combine<pointField>
|
||||
@ -76,6 +82,11 @@ void Foam::directMappedPolyPatch::collectSamples
|
||||
globalFaces,
|
||||
accessOp<labelList>()
|
||||
);
|
||||
patchFc = ListListOps::combine<pointField>
|
||||
(
|
||||
globalFc,
|
||||
accessOp<pointField>()
|
||||
);
|
||||
|
||||
patchFaceProcs.setSize(patchFaces.size());
|
||||
labelList nPerProc
|
||||
@ -103,11 +114,14 @@ void Foam::directMappedPolyPatch::findSamples
|
||||
(
|
||||
const pointField& samples,
|
||||
labelList& sampleCellProcs,
|
||||
labelList& sampleCells
|
||||
labelList& sampleCells,
|
||||
pointField& sampleCc
|
||||
) const
|
||||
{
|
||||
sampleCellProcs.setSize(samples.size());
|
||||
sampleCells.setSize(samples.size());
|
||||
sampleCc.setSize(samples.size());
|
||||
sampleCc = point(-GREAT, -GREAT, -GREAT);
|
||||
|
||||
{
|
||||
// Octree based search engine
|
||||
@ -124,6 +138,8 @@ void Foam::directMappedPolyPatch::findSamples
|
||||
else
|
||||
{
|
||||
sampleCellProcs[sampleI] = Pstream::myProcNo();
|
||||
sampleCc[sampleI] =
|
||||
boundaryMesh().mesh().cellCentres()[sampleCells[sampleI]];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -136,6 +152,9 @@ void Foam::directMappedPolyPatch::findSamples
|
||||
Pstream::listCombineGather(sampleCellProcs, maxEqOp<label>());
|
||||
Pstream::listCombineScatter(sampleCellProcs);
|
||||
|
||||
Pstream::listCombineGather(sampleCc, maxEqOp<point>());
|
||||
Pstream::listCombineScatter(sampleCc);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<< "directMappedPolyPatch::findSamples : " << endl;
|
||||
@ -143,7 +162,8 @@ void Foam::directMappedPolyPatch::findSamples
|
||||
{
|
||||
Info<< " " << sampleI << " coord:" << samples[sampleI]
|
||||
<< " found on processor:" << sampleCellProcs[sampleI]
|
||||
<< " in cell:" << sampleCells[sampleI] << endl;
|
||||
<< " in cell:" << sampleCells[sampleI]
|
||||
<< " with cc:" << sampleCc[sampleI] << endl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -213,12 +233,14 @@ void Foam::directMappedPolyPatch::calcMapping() const
|
||||
pointField samples;
|
||||
labelList patchFaceProcs;
|
||||
labelList patchFaces;
|
||||
collectSamples(samples, patchFaceProcs, patchFaces);
|
||||
pointField patchFc;
|
||||
collectSamples(samples, patchFaceProcs, patchFaces, patchFc);
|
||||
|
||||
// Find processor and cell samples are in
|
||||
labelList sampleCellProcs;
|
||||
labelList sampleCells;
|
||||
findSamples(samples, sampleCellProcs, sampleCells);
|
||||
pointField sampleCc;
|
||||
findSamples(samples, sampleCellProcs, sampleCells, sampleCc);
|
||||
|
||||
|
||||
// Now we have all the data we need:
|
||||
@ -227,6 +249,60 @@ void Foam::directMappedPolyPatch::calcMapping() const
|
||||
// - cell sample is in (so source when mapping)
|
||||
// sampleCells, sampleCellProcs.
|
||||
|
||||
|
||||
if (debug && Pstream::master())
|
||||
{
|
||||
OFstream str
|
||||
(
|
||||
boundaryMesh().mesh().time().path()
|
||||
/ name()
|
||||
+ "_directMapped.obj"
|
||||
);
|
||||
Pout<< "Dumping mapping as lines from patch faceCentres to"
|
||||
<< " sampled cellCentres to file " << str.name() << endl;
|
||||
|
||||
label vertI = 0;
|
||||
|
||||
forAll(patchFc, i)
|
||||
{
|
||||
meshTools::writeOBJ(str, patchFc[i]);
|
||||
vertI++;
|
||||
meshTools::writeOBJ(str, sampleCc[i]);
|
||||
vertI++;
|
||||
str << "l " << vertI-1 << ' ' << vertI << nl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check that actual offset vector (sampleCc - patchFc) is more or less
|
||||
// constant.
|
||||
if (Pstream::master())
|
||||
{
|
||||
const scalarField magOffset(mag(sampleCc - patchFc));
|
||||
const scalar avgOffset(average(magOffset));
|
||||
|
||||
forAll(magOffset, sampleI)
|
||||
{
|
||||
if (mag(magOffset[sampleI]-avgOffset) > 0.001*avgOffset)
|
||||
{
|
||||
WarningIn("directMappedPolyPatch::calcMapping() const")
|
||||
<< "The actual cell centres picked up using offset "
|
||||
<< offset_ << " are not" << endl
|
||||
<< " on a single plane."
|
||||
<< " This might give numerical problems." << endl
|
||||
<< " At patchface " << patchFc[sampleI]
|
||||
<< " the sampled cell " << sampleCc[sampleI] << endl
|
||||
<< " is not on a plane " << avgOffset
|
||||
<< " offset from the patch." << endl
|
||||
<< " You might want to shift your plane offset."
|
||||
<< " Set the debug flag to get a dump of sampled cells."
|
||||
<< endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Determine schedule.
|
||||
mapDistribute distMap(sampleCellProcs, patchFaceProcs);
|
||||
|
||||
|
||||
@ -82,7 +82,8 @@ class directMappedPolyPatch
|
||||
(
|
||||
pointField&,
|
||||
labelList& patchFaceProcs,
|
||||
labelList& patchFaces
|
||||
labelList& patchFaces,
|
||||
pointField& patchFc
|
||||
) const;
|
||||
|
||||
//- Find cells containing samples
|
||||
@ -90,7 +91,8 @@ class directMappedPolyPatch
|
||||
(
|
||||
const pointField&,
|
||||
labelList& sampleCellProcs,
|
||||
labelList& sampleCells
|
||||
labelList& sampleCells,
|
||||
pointField& sampleCc
|
||||
) const;
|
||||
|
||||
//- Calculate matching
|
||||
|
||||
@ -40,7 +40,7 @@ namespace Foam
|
||||
// Does bb intersect a sphere around sample? Or is any corner point of bb
|
||||
// closer than nearestDistSqr to sample.
|
||||
template <class Type>
|
||||
bool indexedOctree<Type>::intersects
|
||||
bool indexedOctree<Type>::overlaps
|
||||
(
|
||||
const point& p0,
|
||||
const point& p1,
|
||||
@ -84,7 +84,7 @@ bool indexedOctree<Type>::intersects
|
||||
// Does bb intersect a sphere around sample? Or is any corner point of bb
|
||||
// closer than nearestDistSqr to sample.
|
||||
template <class Type>
|
||||
bool indexedOctree<Type>::intersects
|
||||
bool indexedOctree<Type>::overlaps
|
||||
(
|
||||
const treeBoundBox& parentBb,
|
||||
const direction octant,
|
||||
@ -94,7 +94,7 @@ bool indexedOctree<Type>::intersects
|
||||
{
|
||||
//- Speeded up version of
|
||||
// treeBoundBox subBb(parentBb.subBbox(mid, octant))
|
||||
// intersects
|
||||
// overlaps
|
||||
// (
|
||||
// subBb.min(),
|
||||
// subBb.max(),
|
||||
@ -136,7 +136,7 @@ bool indexedOctree<Type>::intersects
|
||||
|
||||
const point mid(0.5*(min+max));
|
||||
|
||||
return intersects(mid, other, nearestDistSqr, sample);
|
||||
return overlaps(mid, other, nearestDistSqr, sample);
|
||||
}
|
||||
|
||||
|
||||
@ -567,7 +567,7 @@ void indexedOctree<Type>::findNearest
|
||||
|
||||
const treeBoundBox& subBb = nodes_[subNodeI].bb_;
|
||||
|
||||
if (intersects(subBb.min(), subBb.max(), nearestDistSqr, sample))
|
||||
if (overlaps(subBb.min(), subBb.max(), nearestDistSqr, sample))
|
||||
{
|
||||
findNearest
|
||||
(
|
||||
@ -584,7 +584,7 @@ void indexedOctree<Type>::findNearest
|
||||
{
|
||||
if
|
||||
(
|
||||
intersects
|
||||
overlaps
|
||||
(
|
||||
nod.bb_,
|
||||
octant,
|
||||
@ -639,7 +639,7 @@ void indexedOctree<Type>::findNearest
|
||||
{
|
||||
const treeBoundBox& subBb = nodes_[getNode(index)].bb_;
|
||||
|
||||
if (subBb.intersects(tightest))
|
||||
if (subBb.overlaps(tightest))
|
||||
{
|
||||
findNearest
|
||||
(
|
||||
@ -657,7 +657,7 @@ void indexedOctree<Type>::findNearest
|
||||
{
|
||||
const treeBoundBox subBb(nodeBb.subBbox(octant));
|
||||
|
||||
if (subBb.intersects(tightest))
|
||||
if (subBb.overlaps(tightest))
|
||||
{
|
||||
shapes_.findNearest
|
||||
(
|
||||
@ -1121,7 +1121,7 @@ void indexedOctree<Type>::findBox
|
||||
{
|
||||
const treeBoundBox& subBb = nodes_[getNode(index)].bb_;
|
||||
|
||||
if (subBb.intersects(searchBox))
|
||||
if (subBb.overlaps(searchBox))
|
||||
{
|
||||
findBox(getNode(index), searchBox, elements);
|
||||
}
|
||||
@ -1130,7 +1130,7 @@ void indexedOctree<Type>::findBox
|
||||
{
|
||||
const treeBoundBox subBb(nodeBb.subBbox(octant));
|
||||
|
||||
if (subBb.intersects(searchBox))
|
||||
if (subBb.overlaps(searchBox))
|
||||
{
|
||||
const labelList& indices = contents_[getContent(index)];
|
||||
|
||||
|
||||
@ -36,9 +36,9 @@ SourceFiles
|
||||
#ifndef indexedOctree_H
|
||||
#define indexedOctree_H
|
||||
|
||||
#include "treeBoundBox.H"
|
||||
#include "pointIndexHit.H"
|
||||
#include "FixedList.H"
|
||||
#include "treeBoundBox.H"
|
||||
#include "Ostream.H"
|
||||
#include "labelHashSet.H"
|
||||
#include "labelBits.H"
|
||||
@ -146,7 +146,7 @@ private:
|
||||
|
||||
//- Like above but now bb is implicitly provided as parent bb + mid
|
||||
// + octant
|
||||
static bool intersects
|
||||
static bool overlaps
|
||||
(
|
||||
const treeBoundBox& parentBb,
|
||||
const direction octant,
|
||||
@ -497,7 +497,7 @@ public:
|
||||
|
||||
//- Helper: does bb intersect a sphere around sample? Or is any
|
||||
// corner point of bb closer than nearestDistSqr to sample.
|
||||
static bool intersects
|
||||
static bool overlaps
|
||||
(
|
||||
const point& bbMin,
|
||||
const point& bbMax,
|
||||
|
||||
@ -137,11 +137,11 @@ bool Foam::treeDataCell::overlaps
|
||||
{
|
||||
if (cacheBb_)
|
||||
{
|
||||
return cubeBb.intersects(bbs_[index]);
|
||||
return cubeBb.overlaps(bbs_[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return cubeBb.intersects(calcCellBb(cellLabels_[index]));
|
||||
return cubeBb.overlaps(calcCellBb(cellLabels_[index]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -110,11 +110,11 @@ bool Foam::treeDataEdge::overlaps
|
||||
{
|
||||
if (cacheBb_)
|
||||
{
|
||||
return cubeBb.intersects(bbs_[index]);
|
||||
return cubeBb.overlaps(bbs_[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return cubeBb.intersects(calcBb(edgeLabels_[index]));
|
||||
return cubeBb.overlaps(calcBb(edgeLabels_[index]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -412,14 +412,14 @@ bool Foam::treeDataFace::overlaps
|
||||
// 1. Quick rejection: bb does not intersect face bb at all
|
||||
if (cacheBb_)
|
||||
{
|
||||
if (!cubeBb.intersects(bbs_[index]))
|
||||
if (!cubeBb.overlaps(bbs_[index]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!cubeBb.intersects(calcBb(faceLabels_[index])))
|
||||
if (!cubeBb.overlaps(calcBb(faceLabels_[index])))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -284,13 +284,13 @@ bool Foam::treeDataTriSurface::overlaps
|
||||
triBb.max() = max(triBb.max(), p2);
|
||||
|
||||
//- For testing: robust one
|
||||
//return cubeBb.intersects(triBb);
|
||||
//return cubeBb.overlaps(triBb);
|
||||
|
||||
//- Exact test of triangle intersecting bb
|
||||
|
||||
// Quick rejection. If whole bounding box of tri is outside cubeBb then
|
||||
// there will be no intersection.
|
||||
if (!cubeBb.intersects(triBb))
|
||||
if (!cubeBb.overlaps(triBb))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -94,6 +94,12 @@ public:
|
||||
index_(-1)
|
||||
{}
|
||||
|
||||
//- Construct from Istream
|
||||
PointIndexHit(Istream& is)
|
||||
{
|
||||
is >> *this;
|
||||
}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -193,13 +199,45 @@ public:
|
||||
|
||||
friend Ostream& operator<< (Ostream& os, const PointIndexHit& pHit)
|
||||
{
|
||||
return os << pHit.hit_ << token::SPACE << pHit.hitPoint_
|
||||
<< token::SPACE << pHit.index_;
|
||||
if (os.format() == IOstream::ASCII)
|
||||
{
|
||||
os << pHit.hit_ << token::SPACE << pHit.hitPoint_
|
||||
<< token::SPACE << pHit.index_;
|
||||
}
|
||||
else
|
||||
{
|
||||
os.write
|
||||
(
|
||||
reinterpret_cast<const char*>(&pHit),
|
||||
sizeof(PointIndexHit)
|
||||
);
|
||||
}
|
||||
|
||||
// Check state of Ostream
|
||||
os.check("Ostream& operator<<(Ostream&, const PointIndexHit&)");
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
friend Istream& operator>>(Istream& is, PointIndexHit& pHit)
|
||||
{
|
||||
return is >> pHit.hit_ >> pHit.hitPoint_ >> pHit.index_;
|
||||
if (is.format() == IOstream::ASCII)
|
||||
{
|
||||
return is >> pHit.hit_ >> pHit.hitPoint_ >> pHit.index_;
|
||||
}
|
||||
else
|
||||
{
|
||||
is.read
|
||||
(
|
||||
reinterpret_cast<char*>(&pHit),
|
||||
sizeof(PointIndexHit)
|
||||
);
|
||||
}
|
||||
|
||||
// Check state of Istream
|
||||
is.check("Istream& operator>>(Istream&, PointIndexHit&)");
|
||||
|
||||
return is;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@ -113,7 +113,7 @@ bool Foam::octreeDataCell::overlaps
|
||||
const treeBoundBox& cubeBb
|
||||
) const
|
||||
{
|
||||
return cubeBb.intersects(bbs_[index]);
|
||||
return cubeBb.overlaps(bbs_[index]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -107,7 +107,7 @@ bool Foam::octreeDataEdges::overlaps
|
||||
const treeBoundBox& sampleBb
|
||||
) const
|
||||
{
|
||||
return sampleBb.intersects(allBb_[index]);
|
||||
return sampleBb.overlaps(allBb_[index]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -507,12 +507,12 @@ bool Foam::octreeDataFace::overlaps
|
||||
const treeBoundBox& sampleBb
|
||||
) const
|
||||
{
|
||||
//return sampleBb.intersects(allBb_[index]);
|
||||
//return sampleBb.overlaps(allBb_[index]);
|
||||
|
||||
//- Exact test of face intersecting bb
|
||||
|
||||
// 1. Quick rejection: bb does not intersect face bb at all
|
||||
if (!sampleBb.intersects(allBb_[index]))
|
||||
if (!sampleBb.overlaps(allBb_[index]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -39,7 +39,14 @@ Description
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
typedef PointIndexHit<point> pointIndexHit;
|
||||
|
||||
typedef PointIndexHit<point> pointIndexHit;
|
||||
|
||||
|
||||
//- Specify data associated with pointIndexHit type is contiguous
|
||||
template<>
|
||||
inline bool contiguous<pointIndexHit>() {return true;}
|
||||
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -297,6 +297,45 @@ Foam::treeBoundBox Foam::treeBoundBox::subBbox
|
||||
}
|
||||
|
||||
|
||||
bool Foam::treeBoundBox::overlaps
|
||||
(
|
||||
const point& centre,
|
||||
const scalar radiusSqr
|
||||
) const
|
||||
{
|
||||
// Find out where centre is in relation to bb.
|
||||
// Find nearest point on bb.
|
||||
scalar distSqr = 0;
|
||||
|
||||
for (direction dir = 0; dir < vector::nComponents; dir++)
|
||||
{
|
||||
scalar d0 = min()[dir] - centre[dir];
|
||||
scalar d1 = max()[dir] - centre[dir];
|
||||
|
||||
if ((d0 > 0) != (d1 > 0))
|
||||
{
|
||||
// centre inside both extrema. This component does not add any
|
||||
// distance.
|
||||
}
|
||||
else if (Foam::mag(d0) < Foam::mag(d1))
|
||||
{
|
||||
distSqr += d0*d0;
|
||||
}
|
||||
else
|
||||
{
|
||||
distSqr += d1*d1;
|
||||
}
|
||||
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// line intersection. Returns true if line (start to end) inside
|
||||
// bb or intersects bb. Sets pt to intersection.
|
||||
//
|
||||
|
||||
@ -263,8 +263,11 @@ public:
|
||||
FixedList<direction, 8>& octantOrder
|
||||
) const;
|
||||
|
||||
//- Intersects other boundingbox?
|
||||
inline bool intersects(const treeBoundBox&) const;
|
||||
//- Overlaps other boundingbox?
|
||||
inline bool overlaps(const treeBoundBox&) const;
|
||||
|
||||
//- Overlaps boundingSphere (centre + sqr(radius))?
|
||||
bool overlaps(const point&, const scalar radiusSqr) const;
|
||||
|
||||
//- Intersects segment; set point to intersection position,
|
||||
// return true if intersection found.
|
||||
|
||||
@ -24,9 +24,7 @@ License
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "error.H"
|
||||
#include "treeBoundBox.H"
|
||||
#include "point.H"
|
||||
#include "Random.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -414,9 +412,9 @@ inline void treeBoundBox::searchOrder
|
||||
|
||||
// true if bb's intersect or overlap.
|
||||
// Note: <= to make sure we catch all.
|
||||
inline bool treeBoundBox::intersects(const treeBoundBox& bb) const
|
||||
inline bool treeBoundBox::overlaps(const treeBoundBox& bb) const
|
||||
{
|
||||
return boundBox::intersects(bb);
|
||||
return boundBox::overlaps(bb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -798,7 +798,7 @@ bool treeNode<Type>::findTightest
|
||||
// Node: recurse into subnodes
|
||||
const treeNode<Type>* subNodePtr = getNodePtr(octant);
|
||||
|
||||
if (subNodePtr->bb().intersects(tightest))
|
||||
if (subNodePtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subNode
|
||||
changed |=
|
||||
@ -815,7 +815,7 @@ bool treeNode<Type>::findTightest
|
||||
// Leaf: let leaf::find handle this
|
||||
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant);
|
||||
|
||||
if (subLeafPtr->bb().intersects(tightest))
|
||||
if (subLeafPtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subLeaf
|
||||
changed |=
|
||||
@ -884,7 +884,7 @@ bool treeNode<Type>::findNearest
|
||||
// Node
|
||||
const treeNode<Type>* subNodePtr = getNodePtr(octant);
|
||||
|
||||
if (subNodePtr->bb().intersects(tightest))
|
||||
if (subNodePtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subNode
|
||||
changed |=
|
||||
@ -903,7 +903,7 @@ bool treeNode<Type>::findNearest
|
||||
// Leaf: let leaf::find handle this
|
||||
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant);
|
||||
|
||||
if (subLeafPtr->bb().intersects(tightest))
|
||||
if (subLeafPtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subNode
|
||||
changed |=
|
||||
@ -975,7 +975,7 @@ bool treeNode<Type>::findNearest
|
||||
// Node
|
||||
const treeNode<Type>* subNodePtr = getNodePtr(octant);
|
||||
|
||||
if (subNodePtr->bb().intersects(tightest))
|
||||
if (subNodePtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subNode
|
||||
changed |=
|
||||
@ -995,7 +995,7 @@ bool treeNode<Type>::findNearest
|
||||
// Leaf: let leaf::find handle this
|
||||
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant);
|
||||
|
||||
if (subLeafPtr->bb().intersects(tightest))
|
||||
if (subLeafPtr->bb().overlaps(tightest))
|
||||
{
|
||||
// there might be a better fit inside this subNode
|
||||
changed |=
|
||||
@ -1060,7 +1060,7 @@ bool treeNode<Type>::findBox
|
||||
// Node
|
||||
const treeNode<Type>* subNodePtr = getNodePtr(octant);
|
||||
|
||||
if (subNodePtr->bb().intersects(box))
|
||||
if (subNodePtr->bb().overlaps(box))
|
||||
{
|
||||
// Visit sub node.
|
||||
changed |= subNodePtr->findBox(shapes, box, elements);
|
||||
@ -1071,7 +1071,7 @@ bool treeNode<Type>::findBox
|
||||
// Leaf: let leaf::find handle this
|
||||
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant);
|
||||
|
||||
if (subLeafPtr->bb().intersects(box))
|
||||
if (subLeafPtr->bb().overlaps(box))
|
||||
{
|
||||
// Visit sub leaf.
|
||||
changed |= subLeafPtr->findBox(shapes, box, elements);
|
||||
|
||||
@ -26,7 +26,6 @@ License
|
||||
|
||||
#include "searchableSphere.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "SortableList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -27,8 +27,6 @@ License
|
||||
#include "intersectedSurface.H"
|
||||
#include "surfaceIntersection.H"
|
||||
#include "faceList.H"
|
||||
#include "SortableList.H"
|
||||
#include "triSurfaceTools.H"
|
||||
#include "faceTriangulation.H"
|
||||
#include "treeBoundBox.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
@ -385,12 +385,12 @@ bool Foam::octreeDataTriSurface::overlaps
|
||||
const treeBoundBox& cubeBb
|
||||
) const
|
||||
{
|
||||
//return cubeBb.intersects(allBb_[index]);
|
||||
//return cubeBb.overlaps(allBb_[index]);
|
||||
|
||||
//- Exact test of triangle intersecting bb
|
||||
|
||||
// Quick rejection.
|
||||
if (!cubeBb.intersects(allBb_[index]))
|
||||
if (!cubeBb.overlaps(allBb_[index]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ bool Foam::treeLeaf<Foam::octreeDataTriSurface>::findNearest
|
||||
label faceI = indices_[i];
|
||||
|
||||
// Quick rejection test.
|
||||
if (tightest.intersects(allBb[faceI]))
|
||||
if (tightest.overlaps(allBb[faceI]))
|
||||
{
|
||||
// Full calculation
|
||||
scalar dist = shapes.calcNearest(faceI, sample, nearest);
|
||||
|
||||
@ -101,6 +101,7 @@ bool Foam::triangleFuncs::intersectAxesBundle
|
||||
// Since direction is coordinate axis there is no need to do projection,
|
||||
// we can directly check u,v components for inclusion in triangle.
|
||||
|
||||
scalar localScale = max(max(magSqr(V10), magSqr(V20)), 1.0);
|
||||
|
||||
// Get other components
|
||||
label i1 = (i0 + 1) % 3;
|
||||
@ -114,8 +115,11 @@ bool Foam::triangleFuncs::intersectAxesBundle
|
||||
|
||||
scalar det = v2*u1 - u2*v1;
|
||||
|
||||
// Fix for V0:(-31.71428 0 -15.10714) V10:(-1.285715 8.99165e-16 -1.142858) V20:(0 0 -1.678573) i0:0
|
||||
if (Foam::mag(det)/max(max(mag(V10),mag(V20)),1) < SMALL)
|
||||
// Fix for V0:(-31.71428 0 -15.10714)
|
||||
// V10:(-1.285715 8.99165e-16 -1.142858)
|
||||
// V20:(0 0 -1.678573)
|
||||
// i0:0
|
||||
if (Foam::mag(det)/localScale < SMALL)
|
||||
{
|
||||
// Triangle parallel to dir
|
||||
return false;
|
||||
@ -132,7 +136,7 @@ bool Foam::triangleFuncs::intersectAxesBundle
|
||||
scalar beta = 0;
|
||||
bool inter = false;
|
||||
|
||||
if (Foam::mag(u1) < SMALL)
|
||||
if (Foam::mag(u1)/localScale < SMALL)
|
||||
{
|
||||
beta = u0/u2;
|
||||
if ((beta >= 0) && (beta <= 1))
|
||||
|
||||
@ -107,18 +107,6 @@ combustionMixture::combustionMixture
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Error check for single component mixtures - should be uniform 1
|
||||
if (Y_.size() == 1)
|
||||
{
|
||||
if (average(Y_[0]).value() < 0.999)
|
||||
{
|
||||
FatalErrorIn("combustionMixture::combustionMixture")
|
||||
<< "Mass fraction for single component mixture must be unity"
|
||||
<< nl << "Please correct field: " << species_[0]
|
||||
<< " (Ydefault)" << nl << abort(FatalError);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -31,6 +31,7 @@ License
|
||||
#include "Time.H"
|
||||
#include "boundBox.H"
|
||||
#include "SortableList.H"
|
||||
#include "PackedList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -626,7 +627,7 @@ surfacePatchList triSurface::calcPatches(labelList& faceMap) const
|
||||
{
|
||||
sortedRegion[faceI] = operator[](faceI).region();
|
||||
}
|
||||
sortedRegion.stableSort();
|
||||
sortedRegion.sort();
|
||||
|
||||
faceMap = sortedRegion.indices();
|
||||
|
||||
@ -743,6 +744,26 @@ triSurface::triSurface
|
||||
{}
|
||||
|
||||
|
||||
triSurface::triSurface
|
||||
(
|
||||
List<labelledTri>& triangles,
|
||||
const geometricSurfacePatchList& patches,
|
||||
pointField& points,
|
||||
const bool reUse
|
||||
)
|
||||
:
|
||||
PrimitivePatch<labelledTri, ::Foam::List, pointField>
|
||||
(
|
||||
triangles,
|
||||
points,
|
||||
reUse
|
||||
),
|
||||
patches_(patches),
|
||||
sortedEdgeFacesPtr_(NULL),
|
||||
edgeOwnerPtr_(NULL)
|
||||
{}
|
||||
|
||||
|
||||
triSurface::triSurface
|
||||
(
|
||||
const List<labelledTri>& triangles,
|
||||
@ -1148,9 +1169,7 @@ triSurface triSurface::subsetMesh
|
||||
}
|
||||
|
||||
// Construct subsurface
|
||||
triSurface subSurface(newTriangles, patches(), newPoints);
|
||||
|
||||
return subSurface;
|
||||
return triSurface(newTriangles, patches(), newPoints, true);
|
||||
}
|
||||
|
||||
|
||||
@ -1187,30 +1206,36 @@ void triSurface::write(const Time& d) const
|
||||
|
||||
void triSurface::writeStats(Ostream& os) const
|
||||
{
|
||||
// Calculate bounding box without any additional addressing
|
||||
// Copy of treeBoundBox code. Cannot use meshTools from triSurface...
|
||||
// Unfortunately nPoints constructs meshPoints() so do compact version
|
||||
// ourselves.
|
||||
PackedList<1> pointIsUsed(points().size());
|
||||
pointIsUsed = 0U;
|
||||
|
||||
label nPoints = 0;
|
||||
boundBox bb
|
||||
(
|
||||
point(VGREAT, VGREAT, VGREAT),
|
||||
point(-VGREAT, -VGREAT, -VGREAT)
|
||||
);
|
||||
|
||||
forAll(*this, triI)
|
||||
{
|
||||
const labelledTri& f = operator[](triI);
|
||||
|
||||
forAll(f, fp)
|
||||
{
|
||||
const point& pt = points()[f[fp]];
|
||||
bb.min() = ::Foam::min(bb.min(), pt);
|
||||
bb.max() = ::Foam::max(bb.max(), pt);
|
||||
label pointI = f[fp];
|
||||
if (pointIsUsed.set(pointI, 1))
|
||||
{
|
||||
bb.min() = ::Foam::min(bb.min(), points()[pointI]);
|
||||
bb.max() = ::Foam::max(bb.max(), points()[pointI]);
|
||||
nPoints++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unfortunately nPoints constructs meshPoints() ...
|
||||
|
||||
os << "Triangles : " << size() << endl
|
||||
//<< "Edges : " << nEdges() << endl
|
||||
<< "Vertices : " << nPoints() << endl
|
||||
<< "Vertices : " << nPoints << endl
|
||||
<< "Bounding Box : " << bb << endl;
|
||||
}
|
||||
|
||||
|
||||
@ -36,9 +36,9 @@ SourceFiles
|
||||
#ifndef triSurface_H
|
||||
#define triSurface_H
|
||||
|
||||
#include "PrimitivePatch.H"
|
||||
#include "pointField.H"
|
||||
#include "labelledTri.H"
|
||||
#include "PrimitivePatch.H"
|
||||
#include "boolList.H"
|
||||
#include "geometricSurfacePatchList.H"
|
||||
#include "surfacePatchList.H"
|
||||
@ -215,6 +215,15 @@ public:
|
||||
const pointField&
|
||||
);
|
||||
|
||||
//- Construct from triangles, patches, points. Reuse storage.
|
||||
triSurface
|
||||
(
|
||||
List<labelledTri>&,
|
||||
const geometricSurfacePatchList&,
|
||||
pointField&,
|
||||
const bool reUse
|
||||
);
|
||||
|
||||
//- Construct from triangles, points. Set patchnames to default.
|
||||
triSurface(const List<labelledTri>&, const pointField&);
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ laminar/laminar.C
|
||||
kEpsilon/kEpsilon.C
|
||||
RNGkEpsilon/RNGkEpsilon.C
|
||||
realizableKE/realizableKE.C
|
||||
kOmega/kOmega.C
|
||||
kOmegaSST/kOmegaSST.C
|
||||
SpalartAllmaras/SpalartAllmaras.C
|
||||
LRR/LRR.C
|
||||
|
||||
268
src/turbulenceModels/RAS/incompressible/kOmega/kOmega.C
Normal file
268
src/turbulenceModels/RAS/incompressible/kOmega/kOmega.C
Normal file
@ -0,0 +1,268 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "kOmega.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "wallFvPatch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace incompressible
|
||||
{
|
||||
namespace RASModels
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
defineTypeNameAndDebug(kOmega, 0);
|
||||
addToRunTimeSelectionTable(RASModel, kOmega, dictionary);
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from components
|
||||
kOmega::kOmega
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi,
|
||||
transportModel& lamTransportModel
|
||||
)
|
||||
:
|
||||
RASModel(typeName, U, phi, lamTransportModel),
|
||||
|
||||
Cmu_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"betaStar",
|
||||
coeffDict_,
|
||||
0.09
|
||||
)
|
||||
),
|
||||
beta_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"beta",
|
||||
coeffDict_,
|
||||
0.072
|
||||
)
|
||||
),
|
||||
alphaK_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"alphaK",
|
||||
coeffDict_,
|
||||
0.5
|
||||
)
|
||||
),
|
||||
alphaOmega_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"alphaOmega",
|
||||
coeffDict_,
|
||||
0.5
|
||||
)
|
||||
),
|
||||
|
||||
omega0_("omega0", dimless/dimTime, SMALL),
|
||||
omegaSmall_("omegaSmall", dimless/dimTime, SMALL),
|
||||
|
||||
k_
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"k",
|
||||
runTime_.timeName(),
|
||||
mesh_,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh_
|
||||
),
|
||||
|
||||
omega_
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"omega",
|
||||
runTime_.timeName(),
|
||||
mesh_,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh_
|
||||
),
|
||||
|
||||
nut_(k_/(omega_ + omegaSmall_))
|
||||
{
|
||||
# include "kOmegaWallViscosityI.H"
|
||||
|
||||
printCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
tmp<volSymmTensorField> kOmega::R() const
|
||||
{
|
||||
return tmp<volSymmTensorField>
|
||||
(
|
||||
new volSymmTensorField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"R",
|
||||
runTime_.timeName(),
|
||||
mesh_,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
((2.0/3.0)*I)*k_ - nut_*twoSymm(fvc::grad(U_)),
|
||||
k_.boundaryField().types()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
tmp<volSymmTensorField> kOmega::devReff() const
|
||||
{
|
||||
return tmp<volSymmTensorField>
|
||||
(
|
||||
new volSymmTensorField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"devRhoReff",
|
||||
runTime_.timeName(),
|
||||
mesh_,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
-nuEff()*dev(twoSymm(fvc::grad(U_)))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
tmp<fvVectorMatrix> kOmega::divDevReff(volVectorField& U) const
|
||||
{
|
||||
return
|
||||
(
|
||||
- fvm::laplacian(nuEff(), U)
|
||||
- fvc::div(nuEff()*dev(fvc::grad(U)().T()))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool kOmega::read()
|
||||
{
|
||||
if (RASModel::read())
|
||||
{
|
||||
Cmu_.readIfPresent(coeffDict_);
|
||||
beta_.readIfPresent(coeffDict_);
|
||||
alphaK_.readIfPresent(coeffDict_);
|
||||
alphaOmega_.readIfPresent(coeffDict_);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void kOmega::correct()
|
||||
{
|
||||
transportModel_.correct();
|
||||
|
||||
if (!turbulence_)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RASModel::correct();
|
||||
|
||||
volScalarField G = nut_*2*magSqr(symm(fvc::grad(U_)));
|
||||
|
||||
# include "kOmegaWallFunctionsI.H"
|
||||
|
||||
// Turbulence specific dissipation rate equation
|
||||
tmp<fvScalarMatrix> omegaEqn
|
||||
(
|
||||
fvm::ddt(omega_)
|
||||
+ fvm::div(phi_, omega_)
|
||||
- fvm::Sp(fvc::div(phi_), omega_)
|
||||
- fvm::laplacian(DomegaEff(), omega_)
|
||||
==
|
||||
G*omega_/k_
|
||||
- fvm::Sp(beta_*omega_, omega_)
|
||||
);
|
||||
|
||||
omegaEqn().relax();
|
||||
|
||||
# include "wallOmegaI.H"
|
||||
|
||||
solve(omegaEqn);
|
||||
bound(omega_, omega0_);
|
||||
|
||||
|
||||
// Turbulent kinetic energy equation
|
||||
tmp<fvScalarMatrix> kEqn
|
||||
(
|
||||
fvm::ddt(k_)
|
||||
+ fvm::div(phi_, k_)
|
||||
- fvm::Sp(fvc::div(phi_), k_)
|
||||
- fvm::laplacian(DkEff(), k_)
|
||||
==
|
||||
G
|
||||
- fvm::Sp(Cmu_*omega_, k_)
|
||||
);
|
||||
|
||||
kEqn().relax();
|
||||
solve(kEqn);
|
||||
bound(k_, k0_);
|
||||
|
||||
|
||||
// Re-calculate viscosity
|
||||
nut_ = k_/omega_;
|
||||
|
||||
# include "kOmegaWallViscosityI.H"
|
||||
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace RASModels
|
||||
} // End namespace incompressible
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
205
src/turbulenceModels/RAS/incompressible/kOmega/kOmega.H
Normal file
205
src/turbulenceModels/RAS/incompressible/kOmega/kOmega.H
Normal file
@ -0,0 +1,205 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::incompressible::RASModels::kOmega
|
||||
|
||||
Description
|
||||
Standard high Reynolds-number k-omega turbulence model for
|
||||
incompressible flows.
|
||||
|
||||
References:
|
||||
@verbatim
|
||||
"Turbulence Modeling for CFD"
|
||||
D. C. Wilcox,
|
||||
DCW Industries, Inc., La Canada,
|
||||
California, 1998.
|
||||
@endverbatim
|
||||
|
||||
The default model coefficients correspond to the following:
|
||||
@verbatim
|
||||
kOmegaCoeffs
|
||||
{
|
||||
Cmu 0.09; // Equivalent to betaStar
|
||||
beta 0.072;
|
||||
alphak 0.5;
|
||||
alphaOmega 0.5;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
SourceFiles
|
||||
kOmega.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef kOmega_H
|
||||
#define kOmega_H
|
||||
|
||||
#include "RASModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace incompressible
|
||||
{
|
||||
namespace RASModels
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class kOmega Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class kOmega
|
||||
:
|
||||
public RASModel
|
||||
{
|
||||
// Private data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
dimensionedScalar Cmu_;
|
||||
dimensionedScalar beta_;
|
||||
dimensionedScalar alphaK_;
|
||||
dimensionedScalar alphaOmega_;
|
||||
|
||||
|
||||
dimensionedScalar omega0_;
|
||||
dimensionedScalar omegaSmall_;
|
||||
|
||||
|
||||
// Fields
|
||||
|
||||
volScalarField k_;
|
||||
volScalarField omega_;
|
||||
volScalarField nut_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("kOmega");
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
kOmega
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi,
|
||||
transportModel& transport
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
~kOmega()
|
||||
{}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return the turbulence viscosity
|
||||
tmp<volScalarField> nut() const
|
||||
{
|
||||
return nut_;
|
||||
}
|
||||
|
||||
//- Return the effective diffusivity for k
|
||||
tmp<volScalarField> DkEff() const
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField("DkEff", alphaK_*nut_ + nu())
|
||||
);
|
||||
}
|
||||
|
||||
//- Return the effective diffusivity for omega
|
||||
tmp<volScalarField> DomegaEff() const
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField("DomegaEff", alphaOmega_*nut_ + nu())
|
||||
);
|
||||
}
|
||||
|
||||
//- Return the turbulence kinetic energy
|
||||
tmp<volScalarField> k() const
|
||||
{
|
||||
return k_;
|
||||
}
|
||||
|
||||
//- Return the turbulence specific dissipation rate
|
||||
tmp<volScalarField> omega() const
|
||||
{
|
||||
return omega_;
|
||||
}
|
||||
|
||||
//- Return the turbulence kinetic energy dissipation rate
|
||||
tmp<volScalarField> epsilon() const
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"epsilon",
|
||||
mesh_.time().timeName(),
|
||||
mesh_
|
||||
),
|
||||
Cmu_*k_*omega_,
|
||||
omega_.boundaryField().types()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//- Return the Reynolds stress tensor
|
||||
tmp<volSymmTensorField> R() const;
|
||||
|
||||
//- Return the effective stress tensor including the laminar stress
|
||||
tmp<volSymmTensorField> devReff() const;
|
||||
|
||||
//- Return the source term for the momentum equation
|
||||
tmp<fvVectorMatrix> divDevReff(volVectorField& U) const;
|
||||
|
||||
//- Solve the turbulence equations and correct the turbulence viscosity
|
||||
void correct();
|
||||
|
||||
//- Read turbulenceProperties dictionary
|
||||
bool read();
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace RASModels
|
||||
} // End namespace incompressible
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,125 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Global
|
||||
kOmegaWallFunctions
|
||||
|
||||
Description
|
||||
Calculate wall generation and frequency omega from wall-functions.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
{
|
||||
labelList cellBoundaryFaceCount(omega_.size(), 0);
|
||||
|
||||
scalar Cmu25 = pow(Cmu_.value(), 0.25);
|
||||
|
||||
const fvPatchList& patches = mesh_.boundary();
|
||||
|
||||
//- Initialise the near-wall omega and G fields to zero
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const fvPatch& curPatch = patches[patchi];
|
||||
|
||||
if (isType<wallFvPatch>(curPatch))
|
||||
{
|
||||
forAll(curPatch, facei)
|
||||
{
|
||||
label faceCelli = curPatch.faceCells()[facei];
|
||||
|
||||
omega_[faceCelli] = 0.0;
|
||||
G[faceCelli] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- Accumulate the wall face contributions to omega and G
|
||||
// Increment cellBoundaryFaceCount for each face for averaging
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const fvPatch& curPatch = patches[patchi];
|
||||
|
||||
if (isType<wallFvPatch>(curPatch))
|
||||
{
|
||||
# include "checkkOmegaPatchFieldTypes.H"
|
||||
|
||||
const scalarField& nuw = nu().boundaryField()[patchi];
|
||||
const scalarField& nutw = nut_.boundaryField()[patchi];
|
||||
|
||||
scalarField magFaceGradU =
|
||||
mag(U_.boundaryField()[patchi].snGrad());
|
||||
|
||||
forAll(curPatch, facei)
|
||||
{
|
||||
label faceCelli = curPatch.faceCells()[facei];
|
||||
|
||||
scalar yPlus =
|
||||
Cmu25*y_[patchi][facei]
|
||||
*sqrt(k_[faceCelli])
|
||||
/nuw[facei];
|
||||
|
||||
// For corner cells (with two boundary or more faces),
|
||||
// omega and G in the near-wall cell are calculated
|
||||
// as an average
|
||||
|
||||
cellBoundaryFaceCount[faceCelli]++;
|
||||
|
||||
omega_[faceCelli] +=
|
||||
sqrt(k_[faceCelli])
|
||||
/(Cmu25*kappa_.value()*y_[patchi][facei]);
|
||||
|
||||
if (yPlus > yPlusLam_)
|
||||
{
|
||||
G[faceCelli] +=
|
||||
(nutw[facei] + nuw[facei])
|
||||
*magFaceGradU[facei]
|
||||
*Cmu25*sqrt(k_[faceCelli])
|
||||
/(kappa_.value()*y_[patchi][facei]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Perform the averaging
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const fvPatch& curPatch = patches[patchi];
|
||||
|
||||
if (isType<wallFvPatch>(curPatch))
|
||||
{
|
||||
forAll(curPatch, facei)
|
||||
{
|
||||
label faceCelli = curPatch.faceCells()[facei];
|
||||
|
||||
omega_[faceCelli] /= cellBoundaryFaceCount[faceCelli];
|
||||
G[faceCelli] /= cellBoundaryFaceCount[faceCelli];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,70 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Global
|
||||
kOmegaWallViscosity
|
||||
|
||||
Description
|
||||
Calculate wall viscosity from wall-functions.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
{
|
||||
scalar Cmu25 = pow(Cmu_.value(), 0.25);
|
||||
|
||||
const fvPatchList& patches = mesh_.boundary();
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const fvPatch& curPatch = patches[patchi];
|
||||
|
||||
if (isType<wallFvPatch>(curPatch))
|
||||
{
|
||||
const scalarField& nuw = nu().boundaryField()[patchi];
|
||||
scalarField& nutw = nut_.boundaryField()[patchi];
|
||||
|
||||
forAll(curPatch, facei)
|
||||
{
|
||||
label faceCelli = curPatch.faceCells()[facei];
|
||||
|
||||
scalar yPlus =
|
||||
Cmu25*y_[patchi][facei]*sqrt(k_[faceCelli])/nuw[facei];
|
||||
|
||||
if (yPlus > yPlusLam_)
|
||||
{
|
||||
nutw[facei] =
|
||||
nuw[facei]
|
||||
*(yPlus*kappa_.value()/log(E_.value()*yPlus) - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
nutw[facei] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
51
src/turbulenceModels/RAS/incompressible/kOmega/wallOmegaI.H
Normal file
51
src/turbulenceModels/RAS/incompressible/kOmega/wallOmegaI.H
Normal file
@ -0,0 +1,51 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 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, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Global
|
||||
wallOmega
|
||||
|
||||
Description
|
||||
Set wall dissipation in the omega matrix
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
{
|
||||
const fvPatchList& patches = mesh_.boundary();
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const fvPatch& p = patches[patchi];
|
||||
|
||||
if (isType<wallFvPatch>(p))
|
||||
{
|
||||
omegaEqn().setValues
|
||||
(
|
||||
p.faceCells(),
|
||||
omega_.boundaryField()[patchi].patchInternalField()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -238,6 +238,7 @@ public:
|
||||
return k_;
|
||||
}
|
||||
|
||||
//- Return the turbulence specific dissipation rate
|
||||
tmp<volScalarField> omega() const
|
||||
{
|
||||
return omega_;
|
||||
|
||||
@ -22,7 +22,7 @@ dictionaryReplacement
|
||||
inlet
|
||||
{
|
||||
type directMappedPatch;
|
||||
offset (0.05 0 0);
|
||||
offset (0.0495 0 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user