diff --git a/README b/README index a51f9acb5a..093280c6fb 100644 --- a/README +++ b/README @@ -2,9 +2,9 @@ # #+TITLE: *OpenFOAM README for version 1.5* #+AUTHOR: OpenCFD Ltd. -#+DATE: 14 July 2008 +#+DATE: 26 August 2008 #+LINK: http://www.opencfd.co.uk -#+OPTIONS: author:nil +#+OPTIONS: author:nil ^:{} * Copyright OpenFOAM is free software; you can redistribute it and/or modify it under the diff --git a/README.html b/README.html index 415eb9f33a..cd1497fcad 100644 --- a/README.html +++ b/README.html @@ -1,42 +1,26 @@ - - - -<b>OpenFOAM README for version 1.5</b> - - - - - - -

OpenFOAM README for version 1.5

-
+OpenFOAM README for version 1.5 + +1 Copyright + +OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. +See the file COPYING in this directory, for a description of the GNU General Public License terms under which you can +copy the files. + +2 System requirements + +OpenFOAM is developed and tested on Linux, but should work with other Unix style systems. To check your system setup, +execute the foamSystemCheck script in the bin/ directory of the OpenFOAM installation. If no problems are reported, +proceed to "3. Installation"; otherwise contact your system administrator. + +If the user wishes to run OpenFOAM in 32/64-bit mode they should consult the section "Running OpenFOAM in 32-bit mode". + +2.1 Qt (from http://trolltech.com/products/qt) + +The ParaView 3.3 visualisation package requires that Qt version 4.3.x MUST be installed on the system. Earlier or more +recent versions (4.2.x or 4.4.x) will NOT work. To check whether Qt4 is installed, and the version, type: + + * qmake

Table of Contents

    @@ -62,384 +46,152 @@ lang="en" xml:lang="en">
+–version -
-

1 Copyright

-
+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." -

OpenFOAM is free software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. See the file COPYING in this directory, for a description of the GNU -General Public License terms under which you can copy the files. -

-
- -
- -
-

2 System requirements

-
- -

OpenFOAM is developed and tested on Linux, but should work with other Unix -style systems. To check your system setup, execute the foamSystemCheck script -in the bin/ directory of the OpenFOAM installation. If no problems are -reported, proceed to "3. Installation"; otherwise contact your system -administrator. -

-

-If the user wishes to run OpenFOAM in 32/64-bit mode they should consult the -section "Running OpenFOAM in 32-bit mode". -

- -
- -
-

2.1 Qt (from http://trolltech.com/products/qt)

-
- -

The ParaView 3.3 visualisation package requires that Qt version 4.3.x MUST -be installed on the system. Earlier or more recent versions (4.2.x or -4.4.x) will NOT work. To check whether Qt4 is installed, and the version, -type: -

    -
  • -qmake –version - -
  • -
- -

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." -

-

The default versions of Qt used by some GNU/Linux releases are as follows. -

    -
  • -ubuntu-7.10: Version 4.3.2 -
  • -
  • -ubuntu-8.04: Version 4.3.4 -
  • -
  • -openSuSE-10.2: Version 4.2.1 - too old -
  • -
  • -openSuSE-10.3: Version 4.3.1 -
  • -
  • -openSuSE-11.0: Version 4.4.0 - too new -
  • -
+ * ubuntu-7.10: Version 4.3.2 + * ubuntu-8.04: Version 4.3.4 + * openSuSE-10.2: Version 4.2.1 - too old + * openSuSE-10.3: Version 4.3.1 + * openSuSE-11.0: Version 4.4.0 - too new -

Compilation and running of ParaView has been successful using the libraries -downloaded in the "libqt4-dev" package on ubuntu. -

-

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

-
-
+Compilation and running of ParaView has been successful using the libraries downloaded in the "libqt4-dev" package on +ubuntu. -
+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. -
-

3 Installation

-
+3 Installation -

Download and unpack the files in the $HOME/OpenFOAM directory as described in: -http://www.OpenFOAM.org/download.html -

-

-The environment variable settings are contained in files in an etc/ directory -in the OpenFOAM release. e.g. in -

-
    -
  • -$HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/ -
  • -
  • -where <VERSION> corresponds to the version 1.4, 1.5, … +Download and unpack the files in the $HOME/OpenFOAM directory as described in: http://www.OpenFOAM.org/download.html -
  • -
  • -EITHER, if running bash or ksh (if in doubt type 'echo $SHELL'), source the -etc/bashrc file by adding the following line to the end of your -$HOME/.bashrc file: +The environment variable settings are contained in files in an etc/ directory in the OpenFOAM release. e.g. in -
      -
    • -. $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/bashrc + * $HOME/OpenFOAM/OpenFOAM-/etc/ + * where corresponds to the version 1.4, 1.5, … -
    • -
    + * 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: -

    Then update the environment variables by sourcing the $HOME/.bashrc file by -typing in the terminal: -

    -
      -
    • -. $HOME/.bashrc + + . $HOME/OpenFOAM/OpenFOAM-/etc/bashrc -
    • -
    -
  • -
  • -OR, if running tcsh or csh, source the etc/cshrc file by adding the -following line to the end of your $HOME/.cshrc file: + Then update the environment variables by sourcing the $HOME/.bashrc file by typing in the terminal: -
      -
    • -source $HOME/OpenFOAM/OpenFOAM-<VERSION>/etc/cshrc + + . $HOME/.bashrc -
    • -
    + * OR, if running tcsh or csh, source the etc/cshrc file by adding the following line to the end of your $HOME/.cshrc + file: -

    Then update the environment variables by sourcing the $HOME/.cshrc file by -typing in the terminal: -

    -
      -
    • -source $HOME/.cshrc + + source $HOME/OpenFOAM/OpenFOAM-/etc/cshrc -
    • -
    -
  • -
+ Then update the environment variables by sourcing the $HOME/.cshrc file by typing in the terminal: -
+ + source $HOME/.cshrc -
-

3.1 Installation in alternative locations

-
+3.1 Installation in alternative locations -

OpenFOAM may also be installed in alternative locations. However, the -installation directory should be network available (e.g., NFS) if parallel -calculations are planned. -

-

-The environment variable 'FOAM_INST_DIR' can be used to find and source the -appropriate resource file. Here is a bash/ksh/sh example: -

-
    -
  • -export FOAM_INST_DIR=/data/app/OpenFOAM -
  • -
  • -foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc -
  • -
  • -[ -f $foamDotFile ] && . $foamDotFile +OpenFOAM may also be installed in alternative locations. However, the installation directory should be network +available (e.g., NFS) if parallel calculations are planned. -
  • -
+The environment variable 'FOAM_INST_DIR' can be used to find and source the appropriate resource file. Here is a bash/ +ksh/sh example: -

and a csh/tcsh example: -

-
    -
  • -setenv FOAM_INST_DIR /data/app/OpenFOAM -
  • -
  • -foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc -
  • -
  • -if ( -f $foamDotFile ) source $foamDotFile + * export FOAM_INST_DIR=/data/app/OpenFOAM + * foamDotFile=$FOAM_INST_DIR/OpenFOAM-/etc/bashrc + * [ -f $foamDotFile ] && . $foamDotFile -
  • -
+and a csh/tcsh example: -

The value set in '$FOAM_INST_DIR' will be used to locate the remaining parts -of the OpenFOAM installation. -

-
-
+ * setenv FOAM_INST_DIR /data/app/OpenFOAM + * foamDotFile=$FOAM_INST_DIR/OpenFOAM-/etc/bashrc + * if ( -f $foamDotFile ) source $foamDotFile -
+The value set in '$FOAM_INST_DIR' will be used to locate the remaining parts of the OpenFOAM installation. -
-

4 Building from Sources (Optional)

-
+4 Building from Sources (Optional) -

If you cannot find an appropriate binary pack for your platform, you can build -the complete OpenFOAM from the source-pack. You will first need to compile or -obtain a recent version of gcc (we recomend gcc-4.3.?) for your platform, -which may be obtained from http://gcc.gnu.org/. -

-

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

-

-Now go to the top-level source directory $WM_PROJECT_DIR and execute the -top-level build script './Allwmake'. In principle this will build everything, -but if problems occur with the build order it may be necessary to update the -environment variables and re-execute 'Allwmake'. If you experience -difficulties with building the source-pack, or your platform is not currently -supported, please contact <enquiries@OpenCFD.co.uk> to negotiate a support -contract and we will do the port and maintain it for future releases. -

-
+If you cannot find an appropriate binary pack for your platform, you can build the complete OpenFOAM from the +source-pack. You will first need to compile or obtain a recent version of gcc (we recomend gcc-4.3.?) for your +platform, which may be obtained from http://gcc.gnu.org/. -
+Install the compiler in $WM_PROJECT_INST_DIR/ThirdParty/gcc-/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. -
-

5 Testing the installation

-
+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 to negotiate a support contract and we +will do the port and maintain it for future releases. -

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

-
+5 Testing the installation -
+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. -
-

6 Getting Started

-
+6 Getting Started -

Create a project directory within the $HOME/OpenFOAM directory named -<USER>-<VERSION> (e.g. 'chris-1.5' for user chris and OpenFOAM version 1.5) -and create a directory named 'run' within it, e.g. by typing: -

-
    -
  • -mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run +Create a project directory within the $HOME/OpenFOAM directory named - (e.g. 'chris-1.5' for user chris +and OpenFOAM version 1.5) and create a directory named 'run' within it, e.g. by typing: -
  • -
+ * mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run -

Copy the 'tutorial' examples directory in the OpenFOAM distribution to the -'run' directory. If the OpenFOAM environment variables are set correctly, -then the following command will be correct: -

-
    -
  • -cp -r $WM_PROJECT_DIR/tutorials -$HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run +Copy the 'tutorial' examples directory in the OpenFOAM distribution to the 'run' directory. If the OpenFOAM environment +variables are set correctly, then the following command will be correct: -
  • -
+ * cp -r $WM_PROJECT_DIR/tutorials $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run -

Run the first example case of incompressible laminar flow in a cavity: -

-
    -
  • -cd $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run/tutorials/icoFoam/cavity -
  • -
  • -blockMesh -
  • -
  • -icoFoam -
  • -
  • -paraFoam +Run the first example case of incompressible laminar flow in a cavity: -
  • -
-
+ * cd $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run/tutorials/icoFoam/cavity + * blockMesh + * icoFoam + * paraFoam -
+7 Compiling Paraview 3.3 and the PV3FoamReader module -
-

7 Compiling Paraview 3.3 and the PV3FoamReader module

-
+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: -

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

    -
  • -cd $FOAM_INST_DIR/ThirdParty -
  • -
  • -rm -rf ParaView3.3-cvs/platforms -
  • -
  • -buildParaView3.3-cvs + * cd $FOAM_INST_DIR/ThirdParty + * rm -rf ParaView3.3-cvs/platforms + * buildParaView3.3-cvs -
  • -
+The PV3FoamReader module is an OpenFOAM utility that can be compiled in the usual manner as follows: -

The PV3FoamReader module is an OpenFOAM utility that can be compiled in the -usual manner as follows: -

    -
  • -cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader -
  • -
  • -./Allwclean -
  • -
  • -./Allwmake + * cd $FOAM_UTILITIES/postProcessing/graphics/PV3FoamReader + * ./Allwclean + * ./Allwmake -
  • -
-
+8 Documentation -
+http://www.OpenFOAM.org/doc -
-

8 Documentation

- +http://www.OpenFOAM.org http://www.OpenFOAM.org/discussion.html -
+10 Reporting Bugs in OpenFOAM -
-

9 Help

-
+http://www.OpenFOAM.org/bugs.html -

http://www.OpenFOAM.org http://www.OpenFOAM.org/discussion.html -

-
+11 Running OpenFOAM in 32-bit mode on 64-bit machines -
+Linux users with a 64-bit machine may install either the OpenFOAM 32-bit version (linux) or the OpenFOAM 64-bit version +(linux64), or both. The 64-bit is the default mode on a 64-bit machine. To use an installed 32-bit version, the user +must set the environment variable WM_ARCH_OPTION to 32 before sourcing the etc/bashrc (or etc/cshrc) file. -
-

10 Reporting Bugs in OpenFOAM

-
+Date: 26 August 2008 -

http://www.OpenFOAM.org/bugs.html -

-
+HTML generated by org-mode 6.06b in emacs 23 -
- -
-

11 Running OpenFOAM in 32-bit mode on 64-bit machines

-
- -

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

-
-

Date: 14 July 2008

-

HTML generated by org-mode 6.05a in emacs 23

-

- diff --git a/ReleaseNotes-1.5 b/ReleaseNotes-1.5 index 7a36d0fa3c..faa5dad6b2 100644 --- a/ReleaseNotes-1.5 +++ b/ReleaseNotes-1.5 @@ -2,9 +2,9 @@ # #+TITLE: *OpenFOAM release notes for version 1.5* #+AUTHOR: OpenCFD Ltd. -#+DATE: 14 July 2008 +#+DATE: 26 August 2008 #+LINK: http://www.opencfd.co.uk -#+OPTIONS: author:nil +#+OPTIONS: author:nil ^:{} * Overview OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are diff --git a/ReleaseNotes-1.5.html b/ReleaseNotes-1.5.html index 480775406a..a1805d5e9d 100644 --- a/ReleaseNotes-1.5.html +++ b/ReleaseNotes-1.5.html @@ -1,42 +1,27 @@ - - - -<b>OpenFOAM release notes for version 1.5</b> - - - - - - -

OpenFOAM release notes for version 1.5

-
+OpenFOAM release notes for version 1.5 + +1 Overview + +OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are +outlined below. This release passes all our standard tests and the tutorials +have been broadly checked. If there are any bugs, please report them using the +instructions set out in: http://www.openfoam.org/bugs.html. + +Most of the developments for this release are in: new applications, e.g. for +multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed +flows and even molecular dynamics; new utilities, e.g. for meshing and case +monitoring; and, new modelling, e.g. in Lagrangian particle tracking, +radiation and rotating frames of reference. With these new applications come +numerous new example cases. + +2 GNU/Linux version + +The 64bit binary packs of the OpenFOAM release were compiled on a machine +running SuSE GNU/Linux version 10.3 and the 32bit on a machine running Ubuntu +GNU/Linux version 7.1 and also tested on Ubuntu 8.04. We recommend that users +run OpenFOAM on one of these or a similar recent version of GNU/Linux. This +release has also been successfully compiled and tested on older GNU/Linux +releases but this re

Table of Contents

    @@ -54,376 +39,170 @@ lang="en" xml:lang="en">
+quires the installation of Qt 4.3.? for ParaView-3 to run. -
-

1 Overview

-
+3 C++ Compiler version -

OpenFOAM-1.5 is is a significant upgrade to version 1.4 in ways which are -outlined below. This release passes all our standard tests and the tutorials -have been broadly checked. If there are any bugs, please report them using -the instructions set out in: http://www.openfoam.org/bugs.html. -

-

-Most of the developments for this release are in: new applications, e.g. for -multiphase flow and cavitation, buoyancy-flow and heat transfer, high speed -flows and even molecular dynamics; new utilities, e.g. for meshing and case -monitoring; and, new modelling, e.g. in Lagrangian particle tracking, -radiation and rotating frames of reference. With these new applications come -numerous new example cases. -

-
+ * Released compiled with GCC 4.3.1, the latest version. + * Built in support for the Intel C++ 10.? compiler (untested). + * The choice of the compiler is controlled by the setting of the + $WM_COMPILER and $WM_COMPILER_ARCH environment variables in the + OpenFOAM-1.5/etc/bashrc (or cshrc) file. + * The location of the installation of the compiler is controlled by the + $WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh + (or settings.csh) file. -
+4 Developments to solvers (applications) -
-

2 GNU/Linux version

-
+ * New rhoCentralFoam solver for high-speed, viscous, compressible flows + using non-oscillatory, central-upwind schemes. + * New interDyMFoam solver for 2 incompressible, isothermal, immiscible + fluids using a VoF phase-fraction based interface capturing approach, with + optional mesh motion and mesh topology changes including adaptive mesh + (un)refinement. Useful for simulations such as tank filling, sloshing --- + using solid body motion e.g. SDA or SKA (6DoF) — and slamming (using the + mesh motion solver) and other large-scale applications that benefit from + the efficiency gain of adaptive mesh (un)refinement of the interface. + * New compressibleInterFoam solver for 2 compressible, isothermal, + immiscible fluids using a volume of fluid (VoF) phase-fraction approach + for interface-capturing. The momentum and other fluid properties are of + the "mixture" and a single momentum equation is solved. Turbulence is + modelled using a run-time selectable incompressible LES model. + * New interPhaseChangeFoam solver for 2 incompressible, isothermal, + immiscible fluids with phase-change, e.g. cavitation. Uses VoF interface + capturing, with momentum and other fluid properties described for the + ``mixture'' and a single momentum equation is solved. The set of + phase-change models provided are designed to simulate cavitation but other + mechanisms of phase-change are supported within this solver framework. + * New rasCavitatingFoam solver for transient cavitation using a barotropic + compressibility model, with RAS turbulence. + * New lesCavitatingFoam solver for transient cavitation using a barotropic + compressibility model, with LES turbulence. + * New chtMultiRegionFoam solver that couples conjugate heat transfer in a + solid to a buoyancy-driven flow simulation. + * New PDRFoam solver for compressible premixed/partially-premixed turbulent + combustion that includes porosity/distributed resistance (PDR) modelling + to handle regions containing solid blockages which cannot be resolved by + the mesh. Requires the PDR fields. + * New lesBuoyantFoam solver for transient, buoyant, turbulent flow of + compressible fluids for ventilation and heat-transfer. Turbulence is + modelled using a run-time selectable compressible LES model. + * New rhoPimpleFoam solver for transient, turbulent flow of compressible + fluids for ventilation and heat-transfer. Uses the flexible PIMPLE + (PISO-SIMPLE) solution for time-resolved and pseudo-transient simulations. + * New buoyantSimpleRadiationFoam solver for steady-state, buoyant, turbulent + flow of compressible fluids with radiation, for ventilation and + heat-transfer. + * New rhoTurbTwinParcelFoam solver for transient for compressible, turbulent + flow with two thermo-clouds. + * New gnemdFOAM solver for general purpose molecular dynamics that simulates + atoms in arbitrary shaped domains and average atomic/molecular quantities + to the mesh to create field data. + * New mdEqulibrationFoam solver to equilibrates and/or preconditions + molecular dynamics systems. + * Demonstration SRFSimpleFoam solver based on simpleFoam that incorporates + the SRF extensions (see below) for rotating flows. -

The 64bit binary packs of the OpenFOAM release were compiled on a machine -running SuSE GNU/Linux version 10.3 and the 32bit on a machine running Ubuntu -GNU/Linux version 7.1 and also tested on Ubuntu 8.04. We recommend that -users run OpenFOAM on one of these or a similar recent version of GNU/Linux. -This release has also been successfully compiled and tested on older GNU/Linux -releases but this requires the installation of Qt 4.3.? for ParaView-3 to run. -

-
+5 Automatic mesher -
+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. -
-

3 C++ Compiler version

-
+6 Developments to utilities -
    -
  • -Released compiled with GCC 4.3.1, the latest version. -
  • -
  • -Built in support for the Intel C++ 10.? compiler (untested). -
  • -
  • -The choice of the compiler is controlled by the setting of the $WM_COMPILER -and $WM_COMPILER_ARCH environment variables in the OpenFOAM-1.5/etc/bashrc -(or cshrc) file. -
  • -
  • -The location of the installation of the compiler is controlled by the -$WM_COMPILER_INST environment variable in the OpenFOAM-1.5/etc/settings.sh -(or settings.csh) file. + * New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D + meshes are described by faces with 2 points, so can be used in combination + with 2D meshes converted with ccm26ToFoam. + * New couplePatches functionality integrated into createPatch, which + optionally synchronises ("couples") points and faces of coupled (cyclic, + processor) patches. + * New applyBoundaryLayer pre-processing utility to apply 1/7th power-law + boundary layers at walls, starting from uniform or potential flow + solutions. + * New execFlowFunctionObjects utility executes functionObjects as a + post-processing activity, e.g. probes, sampling, force calculation. + * New changeDictionary utility makes batch changes to OpenFOAM input files, + e.g. to change boundary conditions of field files. + * New foamCalc utility, a generic post-processing field calculator tool + * New molConfig pre-processing utility for molecular dynamics cases. Fills + zones of a mesh with single crystal lattices of specified structure, + density, orientation, alignment and temperature. + * Extended splitMeshRegions utility to split multi-zone meshes, e.g. defined + through cellZones, into separate meshes. + * Extended the foamToVTK, decomposePar, reconstructPar and mapFields + utilities to include support for multiple particle clouds in parallel + processing. -
  • -
-
+7 Migration from ParaView 2.4 to ParaView 3.x -
+ * 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. -
-

4 Developments to solvers (applications)

-
+8 Model development -
    -
  • -New rhoCentralFoam solver for high-speed, viscous, compressible flows using -non-oscillatory, central-upwind schemes. -
  • -
  • -New interDyMFoam solver for 2 incompressible, isothermal, immiscible fluids -using a VoF phase-fraction based interface capturing approach, with optional -mesh motion and mesh topology changes including adaptive mesh -(un)refinement. Useful for simulations such as tank filling, sloshing --- -using solid body motion e.g. SDA or SKA (6DoF) — and slamming (using the -mesh motion solver) and other large-scale applications that benefit from the -efficiency gain of adaptive mesh (un)refinement of the interface. -
  • -
  • -New compressibleInterFoam solver for 2 compressible, isothermal, immiscible -fluids using a volume of fluid (VoF) phase-fraction approach for -interface-capturing. The momentum and other fluid properties are of the -"mixture" and a single momentum equation is solved. Turbulence is modelled -using a run-time selectable incompressible LES model. -
  • -
  • -New interPhaseChangeFoam solver for 2 incompressible, isothermal, immiscible -fluids with phase-change, e.g. cavitation. Uses VoF interface capturing, -with momentum and other fluid properties described for the ``mixture'' and a -single momentum equation is solved. The set of phase-change models provided -are designed to simulate cavitation but other mechanisms of phase-change are -supported within this solver framework. -
  • -
  • -New rasCavitatingFoam solver for transient cavitation using a barotropic -compressibility model, with RAS turbulence. -
  • -
  • -New lesCavitatingFoam solver for transient cavitation using a barotropic -compressibility model, with LES turbulence. -
  • -
  • -New chtMultiRegionFoam solver that couples conjugate heat transfer in a -solid to a buoyancy-driven flow simulation. -
  • -
  • -New PDRFoam solver for compressible premixed/partially-premixed turbulent -combustion that includes porosity/distributed resistance (PDR) modelling to -handle regions containing solid blockages which cannot be resolved by the -mesh. Requires the PDR fields. -
  • -
  • -New lesBuoyantFoam solver for transient, buoyant, turbulent flow of -compressible fluids for ventilation and heat-transfer. Turbulence is -modelled using a run-time selectable compressible LES model. -
  • -
  • -New rhoPimpleFoam solver for transient, turbulent flow of compressible -fluids for ventilation and heat-transfer. Uses the flexible PIMPLE -(PISO-SIMPLE) solution for time-resolved and pseudo-transient simulations. -
  • -
  • -New buoyantSimpleRadiationFoam solver for steady-state, buoyant, turbulent -flow of compressible fluids with radiation, for ventilation and -heat-transfer. -
  • -
  • -New rhoTurbTwinParcelFoam solver for transient for compressible, turbulent -flow with two thermo-clouds. -
  • -
  • -New gnemdFOAM solver for general purpose molecular dynamics that simulates -atoms in arbitrary shaped domains and average atomic/molecular quantities to -the mesh to create field data. -
  • -
  • -New mdEqulibrationFoam solver to equilibrates and/or preconditions molecular -dynamics systems. -
  • -
  • -Demonstration SRFSimpleFoam solver based on simpleFoam that incorporates the -SRF extensions (see below) for rotating flows. + * Overhauled the lagrangian library to support multiple clouds. + * New lagrangianIntermediate library incorporating a hierarchy of parcel and + cloud types, accommodating kinematic, thermodynamic and reacting + applications, including coupling to the new radiation library. Sub-models + are added at the relevant level of physics, e.g.: + + kinematic: injection, wall interaction, drag, dispersion; + + thermo: heat transfer; + + reacting: reacting composition, mass transfer, surface reactions. + * New single rotating frame of reference (SRF) library for rotating flow + applications, e.g. turbo-machinery. + * New radiation library including the P1 model and associated Marshak + boundary conditions for incident radiation. + * New displacementInterpolation motion solver for flexible mesh scaling. + * New molecularDynamics Lagrangian library to calculate intermolecular + forces between spherically symmetrical monatomic species in arbitrary + geometries. -
  • -
-
+9 New functionObjects -
+To aid common monitoring and post-processing activities. -
-

5 Automatic mesher

-
+ * forces: calculate the force and moment on a patch or set of patches, e.g. + to calculate the lift, drag and moment of an object in the flow. + * forceCoeffs: calculate the normalised force and moment on a patch or set + of patches, e.g. to calculate the lift, drag and moment coefficients of an + object in the flow. + * fieldAverage: calculate field arithmetic mean and prime-squared averages + for a list of fields. + * foamCalcFunctions: calculate field components, div, mag, magGrad or + magSqr. -

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

-
+10 Improvements to boundary conditions -
+ * 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. -
-

6 Developments to utilities

-
+11 Other -
    -
  • -New extrude2DMesh utility that extrudes 2D meshes into a 3D mesh. 2D meshes -are described by faces with 2 points, so can be used in combination with 2D -meshes converted with ccm26ToFoam. -
  • -
  • -New couplePatches functionality integrated into createPatch, which -optionally synchronises ("couples") points and faces of coupled (cyclic, -processor) patches. -
  • -
  • -New applyBoundaryLayer pre-processing utility to apply 1/7th power-law -boundary layers at walls, starting from uniform or potential flow solutions. -
  • -
  • -New execFlowFunctionObjects utility executes functionObjects as a -post-processing activity, e.g. probes, sampling, force calculation. -
  • -
  • -New changeDictionary utility makes batch changes to OpenFOAM input files, -e.g. to change boundary conditions of field files. -
  • -
  • -New foamCalc utility, a generic post-processing field calculator tool -
  • -
  • -New molConfig pre-processing utility for molecular dynamics cases. Fills -zones of a mesh with single crystal lattices of specified structure, -density, orientation, alignment and temperature. -
  • -
  • -Extended splitMeshRegions utility to split multi-zone meshes, e.g. defined -through cellZones, into separate meshes. -
  • -
  • -Extended the foamToVTK, decomposePar, reconstructPar and mapFields utilities -to include support for multiple particle clouds in parallel processing. + * New argument-free command execution, e.g typing "icoFoam" without root and + case directory arguments. + * Extended time command line options. + * Many enhancements to dictionary including macro substitution, optional + merging and default/overwrite behaviour, enhanced "#include" file handling + and the framework to support function evaluation. + * Cross-links between applications and Doxygen documentation with the "-doc" + argument. + * Non-blocking, non-buffered, parallel transfers with potential scaling + benefits for larger number of processors. -
  • -
-
+Date: 26 August 2008 -
+HTML generated by org-mode 6.06b in emacs 23 -
-

7 Migration from ParaView 2.4 to ParaView 3.x

-
- -
    -
  • -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. - -
  • -
-
- -
- -
-

8 Model development

-
- -
    -
  • -Overhauled the lagrangian library to support multiple clouds. -
  • -
  • -New lagrangianIntermediate library incorporating a hierarchy of parcel and -cloud types, accommodating kinematic, thermodynamic and reacting -applications, including coupling to the new radiation library. Sub-models -are added at the relevant level of physics, e.g.: -
      -
    • -kinematic: injection, wall interaction, drag, dispersion; -
    • -
    • -thermo: heat transfer; -
    • -
    • -reacting: reacting composition, mass transfer, surface reactions. -
    • -
    -
  • -
  • -New single rotating frame of reference (SRF) library for rotating flow -applications, e.g. turbo-machinery. -
  • -
  • -New radiation library including the P1 model and associated Marshak boundary -conditions for incident radiation. -
  • -
  • -New displacementInterpolation motion solver for flexible mesh scaling. -
  • -
  • -New molecularDynamics Lagrangian library to calculate intermolecular forces -between spherically symmetrical monatomic species in arbitrary geometries. - -
  • -
-
- -
- -
-

9 New functionObjects

-
- -

To aid common monitoring and post-processing activities. -

    -
  • -forces: calculate the force and moment on a patch or set of patches, e.g. to -calculate the lift, drag and moment of an object in the flow. -
  • -
  • -forceCoeffs: calculate the normalised force and moment on a patch or set of -patches, e.g. to calculate the lift, drag and moment coefficients of an -object in the flow. -
  • -
  • -fieldAverage: calculate field arithmetic mean and prime-squared averages for -a list of fields. -
  • -
  • -foamCalcFunctions: calculate field components, div, mag, magGrad or magSqr. - -
  • -
-
- -
- -
-

10 Improvements to boundary conditions

-
- -
    -
  • -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. - -
  • -
-
- -
- -
-

11 Other

-
- -
    -
  • -New argument-free command execution, e.g typing "icoFoam" without root and -case directory arguments. -
  • -
  • -Extended time command line options. -
  • -
  • -Many enhancements to dictionary including macro substitution, optional -merging and default/overwrite behaviour, enhanced "#include" file handling -and the framework to support function evaluation. -
  • -
  • -Cross-links between applications and Doxygen documentation with the "-doc" -argument. -
  • -
  • -Non-blocking, non-buffered, parallel transfers with potential scaling -benefits for larger number of processors. -
  • -
-
-
-

Date: 14 July 2008

-

HTML generated by org-mode 6.05a in emacs 23

-

- diff --git a/applications/solvers/Lagrangian/kinematicParcelFoam/Make/files b/applications/solvers/Lagrangian/kinematicParcelFoam/Make/files new file mode 100644 index 0000000000..f98171fc93 --- /dev/null +++ b/applications/solvers/Lagrangian/kinematicParcelFoam/Make/files @@ -0,0 +1,3 @@ +kinematicParcelFoam.C + +EXE = $(FOAM_USER_APPBIN)/kinematicParcelFoam diff --git a/applications/solvers/Lagrangian/kinematicParcelFoam/Make/options b/applications/solvers/Lagrangian/kinematicParcelFoam/Make/options new file mode 100644 index 0000000000..517724be31 --- /dev/null +++ b/applications/solvers/Lagrangian/kinematicParcelFoam/Make/options @@ -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 diff --git a/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H b/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H new file mode 100644 index 0000000000..6b87262133 --- /dev/null +++ b/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H @@ -0,0 +1,68 @@ + Info<< "Reading thermophysical properties\n" << endl; + + autoPtr 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 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 + ); diff --git a/applications/solvers/Lagrangian/kinematicParcelFoam/kinematicParcelFoam.C b/applications/solvers/Lagrangian/kinematicParcelFoam/kinematicParcelFoam.C new file mode 100644 index 0000000000..290480583c --- /dev/null +++ b/applications/solvers/Lagrangian/kinematicParcelFoam/kinematicParcelFoam.C @@ -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); +} + + +// ************************************************************************* // diff --git a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H index 8eb03f95eb..6a87bbdf11 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H @@ -5,7 +5,7 @@ - fvm::Sp(fvc::div(phi), h) - fvm::laplacian(turbulence->alphaEff(), h) == - fvc::div(phi/fvc::interpolate(rho)*fvc::interpolate(p, "div(U,p)")) + fvc::div(phi/fvc::interpolate(rho), p, "div(U,p)") - p*fvc::div(phi/fvc::interpolate(rho)) ); diff --git a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H index 9f7e576919..e4fbe15aa4 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H @@ -1,40 +1,92 @@ -volScalarField AU = UEqn().A(); -U = UEqn().H()/AU; -UEqn.clear(); -phi = fvc::interpolate(rho*U) & mesh.Sf(); -bool closedVolume = adjustPhi(phi, U, p); +rho = thermo->rho(); -for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) +volScalarField rUA = 1.0/UEqn().A(); +U = rUA*UEqn().H(); +UEqn.clear(); + +bool closedVolume = false; + +if (transonic) { - fvScalarMatrix pEqn + surfaceScalarField phid ( - fvm::laplacian(rho/AU, p) == fvc::div(phi) + "phid", + fvc::interpolate(thermo->psi())*(fvc::interpolate(U) & mesh.Sf()) ); - pEqn.setReference(pRefCell, pRefValue); - // retain the residual from the first iteration - if (nonOrth == 0) + for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) { - eqnResidual = pEqn.solve().initialResidual(); - maxResidual = max(eqnResidual, maxResidual); - } - else - { - pEqn.solve(); - } + fvScalarMatrix pEqn + ( + fvm::div(phid, p) + - fvm::laplacian(rho*rUA, p) + ); - if (nonOrth == nNonOrthCorr) - { - phi -= pEqn.flux(); + // Relax the pressure equation to ensure diagonal-dominance + pEqn.relax(mesh.relaxationFactor("pEqn")); + + pEqn.setReference(pRefCell, pRefValue); + + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pEqn.solve(); + } + + if (nonOrth == nNonOrthCorr) + { + phi == pEqn.flux(); + } } } +else +{ + phi = fvc::interpolate(rho)*(fvc::interpolate(U) & mesh.Sf()); + closedVolume = adjustPhi(phi, U, p); + + for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) + { + fvScalarMatrix pEqn + ( + fvm::laplacian(rho*rUA, p) == fvc::div(phi) + ); + + pEqn.setReference(pRefCell, pRefValue); + + // Retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pEqn.solve(); + } + + if (nonOrth == nNonOrthCorr) + { + phi -= pEqn.flux(); + } + } +} + #include "incompressible/continuityErrs.H" // Explicitly relax pressure for momentum corrector p.relax(); -U -= fvc::grad(p)/AU; +rho = thermo->rho(); +rho.relax(); +Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; + +U -= rUA*fvc::grad(p); U.correctBoundaryConditions(); bound(p, pMin); @@ -46,7 +98,3 @@ if (closedVolume) p += (initialMass - fvc::domainIntegrate(thermo->psi()*p)) /fvc::domainIntegrate(thermo->psi()); } - -rho = thermo->rho(); -rho.relax(); -Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index d4a3e0ff78..83dff1819d 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -84,6 +84,7 @@ $(derivedFvPatchFields)/oscillatingFixedValue/oscillatingFixedValueFvPatchFields $(derivedFvPatchFields)/outletInlet/outletInletFvPatchFields.C $(derivedFvPatchFields)/partialSlip/partialSlipFvPatchFields.C $(derivedFvPatchFields)/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C +$(derivedFvPatchFields)/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.C index 2908681eb0..7082962d9f 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.C @@ -74,20 +74,10 @@ fluxCorrectedVelocityFvPatchVectorField ) : zeroGradientFvPatchVectorField(p, iF), - phiName_("phi"), - rhoName_("rho") + phiName_(dict.lookupOrDefault("phi", "phi")), + rhoName_(dict.lookupOrDefault("rho", "rho")) { fvPatchVectorField::operator=(patchInternalField()); - - if (dict.found("phi")) - { - dict.lookup("phi") >> phiName_; - } - - if (dict.found("rho")) - { - dict.lookup("rho") >> rhoName_; - } } @@ -118,10 +108,8 @@ void fluxCorrectedVelocityFvPatchVectorField::evaluate zeroGradientFvPatchVectorField::evaluate(); - const surfaceScalarField& phi = db().lookupObject - ( - phiName_ - ); + const surfaceScalarField& phi = + db().lookupObject(phiName_); const fvsPatchField& phip = patch().patchField(phi); diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.H index 438eb0deb9..239db2cd33 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.H @@ -26,7 +26,10 @@ Class Foam::fluxCorrectedVelocityFvPatchVectorField Description - Foam::fluxCorrectedVelocityFvPatchVectorField + Velocity outlet boundary condition for patches where the pressure is + specified. The outflow velocity is obtained by "zeroGradient" and then + corrected from the flux. If reverse flow is possible or expected use + the "pressureInletOutletVelocityFvPatchVectorField" BC instead. SourceFiles fluxCorrectedVelocityFvPatchVectorField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.C index 819807927b..c41d207724 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.C @@ -158,6 +158,22 @@ void inletOutletFvPatchField::write(Ostream& os) const } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +template +void inletOutletFvPatchField::operator= +( + const fvPatchField& ptf +) +{ + fvPatchField::operator= + ( + this->valueFraction()*this->refValue() + + (1 - this->valueFraction())*ptf + ); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.H index 788285ff98..a7c72aa038 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/inletOutlet/inletOutletFvPatchField.H @@ -134,6 +134,11 @@ public: //- Write virtual void write(Ostream&) const; + + + // Member operators + + virtual void operator=(const fvPatchField& pvf); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C index 66a535c6a7..afbccbd03a 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.C @@ -45,6 +45,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField ) : mixedFvPatchVectorField(p, iF), + phiName_("phi"), + rhoName_("rho"), inletDir_(p.size()) { refValue() = *this; @@ -63,6 +65,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField ) : mixedFvPatchVectorField(ptf, p, iF, mapper), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_), inletDir_(ptf.inletDir_, mapper) {} @@ -76,6 +80,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField ) : mixedFvPatchVectorField(p, iF), + phiName_(dict.lookupOrDefault("phi", "phi")), + rhoName_(dict.lookupOrDefault("rho", "rho")), inletDir_("inletDirection", dict, p.size()) { fvPatchVectorField::operator=(vectorField("value", dict, p.size())); @@ -92,6 +98,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField ) : mixedFvPatchVectorField(pivpvf), + phiName_(pivpvf.phiName_), + rhoName_(pivpvf.rhoName_), inletDir_(pivpvf.inletDir_) {} @@ -104,6 +112,8 @@ pressureDirectedInletOutletVelocityFvPatchVectorField ) : mixedFvPatchVectorField(pivpvf, iF), + phiName_(pivpvf.phiName_), + rhoName_(pivpvf.rhoName_), inletDir_(pivpvf.inletDir_) {} @@ -129,7 +139,8 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::rmap mixedFvPatchVectorField::rmap(ptf, addr); const pressureDirectedInletOutletVelocityFvPatchVectorField& tiptf = - refCast(ptf); + refCast + (ptf); inletDir_.rmap(tiptf.inletDir_, addr); } @@ -143,7 +154,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs() } const surfaceScalarField& phi = - db().lookupObject("phi"); + db().lookupObject(phiName_); const fvsPatchField& phip = patch().patchField(phi); @@ -158,7 +169,7 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField::updateCoeffs() else if (phi.dimensions() == dimDensity*dimVelocity*dimArea) { const fvPatchField& rhop = - patch().lookupPatchField("rho"); + patch().lookupPatchField(rhoName_); refValue() = inletDir_*phip/(rhop*ndmagS); } @@ -185,11 +196,28 @@ void pressureDirectedInletOutletVelocityFvPatchVectorField:: write(Ostream& os) const { fvPatchVectorField::write(os); + os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl; + os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl; inletDir_.writeEntry("inletDirection", os); writeEntry("value", os); } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +void pressureDirectedInletOutletVelocityFvPatchVectorField::operator= +( + const fvPatchField& pvf +) +{ + fvPatchField::operator= + ( + valueFraction()*(inletDir_*(inletDir_ & pvf)) + + (1 - valueFraction())*pvf + ); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePatchTypeField diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.H index 8907c1d1af..4eaa0586e6 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletOutletVelocity/pressureDirectedInletOutletVelocityFvPatchVectorField.H @@ -26,7 +26,10 @@ Class Foam::pressureDirectedInletOutletVelocityFvPatchVectorField Description - Foam::pressureDirectedInletOutletVelocityFvPatchVectorField + Velocity inlet/outlet boundary condition for pressure boundary where the + pressure is specified. zero-gradient is applied for outflow (as defined + by the flux) and for inflow the velocity is obtained from the flux with + the specified `inletDirection'. SourceFiles pressureDirectedInletOutletVelocityFvPatchVectorField.C @@ -53,7 +56,9 @@ class pressureDirectedInletOutletVelocityFvPatchVectorField public mixedFvPatchVectorField { // Private data - + + word phiName_; + word rhoName_; vectorField inletDir_; @@ -133,9 +138,35 @@ public: } - // Member functions + // Access + + //- Return the name of rho + const word& rhoName() const + { + return rhoName_; + } + + //- Return reference to the name of rho to allow adjustment + word& rhoName() + { + return rhoName_; + } + + //- Return the name of phi + const word& phiName() const + { + return phiName_; + } + + //- Return reference to the name of phi to allow adjustment + word& phiName() + { + return phiName_; + } + + // Mapping functions //- Map (and resize as needed) from self given a mapping object @@ -157,6 +188,11 @@ public: //- Write virtual void write(Ostream&) const; + + + // Member operators + + virtual void operator=(const fvPatchField& pvf); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C index 1fe26fd649..fa9b68f545 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.C @@ -45,6 +45,8 @@ pressureDirectedInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(p, iF), + phiName_("phi"), + rhoName_("rho"), inletDir_(p.size()) {} @@ -59,6 +61,8 @@ pressureDirectedInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(ptf, p, iF, mapper), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_), inletDir_(ptf.inletDir_, mapper) {} @@ -72,6 +76,8 @@ pressureDirectedInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(p, iF), + phiName_(dict.lookupOrDefault("phi", "phi")), + rhoName_(dict.lookupOrDefault("rho", "rho")), inletDir_("inletDirection", dict, p.size()) { fvPatchVectorField::operator=(vectorField("value", dict, p.size())); @@ -85,6 +91,8 @@ pressureDirectedInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(pivpvf), + phiName_(pivpvf.phiName_), + rhoName_(pivpvf.rhoName_), inletDir_(pivpvf.inletDir_) {} @@ -97,6 +105,8 @@ pressureDirectedInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(pivpvf, iF), + phiName_(pivpvf.phiName_), + rhoName_(pivpvf.rhoName_), inletDir_(pivpvf.inletDir_) {} @@ -135,8 +145,8 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs() return; } - const surfaceScalarField& phi = - db().lookupObject("phi"); + const surfaceScalarField& phi = + db().lookupObject(phiName_); const fvsPatchField& phip = patch().patchField(phi); @@ -151,7 +161,7 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs() else if (phi.dimensions() == dimDensity*dimVelocity*dimArea) { const fvPatchField& rhop = - patch().lookupPatchField("rho"); + patch().lookupPatchField(rhoName_); operator==(inletDir_*phip/(rhop*ndmagS)); } @@ -174,11 +184,24 @@ void pressureDirectedInletVelocityFvPatchVectorField::updateCoeffs() void pressureDirectedInletVelocityFvPatchVectorField::write(Ostream& os) const { fvPatchVectorField::write(os); + os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl; + os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl; inletDir_.writeEntry("inletDirection", os); writeEntry("value", os); } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +void pressureDirectedInletVelocityFvPatchVectorField::operator= +( + const fvPatchField& pvf +) +{ + fvPatchField::operator=(inletDir_*(inletDir_ & pvf)); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePatchTypeField diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.H index a80e7779b2..4de0c84f48 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureDirectedInletVelocity/pressureDirectedInletVelocityFvPatchVectorField.H @@ -23,10 +23,14 @@ License Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Class - Foam::pressureDirectedInletVelocityFvPatchVectorField + Foam::pressureDirectedInletVelocityFvPatchVectorField Description - Foam::pressureDirectedInletOutletVelocityFvPatchVectorField + Velocity inlet boundary condition for patches where the pressure is + specified. The inflow velocity is obtained from the flux with the + specified "inletDirection" direction. If reverse flow is possible or + expected use the "pressureDirectedInletOutletVelocityFvPatchVectorField" + BC instead. SourceFiles pressureDirectedInletVelocityFvPatchVectorField.C @@ -53,7 +57,9 @@ class pressureDirectedInletVelocityFvPatchVectorField public fixedValueFvPatchVectorField { // Private data - + + word phiName_; + word rhoName_; vectorField inletDir_; @@ -130,9 +136,35 @@ public: } - // Member functions + // Access + + //- Return the name of rho + const word& rhoName() const + { + return rhoName_; + } + + //- Return reference to the name of rho to allow adjustment + word& rhoName() + { + return rhoName_; + } + + //- Return the name of phi + const word& phiName() const + { + return phiName_; + } + + //- Return reference to the name of phi to allow adjustment + word& phiName() + { + return phiName_; + } + + // Mapping functions //- Map (and resize as needed) from self given a mapping object @@ -154,6 +186,11 @@ public: //- Write virtual void write(Ostream&) const; + + + // Member operators + + virtual void operator=(const fvPatchField& pvf); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.H index 538e17ae18..29eed3bfc3 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletOutletVelocity/pressureInletOutletVelocityFvPatchVectorField.H @@ -26,7 +26,10 @@ Class Foam::pressureInletOutletVelocityFvPatchVectorField Description - Foam::pressureInletOutletVelocityFvPatchVectorField + Velocity inlet/outlet boundary condition patches for where the pressure is + specified. zero-gradient is applied for outflow (as defined by the flux) + and for inflow the velocity is obtained from the patch-face normal + component of the internal-cell value. SourceFiles pressureInletOutletVelocityFvPatchVectorField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C index fb2787c164..0acfc62f01 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C @@ -108,6 +108,17 @@ void pressureInletUniformVelocityFvPatchVectorField::updateCoeffs() } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +void pressureInletUniformVelocityFvPatchVectorField::operator= +( + const fvPatchField& pvf +) +{ + operator==(patch().nf()*sum(patch().Sf() & pvf)/sum(patch().magSf())); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePatchTypeField diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.H index 4440cdfbe8..0eadf62472 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.H @@ -26,7 +26,9 @@ Class Foam::pressureInletUniformVelocityFvPatchVectorField Description - Foam::pressureInletUniformVelocityFvPatchVectorField + Velocity inlet boundary condition for patches where the pressure is + specified. The uniform inflow velocity is obtained by averaging the flux + over the patch and apply it in the direction normal to the patch faces. SourceFiles pressureInletUniformVelocityFvPatchVectorField.C @@ -124,6 +126,11 @@ public: //- Update the coefficients associated with the patch field virtual void updateCoeffs(); + + + // Member operators + + virtual void operator=(const fvPatchField& pvf); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.C index c349bc3260..75242aabb5 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.C @@ -70,20 +70,10 @@ pressureInletVelocityFvPatchVectorField::pressureInletVelocityFvPatchVectorField ) : fixedValueFvPatchVectorField(p, iF), - phiName_("phi"), - rhoName_("rho") + phiName_(dict.lookupOrDefault("phi", "phi")), + rhoName_(dict.lookupOrDefault("rho", "rho")) { fvPatchVectorField::operator=(vectorField("value", dict, p.size())); - - if (dict.found("phi")) - { - dict.lookup("phi") >> phiName_; - } - - if (dict.found("rho")) - { - dict.lookup("rho") >> rhoName_; - } } @@ -164,6 +154,17 @@ void pressureInletVelocityFvPatchVectorField::write(Ostream& os) const } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +void pressureInletVelocityFvPatchVectorField::operator= +( + const fvPatchField& pvf +) +{ + fvPatchField::operator=(patch().nf()*(patch().nf() & pvf)); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePatchTypeField diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.H index 75348775bc..bb7b7f5b9b 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.H @@ -26,7 +26,10 @@ Class Foam::pressureInletVelocityFvPatchVectorField Description - Foam::pressureInletVelocityFvPatchVectorField + Velocity inlet boundary condition for patches where the pressure is + specified. The inflow velocity is obtained from the flux with a direction + normal to the patch faces. If reverse flow is possible or expected use + the "pressureInletOutletVelocityFvPatchVectorField" BC instead. SourceFiles pressureInletVelocityFvPatchVectorField.C @@ -57,6 +60,7 @@ class pressureInletVelocityFvPatchVectorField word phiName_; word rhoName_; + public: //- Runtime type information @@ -127,6 +131,33 @@ public: // Member functions + // Access + + //- Return the name of rho + const word& rhoName() const + { + return rhoName_; + } + + //- Return reference to the name of rho to allow adjustment + word& rhoName() + { + return rhoName_; + } + + //- Return the name of phi + const word& phiName() const + { + return phiName_; + } + + //- Return reference to the name of phi to allow adjustment + word& phiName() + { + return phiName_; + } + + //- Update the coefficients associated with the patch field virtual void updateCoeffs(); @@ -136,10 +167,7 @@ public: // Member operators - virtual void operator=(const fvPatchField& pvf) - { - fvPatchField::operator=(pvf); - } + virtual void operator=(const fvPatchField& pvf); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C new file mode 100644 index 0000000000..30b7b12ff7 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C @@ -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& 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& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchVectorField(ptf, p, iF, mapper), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_) +{} + + +pressureNormalInletOutletVelocityFvPatchVectorField:: +pressureNormalInletOutletVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField& iF, + const dictionary& dict +) +: + mixedFvPatchVectorField(p, iF), + phiName_(dict.lookupOrDefault("phi", "phi")), + rhoName_(dict.lookupOrDefault("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& iF +) +: + mixedFvPatchVectorField(pivpvf, iF), + phiName_(pivpvf.phiName_), + rhoName_(pivpvf.rhoName_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void pressureNormalInletOutletVelocityFvPatchVectorField::updateCoeffs() +{ + if (updated()) + { + return; + } + + const surfaceScalarField& phi = + db().lookupObject(phiName_); + + const fvsPatchField& phip = + patch().patchField(phi); + + vectorField n = patch().nf(); + const Field& magS = patch().magSf(); + + if (phi.dimensions() == dimVelocity*dimArea) + { + refValue() = n*phip/magS; + } + else if (phi.dimensions() == dimDensity*dimVelocity*dimArea) + { + const fvPatchField& rhop = + patch().lookupPatchField(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& pvf +) +{ + fvPatchField::operator= + ( + valueFraction()*(patch().nf()*(patch().nf() & pvf)) + + (1 - valueFraction())*pvf + ); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeField +( + fvPatchVectorField, + pressureNormalInletOutletVelocityFvPatchVectorField +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.H new file mode 100644 index 0000000000..e1f576d012 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.H @@ -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& + ); + + //- Construct from patch, internal field and dictionary + pressureNormalInletOutletVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField&, + const dictionary& + ); + + //- Construct by mapping given + // pressureNormalInletOutletVelocityFvPatchVectorField + // onto a new patch + pressureNormalInletOutletVelocityFvPatchVectorField + ( + const pressureNormalInletOutletVelocityFvPatchVectorField&, + const fvPatch&, + const DimensionedField&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + pressureNormalInletOutletVelocityFvPatchVectorField + ( + const pressureNormalInletOutletVelocityFvPatchVectorField& + ); + + //- Construct and return a clone + virtual tmp clone() const + { + return tmp + ( + new pressureNormalInletOutletVelocityFvPatchVectorField + ( + *this + ) + ); + } + + //- Construct as copy setting internal field reference + pressureNormalInletOutletVelocityFvPatchVectorField + ( + const pressureNormalInletOutletVelocityFvPatchVectorField&, + const DimensionedField& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp clone + ( + const DimensionedField& iF + ) const + { + return tmp + ( + 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& pvf); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.H index e97cb203cf..86ef7a8961 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.H @@ -26,7 +26,10 @@ Class Foam::rotatingPressureInletOutletVelocityFvPatchVectorField Description - Foam::rotatingPressureInletOutletVelocityFvPatchVectorField + Velocity inlet/outlet boundary condition in a rotating frame + for patches where the pressure is specified. zero-gradient is applied for + outflow (as defined by the flux) and for inflow the velocity is obtained + from the flux with a direction normal to the patch faces. SourceFiles rotatingPressureInletOutletVelocityFvPatchVectorField.C diff --git a/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionScheme.C b/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionScheme.C index 90b8139264..6b0f66f245 100644 --- a/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionScheme.C +++ b/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionScheme.C @@ -22,8 +22,6 @@ License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -Description - \*---------------------------------------------------------------------------*/ #include "gaussConvectionScheme.H" diff --git a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C index 1606e29b07..02471bdc2e 100644 --- a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C +++ b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C @@ -50,7 +50,8 @@ Foam::Analytical::~Analytical() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -Type Foam::Analytical::integrate +typename Foam::IntegrationScheme::integrationResult +Foam::Analytical::integrate ( const Type phi, const scalar dt, @@ -58,7 +59,11 @@ Type Foam::Analytical::integrate const scalar beta ) const { - return alpha + (phi - alpha)*exp(-beta*dt); + typename IntegrationScheme::integrationResult retValue; + retValue.average() = alpha + (phi - alpha)*(1 - exp(-beta*dt))/(beta*dt); + retValue.value() = alpha + (phi - alpha)*exp(-beta*dt); + + return retValue; } diff --git a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H index ebbb61522c..3c6bdd3b1f 100644 --- a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H +++ b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H @@ -74,7 +74,7 @@ public: // Member Functions //- Perform the integration - virtual Type integrate + virtual typename IntegrationScheme::integrationResult integrate ( const Type phi, const scalar dt, diff --git a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C index 5b9f921819..2b39e9fd68 100644 --- a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C +++ b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C @@ -50,7 +50,8 @@ Foam::Euler::~Euler() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -Type Foam::Euler::integrate +typename Foam::IntegrationScheme::integrationResult +Foam::Euler::integrate ( const Type phi, const scalar dt, @@ -58,7 +59,11 @@ Type Foam::Euler::integrate const scalar beta ) const { - return (phi + dt*alpha)/(1.0 + dt/beta); + typename IntegrationScheme::integrationResult retValue; + retValue.value() = (phi + beta*dt*alpha)/(1.0 + beta*dt); + retValue.average() = 0.5*(phi + retValue.value()); + + return retValue; } diff --git a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H index 724320a09e..a3c925e9f0 100644 --- a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H +++ b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H @@ -74,7 +74,7 @@ public: // Member Functions //- Perform the integration - virtual Type integrate + virtual typename IntegrationScheme::integrationResult integrate ( const Type phi, const scalar dt, diff --git a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H index b8b3859a0f..bac74a898c 100644 --- a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H +++ b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H @@ -53,6 +53,63 @@ namespace Foam template class IntegrationScheme { + +public: + + //- Helper class to supply results of integration + class integrationResult + { + //- Integration value + Type value_; + + //- Average value across integration step + Type average_; + + + public: + + //- Constructor + integrationResult() + : + value_(pTraits::zero), + average_(pTraits::zero) + {} + + + // Member functions + + // Access + + //- Return const access to the value + Type value() const + { + return value_; + } + + //- Return const access to the average + Type average() const + { + return average_; + } + + + // Edit + + //- Return access to the value for changing + Type& value() + { + return value_; + } + + //- Return access to the average for changing + Type& average() + { + return average_; + } + }; + + +private: // Private data //- Name of the Integration variable @@ -120,7 +177,7 @@ public: // Member Functions //- Perform the Integration - virtual Type integrate + virtual integrationResult integrate ( const Type phi, const scalar dt, @@ -151,7 +208,7 @@ public: \ defineNamedTemplateTypeNameAndDebug(SS, 0); \ \ - IntegrationScheme::adddictionaryConstructorToTable > \ + IntegrationScheme::adddictionaryConstructorToTable > \ add##SS##Type##ConstructorToTable_; diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index 05c5dc728f..6ee04f1235 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -332,21 +332,11 @@ void Foam::KinematicCloud::evolve() inject(td); - move(td); -} - - -template -template -void Foam::KinematicCloud::move -( - TrackingData& td -) -{ if (coupled_) { resetSourceTerms(); } + Cloud::move(td); } diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index dff0859c53..da0f1738e5 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -109,7 +109,6 @@ private: //- References to the mesh and time databases const fvMesh& mesh_; -// const Time& runTime_; //- Reference to the interpolation for the carrier phase to the parcels const volPointInterpolation& vpi_; @@ -257,19 +256,12 @@ protected: ParcelType* p ); - //- Move the parcels - template - void move(TrackingData& td); - //- Post-injection checks void postInjectCheck(); public: - //- Runtime type information -// TypeName("KinematicCloud"); - // Constructors //- Construct given carrier gas fields @@ -284,9 +276,8 @@ public: ); - // Destructor - - virtual ~KinematicCloud(); + //- Destructor + virtual ~KinematicCloud(); // Member Functions @@ -395,7 +386,6 @@ public: inline tmp SU2(volVectorField& U) const; - // Check //- Total mass injected @@ -436,7 +426,7 @@ public: //- Reset the spray source terms void resetSourceTerms(); - //- Evolve the spray (move, inject) + //- Evolve the spray (inject, inject) void evolve(); }; diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C index f30f70bcb3..dcf4730f7a 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C @@ -185,7 +185,12 @@ void Foam::ReactingCloud::evolve() inject(td); - this->move(td); + if (this->coupled()) + { + resetSourceTerms(); + } + + Cloud::move(td); } diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H index 7afa096c63..6f7bb05e09 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H @@ -204,7 +204,7 @@ public: //- Reset the spray source terms void resetSourceTerms(); - //- Evolve the spray (move, inject) + //- Evolve the spray (inject, move) void evolve(); }; diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C index 0e07f89769..ad0d520b74 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C @@ -176,7 +176,12 @@ void Foam::ThermoCloud::evolve() inject(td); - this->move(td); + if (this->coupled()) + { + resetSourceTerms(); + } + + Cloud::move(td); } diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H index da9c5e4fb5..072c86165b 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H @@ -209,11 +209,11 @@ public: // Cloud evolution functions - //- Evolve the spray (move, inject) - void evolve(); - //- Reset the spray source terms void resetSourceTerms(); + + //- Evolve the spray (inject, move) + void evolve(); }; diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 9b0dbf45cd..07e20192c8 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -155,15 +155,16 @@ Foam::vector Foam::KinematicParcel::calcVelocity //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Update velocity - treat as 3-D - const scalar bp = 1.0/(Cud + VSMALL); - const vector ap = Uc_/bp + rhoc_/rho_*td.g(); + const vector ap = Uc_ + (1 - rhoc_/rho_)/(Cud + VSMALL)*td.g(); + const scalar bp = Cud; - vector Unew = td.cloud().UIntegrator().integrate(U_, dt, ap, bp); + vector Unew = td.cloud().UIntegrator().integrate(U_, dt, ap, bp).value(); // Info<< "U_, Unew = " << U_ << ", " << Unew << endl; // Calculate the momentum transfer to the continuous phase - dUTrans = -mass()*(Unew - U_); + // - do not include gravity impulse + dUTrans = -mass()*(Unew - U_ - dt*td.g()); // Make corrections for 2-D cases if (meshInfo.caseIs2d()) @@ -233,13 +234,17 @@ bool Foam::KinematicParcel::move // Update cell based properties p.updateCellQuantities(td, dt, celli); - if (td.cloud().coupled()) + // Avoid problems with extremely small timesteps + if (dt > ROOTVSMALL) { - p.calcCoupled(td, dt, celli); - } - else - { - p.calcUncoupled(td, dt, celli); + if (td.cloud().coupled()) + { + p.calcCoupled(td, dt, celli); + } + else + { + p.calcUncoupled(td, dt, celli); + } } if (p.onBoundary() && td.keepParticle) diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C index 98ecd22675..b000ed0237 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C @@ -203,7 +203,7 @@ Foam::Ostream& Foam::operator<< os << static_cast& >(p); os.write ( - reinterpret_cast(p.typeId()), + reinterpret_cast(&p.typeId_), sizeof(p.typeId()) + sizeof(p.d()) + sizeof(p.U()) diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index d9d47894a5..5fe3aa1633 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -59,6 +59,164 @@ void Foam::ReactingParcel::calcCoupled const scalar mass0 = this->mass(); const scalar np0 = this->nParticle_; const scalar T0 = this->T_; + + // ~~~~~~~~~~~~~~~~~~~~~~~~~ + // Initialise transfer terms + // ~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Momentum transfer from the particle to the carrier phase + vector dUTrans = vector::zero; + + // Enthalpy transfer from the particle to the carrier phase + scalar dhTrans = 0.0; + + // Mass transfer from particle to carrier phase + // - components exist in particle already + scalarList dMassMT(td.cloud().gases().size(), 0.0); + + // Mass transfer due to surface reactions from particle to carrier phase + // - components do not necessarily exist in particle already + scalarList dMassSR(td.cloud().gases().size(), 0.0); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Calculate velocity - update U + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + scalar Cud = 0.0; + const vector U1 = calcVelocity(td, dt, Cud, dUTrans); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Calculate heat transfer - update T + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + scalar htc = 0.0; + scalar T1 = calcHeatTransfer(td, dt, celli, htc, dhTrans); + + + // ~~~~~~~~~~~~~~~~~~~~~~~ + // Calculate mass transfer + // ~~~~~~~~~~~~~~~~~~~~~~~ + calcMassTransfer(td, dt, T0, T1, dMassMT); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Calculate surface reactions + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Initialise enthalpy retention to zero + scalar dhRet = 0.0; + + calcSurfaceReactions(td, dt, celli, T0, T1, dMassMT, dMassSR, dhRet); + + // New total mass + const scalar mass1 = mass0 - sum(dMassMT) - sum(dMassSR); + + // Correct particle temperature to account for latent heat of + // devolatilisation + T1 -= + td.constProps().Ldevol() + *sum(dMassMT) + /(0.5*(mass0 + mass1)*this->cp_); + + // Add retained enthalpy from surface reaction to particle and remove + // from gas + T1 += dhRet/(0.5*(mass0 + mass1)*this->cp_); + dhTrans -= dhRet; + + // Correct dhTrans to account for enthalpy of evolved volatiles + dhTrans += + sum(dMassMT) + *td.cloud().composition().HGas(YGas_, 0.5*(T0 + T1)); + + // Correct dhTrans to account for enthalpy of consumed solids + dhTrans += + sum(dMassSR) + *td.cloud().composition().HSolid(YSolid_, 0.5*(T0 + T1)); + + + // ~~~~~~~~~~~~~~~~~~~~~~~ + // Accumulate source terms + // ~~~~~~~~~~~~~~~~~~~~~~~ + + // Transfer mass lost from particle to carrier mass source + forAll(dMassMT, i) + { + td.cloud().rhoTrans(i)[celli] += np0*(dMassMT[i] + dMassSR[i]); + } + + // Update momentum transfer + td.cloud().UTrans()[celli] += np0*dUTrans; + + // Accumulate coefficient to be applied in carrier phase momentum coupling + td.cloud().UCoeff()[celli] += np0*mass0*Cud; + + // Update enthalpy transfer + // - enthalpy of lost solids already accounted for + td.cloud().hTrans()[celli] += np0*dhTrans; + + // Accumulate coefficient to be applied in carrier phase enthalpy coupling + td.cloud().hCoeff()[celli] += np0*htc*this->areaS(); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Remove the particle when mass falls below minimum threshold + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if (mass1 < td.constProps().minParticleMass()) + { + td.keepParticle = false; + + // Absorb particle(s) into carrier phase + forAll(dMassMT, i) + { + td.cloud().rhoTrans(i)[celli] += np0*dMassMT[i]; + } + td.cloud().hTrans()[celli] += + np0*mass1 + *( + YMixture_[0]*td.cloud().composition().HGas(YGas_, T1) + + YMixture_[2]*td.cloud().composition().HSolid(YSolid_, T1) + ); + td.cloud().UTrans()[celli] += np0*mass1*U1; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Set new particle properties + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + { + this->U_ = U1; + this->T_ = T1; + this->cp_ = + YMixture_[0]*td.cloud().composition().cpGas(YGas_, T1) + + YMixture_[1]*td.cloud().composition().cpLiquid(YLiquid_, pc_, T1) + + YMixture_[2]*td.cloud().composition().cpSolid(YSolid_); + + // Update particle density or diameter + if (td.constProps().constantVolume()) + { + this->rho_ = mass1/this->volume(); + } + else + { + this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi); + } + } +} + + +template +template +void Foam::ReactingParcel::calcUncoupled +( + TrackData& td, + const scalar dt, + const label celli +) +{ + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Define local properties at beginning of timestep + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + const scalar T0 = this->T_; + const scalar mass0 = this->mass(); const scalar cp0 = this->cp_; // ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -79,9 +237,12 @@ void Foam::ReactingParcel::calcCoupled // - components do not necessarily exist in particle already scalarList dMassSR(td.cloud().gases().size(), 0.0); - // Total mass lost from particle due to surface reactions - // - sub-model will adjust component mass fractions - scalar dMassMTSR = 0.0; + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Calculate velocity - update U + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + scalar Cud = 0.0; + const vector U1 = calcVelocity(td, dt, Cud, dUTrans); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -91,13 +252,6 @@ void Foam::ReactingParcel::calcCoupled scalar T1 = calcHeatTransfer(td, dt, celli, htc, dhTrans); - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Calculate velocity - update U - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar Cud = 0.0; - const vector U1 = calcVelocity(td, dt, Cud, dUTrans); - - // ~~~~~~~~~~~~~~~~~~~~~~~ // Calculate mass transfer // ~~~~~~~~~~~~~~~~~~~~~~~ @@ -107,186 +261,23 @@ void Foam::ReactingParcel::calcCoupled // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Calculate surface reactions // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - calcSurfaceReactions(td, dt, celli, T0, T1, dMassMTSR, dMassSR); + + // Initialise enthalpy retention to zero + scalar dhRet = 0.0; + + calcSurfaceReactions(td, dt, celli, T0, T1, dMassMT, dMassSR, dhRet); // New total mass - const scalar mass1 = mass0 - sum(dMassMT) - dMassMTSR; + const scalar mass1 = mass0 - sum(dMassMT) - sum(dMassSR); - // Ratio of mass devolatilised to the total volatile mass of the particle - const scalar fVol = 1 - - (YMixture_[0]*mass1) - /(td.cloud().composition().YMixture0()[0]*mass0_); - - // Specific heat capacity of non-volatile components - const scalar cpNonVolatile = - ( - YMixture_[1]*td.cloud().composition().cpLiquid(YLiquid_, pc_, this->Tc_) - + YMixture_[2]*td.cloud().composition().cpSolid(YSolid_) - )/(YMixture_[1] + YMixture_[2]); - - // New specific heat capacity - linear variation until volatiles - // have evolved - const scalar cp1 = (cpNonVolatile - td.constProps().cp0())*fVol - + td.constProps().cp0(); - - - // ~~~~~~~~~~~~~~~~~~~~~~~ - // Accumulate source terms - // ~~~~~~~~~~~~~~~~~~~~~~~ - - // Transfer mass lost from particle to carrier mass source - forAll(dMassMT, i) - { - td.cloud().rhoTrans(i)[celli] += np0*(dMassMT[i] + dMassSR[i]); - } - - // Update momentum transfer - td.cloud().UTrans()[celli] += np0*dUTrans; - - // Accumulate coefficient to be applied in carrier phase momentum coupling - td.cloud().UCoeff()[celli] += np0*mass0*Cud; - - // Update enthalpy transfer -// td.cloud().hTrans()[celli] += np0*(mass0*cp0*T0 - mass1*cp1*T1); - td.cloud().hTrans()[celli] += np0*((mass0*cp0 - mass1*cp1)*T0 + dhTrans); - - // Accumulate coefficient to be applied in carrier phase enthalpy coupling - td.cloud().hCoeff()[celli] += np0*htc*this->areaS(); - - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Remove the particle when mass falls below minimum threshold - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - if (mass1 < td.constProps().minParticleMass()) - { - td.keepParticle = false; - - // Absorb particle(s) into carrier phase - forAll(dMassMT, i) - { - td.cloud().rhoTrans(i)[celli] += np0*dMassMT[i]; - } - td.cloud().hTrans()[celli] += np0*mass1*cp1*T1; - td.cloud().UTrans()[celli] += np0*mass1*U1; - } - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Set new particle properties - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - else - { - this->U_ = U1; - this->T_ = T1; - this->cp_ = cp1; - - // Update particle density or diameter - if (td.cloud().massTransfer().changesVolume()) - { - this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi); - } - else - { - this->rho_ = mass1/this->volume(); - } - } -} - - -template -template -void Foam::ReactingParcel::calcUncoupled -( - TrackData& td, - const scalar dt, - const label celli -) -{ - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Define local properties at beginning of timestep - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - const scalar T0 = this->T_; - const scalar mass0 = this->mass(); -// const scalar cp0 = this->cp(); - - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - // Initialise transfer terms - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - - // Momentum transfer from the particle to the carrier phase - vector dUTrans = vector::zero; - - // Enthalpy transfer from the particle to the carrier phase - scalar dhTrans = 0.0; - - // Mass transfer from particle to carrier phase - // - components exist in particle already - scalarList dMassMT(td.cloud().gases().size(), 0.0); - - // Mass transfer due to surface reactions from particle to carrier phase - // - components do not necessarily exist in particle already - scalarList dMassSR(td.cloud().gases().size(), 0.0); - - // Total mass lost from particle due to surface reactions - // - sub-model will adjust component mass fractions - scalar dMassMTSR = 0.0; - - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Calculate heat transfer - update T - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar htc = 0.0; - scalar T1 = calcHeatTransfer(td, dt, celli, htc, dhTrans); - - // Limit new temp max by vapourisarion temperature - T1 = min(td.constProps().Tvap(), T1); - - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Calculate velocity - update U - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar Cud = 0.0; - const vector U1 = calcVelocity(td, dt, Cud, dUTrans); - - - // ~~~~~~~~~~~~~~~~~~~~~~~ - // Calculate mass transfer - // ~~~~~~~~~~~~~~~~~~~~~~~ - calcMassTransfer(td, dt, T0, T1, dMassMT); - - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Calculate surface reactions - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - calcSurfaceReactions - ( - td, - dt, - celli, - T0, - T1, - dMassMTSR, - dMassSR - ); - - // New total mass - const scalar mass1 = mass0 - sum(dMassMT) - dMassMTSR; - - // Ratio of mass devolatilised to the total volatile mass of the particle - const scalar fVol = 1 - - (YMixture_[0]*mass1) - /(td.cloud().composition().YMixture0()[0]*mass0_); - - // Specific heat capacity of non-volatile components - const scalar cpNonVolatile = - ( - YMixture_[1]*td.cloud().composition().cpLiquid(YLiquid_, pc_, this->Tc_) - + YMixture_[2]*td.cloud().composition().cpSolid(YSolid_) - )/(YMixture_[1] + YMixture_[2]); - - // New specific heat capacity - linear variation until volatiles - // have evolved - const scalar cp1 = (cpNonVolatile - td.constProps().cp0())*fVol - + td.constProps().cp0(); + // New specific heat capacity + const scalar cp1 = + YMixture_[0]*td.cloud().composition().cpGas(YGas_, T1) + + YMixture_[1]*td.cloud().composition().cpLiquid(YLiquid_, pc_, T1) + + YMixture_[2]*td.cloud().composition().cpSolid(YSolid_); + // Add retained enthalpy to particle + T1 += dhRet/(mass0*0.5*(cp0 + cp1)); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Remove the particle when mass falls below minimum threshold @@ -305,13 +296,13 @@ void Foam::ReactingParcel::calcUncoupled this->cp_ = cp1; // Update particle density or diameter - if (td.cloud().massTransfer().changesVolume()) + if (td.constProps().constantVolume()) { - this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi); + this->rho_ = mass1/this->volume(); } else { - this->rho_ = mass1/this->volume(); + this->d_ = cbrt(mass1/this->rho_*6.0/mathematicalConstant::pi); } } } @@ -389,8 +380,9 @@ void Foam::ReactingParcel::calcSurfaceReactions const label celli, const scalar T0, const scalar T1, - scalar& dMassMTSR, - scalarList& dMassMT + const scalarList& dMassMT, + scalarList& dMassSR, + scalar& dhRet ) { // Check that model is active @@ -409,21 +401,20 @@ void Foam::ReactingParcel::calcSurfaceReactions T0, T1, this->Tc_, + pc_, this->rhoc_, this->mass(), + dMassMT, YGas_, YLiquid_, YSolid_, YMixture_, - dMassMTSR, - dMassMT + dMassSR, + dhRet ); } -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - - // * * * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * // #include "ReactingParcelIO.C" diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H index 43e125f13b..fc4edfb797 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H @@ -89,6 +89,12 @@ public: //- Boiling point [K] const scalar Tbp_; + //- Latent heat of devolatilisation [J/kg] + const scalar Ldevol_; + + //- Constant volume flag - e.g. during mass transfer + Switch constantVolume_; + public: @@ -102,6 +108,12 @@ public: //- Return const access to the boiling point inline scalar Tbp() const; + + //- Return const access to the latent heat of devolatilisation + inline scalar Ldevol() const; + + //- Return const access to the constant volume flag + inline Switch constantVolume() const; }; @@ -210,8 +222,9 @@ protected: const label celli, const scalar T0, const scalar T1, - scalar& dMassMTSR, - scalarList& dMassMT + const scalarList& dMassMT, + scalarList& dMassSR, + scalar& dhRet ); diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H index 7138666b2e..d84ee3742c 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H @@ -34,7 +34,9 @@ inline Foam::ReactingParcel::constantProperties::constantProperties : ThermoParcel::constantProperties(dict), Tvap_(dimensionedScalar(dict.lookup("Tvap")).value()), - Tbp_(dimensionedScalar(dict.lookup("Tbp")).value()) + Tbp_(dimensionedScalar(dict.lookup("Tbp")).value()), + Ldevol_(dimensionedScalar(dict.lookup("Ldevol")).value()), + constantVolume_(dict.lookup("constantVolume")) {} @@ -127,6 +129,22 @@ Foam::ReactingParcel::constantProperties::Tbp() const } +template +inline Foam::scalar +Foam::ReactingParcel::constantProperties::Ldevol() const +{ + return Ldevol_; +} + + +template +inline Foam::Switch +Foam::ReactingParcel::constantProperties::constantVolume() const +{ + return constantVolume_; +} + + // * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * // template diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C index ae0dcd0573..b1797b97de 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C @@ -297,10 +297,7 @@ Foam::Ostream& Foam::operator<< os << static_cast& >(p); os.write ( - reinterpret_cast - ( - &const_cast&>(p).mass0() - ), + reinterpret_cast(&p.mass0_), sizeof(p.mass0()) ); os << p.YMixture() << YGasLoc << YLiquidLoc << YSolidLoc; diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C index 89c0e4f2e4..75ab727b77 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C @@ -203,17 +203,17 @@ Foam::scalar Foam::ThermoParcel::calcHeatTransfer // Set new particle temperature //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar Tnew = td.cloud().TIntegrator().integrate(T_, dt, ap, bp); + // Integrate to find the new parcel temperature + IntegrationScheme::integrationResult Tres = + td.cloud().TIntegrator().integrate(T_, dt, ap, bp); - dhTrans = -this->mass()*cp_*(Tnew - T_); + // Using average parcel temperature for enthalpy transfer calculation + dhTrans = dt*this->areaS()*htc*(Tres.average() - Tc_); - return Tnew; + return Tres.value(); } -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - - // * * * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * // #include "ThermoParcelIO.C" diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C index 04d444e6bb..d0242e5e51 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C @@ -149,10 +149,7 @@ Foam::Ostream& Foam::operator<< os << static_cast& >(p); os.write ( - reinterpret_cast - ( - &const_cast&>(p).T() - ), + reinterpret_cast(&p.T_), sizeof(p.T()) + sizeof(p.cp()) ); } diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H index ce85b19a5c..9caea94a34 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H +++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H @@ -209,13 +209,20 @@ public: //- Return the gas constant for the gas mixture virtual scalar RGas(const scalarField& YGas) const = 0; - //- Return enthalpy for the gas mixture + //- Return enthalpy for the gas mixture [energy per unit mass] virtual scalar HGas ( const scalarField& YGas, const scalar T ) const = 0; + //- Return enthalpy for the solid mixture [energy per unit mass] + virtual scalar HSolid + ( + const scalarField& YSolid, + const scalar T + ) const = 0; + //- Return specific heat caparcity for the gas mixture virtual scalar cpGas ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C index 350546b5fe..74fb92338c 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C +++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C @@ -519,6 +519,29 @@ const } +template +Foam::scalar Foam::SingleMixtureFraction::HSolid +( + const scalarField& YSolid, + const scalar T +) +const +{ + scalar HMixture = 0.0; + forAll(YSolid, i) + { + label id = solidGlobalIds_[i]; + HMixture += + YSolid[i] + *( + this->solids().properties()[id].Hf() + + this->solids().properties()[id].cp()*T + ); + } + return HMixture; +} + + template Foam::scalar Foam::SingleMixtureFraction::cpGas ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H index bd03d69456..de1fb8daf7 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H +++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H @@ -188,9 +188,12 @@ public: //- Return the gas constant for the gas mixture scalar RGas(const scalarField& YGas) const; - //- Return enthalpy for the gas mixture + //- Return enthalpy for the gas mixture [energy per unit mass] scalar HGas(const scalarField& YGas, const scalar T) const; + //- Return enthalpy for the solid mixture [energy per unit mass] + scalar HSolid(const scalarField& YSolid, const scalar T) const; + //- Return specific heat caparcity for the gas mixture scalar cpGas(const scalarField& YGas, const scalar T) const; diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C index cb2785d175..304bd6897c 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C @@ -60,13 +60,6 @@ bool Foam::ConstantRateDevolatilisation::active() const } -template -bool Foam::ConstantRateDevolatilisation::changesVolume() const -{ - return false; -} - - template Foam::scalar Foam::ConstantRateDevolatilisation::calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H index 14e7262169..094859cbec 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H @@ -89,9 +89,6 @@ public: //- Flag to indicate whether model activates mass transfer model bool active() const; - //- Flag to indicate whether model changes particle volume - bool changesVolume() const; - //- Update model scalar calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/MassTransferModel/MassTransferModel.H b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/MassTransferModel/MassTransferModel.H index 7b16d3dc35..2c5b5159cf 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/MassTransferModel/MassTransferModel.H +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/MassTransferModel/MassTransferModel.H @@ -130,9 +130,6 @@ public: //- Flag to indicate whether model activates mass transfer model virtual bool active() const = 0; - //- Flag to indicate whether model changes particle volume - virtual bool changesVolume() const = 0; - //- Update model virtual scalar calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.C b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.C index 5b21a77250..38cb63ff38 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.C +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.C @@ -55,13 +55,6 @@ bool Foam::NoMassTransfer::active() const } -template -bool Foam::NoMassTransfer::changesVolume() const -{ - return false; -} - - template Foam::scalar Foam::NoMassTransfer::calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.H b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.H index fb3e30fc61..9415db1dad 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.H +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/NoMassTransfer/NoMassTransfer.H @@ -75,9 +75,6 @@ public: //- Flag to indicate whether model activates mass transfer model bool active() const; - //- Flag to indicate whether model changes particle volume - bool changesVolume() const; - //- Update model scalar calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C index c8b5367d50..8cf111b816 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C @@ -62,13 +62,6 @@ bool Foam::SingleKineticRateDevolatilisation::active() const } -template -bool Foam::SingleKineticRateDevolatilisation::changesVolume() const -{ - return false; -} - - template Foam::scalar Foam::SingleKineticRateDevolatilisation::calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H index a2894e5ece..13d3d4825a 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H +++ b/src/lagrangian/intermediate/submodels/Reacting/MassTransferModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H @@ -91,9 +91,6 @@ public: //- Flag to indicate whether model activates mass transfer model bool active() const; - //- Flag to indicate whether model changes particle volume - bool changesVolume() const; - //- Update model scalar calculate ( diff --git a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C index 8ea8816f04..d164a500c2 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C +++ b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C @@ -64,16 +64,20 @@ void Foam::NoSurfaceReaction::calculate const scalar T0, const scalar T1, const scalar Tc, + const scalar pc, const scalar rhoc, const scalar massp, + const scalarList& dMassMT, scalarField& YGas, scalarField& YLiquid, scalarField& YSolid, scalarField& YMixture, - scalar& dMassMTSR, - scalarList& dMassSR + scalarList& dMassSR, + scalar& dhRet ) const -{} +{ + // do nothing +} // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H index f3072df598..8a58352b5d 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H +++ b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H @@ -84,14 +84,16 @@ public: const scalar T0, const scalar T1, const scalar Tc, + const scalar pc, const scalar rhoc, const scalar massp, + const scalarList& dMassMT, scalarField& YGas, scalarField& YLiquid, scalarField& YSolid, scalarField& YMixture, - scalar& dMassMTSR, - scalarList& dMassSR + scalarList& dMassSR, + scalar& dhRet ) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H index b50b5a90b4..a3b3e4e00f 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H +++ b/src/lagrangian/intermediate/submodels/Reacting/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H @@ -141,14 +141,16 @@ public: const scalar T0, const scalar T1, const scalar Tc, + const scalar pc, const scalar rhoc, const scalar massp, + const scalarList& dMassMT, scalarField& YGas, scalarField& YLiquid, scalarField& YSolid, scalarField& YMixture, - scalar& dMassMTSR, - scalarList& dMassSR + scalarList& dMassSR, + scalar& dhRet ) const = 0; }; diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C index edeb799fc0..92ddbd7663 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C @@ -62,11 +62,6 @@ Foam::scalar Foam::NoHeatTransfer::Nu const scalar ) const { - notImplemented - ( - "Foam::scalar Foam::NoHeatTransfer::Nu" - "(const scalar, const scalar)" - ); return 0.0; } @@ -74,8 +69,7 @@ Foam::scalar Foam::NoHeatTransfer::Nu template Foam::scalar Foam::NoHeatTransfer::Pr() const { - notImplemented("Foam::scalar Foam::NoHeatTransfer::Pr()"); - return 0.0; + return 1.0; }