Merge branch 'master' into molecularDynamics

This commit is contained in:
graham
2008-09-08 17:50:47 +01:00
93 changed files with 2358 additions and 1153 deletions

4
README
View File

@ -2,9 +2,9 @@
# #
#+TITLE: *OpenFOAM README for version 1.5* #+TITLE: *OpenFOAM README for version 1.5*
#+AUTHOR: OpenCFD Ltd. #+AUTHOR: OpenCFD Ltd.
#+DATE: 14 July 2008 #+DATE: 26 August 2008
#+LINK: http://www.opencfd.co.uk #+LINK: http://www.opencfd.co.uk
#+OPTIONS: author:nil #+OPTIONS: author:nil ^:{}
* Copyright * Copyright
OpenFOAM is free software; you can redistribute it and/or modify it under the OpenFOAM is free software; you can redistribute it and/or modify it under the

View File

@ -1,42 +1,26 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" OpenFOAM README for version 1.5
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 1 Copyright
lang="en" xml:lang="en">
<head> OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
<title><b>OpenFOAM README for version 1.5</b></title> as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/> See the file COPYING in this directory, for a description of the GNU General Public License terms under which you can
<meta name="generator" content="Org-mode"/> copy the files.
<meta name="generated" content="14 July 2008"/>
<meta name="author" content="OpenCFD Ltd."/> 2 System requirements
<style type="text/css">
html { OpenFOAM is developed and tested on Linux, but should work with other Unix style systems. To check your system setup,
font-family: Times, serif; execute the foamSystemCheck script in the bin/ directory of the OpenFOAM installation. If no problems are reported,
font-size: 12pt; proceed to "3. Installation"; otherwise contact your system administrator.
}
.title { text-align: center; } If the user wishes to run OpenFOAM in 32/64-bit mode they should consult the section "Running OpenFOAM in 32-bit mode".
.todo { color: red; }
.done { color: green; } 2.1 Qt (from http://trolltech.com/products/qt)
.timestamp { color: grey }
.timestamp-kwd { color: CadetBlue } The ParaView 3.3 visualisation package requires that Qt version 4.3.x MUST be installed on the system. Earlier or more
.tag { background-color:lightblue; font-weight:normal } recent versions (4.2.x or 4.4.x) will NOT work. To check whether Qt4 is installed, and the version, type:
.target { }
pre { * qmake <div id="table-of-contents">
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">
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
@ -62,384 +46,152 @@ lang="en" xml:lang="en">
</ul> </ul>
</div> </div>
</div> </div>
version
<div id="outline-container-1" class="outline-2"> The ParaView binary executables in the ThirdParty distribution will only work with PRECISELY the same version of Qt
<h2 id="sec-1">1 Copyright</h2> with which it was compiled. The 64-bit version of ParaView was compiled with Qt-4.3.1 (with openSuSE-10.3) and the
<div id="text-1"> 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 &ndash;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. 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> * ubuntu-7.10: Version 4.3.2
</ul> * 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 Compilation and running of ParaView has been successful using the libraries downloaded in the "libqt4-dev" package on
downloaded in the "libqt4-dev" package on ubuntu. 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>
</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"> 3 Installation
<h2 id="sec-3">3 Installation</h2>
<div id="text-3">
<p>Download and unpack the files in the $HOME/OpenFOAM directory as described in: Download and unpack the files in the $HOME/OpenFOAM directory as described in: http://www.OpenFOAM.org/download.html
<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-&lt;VERSION&gt;/etc/
</li>
<li>
where &lt;VERSION&gt; corresponds to the version 1.4, 1.5, &hellip;
</li> The environment variable settings are contained in files in an etc/ directory in the OpenFOAM release. e.g. in
<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:
<ul> * $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/
<li> * where <VERSION> corresponds to the version 1.4, 1.5, …
. $HOME/OpenFOAM/OpenFOAM-&lt;VERSION&gt;/etc/bashrc
</li> * EITHER, if running bash or ksh (if in doubt type 'echo $SHELL'), source the etc/bashrc file by adding the following
</ul> line to the end of your $HOME/.bashrc file:
<p>Then update the environment variables by sourcing the $HOME/.bashrc file by + . $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/bashrc
typing in the terminal:
</p>
<ul>
<li>
. $HOME/.bashrc
</li> Then update the environment variables by sourcing the $HOME/.bashrc file by typing in the terminal:
</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:
<ul> + . $HOME/.bashrc
<li>
source $HOME/OpenFOAM/OpenFOAM-&lt;VERSION&gt;/etc/cshrc
</li> * OR, if running tcsh or csh, source the etc/cshrc file by adding the following line to the end of your $HOME/.cshrc
</ul> file:
<p>Then update the environment variables by sourcing the $HOME/.cshrc file by + source $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/cshrc
typing in the terminal:
</p>
<ul>
<li>
source $HOME/.cshrc
</li> Then update the environment variables by sourcing the $HOME/.cshrc file by typing in the terminal:
</ul>
</li>
</ul>
</div> + source $HOME/.cshrc
<div id="outline-container-3.1" class="outline-3"> 3.1 Installation in alternative locations
<h3 id="sec-3.1">3.1 Installation in alternative locations</h3>
<div id="text-3.1">
<p>OpenFOAM may also be installed in alternative locations. However, the OpenFOAM may also be installed in alternative locations. However, the installation directory should be network
installation directory should be network available (e.g., NFS) if parallel available (e.g., NFS) if parallel calculations are planned.
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-&lt;VERSION&gt;/etc/bashrc
</li>
<li>
[ -f $foamDotFile ] &amp;&amp; . $foamDotFile
</li> The environment variable 'FOAM_INST_DIR' can be used to find and source the appropriate resource file. Here is a bash/
</ul> ksh/sh example:
<p>and a csh/tcsh example: * export FOAM_INST_DIR=/data/app/OpenFOAM
</p> * foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
<ul> * [ -f $foamDotFile ] && . $foamDotFile
<li>
setenv FOAM_INST_DIR /data/app/OpenFOAM
</li>
<li>
foamDotFile=$FOAM_INST_DIR/OpenFOAM-&lt;VERSION&gt;/etc/bashrc
</li>
<li>
if ( -f $foamDotFile ) source $foamDotFile
</li> and a csh/tcsh example:
</ul>
<p>The value set in '$FOAM_INST_DIR' will be used to locate the remaining parts * setenv FOAM_INST_DIR /data/app/OpenFOAM
of the OpenFOAM installation. * foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
</p> * if ( -f $foamDotFile ) source $foamDotFile
</div>
</div>
</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"> 4 Building from Sources (Optional)
<h2 id="sec-4">4 Building from Sources (Optional)</h2>
<div id="text-4">
<p>If you cannot find an appropriate binary pack for your platform, you can build If you cannot find an appropriate binary pack for your platform, you can build the complete OpenFOAM from the
the complete OpenFOAM from the source-pack. You will first need to compile or source-pack. You will first need to compile or obtain a recent version of gcc (we recomend gcc-4.3.?) for your
obtain a recent version of gcc (we recomend gcc-4.3.?) for your platform, platform, which may be obtained from http://gcc.gnu.org/.
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-&lt;GCC_VERSION&gt;/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 &lt;enquiries@OpenCFD.co.uk&gt; to negotiate a support
contract and we will do the port and maintain it for future releases.
</p>
</div>
</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"> Now go to the top-level source directory $WM_PROJECT_DIR and execute the top-level build script './Allwmake'. In
<h2 id="sec-5">5 Testing the installation</h2> principle this will build everything, but if problems occur with the build order it may be necessary to update the
<div id="text-5"> 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 5 Testing the installation
(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>
</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"> 6 Getting Started
<h2 id="sec-6">6 Getting Started</h2>
<div id="text-6">
<p>Create a project directory within the $HOME/OpenFOAM directory named Create a project directory within the $HOME/OpenFOAM directory named <USER>-<VERSION> (e.g. 'chris-1.5' for user chris
&lt;USER&gt;-&lt;VERSION&gt; (e.g. 'chris-1.5' for user chris and OpenFOAM version 1.5) and OpenFOAM version 1.5) and create a directory named 'run' within it, e.g. by typing:
and create a directory named 'run' within it, e.g. by typing:
</p>
<ul>
<li>
mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
</li> * mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
</ul>
<p>Copy the 'tutorial' examples directory in the OpenFOAM distribution to the Copy the 'tutorial' examples directory in the OpenFOAM distribution to the 'run' directory. If the OpenFOAM environment
'run' directory. If the OpenFOAM environment variables are set correctly, variables are set correctly, then the following command will be correct:
then the following command will be correct:
</p>
<ul>
<li>
cp -r $WM_PROJECT_DIR/tutorials
$HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
</li> * cp -r $WM_PROJECT_DIR/tutorials $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
</ul>
<p>Run the first example case of incompressible laminar flow in a cavity: 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
</li> * cd $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run/tutorials/icoFoam/cavity
</ul> * blockMesh
</div> * icoFoam
* paraFoam
</div> 7 Compiling Paraview 3.3 and the PV3FoamReader module
<div id="outline-container-7" class="outline-2"> A version of Qt 4.3.x must be installed to compile ParaView. The compilation is a fairly simple process using the
<h2 id="sec-7">7 Compiling Paraview 3.3 and the PV3FoamReader module</h2> supplied buildParaView3.3-cvs script that has worked is our tests with other packages supplied in the ThirdParty
<div id="text-7">
<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: 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
</li> * cd $FOAM_INST_DIR/ThirdParty
</ul> * rm -rf ParaView3.3-cvs/platforms
* buildParaView3.3-cvs
<p>The PV3FoamReader module is an OpenFOAM utility that can be compiled in the The PV3FoamReader module is an OpenFOAM utility that can be compiled in the usual manner as follows:
usual manner as follows:
</p><ul>
<li>
cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader
</li>
<li>
./Allwclean
</li>
<li>
./Allwmake
</li> * cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader
</ul> * ./Allwclean
</div> * ./Allwmake
</div> 8 Documentation
<div id="outline-container-8" class="outline-2"> http://www.OpenFOAM.org/doc
<h2 id="sec-8">8 Documentation</h2>
<div id="text-8">
<p><a href="http://www.OpenFOAM.org/doc">http://www.OpenFOAM.org/doc</a> 9 Help
</p>
</div>
</div> http://www.OpenFOAM.org http://www.OpenFOAM.org/discussion.html
<div id="outline-container-9" class="outline-2"> 10 Reporting Bugs in OpenFOAM
<h2 id="sec-9">9 Help</h2>
<div id="text-9">
<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> http://www.OpenFOAM.org/bugs.html
</p>
</div>
</div> 11 Running OpenFOAM in 32-bit mode on 64-bit machines
<div id="outline-container-10" class="outline-2"> Linux users with a 64-bit machine may install either the OpenFOAM 32-bit version (linux) or the OpenFOAM 64-bit version
<h2 id="sec-10">10 Reporting Bugs in OpenFOAM</h2> (linux64), or both. The 64-bit is the default mode on a 64-bit machine. To use an installed 32-bit version, the user
<div id="text-10"> must set the environment variable WM_ARCH_OPTION to 32 before sourcing the etc/bashrc (or etc/cshrc) file.
<p><a href="http://www.OpenFOAM.org/bugs.html">http://www.OpenFOAM.org/bugs.html</a> Date: 26 August 2008
</p>
</div>
</div> HTML generated by org-mode 6.06b in emacs 23
<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>

View File

@ -2,9 +2,9 @@
# #
#+TITLE: *OpenFOAM release notes for version 1.5* #+TITLE: *OpenFOAM release notes for version 1.5*
#+AUTHOR: OpenCFD Ltd. #+AUTHOR: OpenCFD Ltd.
#+DATE: 14 July 2008 #+DATE: 26 August 2008
#+LINK: http://www.opencfd.co.uk #+LINK: http://www.opencfd.co.uk
#+OPTIONS: author:nil #+OPTIONS: author:nil ^:{}
* Overview * Overview
OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are

View File

@ -1,42 +1,27 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" OpenFOAM release notes for version 1.5
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 1 Overview
lang="en" xml:lang="en">
<head> OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are
<title><b>OpenFOAM release notes for version 1.5</b></title> outlined below. This release passes all our standard tests and the tutorials
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/> have been broadly checked. If there are any bugs, please report them using the
<meta name="generator" content="Org-mode"/> instructions set out in: http://www.openfoam.org/bugs.html.
<meta name="generated" content="14 July 2008"/>
<meta name="author" content="OpenCFD Ltd."/> Most of the developments for this release are in: new applications, e.g. for
<style type="text/css"> multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed
html { flows and even molecular dynamics; new utilities, e.g. for meshing and case
font-family: Times, serif; monitoring; and, new modelling, e.g. in Lagrangian particle tracking,
font-size: 12pt; radiation and rotating frames of reference. With these new applications come
} numerous new example cases.
.title { text-align: center; }
.todo { color: red; } 2 GNU/Linux version
.done { color: green; }
.timestamp { color: grey } The 64bit binary packs of the OpenFOAM release were compiled on a machine
.timestamp-kwd { color: CadetBlue } running SuSE GNU/Linux version 10.3 and the 32bit on a machine running Ubuntu
.tag { background-color:lightblue; font-weight:normal } GNU/Linux version 7.1 and also tested on Ubuntu 8.04. We recommend that users
.target { } run OpenFOAM on one of these or a similar recent version of GNU/Linux. This
pre { release has also been successfully compiled and tested on older GNU/Linux
border: 1pt solid #AEBDCC; releases but this re<div id="table-of-contents">
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">
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
@ -54,376 +39,170 @@ lang="en" xml:lang="en">
</ul> </ul>
</div> </div>
</div> </div>
quires the installation of Qt 4.3.? for ParaView-3 to run.
<div id="outline-container-1" class="outline-2"> 3 C++ Compiler version
<h2 id="sec-1">1 Overview</h2>
<div id="text-1">
<p>OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are * Released compiled with GCC 4.3.1, the latest version.
outlined below. This release passes all our standard tests and the tutorials * Built in support for the Intel C++ 10.? compiler (untested).
have been broadly checked. If there are any bugs, please report them using * The choice of the compiler is controlled by the setting of the
the instructions set out in: <a href="http://www.openfoam.org/bugs.html">http://www.openfoam.org/bugs.html</a>. $WM_COMPILER and $WM_COMPILER_ARCH environment variables in the
</p> OpenFOAM-1.5/etc/bashrc (or cshrc) file.
<p> * The location of the installation of the compiler is controlled by the
Most of the developments for this release are in: new applications, e.g. for $WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh
multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed (or settings.csh) file.
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>
</div> 4 Developments to solvers (applications)
<div id="outline-container-2" class="outline-2"> * New rhoCentralFoam solver for high-speed, viscous, compressible flows
<h2 id="sec-2">2 GNU/Linux version</h2> using non-oscillatory, central-upwind schemes.
<div id="text-2"> * 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 5 Automatic mesher
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>
</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"> 6 Developments to utilities
<h2 id="sec-3">3 C++ Compiler version</h2>
<div id="text-3">
<ul> * New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D
<li> meshes are described by faces with 2 points, so can be used in combination
Released compiled with GCC 4.3.1, the latest version. with 2D meshes converted with ccm26ToFoam.
</li> * New couplePatches functionality integrated into createPatch, which
<li> optionally synchronises ("couples") points and faces of coupled (cyclic,
Built in support for the Intel C++ 10.? compiler (untested). processor) patches.
</li> * New applyBoundaryLayer pre-processing utility to apply 1/7th power-law
<li> boundary layers at walls, starting from uniform or potential flow
The choice of the compiler is controlled by the setting of the $WM_COMPILER solutions.
and $WM_COMPILER_ARCH environment variables in the OpenFOAM-1.5/etc/bashrc * New execFlowFunctionObjects utility executes functionObjects as a
(or cshrc) file. post-processing activity, e.g. probes, sampling, force calculation.
</li> * New changeDictionary utility makes batch changes to OpenFOAM input files,
<li> e.g. to change boundary conditions of field files.
The location of the installation of the compiler is controlled by the * New foamCalc utility, a generic post-processing field calculator tool
$WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh * New molConfig pre-processing utility for molecular dynamics cases. Fills
(or settings.csh) file. 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> 7 Migration from ParaView 2.4 to ParaView 3.x
</ul>
</div>
</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"> 8 Model development
<h2 id="sec-4">4 Developments to solvers (applications)</h2>
<div id="text-4">
<ul> * Overhauled the lagrangian library to support multiple clouds.
<li> * New lagrangianIntermediate library incorporating a hierarchy of parcel and
New rhoCentralFoam solver for high-speed, viscous, compressible flows using cloud types, accommodating kinematic, thermodynamic and reacting
non-oscillatory, central-upwind schemes. applications, including coupling to the new radiation library. Sub-models
</li> are added at the relevant level of physics, e.g.:
<li> + kinematic: injection, wall interaction, drag, dispersion;
New interDyMFoam solver for 2 incompressible, isothermal, immiscible fluids + thermo: heat transfer;
using a VoF phase-fraction based interface capturing approach, with optional + reacting: reacting composition, mass transfer, surface reactions.
mesh motion and mesh topology changes including adaptive mesh * New single rotating frame of reference (SRF) library for rotating flow
(un)refinement. Useful for simulations such as tank filling, sloshing --- applications, e.g. turbo-machinery.
using solid body motion e.g. SDA or SKA (6DoF) &mdash; and slamming (using the * New radiation library including the P1 model and associated Marshak
mesh motion solver) and other large-scale applications that benefit from the boundary conditions for incident radiation.
efficiency gain of adaptive mesh (un)refinement of the interface. * New displacementInterpolation motion solver for flexible mesh scaling.
</li> * New molecularDynamics Lagrangian library to calculate intermolecular
<li> forces between spherically symmetrical monatomic species in arbitrary
New compressibleInterFoam solver for 2 compressible, isothermal, immiscible geometries.
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.
</li> 9 New functionObjects
</ul>
</div>
</div> To aid common monitoring and post-processing activities.
<div id="outline-container-5" class="outline-2"> * forces: calculate the force and moment on a patch or set of patches, e.g.
<h2 id="sec-5">5 Automatic mesher</h2> to calculate the lift, drag and moment of an object in the flow.
<div id="text-5"> * 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 10 Improvements to boundary conditions
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>
</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"> 11 Other
<h2 id="sec-6">6 Developments to utilities</h2>
<div id="text-6">
<ul> * New argument-free command execution, e.g typing "icoFoam" without root and
<li> case directory arguments.
New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D meshes * Extended time command line options.
are described by faces with 2 points, so can be used in combination with 2D * Many enhancements to dictionary including macro substitution, optional
meshes converted with ccm26ToFoam. merging and default/overwrite behaviour, enhanced "#include" file handling
</li> and the framework to support function evaluation.
<li> * Cross-links between applications and Doxygen documentation with the "-doc"
New couplePatches functionality integrated into createPatch, which argument.
optionally synchronises ("couples") points and faces of coupled (cyclic, * Non-blocking, non-buffered, parallel transfers with potential scaling
processor) patches. benefits for larger number of processors.
</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.
</li> Date: 26 August 2008
</ul>
</div>
</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>

View File

@ -0,0 +1,3 @@
kinematicParcelFoam.C
EXE = $(FOAM_USER_APPBIN)/kinematicParcelFoam

View File

@ -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

View File

@ -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
);

View File

@ -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);
}
// ************************************************************************* //

View File

@ -16,12 +16,13 @@ if (transonic)
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{ {
fvScalarMatrix pEqn0 fvScalarMatrix pEqn
( (
fvm::div(phid, p) fvm::div(phid, p)
- fvm::laplacian(rho*rUA, p) - fvm::laplacian(rho*rUA, p)
); );
fvScalarMatrix pEqn = pEqn0;
// Relax the pressure equation to ensure diagonal-dominance
pEqn.relax(mesh.relaxationFactor("pEqn")); pEqn.relax(mesh.relaxationFactor("pEqn"));
pEqn.setReference(pRefCell, pRefValue); pEqn.setReference(pRefCell, pRefValue);
@ -39,14 +40,13 @@ if (transonic)
if (nonOrth == nNonOrthCorr) if (nonOrth == nNonOrthCorr)
{ {
phi == pEqn0.flux(); phi == pEqn.flux();
} }
} }
} }
else else
{ {
phi = fvc::interpolate(rho)*(fvc::interpolate(U) & mesh.Sf()); phi = fvc::interpolate(rho)*(fvc::interpolate(U) & mesh.Sf());
//phi = fvc::interpolate(rho*U) & mesh.Sf();
closedVolume = adjustPhi(phi, U, p); closedVolume = adjustPhi(phi, U, p);
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
@ -58,7 +58,7 @@ else
pEqn.setReference(pRefCell, pRefValue); pEqn.setReference(pRefCell, pRefValue);
// retain the residual from the first iteration // Retain the residual from the first iteration
if (nonOrth == 0) if (nonOrth == 0)
{ {
eqnResidual = pEqn.solve().initialResidual(); eqnResidual = pEqn.solve().initialResidual();

View File

@ -1,4 +1,6 @@
EXE_INC = \ EXE_INC = \
-I../rasInterFoam \
-I../interFoam \
-I$(LIB_SRC)/transportModels \ -I$(LIB_SRC)/transportModels \
-I$(LIB_SRC)/transportModels/incompressible/lnInclude \ -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
-I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \ -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \

View File

@ -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()
)
);
}

View File

@ -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;
}

View File

@ -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;

View File

@ -41,7 +41,6 @@ Description
#include "twoPhaseMixture.H" #include "twoPhaseMixture.H"
#include "incompressible/RASModel/RASModel.H" #include "incompressible/RASModel/RASModel.H"
#include "probes.H" #include "probes.H"
#include "EulerDdtScheme.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -504,7 +504,7 @@ int main(int argc, char *argv[])
!bbsTargetSet[procITarget] !bbsTargetSet[procITarget]
|| ( || (
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(); bbsTarget[procITarget] = meshTarget.bounds();
bbsTargetSet[procITarget] = true; bbsTargetSet[procITarget] = true;
if (bbsTarget[procITarget].intersects(bbSource)) if (bbsTarget[procITarget].overlaps(bbSource))
{ {
if (consistent) if (consistent)
{ {

View File

@ -86,28 +86,7 @@ void Foam::SortableList<Type>::sort()
indices_[i] = i; indices_[i] = i;
} }
Foam::sort(indices_, less(*this)); //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::stableSort(indices_, less(*this)); Foam::stableSort(indices_, less(*this));
List<Type> tmpValues(this->size()); List<Type> tmpValues(this->size());

View File

@ -109,12 +109,9 @@ public:
//- Size the list. If grow can cause undefined indices (until next sort) //- Size the list. If grow can cause undefined indices (until next sort)
void setSize(const label); void setSize(const label);
//- Sort the list (if changed after construction time) //- (stable) sort the list (if changed after construction time)
void sort(); void sort();
//- Sort the list (if changed after construction time)
void stableSort();
// Member Operators // Member Operators

View File

@ -118,7 +118,7 @@ public:
// Query // Query
//- Intersects other boundingbox? //- Intersects other boundingbox?
bool intersects(const boundBox& bb) const bool overlaps(const boundBox& bb) const
{ {
if if
( (

View File

@ -31,7 +31,11 @@ License
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * 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 // Communications: send and receive processor
List<labelPair> allComms; List<labelPair> allComms;
@ -40,16 +44,16 @@ void Foam::mapDistribute::calcSchedule() const
HashSet<labelPair, labelPair::Hash<> > commsSet(Pstream::nProcs()); HashSet<labelPair, labelPair::Hash<> > commsSet(Pstream::nProcs());
// Find what communication is required // Find what communication is required
forAll(subMap_, procI) forAll(subMap, procI)
{ {
if (procI != Pstream::myProcNo()) if (procI != Pstream::myProcNo())
{ {
if (subMap_[procI].size() > 0) if (subMap[procI].size() > 0)
{ {
// I need to send to procI // I need to send to procI
commsSet.insert(labelPair(Pstream::myProcNo(), procI)); commsSet.insert(labelPair(Pstream::myProcNo(), procI));
} }
if (constructMap_[procI].size() > 0) if (constructMap[procI].size() > 0)
{ {
// I need to receive from procI // I need to receive from procI
commsSet.insert(labelPair(procI, Pstream::myProcNo())); commsSet.insert(labelPair(procI, Pstream::myProcNo()));
@ -120,13 +124,7 @@ void Foam::mapDistribute::calcSchedule() const
); );
// Processors involved in my schedule // Processors involved in my schedule
schedulePtr_.reset return IndirectList<labelPair>(allComms, mySchedule);
(
new List<labelPair>
(
IndirectList<labelPair>(allComms, mySchedule)
)
);
//if (debug) //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 * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
//- Construct from components //- Construct from components
@ -257,13 +271,4 @@ Foam::mapDistribute::mapDistribute
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -36,6 +36,8 @@ Note:
Schedule is a list of processor pairs (one send, one receive. One of 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. them will be myself) which forms a scheduled (i.e. non-buffered) exchange.
See distribute on how to use it. 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 SourceFiles
@ -80,8 +82,6 @@ class mapDistribute
// Private Member Functions // Private Member Functions
void calcSchedule() const;
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
mapDistribute(const mapDistribute&); mapDistribute(const mapDistribute&);
@ -142,15 +142,15 @@ public:
return constructMap_; return constructMap_;
} }
//- Calculate a schedule. See above.
static List<labelPair> schedule
(
const labelListList& subMap,
const labelListList& constructMap
);
//- Return a schedule. Demand driven. See above. //- Return a schedule. Demand driven. See above.
const List<labelPair>& schedule() const const List<labelPair>& schedule() const;
{
if (!schedulePtr_.valid())
{
calcSchedule();
}
return schedulePtr_();
}
// Other // Other

View File

@ -48,15 +48,28 @@ void Foam::mapDistribute::distribute
// Send sub field to neighbour // Send sub field to neighbour
for (label domain = 0; domain < Pstream::nProcs(); domain++) 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); OPstream toNbr(Pstream::blocking, domain);
toNbr << IndirectList<T>(field, subMap[domain])(); toNbr << subField;
} }
} }
// Subset myself // 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) // Receive sub field from myself (subField)
const labelList& map = constructMap[Pstream::myProcNo()]; const labelList& map = constructMap[Pstream::myProcNo()];
@ -71,7 +84,11 @@ void Foam::mapDistribute::distribute
// Receive sub field from neighbour // Receive sub field from neighbour
for (label domain = 0; domain < Pstream::nProcs(); domain++) 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); IPstream fromNbr(Pstream::blocking, domain);
List<T> subField(fromNbr); List<T> subField(fromNbr);
@ -93,7 +110,13 @@ void Foam::mapDistribute::distribute
List<T> newField(constructSize); List<T> newField(constructSize);
// Subset myself // 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) // Receive sub field from myself (subField)
const labelList& map = constructMap[Pstream::myProcNo()]; const labelList& map = constructMap[Pstream::myProcNo()];
@ -112,8 +135,16 @@ void Foam::mapDistribute::distribute
if (Pstream::myProcNo() == sendProc) if (Pstream::myProcNo() == sendProc)
{ {
// I am sender. Send to recvProc. // 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); OPstream toNbr(Pstream::scheduled, recvProc);
toNbr << IndirectList<T>(field, subMap[recvProc])(); toNbr << subField;
} }
else else
{ {
@ -136,7 +167,13 @@ void Foam::mapDistribute::distribute
List<T> newField(constructSize); List<T> newField(constructSize);
// Subset myself // 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) // Receive sub field from myself (subField)
const labelList& map = constructMap[Pstream::myProcNo()]; const labelList& map = constructMap[Pstream::myProcNo()];
@ -149,10 +186,19 @@ void Foam::mapDistribute::distribute
// Send sub field to neighbour // Send sub field to neighbour
for (label domain = 0; domain < Pstream::nProcs(); domain++) 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); 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 // Receive sub field from neighbour
for (label domain = 0; domain < Pstream::nProcs(); domain++) 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); IPstream fromNbr(Pstream::nonBlocking, domain);
List<T> subField(fromNbr); List<T> subField(fromNbr);
const labelList& map = constructMap[domain];
forAll(map, i) forAll(map, i)
{ {
newField[map[i]] = subField[i]; newField[map[i]] = subField[i];

View File

@ -25,7 +25,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "coupledPolyPatch.H" #include "coupledPolyPatch.H"
#include "SortableList.H"
#include "ListOps.H" #include "ListOps.H"
#include "transform.H" #include "transform.H"
#include "OFstream.H" #include "OFstream.H"

View File

@ -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 // Construct as copy
template template
< <

View File

@ -235,6 +235,14 @@ public:
const Field<PointType>& points const Field<PointType>& points
); );
//- Construct from components, reuse storage
PrimitivePatch
(
FaceList<Face>& faces,
Field<PointType>& points,
const bool reUse
);
//- Construct as copy //- Construct as copy
PrimitivePatch PrimitivePatch
( (

View File

@ -467,7 +467,8 @@ const edgeList& primitiveMesh::edges() const
{ {
if (!edgesPtr_) if (!edgesPtr_)
{ {
calcEdges(true); //calcEdges(true);
calcEdges(false);
} }
return *edgesPtr_; return *edgesPtr_;
@ -477,10 +478,8 @@ const labelListList& primitiveMesh::pointEdges() const
{ {
if (!pePtr_) if (!pePtr_)
{ {
//// Invert edges //calcEdges(true);
//pePtr_ = new labelListList(nPoints()); calcEdges(false);
//invertManyToMany(nPoints(), edges(), *pePtr_);
calcEdges(true);
} }
return *pePtr_; return *pePtr_;
@ -491,12 +490,53 @@ const labelListList& primitiveMesh::faceEdges() const
{ {
if (!fePtr_) 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_; return *fePtr_;
} }
void primitiveMesh::clearOutEdges() void primitiveMesh::clearOutEdges()
{ {
deleteDemandDrivenData(edgesPtr_); deleteDemandDrivenData(edgesPtr_);

View File

@ -41,8 +41,7 @@ extern "C"
# include "parmetis.h" # include "parmetis.h"
} }
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
@ -57,6 +56,8 @@ namespace Foam
} }
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
//- Does prevention of 0 cell domains and calls parmetis. //- Does prevention of 0 cell domains and calls parmetis.
Foam::label Foam::parMetisDecomp::decompose Foam::label Foam::parMetisDecomp::decompose
( (
@ -76,6 +77,16 @@ Foam::label Foam::parMetisDecomp::decompose
// Number of dimensions // Number of dimensions
int nDims = 3; 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 // Get number of cells on all processors
List<int> nLocalCells(Pstream::nProcs()); List<int> nLocalCells(Pstream::nProcs());
nLocalCells[Pstream::myProcNo()] = xadj.size()-1; nLocalCells[Pstream::myProcNo()] = xadj.size()-1;
@ -106,12 +117,12 @@ Foam::label Foam::parMetisDecomp::decompose
// Make sure every domain has at least one cell // Make sure every domain has at least one cell
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// (Metis falls over with zero sized domains) // (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. // don't.
// Number of cells to send down (is same as number of cells next processor // Number of cells to send to the next processor
// has to receive) // (is same as number of cells next processor has to receive)
List<int> nSendCells(Pstream::nProcs(), 0); List<int> nSendCells(Pstream::nProcs(), 0);
for (label procI = nLocalCells.size()-1; procI >=1; procI--) for (label procI = nLocalCells.size()-1; procI >=1; procI--)
@ -135,6 +146,15 @@ Foam::label Foam::parMetisDecomp::decompose
Field<int> prevCellWeights(fromPrevProc); Field<int> prevCellWeights(fromPrevProc);
Field<int> prevFaceWeights(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 // Insert adjncy
prepend(prevAdjncy, adjncy); prepend(prevAdjncy, adjncy);
// Adapt offsets and prepend xadj // 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 // Weight info
int wgtFlag = 0; int wgtFlag = 0;
int* vwgtPtr = NULL; int* vwgtPtr = NULL;
@ -292,6 +320,15 @@ Foam::label Foam::parMetisDecomp::decompose
List<int> nextFinalDecomp(fromNextProc); 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); append(nextFinalDecomp, finalDecomp);
} }

View File

@ -24,7 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "SortableList.H"
#include "dynamicRefineFvMesh.H" #include "dynamicRefineFvMesh.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
#include "volFields.H" #include "volFields.H"
@ -32,7 +31,6 @@ License
#include "surfaceFields.H" #include "surfaceFields.H"
#include "fvCFD.H" #include "fvCFD.H"
#include "syncTools.H" #include "syncTools.H"
#include "ListListOps.H"
#include "pointFields.H" #include "pointFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -399,7 +399,7 @@ bool Foam::octreeDataFaceList::overlaps
const treeBoundBox& sampleBb const treeBoundBox& sampleBb
) const ) const
{ {
return sampleBb.intersects(allBb_[index]); return sampleBb.overlaps(allBb_[index]);
} }

View File

@ -32,7 +32,6 @@ License
#include "octreeDataFace.H" #include "octreeDataFace.H"
#include "octree.H" #include "octree.H"
#include "OFstream.H" #include "OFstream.H"
#include "SortableList.H"
#include "IndirectList.H" #include "IndirectList.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

View File

@ -84,6 +84,7 @@ $(derivedFvPatchFields)/oscillatingFixedValue/oscillatingFixedValueFvPatchFields
$(derivedFvPatchFields)/outletInlet/outletInletFvPatchFields.C $(derivedFvPatchFields)/outletInlet/outletInletFvPatchFields.C
$(derivedFvPatchFields)/partialSlip/partialSlipFvPatchFields.C $(derivedFvPatchFields)/partialSlip/partialSlipFvPatchFields.C
$(derivedFvPatchFields)/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C

View File

@ -74,20 +74,10 @@ fluxCorrectedVelocityFvPatchVectorField
) )
: :
zeroGradientFvPatchVectorField(p, iF), zeroGradientFvPatchVectorField(p, iF),
phiName_("phi"), phiName_(dict.lookupOrDefault<word>("phi", "phi")),
rhoName_("rho") rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
{ {
fvPatchVectorField::operator=(patchInternalField()); 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(); zeroGradientFvPatchVectorField::evaluate();
const surfaceScalarField& phi = db().lookupObject<surfaceScalarField> const surfaceScalarField& phi =
( db().lookupObject<surfaceScalarField>(phiName_);
phiName_
);
const fvsPatchField<scalar>& phip = const fvsPatchField<scalar>& phip =
patch().patchField<surfaceScalarField, scalar>(phi); patch().patchField<surfaceScalarField, scalar>(phi);

View File

@ -26,7 +26,10 @@ Class
Foam::fluxCorrectedVelocityFvPatchVectorField Foam::fluxCorrectedVelocityFvPatchVectorField
Description 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 SourceFiles
fluxCorrectedVelocityFvPatchVectorField.C fluxCorrectedVelocityFvPatchVectorField.C

View File

@ -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 } // End namespace Foam

View File

@ -134,6 +134,11 @@ public:
//- Write //- Write
virtual void write(Ostream&) const; virtual void write(Ostream&) const;
// Member operators
virtual void operator=(const fvPatchField<Type>& pvf);
}; };

View File

@ -45,6 +45,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
) )
: :
mixedFvPatchVectorField(p, iF), mixedFvPatchVectorField(p, iF),
phiName_("phi"),
rhoName_("rho"),
inletDir_(p.size()) inletDir_(p.size())
{ {
refValue() = *this; refValue() = *this;
@ -63,6 +65,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
) )
: :
mixedFvPatchVectorField(ptf, p, iF, mapper), mixedFvPatchVectorField(ptf, p, iF, mapper),
phiName_(ptf.phiName_),
rhoName_(ptf.rhoName_),
inletDir_(ptf.inletDir_, mapper) inletDir_(ptf.inletDir_, mapper)
{} {}
@ -76,6 +80,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
) )
: :
mixedFvPatchVectorField(p, iF), mixedFvPatchVectorField(p, iF),
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
inletDir_("inletDirection", dict, p.size()) inletDir_("inletDirection", dict, p.size())
{ {
fvPatchVectorField::operator=(vectorField("value", dict, p.size())); fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
@ -92,6 +98,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
) )
: :
mixedFvPatchVectorField(pivpvf), mixedFvPatchVectorField(pivpvf),
phiName_(pivpvf.phiName_),
rhoName_(pivpvf.rhoName_),
inletDir_(pivpvf.inletDir_) inletDir_(pivpvf.inletDir_)
{} {}
@ -104,6 +112,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField
) )
: :
mixedFvPatchVectorField(pivpvf, iF), mixedFvPatchVectorField(pivpvf, iF),
phiName_(pivpvf.phiName_),
rhoName_(pivpvf.rhoName_),
inletDir_(pivpvf.inletDir_) inletDir_(pivpvf.inletDir_)
{} {}
@ -129,7 +139,8 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::rmap
mixedFvPatchVectorField::rmap(ptf, addr); mixedFvPatchVectorField::rmap(ptf, addr);
const pressureDirectedInletOutletVelocityFvPatchVectorField& tiptf = const pressureDirectedInletOutletVelocityFvPatchVectorField& tiptf =
refCast<const pressureDirectedInletOutletVelocityFvPatchVectorField>(ptf); refCast<const pressureDirectedInletOutletVelocityFvPatchVectorField>
(ptf);
inletDir_.rmap(tiptf.inletDir_, addr); inletDir_.rmap(tiptf.inletDir_, addr);
} }
@ -143,7 +154,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs()
} }
const surfaceScalarField& phi = const surfaceScalarField& phi =
db().lookupObject<surfaceScalarField>("phi"); db().lookupObject<surfaceScalarField>(phiName_);
const fvsPatchField<scalar>& phip = const fvsPatchField<scalar>& phip =
patch().patchField<surfaceScalarField, scalar>(phi); patch().patchField<surfaceScalarField, scalar>(phi);
@ -158,7 +169,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs()
else if (phi.dimensions() == dimDensity*dimVelocity*dimArea) else if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
{ {
const fvPatchField<scalar>& rhop = const fvPatchField<scalar>& rhop =
patch().lookupPatchField<volScalarField, scalar>("rho"); patch().lookupPatchField<volScalarField, scalar>(rhoName_);
refValue() = inletDir_*phip/(rhop*ndmagS); refValue() = inletDir_*phip/(rhop*ndmagS);
} }
@ -185,11 +196,28 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::
write(Ostream& os) const write(Ostream& os) const
{ {
fvPatchVectorField::write(os); fvPatchVectorField::write(os);
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
inletDir_.writeEntry("inletDirection", os); inletDir_.writeEntry("inletDirection", os);
writeEntry("value", os); writeEntry("value", os);
} }
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void pressureDirectedInletOutletVelocityFvPatchVectorField::operator=
(
const fvPatchField<vector>& pvf
)
{
fvPatchField<vector>::operator=
(
valueFraction()*(inletDir_*(inletDir_ & pvf))
+ (1 - valueFraction())*pvf
);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField makePatchTypeField

View File

@ -26,7 +26,10 @@ Class
Foam::pressureDirectedInletOutletVelocityFvPatchVectorField Foam::pressureDirectedInletOutletVelocityFvPatchVectorField
Description 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 SourceFiles
pressureDirectedInletOutletVelocityFvPatchVectorField.C pressureDirectedInletOutletVelocityFvPatchVectorField.C
@ -54,6 +57,8 @@ class pressureDirectedInletOutletVelocityFvPatchVectorField
{ {
// Private data // Private data
word phiName_;
word rhoName_;
vectorField inletDir_; vectorField inletDir_;
@ -133,9 +138,35 @@ public:
} }
// Member functions // 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 // Mapping functions
//- Map (and resize as needed) from self given a mapping object //- Map (and resize as needed) from self given a mapping object
@ -157,6 +188,11 @@ public:
//- Write //- Write
virtual void write(Ostream&) const; virtual void write(Ostream&) const;
// Member operators
virtual void operator=(const fvPatchField<vector>& pvf);
}; };

View File

@ -45,6 +45,8 @@ pressureDirectedInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(p, iF), fixedValueFvPatchVectorField(p, iF),
phiName_("phi"),
rhoName_("rho"),
inletDir_(p.size()) inletDir_(p.size())
{} {}
@ -59,6 +61,8 @@ pressureDirectedInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(ptf, p, iF, mapper), fixedValueFvPatchVectorField(ptf, p, iF, mapper),
phiName_(ptf.phiName_),
rhoName_(ptf.rhoName_),
inletDir_(ptf.inletDir_, mapper) inletDir_(ptf.inletDir_, mapper)
{} {}
@ -72,6 +76,8 @@ pressureDirectedInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(p, iF), fixedValueFvPatchVectorField(p, iF),
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
inletDir_("inletDirection", dict, p.size()) inletDir_("inletDirection", dict, p.size())
{ {
fvPatchVectorField::operator=(vectorField("value", dict, p.size())); fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
@ -85,6 +91,8 @@ pressureDirectedInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(pivpvf), fixedValueFvPatchVectorField(pivpvf),
phiName_(pivpvf.phiName_),
rhoName_(pivpvf.rhoName_),
inletDir_(pivpvf.inletDir_) inletDir_(pivpvf.inletDir_)
{} {}
@ -97,6 +105,8 @@ pressureDirectedInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(pivpvf, iF), fixedValueFvPatchVectorField(pivpvf, iF),
phiName_(pivpvf.phiName_),
rhoName_(pivpvf.rhoName_),
inletDir_(pivpvf.inletDir_) inletDir_(pivpvf.inletDir_)
{} {}
@ -136,7 +146,7 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
} }
const surfaceScalarField& phi = const surfaceScalarField& phi =
db().lookupObject<surfaceScalarField>("phi"); db().lookupObject<surfaceScalarField>(phiName_);
const fvsPatchField<scalar>& phip = const fvsPatchField<scalar>& phip =
patch().patchField<surfaceScalarField, scalar>(phi); patch().patchField<surfaceScalarField, scalar>(phi);
@ -151,7 +161,7 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
else if (phi.dimensions() == dimDensity*dimVelocity*dimArea) else if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
{ {
const fvPatchField<scalar>& rhop = const fvPatchField<scalar>& rhop =
patch().lookupPatchField<volScalarField, scalar>("rho"); patch().lookupPatchField<volScalarField, scalar>(rhoName_);
operator==(inletDir_*phip/(rhop*ndmagS)); operator==(inletDir_*phip/(rhop*ndmagS));
} }
@ -174,11 +184,24 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs()
void pressureDirectedInletVelocityFvPatchVectorField::write(Ostream& os) const void pressureDirectedInletVelocityFvPatchVectorField::write(Ostream& os) const
{ {
fvPatchVectorField::write(os); fvPatchVectorField::write(os);
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
inletDir_.writeEntry("inletDirection", os); inletDir_.writeEntry("inletDirection", os);
writeEntry("value", os); writeEntry("value", os);
} }
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void pressureDirectedInletVelocityFvPatchVectorField::operator=
(
const fvPatchField<vector>& pvf
)
{
fvPatchField<vector>::operator=(inletDir_*(inletDir_ & pvf));
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField makePatchTypeField

View File

@ -26,7 +26,11 @@ Class
Foam::pressureDirectedInletVelocityFvPatchVectorField Foam::pressureDirectedInletVelocityFvPatchVectorField
Description 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 SourceFiles
pressureDirectedInletVelocityFvPatchVectorField.C pressureDirectedInletVelocityFvPatchVectorField.C
@ -54,6 +58,8 @@ class pressureDirectedInletVelocityFvPatchVectorField
{ {
// Private data // Private data
word phiName_;
word rhoName_;
vectorField inletDir_; vectorField inletDir_;
@ -130,9 +136,35 @@ public:
} }
// Member functions // 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 // Mapping functions
//- Map (and resize as needed) from self given a mapping object //- Map (and resize as needed) from self given a mapping object
@ -154,6 +186,11 @@ public:
//- Write //- Write
virtual void write(Ostream&) const; virtual void write(Ostream&) const;
// Member operators
virtual void operator=(const fvPatchField<vector>& pvf);
}; };

View File

@ -26,7 +26,10 @@ Class
Foam::pressureInletOutletVelocityFvPatchVectorField Foam::pressureInletOutletVelocityFvPatchVectorField
Description 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 SourceFiles
pressureInletOutletVelocityFvPatchVectorField.C pressureInletOutletVelocityFvPatchVectorField.C

View File

@ -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 makePatchTypeField

View File

@ -26,7 +26,9 @@ Class
Foam::pressureInletUniformVelocityFvPatchVectorField Foam::pressureInletUniformVelocityFvPatchVectorField
Description 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 SourceFiles
pressureInletUniformVelocityFvPatchVectorField.C pressureInletUniformVelocityFvPatchVectorField.C
@ -124,6 +126,11 @@ public:
//- Update the coefficients associated with the patch field //- Update the coefficients associated with the patch field
virtual void updateCoeffs(); virtual void updateCoeffs();
// Member operators
virtual void operator=(const fvPatchField<vector>& pvf);
}; };

View File

@ -70,20 +70,10 @@ pressureInletVelocityFvPatchVectorField::pressureInletVelocityFvPatchVectorField
) )
: :
fixedValueFvPatchVectorField(p, iF), fixedValueFvPatchVectorField(p, iF),
phiName_("phi"), phiName_(dict.lookupOrDefault<word>("phi", "phi")),
rhoName_("rho") rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
{ {
fvPatchVectorField::operator=(vectorField("value", dict, p.size())); 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 makePatchTypeField

View File

@ -26,7 +26,10 @@ Class
Foam::pressureInletVelocityFvPatchVectorField Foam::pressureInletVelocityFvPatchVectorField
Description 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 SourceFiles
pressureInletVelocityFvPatchVectorField.C pressureInletVelocityFvPatchVectorField.C
@ -57,6 +60,7 @@ class pressureInletVelocityFvPatchVectorField
word phiName_; word phiName_;
word rhoName_; word rhoName_;
public: public:
//- Runtime type information //- Runtime type information
@ -127,6 +131,33 @@ public:
// Member functions // 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 //- Update the coefficients associated with the patch field
virtual void updateCoeffs(); virtual void updateCoeffs();
@ -136,10 +167,7 @@ public:
// Member operators // Member operators
virtual void operator=(const fvPatchField<vector>& pvf) virtual void operator=(const fvPatchField<vector>& pvf);
{
fvPatchField<vector>::operator=(pvf);
}
}; };

View File

@ -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
// ************************************************************************* //

View File

@ -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
// ************************************************************************* //

View File

@ -26,7 +26,10 @@ Class
Foam::rotatingPressureInletOutletVelocityFvPatchVectorField Foam::rotatingPressureInletOutletVelocityFvPatchVectorField
Description 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 SourceFiles
rotatingPressureInletOutletVelocityFvPatchVectorField.C rotatingPressureInletOutletVelocityFvPatchVectorField.C

View File

@ -22,8 +22,6 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "gaussConvectionScheme.H" #include "gaussConvectionScheme.H"

View File

@ -978,14 +978,14 @@ CrankNicholsonDdtScheme<Type>::fvcDdtPhiCorr
ddt0_<GeometricField<Type, fvPatchField, volMesh> > ddt0_<GeometricField<Type, fvPatchField, volMesh> >
( (
"ddt0(" + U.name() + ')', "ddt0(" + U.name() + ')',
rho.dimensions()*U.dimensions() U.dimensions()
); );
DDt0Field<fluxFieldType>& dphidt0 = DDt0Field<fluxFieldType>& dphidt0 =
ddt0_<fluxFieldType> ddt0_<fluxFieldType>
( (
"ddt0(" + phi.name() + ')', "ddt0(" + phi.name() + ')',
phi.dimensions() U.dimensions()*dimArea
); );
IOobject ddtIOobject IOobject ddtIOobject

View File

@ -109,7 +109,6 @@ private:
//- References to the mesh and time databases //- References to the mesh and time databases
const fvMesh& mesh_; const fvMesh& mesh_;
// const Time& runTime_;
//- Reference to the interpolation for the carrier phase to the parcels //- Reference to the interpolation for the carrier phase to the parcels
const volPointInterpolation& vpi_; const volPointInterpolation& vpi_;
@ -263,9 +262,6 @@ protected:
public: public:
//- Runtime type information
// TypeName("KinematicCloud");
// Constructors // Constructors
//- Construct given carrier gas fields //- Construct given carrier gas fields
@ -280,8 +276,7 @@ public:
); );
// Destructor //- Destructor
virtual ~KinematicCloud(); virtual ~KinematicCloud();
@ -391,7 +386,6 @@ public:
inline tmp<fvVectorMatrix> SU2(volVectorField& U) const; inline tmp<fvVectorMatrix> SU2(volVectorField& U) const;
// Check // Check
//- Total mass injected //- Total mass injected

View File

@ -191,13 +191,13 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
+ YMixture_[2]*td.cloud().composition().cpSolid(YSolid_); + YMixture_[2]*td.cloud().composition().cpSolid(YSolid_);
// Update particle density or diameter // 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 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; this->cp_ = cp1;
// Update particle density or diameter // 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 else
{ {
this->rho_ = mass1/this->volume(); this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi);
} }
} }
} }

View File

@ -92,6 +92,9 @@ public:
//- Latent heat of devolatilisation [J/kg] //- Latent heat of devolatilisation [J/kg]
const scalar Ldevol_; const scalar Ldevol_;
//- Constant volume flag - e.g. during mass transfer
Switch constantVolume_;
public: public:
@ -108,6 +111,9 @@ public:
//- Return const access to the latent heat of devolatilisation //- Return const access to the latent heat of devolatilisation
inline scalar Ldevol() const; inline scalar Ldevol() const;
//- Return const access to the constant volume flag
inline Switch constantVolume() const;
}; };

View File

@ -35,7 +35,8 @@ inline Foam::ReactingParcel<ParcelType>::constantProperties::constantProperties
ThermoParcel<ParcelType>::constantProperties(dict), ThermoParcel<ParcelType>::constantProperties(dict),
Tvap_(dimensionedScalar(dict.lookup("Tvap")).value()), Tvap_(dimensionedScalar(dict.lookup("Tvap")).value()),
Tbp_(dimensionedScalar(dict.lookup("Tbp")).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 * * * * * * * * * * * * // // * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * //
template<class ParcelType> template<class ParcelType>

View File

@ -60,13 +60,6 @@ bool Foam::ConstantRateDevolatilisation<CloudType>::active() const
} }
template<class CloudType>
bool Foam::ConstantRateDevolatilisation<CloudType>::changesVolume() const
{
return false;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::ConstantRateDevolatilisation<CloudType>::calculate Foam::scalar Foam::ConstantRateDevolatilisation<CloudType>::calculate
( (

View File

@ -89,9 +89,6 @@ public:
//- Flag to indicate whether model activates mass transfer model //- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const;
//- Update model //- Update model
scalar calculate scalar calculate
( (

View File

@ -130,9 +130,6 @@ public:
//- Flag to indicate whether model activates mass transfer model //- Flag to indicate whether model activates mass transfer model
virtual bool active() const = 0; virtual bool active() const = 0;
//- Flag to indicate whether model changes particle volume
virtual bool changesVolume() const = 0;
//- Update model //- Update model
virtual scalar calculate virtual scalar calculate
( (

View File

@ -55,13 +55,6 @@ bool Foam::NoMassTransfer<CloudType>::active() const
} }
template<class CloudType>
bool Foam::NoMassTransfer<CloudType>::changesVolume() const
{
return false;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::NoMassTransfer<CloudType>::calculate Foam::scalar Foam::NoMassTransfer<CloudType>::calculate
( (

View File

@ -75,9 +75,6 @@ public:
//- Flag to indicate whether model activates mass transfer model //- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const;
//- Update model //- Update model
scalar calculate scalar calculate
( (

View File

@ -62,13 +62,6 @@ bool Foam::SingleKineticRateDevolatilisation<CloudType>::active() const
} }
template<class CloudType>
bool Foam::SingleKineticRateDevolatilisation<CloudType>::changesVolume() const
{
return false;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::SingleKineticRateDevolatilisation<CloudType>::calculate Foam::scalar Foam::SingleKineticRateDevolatilisation<CloudType>::calculate
( (

View File

@ -91,9 +91,6 @@ public:
//- Flag to indicate whether model activates mass transfer model //- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const;
//- Update model //- Update model
scalar calculate scalar calculate
( (

View File

@ -29,6 +29,8 @@ License
#include "ListListOps.H" #include "ListListOps.H"
#include "meshSearch.H" #include "meshSearch.H"
#include "mapDistribute.H" #include "mapDistribute.H"
#include "meshTools.H"
#include "OFstream.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -47,16 +49,18 @@ void Foam::directMappedPolyPatch::collectSamples
( (
pointField& samples, pointField& samples,
labelList& patchFaceProcs, labelList& patchFaceProcs,
labelList& patchFaces labelList& patchFaces,
pointField& patchFc
) const ) const
{ {
const vectorField::subField fc = this->faceCentres();
// Collect all sample points and the faces they come from. // Collect all sample points and the faces they come from.
List<pointField> globalFc(Pstream::nProcs());
List<pointField> globalSamples(Pstream::nProcs()); List<pointField> globalSamples(Pstream::nProcs());
labelListList globalFaces(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()); globalFaces[Pstream::myProcNo()] = identity(size());
// Distribute to all processors // Distribute to all processors
@ -64,6 +68,8 @@ void Foam::directMappedPolyPatch::collectSamples
Pstream::scatterList(globalSamples); Pstream::scatterList(globalSamples);
Pstream::gatherList(globalFaces); Pstream::gatherList(globalFaces);
Pstream::scatterList(globalFaces); Pstream::scatterList(globalFaces);
Pstream::gatherList(globalFc);
Pstream::scatterList(globalFc);
// Rework into straight list // Rework into straight list
samples = ListListOps::combine<pointField> samples = ListListOps::combine<pointField>
@ -76,6 +82,11 @@ void Foam::directMappedPolyPatch::collectSamples
globalFaces, globalFaces,
accessOp<labelList>() accessOp<labelList>()
); );
patchFc = ListListOps::combine<pointField>
(
globalFc,
accessOp<pointField>()
);
patchFaceProcs.setSize(patchFaces.size()); patchFaceProcs.setSize(patchFaces.size());
labelList nPerProc labelList nPerProc
@ -103,11 +114,14 @@ void Foam::directMappedPolyPatch::findSamples
( (
const pointField& samples, const pointField& samples,
labelList& sampleCellProcs, labelList& sampleCellProcs,
labelList& sampleCells labelList& sampleCells,
pointField& sampleCc
) const ) const
{ {
sampleCellProcs.setSize(samples.size()); sampleCellProcs.setSize(samples.size());
sampleCells.setSize(samples.size()); sampleCells.setSize(samples.size());
sampleCc.setSize(samples.size());
sampleCc = point(-GREAT, -GREAT, -GREAT);
{ {
// Octree based search engine // Octree based search engine
@ -124,6 +138,8 @@ void Foam::directMappedPolyPatch::findSamples
else else
{ {
sampleCellProcs[sampleI] = Pstream::myProcNo(); 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::listCombineGather(sampleCellProcs, maxEqOp<label>());
Pstream::listCombineScatter(sampleCellProcs); Pstream::listCombineScatter(sampleCellProcs);
Pstream::listCombineGather(sampleCc, maxEqOp<point>());
Pstream::listCombineScatter(sampleCc);
if (debug) if (debug)
{ {
Info<< "directMappedPolyPatch::findSamples : " << endl; Info<< "directMappedPolyPatch::findSamples : " << endl;
@ -143,7 +162,8 @@ void Foam::directMappedPolyPatch::findSamples
{ {
Info<< " " << sampleI << " coord:" << samples[sampleI] Info<< " " << sampleI << " coord:" << samples[sampleI]
<< " found on processor:" << sampleCellProcs[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; pointField samples;
labelList patchFaceProcs; labelList patchFaceProcs;
labelList patchFaces; labelList patchFaces;
collectSamples(samples, patchFaceProcs, patchFaces); pointField patchFc;
collectSamples(samples, patchFaceProcs, patchFaces, patchFc);
// Find processor and cell samples are in // Find processor and cell samples are in
labelList sampleCellProcs; labelList sampleCellProcs;
labelList sampleCells; labelList sampleCells;
findSamples(samples, sampleCellProcs, sampleCells); pointField sampleCc;
findSamples(samples, sampleCellProcs, sampleCells, sampleCc);
// Now we have all the data we need: // 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) // - cell sample is in (so source when mapping)
// sampleCells, sampleCellProcs. // 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. // Determine schedule.
mapDistribute distMap(sampleCellProcs, patchFaceProcs); mapDistribute distMap(sampleCellProcs, patchFaceProcs);

View File

@ -82,7 +82,8 @@ class directMappedPolyPatch
( (
pointField&, pointField&,
labelList& patchFaceProcs, labelList& patchFaceProcs,
labelList& patchFaces labelList& patchFaces,
pointField& patchFc
) const; ) const;
//- Find cells containing samples //- Find cells containing samples
@ -90,7 +91,8 @@ class directMappedPolyPatch
( (
const pointField&, const pointField&,
labelList& sampleCellProcs, labelList& sampleCellProcs,
labelList& sampleCells labelList& sampleCells,
pointField& sampleCc
) const; ) const;
//- Calculate matching //- Calculate matching

View File

@ -40,7 +40,7 @@ namespace Foam
// Does bb intersect a sphere around sample? Or is any corner point of bb // Does bb intersect a sphere around sample? Or is any corner point of bb
// closer than nearestDistSqr to sample. // closer than nearestDistSqr to sample.
template <class Type> template <class Type>
bool indexedOctree<Type>::intersects bool indexedOctree<Type>::overlaps
( (
const point& p0, const point& p0,
const point& p1, 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 // Does bb intersect a sphere around sample? Or is any corner point of bb
// closer than nearestDistSqr to sample. // closer than nearestDistSqr to sample.
template <class Type> template <class Type>
bool indexedOctree<Type>::intersects bool indexedOctree<Type>::overlaps
( (
const treeBoundBox& parentBb, const treeBoundBox& parentBb,
const direction octant, const direction octant,
@ -94,7 +94,7 @@ bool indexedOctree<Type>::intersects
{ {
//- Speeded up version of //- Speeded up version of
// treeBoundBox subBb(parentBb.subBbox(mid, octant)) // treeBoundBox subBb(parentBb.subBbox(mid, octant))
// intersects // overlaps
// ( // (
// subBb.min(), // subBb.min(),
// subBb.max(), // subBb.max(),
@ -136,7 +136,7 @@ bool indexedOctree<Type>::intersects
const point mid(0.5*(min+max)); 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_; const treeBoundBox& subBb = nodes_[subNodeI].bb_;
if (intersects(subBb.min(), subBb.max(), nearestDistSqr, sample)) if (overlaps(subBb.min(), subBb.max(), nearestDistSqr, sample))
{ {
findNearest findNearest
( (
@ -584,7 +584,7 @@ void indexedOctree<Type>::findNearest
{ {
if if
( (
intersects overlaps
( (
nod.bb_, nod.bb_,
octant, octant,
@ -639,7 +639,7 @@ void indexedOctree<Type>::findNearest
{ {
const treeBoundBox& subBb = nodes_[getNode(index)].bb_; const treeBoundBox& subBb = nodes_[getNode(index)].bb_;
if (subBb.intersects(tightest)) if (subBb.overlaps(tightest))
{ {
findNearest findNearest
( (
@ -657,7 +657,7 @@ void indexedOctree<Type>::findNearest
{ {
const treeBoundBox subBb(nodeBb.subBbox(octant)); const treeBoundBox subBb(nodeBb.subBbox(octant));
if (subBb.intersects(tightest)) if (subBb.overlaps(tightest))
{ {
shapes_.findNearest shapes_.findNearest
( (
@ -1121,7 +1121,7 @@ void indexedOctree<Type>::findBox
{ {
const treeBoundBox& subBb = nodes_[getNode(index)].bb_; const treeBoundBox& subBb = nodes_[getNode(index)].bb_;
if (subBb.intersects(searchBox)) if (subBb.overlaps(searchBox))
{ {
findBox(getNode(index), searchBox, elements); findBox(getNode(index), searchBox, elements);
} }
@ -1130,7 +1130,7 @@ void indexedOctree<Type>::findBox
{ {
const treeBoundBox subBb(nodeBb.subBbox(octant)); const treeBoundBox subBb(nodeBb.subBbox(octant));
if (subBb.intersects(searchBox)) if (subBb.overlaps(searchBox))
{ {
const labelList& indices = contents_[getContent(index)]; const labelList& indices = contents_[getContent(index)];

View File

@ -36,9 +36,9 @@ SourceFiles
#ifndef indexedOctree_H #ifndef indexedOctree_H
#define indexedOctree_H #define indexedOctree_H
#include "treeBoundBox.H"
#include "pointIndexHit.H" #include "pointIndexHit.H"
#include "FixedList.H" #include "FixedList.H"
#include "treeBoundBox.H"
#include "Ostream.H" #include "Ostream.H"
#include "labelHashSet.H" #include "labelHashSet.H"
#include "labelBits.H" #include "labelBits.H"
@ -146,7 +146,7 @@ private:
//- Like above but now bb is implicitly provided as parent bb + mid //- Like above but now bb is implicitly provided as parent bb + mid
// + octant // + octant
static bool intersects static bool overlaps
( (
const treeBoundBox& parentBb, const treeBoundBox& parentBb,
const direction octant, const direction octant,
@ -497,7 +497,7 @@ public:
//- Helper: does bb intersect a sphere around sample? Or is any //- Helper: does bb intersect a sphere around sample? Or is any
// corner point of bb closer than nearestDistSqr to sample. // corner point of bb closer than nearestDistSqr to sample.
static bool intersects static bool overlaps
( (
const point& bbMin, const point& bbMin,
const point& bbMax, const point& bbMax,

View File

@ -137,11 +137,11 @@ bool Foam::treeDataCell::overlaps
{ {
if (cacheBb_) if (cacheBb_)
{ {
return cubeBb.intersects(bbs_[index]); return cubeBb.overlaps(bbs_[index]);
} }
else else
{ {
return cubeBb.intersects(calcCellBb(cellLabels_[index])); return cubeBb.overlaps(calcCellBb(cellLabels_[index]));
} }
} }

View File

@ -110,11 +110,11 @@ bool Foam::treeDataEdge::overlaps
{ {
if (cacheBb_) if (cacheBb_)
{ {
return cubeBb.intersects(bbs_[index]); return cubeBb.overlaps(bbs_[index]);
} }
else else
{ {
return cubeBb.intersects(calcBb(edgeLabels_[index])); return cubeBb.overlaps(calcBb(edgeLabels_[index]));
} }
} }

View File

@ -412,14 +412,14 @@ bool Foam::treeDataFace::overlaps
// 1. Quick rejection: bb does not intersect face bb at all // 1. Quick rejection: bb does not intersect face bb at all
if (cacheBb_) if (cacheBb_)
{ {
if (!cubeBb.intersects(bbs_[index])) if (!cubeBb.overlaps(bbs_[index]))
{ {
return false; return false;
} }
} }
else else
{ {
if (!cubeBb.intersects(calcBb(faceLabels_[index]))) if (!cubeBb.overlaps(calcBb(faceLabels_[index])))
{ {
return false; return false;
} }

View File

@ -284,13 +284,13 @@ bool Foam::treeDataTriSurface::overlaps
triBb.max() = max(triBb.max(), p2); triBb.max() = max(triBb.max(), p2);
//- For testing: robust one //- For testing: robust one
//return cubeBb.intersects(triBb); //return cubeBb.overlaps(triBb);
//- Exact test of triangle intersecting bb //- Exact test of triangle intersecting bb
// Quick rejection. If whole bounding box of tri is outside cubeBb then // Quick rejection. If whole bounding box of tri is outside cubeBb then
// there will be no intersection. // there will be no intersection.
if (!cubeBb.intersects(triBb)) if (!cubeBb.overlaps(triBb))
{ {
return false; return false;
} }

View File

@ -94,6 +94,12 @@ public:
index_(-1) index_(-1)
{} {}
//- Construct from Istream
PointIndexHit(Istream& is)
{
is >> *this;
}
// Member Functions // Member Functions
@ -193,14 +199,46 @@ public:
friend Ostream& operator<< (Ostream& os, const PointIndexHit& pHit) friend Ostream& operator<< (Ostream& os, const PointIndexHit& pHit)
{ {
return os << pHit.hit_ << token::SPACE << pHit.hitPoint_ if (os.format() == IOstream::ASCII)
{
os << pHit.hit_ << token::SPACE << pHit.hitPoint_
<< token::SPACE << pHit.index_; << 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) friend Istream& operator>>(Istream& is, PointIndexHit& pHit)
{
if (is.format() == IOstream::ASCII)
{ {
return is >> pHit.hit_ >> pHit.hitPoint_ >> pHit.index_; 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;
}
}; };

View File

@ -113,7 +113,7 @@ bool Foam::octreeDataCell::overlaps
const treeBoundBox& cubeBb const treeBoundBox& cubeBb
) const ) const
{ {
return cubeBb.intersects(bbs_[index]); return cubeBb.overlaps(bbs_[index]);
} }

View File

@ -107,7 +107,7 @@ bool Foam::octreeDataEdges::overlaps
const treeBoundBox& sampleBb const treeBoundBox& sampleBb
) const ) const
{ {
return sampleBb.intersects(allBb_[index]); return sampleBb.overlaps(allBb_[index]);
} }

View File

@ -507,12 +507,12 @@ bool Foam::octreeDataFace::overlaps
const treeBoundBox& sampleBb const treeBoundBox& sampleBb
) const ) const
{ {
//return sampleBb.intersects(allBb_[index]); //return sampleBb.overlaps(allBb_[index]);
//- Exact test of face intersecting bb //- Exact test of face intersecting bb
// 1. Quick rejection: bb does not intersect face bb at all // 1. Quick rejection: bb does not intersect face bb at all
if (!sampleBb.intersects(allBb_[index])) if (!sampleBb.overlaps(allBb_[index]))
{ {
return false; return false;
} }

View File

@ -39,7 +39,14 @@ Description
namespace Foam 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;}
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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 // line intersection. Returns true if line (start to end) inside
// bb or intersects bb. Sets pt to intersection. // bb or intersects bb. Sets pt to intersection.
// //

View File

@ -263,8 +263,11 @@ public:
FixedList<direction, 8>& octantOrder FixedList<direction, 8>& octantOrder
) const; ) const;
//- Intersects other boundingbox? //- Overlaps other boundingbox?
inline bool intersects(const treeBoundBox&) const; 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, //- Intersects segment; set point to intersection position,
// return true if intersection found. // return true if intersection found.

View File

@ -24,9 +24,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H"
#include "treeBoundBox.H" #include "treeBoundBox.H"
#include "point.H"
#include "Random.H" #include "Random.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -414,9 +412,9 @@ inline void treeBoundBox::searchOrder
// true if bb's intersect or overlap. // true if bb's intersect or overlap.
// Note: <= to make sure we catch all. // 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);
} }

View File

@ -798,7 +798,7 @@ bool treeNode<Type>::findTightest
// Node: recurse into subnodes // Node: recurse into subnodes
const treeNode<Type>* subNodePtr = getNodePtr(octant); 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 // there might be a better fit inside this subNode
changed |= changed |=
@ -815,7 +815,7 @@ bool treeNode<Type>::findTightest
// Leaf: let leaf::find handle this // Leaf: let leaf::find handle this
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant); 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 // there might be a better fit inside this subLeaf
changed |= changed |=
@ -884,7 +884,7 @@ bool treeNode<Type>::findNearest
// Node // Node
const treeNode<Type>* subNodePtr = getNodePtr(octant); 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 // there might be a better fit inside this subNode
changed |= changed |=
@ -903,7 +903,7 @@ bool treeNode<Type>::findNearest
// Leaf: let leaf::find handle this // Leaf: let leaf::find handle this
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant); 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 // there might be a better fit inside this subNode
changed |= changed |=
@ -975,7 +975,7 @@ bool treeNode<Type>::findNearest
// Node // Node
const treeNode<Type>* subNodePtr = getNodePtr(octant); 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 // there might be a better fit inside this subNode
changed |= changed |=
@ -995,7 +995,7 @@ bool treeNode<Type>::findNearest
// Leaf: let leaf::find handle this // Leaf: let leaf::find handle this
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant); 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 // there might be a better fit inside this subNode
changed |= changed |=
@ -1060,7 +1060,7 @@ bool treeNode<Type>::findBox
// Node // Node
const treeNode<Type>* subNodePtr = getNodePtr(octant); const treeNode<Type>* subNodePtr = getNodePtr(octant);
if (subNodePtr->bb().intersects(box)) if (subNodePtr->bb().overlaps(box))
{ {
// Visit sub node. // Visit sub node.
changed |= subNodePtr->findBox(shapes, box, elements); changed |= subNodePtr->findBox(shapes, box, elements);
@ -1071,7 +1071,7 @@ bool treeNode<Type>::findBox
// Leaf: let leaf::find handle this // Leaf: let leaf::find handle this
const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant); const treeLeaf<Type>* subLeafPtr = getLeafPtr(octant);
if (subLeafPtr->bb().intersects(box)) if (subLeafPtr->bb().overlaps(box))
{ {
// Visit sub leaf. // Visit sub leaf.
changed |= subLeafPtr->findBox(shapes, box, elements); changed |= subLeafPtr->findBox(shapes, box, elements);

View File

@ -26,7 +26,6 @@ License
#include "searchableSphere.H" #include "searchableSphere.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
#include "SortableList.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

View File

@ -27,8 +27,6 @@ License
#include "intersectedSurface.H" #include "intersectedSurface.H"
#include "surfaceIntersection.H" #include "surfaceIntersection.H"
#include "faceList.H" #include "faceList.H"
#include "SortableList.H"
#include "triSurfaceTools.H"
#include "faceTriangulation.H" #include "faceTriangulation.H"
#include "treeBoundBox.H" #include "treeBoundBox.H"
#include "OFstream.H" #include "OFstream.H"

View File

@ -385,12 +385,12 @@ bool Foam::octreeDataTriSurface::overlaps
const treeBoundBox& cubeBb const treeBoundBox& cubeBb
) const ) const
{ {
//return cubeBb.intersects(allBb_[index]); //return cubeBb.overlaps(allBb_[index]);
//- Exact test of triangle intersecting bb //- Exact test of triangle intersecting bb
// Quick rejection. // Quick rejection.
if (!cubeBb.intersects(allBb_[index])) if (!cubeBb.overlaps(allBb_[index]))
{ {
return false; return false;
} }

View File

@ -54,7 +54,7 @@ bool Foam::treeLeaf<Foam::octreeDataTriSurface>::findNearest
label faceI = indices_[i]; label faceI = indices_[i];
// Quick rejection test. // Quick rejection test.
if (tightest.intersects(allBb[faceI])) if (tightest.overlaps(allBb[faceI]))
{ {
// Full calculation // Full calculation
scalar dist = shapes.calcNearest(faceI, sample, nearest); scalar dist = shapes.calcNearest(faceI, sample, nearest);

View File

@ -101,6 +101,7 @@ bool Foam::triangleFuncs::intersectAxesBundle
// Since direction is coordinate axis there is no need to do projection, // Since direction is coordinate axis there is no need to do projection,
// we can directly check u,v components for inclusion in triangle. // we can directly check u,v components for inclusion in triangle.
scalar localScale = max(max(magSqr(V10), magSqr(V20)), 1.0);
// Get other components // Get other components
label i1 = (i0 + 1) % 3; label i1 = (i0 + 1) % 3;
@ -114,8 +115,11 @@ bool Foam::triangleFuncs::intersectAxesBundle
scalar det = v2*u1 - u2*v1; 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 // Fix for V0:(-31.71428 0 -15.10714)
if (Foam::mag(det)/max(max(mag(V10),mag(V20)),1) < SMALL) // 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 // Triangle parallel to dir
return false; return false;
@ -132,7 +136,7 @@ bool Foam::triangleFuncs::intersectAxesBundle
scalar beta = 0; scalar beta = 0;
bool inter = false; bool inter = false;
if (Foam::mag(u1) < SMALL) if (Foam::mag(u1)/localScale < SMALL)
{ {
beta = u0/u2; beta = u0/u2;
if ((beta >= 0) && (beta <= 1)) if ((beta >= 0) && (beta <= 1))

View File

@ -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);
}
}
} }

View File

@ -31,6 +31,7 @@ License
#include "Time.H" #include "Time.H"
#include "boundBox.H" #include "boundBox.H"
#include "SortableList.H" #include "SortableList.H"
#include "PackedList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -626,7 +627,7 @@ surfacePatchList triSurface::calcPatches(labelList& faceMap) const
{ {
sortedRegion[faceI] = operator[](faceI).region(); sortedRegion[faceI] = operator[](faceI).region();
} }
sortedRegion.stableSort(); sortedRegion.sort();
faceMap = sortedRegion.indices(); 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 triSurface::triSurface
( (
const List<labelledTri>& triangles, const List<labelledTri>& triangles,
@ -1148,9 +1169,7 @@ triSurface triSurface::subsetMesh
} }
// Construct subsurface // Construct subsurface
triSurface subSurface(newTriangles, patches(), newPoints); return triSurface(newTriangles, patches(), newPoints, true);
return subSurface;
} }
@ -1187,30 +1206,36 @@ void triSurface::write(const Time& d) const
void triSurface::writeStats(Ostream& os) const void triSurface::writeStats(Ostream& os) const
{ {
// Calculate bounding box without any additional addressing // Unfortunately nPoints constructs meshPoints() so do compact version
// Copy of treeBoundBox code. Cannot use meshTools from triSurface... // ourselves.
PackedList<1> pointIsUsed(points().size());
pointIsUsed = 0U;
label nPoints = 0;
boundBox bb boundBox bb
( (
point(VGREAT, VGREAT, VGREAT), point(VGREAT, VGREAT, VGREAT),
point(-VGREAT, -VGREAT, -VGREAT) point(-VGREAT, -VGREAT, -VGREAT)
); );
forAll(*this, triI) forAll(*this, triI)
{ {
const labelledTri& f = operator[](triI); const labelledTri& f = operator[](triI);
forAll(f, fp) forAll(f, fp)
{ {
const point& pt = points()[f[fp]]; label pointI = f[fp];
bb.min() = ::Foam::min(bb.min(), pt); if (pointIsUsed.set(pointI, 1))
bb.max() = ::Foam::max(bb.max(), pt); {
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 os << "Triangles : " << size() << endl
//<< "Edges : " << nEdges() << endl << "Vertices : " << nPoints << endl
<< "Vertices : " << nPoints() << endl
<< "Bounding Box : " << bb << endl; << "Bounding Box : " << bb << endl;
} }

View File

@ -36,9 +36,9 @@ SourceFiles
#ifndef triSurface_H #ifndef triSurface_H
#define triSurface_H #define triSurface_H
#include "PrimitivePatch.H"
#include "pointField.H" #include "pointField.H"
#include "labelledTri.H" #include "labelledTri.H"
#include "PrimitivePatch.H"
#include "boolList.H" #include "boolList.H"
#include "geometricSurfacePatchList.H" #include "geometricSurfacePatchList.H"
#include "surfacePatchList.H" #include "surfacePatchList.H"
@ -215,6 +215,15 @@ public:
const pointField& 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. //- Construct from triangles, points. Set patchnames to default.
triSurface(const List<labelledTri>&, const pointField&); triSurface(const List<labelledTri>&, const pointField&);

View File

@ -5,6 +5,7 @@ laminar/laminar.C
kEpsilon/kEpsilon.C kEpsilon/kEpsilon.C
RNGkEpsilon/RNGkEpsilon.C RNGkEpsilon/RNGkEpsilon.C
realizableKE/realizableKE.C realizableKE/realizableKE.C
kOmega/kOmega.C
kOmegaSST/kOmegaSST.C kOmegaSST/kOmegaSST.C
SpalartAllmaras/SpalartAllmaras.C SpalartAllmaras/SpalartAllmaras.C
LRR/LRR.C LRR/LRR.C

View 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
// ************************************************************************* //

View 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
// ************************************************************************* //

View File

@ -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];
}
}
}
}
// ************************************************************************* //

View File

@ -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;
}
}
}
}
}
// ************************************************************************* //

View 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()
);
}
}
}
// ************************************************************************* //

View File

@ -238,6 +238,7 @@ public:
return k_; return k_;
} }
//- Return the turbulence specific dissipation rate
tmp<volScalarField> omega() const tmp<volScalarField> omega() const
{ {
return omega_; return omega_;

View File

@ -22,7 +22,7 @@ dictionaryReplacement
inlet inlet
{ {
type directMappedPatch; type directMappedPatch;
offset (0.05 0 0); offset (0.0495 0 0);
} }
} }
} }