mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge commit 'OpenCFD/master' into olesenm
This commit is contained in:
415
ReleaseNotes-1.6
415
ReleaseNotes-1.6
@ -11,7 +11,7 @@
|
||||
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 here:
|
||||
http://www.OpenFOAM.org/bugs.html
|
||||
http://www.OpenFOAM.org/bugs.html.
|
||||
|
||||
* GNU/Linux version
|
||||
The 32bit and 64bit binary packs of the OpenFOAM release were compiled on
|
||||
@ -34,288 +34,222 @@
|
||||
|
||||
* Library developments
|
||||
|
||||
** Core library
|
||||
*** Core library
|
||||
|
||||
*** Regular Expressions
|
||||
The addition of regular expressions marks a major improvement in usability.
|
||||
+ *New* =regExp= class provides support for accessing POSIX extended regular
|
||||
expresssions from within OpenFOAM. See the manpages on your system (/man
|
||||
7 regex/) for more information about the extended regular expression
|
||||
syntax. Since entire strings are matched, the =^= and =$= anchors are not
|
||||
required.
|
||||
+ *New* =wordRe= class can contain a =word= or a =regExp= . The match()
|
||||
method matches appropriately (as a =word= or as a =regExp=).
|
||||
+ *New* =stringListOps= to search string lists based on regular expressions,
|
||||
=wordRe= or =wordReList= .
|
||||
+ =Istream= and =Ostream= now retain backslashes when reading/writing
|
||||
strings. The backslash continues to be used as an escape character for
|
||||
double-quote and newline, but otherwise get passed through "as-is" without
|
||||
any other special meaning (ie, they are /not/ C-style strings). This
|
||||
especially helps with input/output of regular expressions.
|
||||
|
||||
*** Dictionary improvements/changes
|
||||
+ Dictionaries can use words (unquoted) or regular expressions (quoted) for
|
||||
their keywords. When searching, an exact match has priority over a regular
|
||||
expression match. Multiple regular expressions are matched in reverse
|
||||
order.
|
||||
***** Dictionary improvements/changes
|
||||
+ Dictionaries can use words (unquoted) or regular expressions (quoted)
|
||||
for their keywords. When searching, an exact match has priority over a
|
||||
regular expression match. Multiple regular expressions are matched in
|
||||
reverse order.
|
||||
+ The *new* =#includeIfPresent= directive is similar to the =#include=
|
||||
directive, but does not generate an error if the file does not exist.
|
||||
+ The default =#inputMode= is now '=merge=', which corresponds to the most
|
||||
general usage. The =#inputMode warn= corresponds to the previous default
|
||||
behaviour.
|
||||
+ The *new* =#inputMode protect= can be used to conditionally merge default
|
||||
values into existing dictionaries.
|
||||
+ *New* =digest()= method to calculate and return the SHA1 message digest
|
||||
+ The *new* =#inputMode protect= can be used to conditionally merge
|
||||
default values into existing dictionaries.
|
||||
+ *New* =digest()= method to calculate and return the SHA1 message digest.
|
||||
|
||||
*** Improved list containers
|
||||
+ It is now possible to append a =UList= to an existing =List= or
|
||||
=DynamicList= .
|
||||
+ =DynamicList= is now much more flexible. It can be used with the
|
||||
=append()= method, or with the =setSize()= method and =operator[]=, as per
|
||||
=List= . =DynamicList= also has more methods for adjusting the space
|
||||
allocated.
|
||||
+ =SortableList= now uses stable sort and allows =reverseSort()= as well.
|
||||
=SortableList= is also more versatile - the indices mostly remain
|
||||
unallocated until they are required in the =sort()= method. The sort
|
||||
indices can be deallocated with the =shrink()= method. Works as expected
|
||||
with =transfer()= and assignment from other lists.
|
||||
+ Specialization for =UList<bool>::operator[](..) const= to return =false=
|
||||
for out-of-range elements. This allows lazy evaluation with no noticeable
|
||||
change in performance.
|
||||
+ =PackedList= has much better performance, *new* lazy evaluation and *new*
|
||||
auto-vivify of elements on assignment. Any auto-vivified elements will
|
||||
also flood-fill the gaps with zero. The =append()= method can be used
|
||||
like in =DynamicList= to append a single element. The =set()= method can
|
||||
be used like in =labelHashSet= . A =PackedBoolList= can thus replace
|
||||
=labelHashSet= in many places.
|
||||
+ *New* =UIndirectList= for an indirect list without storing the addressing.
|
||||
***** Regular Expressions
|
||||
The addition of regular expressions marks a major improvement in
|
||||
usability.
|
||||
+ *New* =regExp= class provides support for accessing POSIX extended
|
||||
regular expresssions from within OpenFOAM.
|
||||
+ *New* =wordRe= class can contain a =word= or a =regExp= .
|
||||
+ *New* =stringListOps= to search string lists based on regular
|
||||
expressions, =wordRe= or =wordReList=.
|
||||
+ =Istream= and =Ostream= now retain backslashes when reading/writing
|
||||
strings.
|
||||
|
||||
*** New hashing algorithms
|
||||
+ Bob Jenkins' hash routine for performance improvement (5-10% faster for
|
||||
string hashing than the previous algorithm) and fewer collisions.
|
||||
+ SHA1 hashing and SHA1 message digests (NIST specification FIPS-180-1)
|
||||
added. The SHA1 digest provides a compact (20 bytes) means of determining
|
||||
if the contents of an object have changed. The *new* =OSHA1stream= class
|
||||
can be used to calculate SHA1 digests for anything that can write to an
|
||||
output stream.
|
||||
|
||||
*** HashTable/HashSet improvements
|
||||
+ Performance improvements for querying on empty tables
|
||||
+ The =erase()= method can take a list of keys or the keys from any another
|
||||
=HashTable=/=HashSet= .
|
||||
+ =HashSet= has an =operator[]() const= that allows the same syntax to be
|
||||
used for =boolList=, =PackedBoolList= and =labelHashSet= .
|
||||
+ =HashSet has additional operators '+=', '-=', '&=' to add, remove or
|
||||
intersect keys, respectively.
|
||||
|
||||
*** Improved bool/Switch
|
||||
+ The =Switch= class has reduced the storage to be on par with =bool= . It
|
||||
is now more flexible and behaves much more like a =bool= .
|
||||
+ The IO for =bool= uses =Switch= internally for reading, so the end-user
|
||||
doesn't need to know if a particular class used =bool= or =Switch= .
|
||||
|
||||
*** Miscellaneous container class improvments
|
||||
+ *New* Boost-style =StaticAssert= added. Which is useful to catch invalid
|
||||
template sizes, for example.
|
||||
+ Various containers now have C++0x-style =cbegin()=, =cend()= iterator
|
||||
methods.
|
||||
+ Various containers now have STL-style =empty()= method, which may be more
|
||||
readable and universal than =!size()= or =!valid()= conditions.
|
||||
+ various containers now have an =xfer()= method for yielding their contents
|
||||
to a corresponding =Xfer= class.
|
||||
|
||||
*** *New* Xfer class
|
||||
Provides finer grained control over copying or transferring objects with
|
||||
very little overhead. It can be used for any object that has a =transfer()=
|
||||
method and a =operator=()= copy method. Since it is decided upon
|
||||
construction of the =Xfer= object whether the parameter is to be copied or
|
||||
transferred, the contents of the resulting Xfer object can be transferred
|
||||
unconditionally. This greatly simplifies defining constructors or methods in
|
||||
other classes with mixed transfer/copy semantics without requiring 2^N
|
||||
different versions.
|
||||
+ =xferCopy()=, =xferMove()= and =xferCopyTo()=, =xferMoveTo()= functions to
|
||||
ease the use of the =Xfer= class.
|
||||
|
||||
*** Convenience changes
|
||||
***** Convenience changes
|
||||
+ =IOobject= has a *new* constructor for creating an =IOobject= from a
|
||||
single-path specification (eg, see =blockMesh -dict= option).
|
||||
+ =argList= has *new* convenience methods for accessing options more
|
||||
directly: =option()=, =optionFound()=, =optionLookup()=, =optionRead()=,
|
||||
=optionReadIfPresent()=.
|
||||
+ The *new* =readList(Istream&)= can read a bracket-delimited list or handle
|
||||
a single value as a list of size 1. This can be a useful convenience when
|
||||
processing command-line options.
|
||||
+ The *new* =readList(Istream&)= can read a bracket-delimited list or
|
||||
handle a single value as a list of size 1. This can be a useful
|
||||
convenience when processing command-line options.
|
||||
+ Export *new* environment variable =FOAM_CASENAME= that contains the
|
||||
name part of the =FOAM_CASE= environment variable
|
||||
+ Resolve relative cases ending in =..= to avoid potentially bad/ugly
|
||||
case names being used.
|
||||
name part of the =FOAM_CASE= environment variable.
|
||||
|
||||
*** Misc. improvements
|
||||
+ Improved consistency and interoperability between =face= and =triFace= classes.
|
||||
+ =face::triangles()= can split and append to a =DynamicList=
|
||||
+ =coordinateSystems= can access global systems (similar to =MeshObject=)
|
||||
*** Numerics
|
||||
+ *new* polynomial-fit higher-order interpolation schemes:
|
||||
- =biLinearFit=
|
||||
- =linearFit=
|
||||
- =quadraticLinearFit=
|
||||
- =quadraticFit=
|
||||
- =linearPureUpwindFit=
|
||||
- =quadraticLinearPureUpwindFit=
|
||||
- =quadraticLinearUpwindFit=
|
||||
- =quadraticUpwindFit=
|
||||
- =cubicUpwindFit=
|
||||
+ *new* polynomial-fit higher-order Sn-Grad: =quadraticFitSnGrad=.
|
||||
|
||||
** Turbulence modelling
|
||||
*** Turbulence modelling
|
||||
+ Major development of turbulence model libraries to give extra flexibility
|
||||
at the solver level. For solvers that can support either RAS/LES
|
||||
computations, the selection is made in the /constant/turbulenceProperties/,
|
||||
by setting the =simulationType= keyword to:
|
||||
- =laminar=
|
||||
- =RASModel=
|
||||
- =LESModel=
|
||||
computations, the selection is made in the
|
||||
/constant/turbulenceProperties/, by setting the =simulationType= keyword
|
||||
to:
|
||||
- =laminar=,
|
||||
- =RASModel=,
|
||||
- =LESModel=.
|
||||
+ Depending on the selection, the model is the instantiated from /constant//
|
||||
- /RASProperties/
|
||||
- /LESProperties/
|
||||
- /RASProperties/,
|
||||
- /LESProperties/.
|
||||
|
||||
**** RAS wall functions
|
||||
***** RAS wall functions
|
||||
Wall functions are now run-time selectable per patch for RAS.
|
||||
+ Velocity:
|
||||
- Apply to turbulent viscosities =nut= or =mut=
|
||||
- Apply to =k=, =Q=, =R=
|
||||
- Apply to =epsilon=, =omega=
|
||||
- Apply to turbulent viscosities =nut= or =mut=,
|
||||
- Apply to =k=, =Q=, =R=,
|
||||
- Apply to =epsilon=, =omega=.
|
||||
+ Temperature:
|
||||
- Apply to turbulent thermal diffusivity, =alphat= (compressible only)
|
||||
|
||||
- Apply to turbulent thermal diffusivity, =alphat= (compressible only).
|
||||
+ To apply wall functions:
|
||||
- To recapture the functionality of previous OpenFOAM versions (v1.5 and
|
||||
earlier) assign:
|
||||
- for velocity:
|
||||
- =nut=: =nutWallFunction=
|
||||
- =mut=: =muWallFunction=
|
||||
- =epsilon=: =epsilonWallFunction=
|
||||
- =omega=: =omegaWallFunction=
|
||||
- =k=, =q=, =R=: =kqRWallFunction=
|
||||
- =nut=: =nutWallFunction=,
|
||||
- =mut=: =muWallFunction=,
|
||||
- =epsilon=: =epsilonWallFunction=,
|
||||
- =omega=: =omegaWallFunction=,
|
||||
- =k=, =q=, =R=: =kqRWallFunction=.
|
||||
- for temperature:
|
||||
- =alphat=: =alphatWallFunction=
|
||||
- =alphat=: =alphatWallFunction=.
|
||||
- New =alphaSgsJayatillekeWallFunction= thermal wall function for
|
||||
compressible LES
|
||||
compressible LES.
|
||||
|
||||
**** *New* LES turbulence models
|
||||
+ Spalart-Allmaras DDES
|
||||
+ Spalart-Allmaras IDDES
|
||||
***** *New* LES turbulence models
|
||||
+ Spalart-Allmaras DDES.
|
||||
+ Spalart-Allmaras IDDES.
|
||||
|
||||
**** Upgrading:
|
||||
+ *New* utility - =applyWallFunctionBoundaryConditions=
|
||||
+ Solvers will automatically update existing cases
|
||||
- New fields created based on the presence of the =nut/mut= field
|
||||
***** Upgrading:
|
||||
+ *New* utility - =applyWallFunctionBoundaryConditions=.
|
||||
+ Solvers will automatically update existing cases.
|
||||
- New fields created based on the presence of the =nut/mut= field.
|
||||
- Boundary conditions include scoping, i.e compressibility:: for
|
||||
compressible solvers
|
||||
- Modified fields will be backed-up to /<field>.old/
|
||||
compressible solvers.
|
||||
- Modified fields will be backed-up to /<field>.old/.
|
||||
+ NOTE:
|
||||
- Fields are only updated for those fields associated with the current
|
||||
turbulence model selection, i.e. if fields exist for use with other
|
||||
models, they will not be updated
|
||||
- The new specification is not backwards compatible
|
||||
models, they will not be updated.
|
||||
- The new specification is not backwards compatible.
|
||||
|
||||
** Thermo-physical Models
|
||||
*** Thermo-physical Models
|
||||
+ Old compressibility-based thermo package renamed
|
||||
=basicThermo= \rightarrow =basicPsiThermo=
|
||||
+ *New* =basicRhoThermo= thermo package
|
||||
- Additional density field stored
|
||||
- General form - can be used for other types of media, e.g. liquids
|
||||
- Additional polynomial-based thermodynamics
|
||||
- Equation of state: =icoPolynomial=
|
||||
- Transport: =polynomialTransport=
|
||||
- Thermo: =hPolynomialThermo=
|
||||
=basicThermo= \rightarrow =basicPsiThermo=.
|
||||
+ *New* =basicRhoThermo= thermo package.
|
||||
- Additional density field stored.
|
||||
- General form - can be used for other types of media, e.g. liquids.
|
||||
- Additional polynomial-based thermodynamics:
|
||||
- Equation of state: =icoPolynomial=,
|
||||
- Transport: =polynomialTransport=,
|
||||
- Thermo: =hPolynomialThermo=.
|
||||
+ Removed earlier hard-coding of gas thermophysics for chemistry modelling:
|
||||
- =reactingMixture= now templated on thermo package
|
||||
- =chemistryModel= now templated on thermo package
|
||||
- =chemistrySolver= now templated on thermo package
|
||||
- =reactingMixture= now templated on thermo package,
|
||||
- =chemistryModel= now templated on thermo package,
|
||||
- =chemistrySolver= now templated on thermo package.
|
||||
+ *New* =fvDOM= radition model
|
||||
- finite volume, discrete ordinates method
|
||||
- finite volume, discrete ordinates method.
|
||||
+ *New* (reinstated) =eThermo= thermodynamics package
|
||||
- internal energy-based thermodynamics
|
||||
- internal energy-based thermodynamics.
|
||||
|
||||
** Lagrangian
|
||||
*** Lagrangian
|
||||
|
||||
**** Intermediate
|
||||
+ Overhaul of the underlying framework
|
||||
+ Reacting now split into reacting and reacting multiphase
|
||||
+ New structure for variable composition
|
||||
***** Intermediate
|
||||
+ Overhaul of the underlying framework.
|
||||
+ Reacting now split into reacting and reacting multiphase.
|
||||
+ New structure for variable composition.
|
||||
+ Many new sub-models, including:
|
||||
- Injection
|
||||
- =PatchInjection= - injection local to patch face cells
|
||||
- =PatchInjection= - injection local to patch face cells,
|
||||
- =FieldActivatedInjection= - injection based on satisfying external
|
||||
criterion
|
||||
criterion,
|
||||
- LookupTableInjection - explicity define injection locations and all
|
||||
parcel properties
|
||||
parcel properties.
|
||||
- Post-processing
|
||||
- patch post-processing - collect data for parcels impacting user
|
||||
defined patches
|
||||
- patch post-processing - collect data for parcels impacting user,
|
||||
defined patches.
|
||||
- Patch interaction
|
||||
- generalised behaviour for parcel interaction with patch
|
||||
- generalised behaviour for parcel interaction with patch.
|
||||
- Phase change
|
||||
- liquid evaporation
|
||||
- liquid evaporation.
|
||||
|
||||
**** Coal combustion
|
||||
+ *New* library - extension of reacting-multiphase functionality
|
||||
- Surface reaction/combustion models
|
||||
***** Coal combustion
|
||||
+ *New* library - extension of reacting-multiphase functionality.
|
||||
- Surface reaction/combustion models.
|
||||
|
||||
** Discrete methods
|
||||
*** Discrete methods
|
||||
+ *New* library offering DSMC simulation functionality - see =dsmcFoam=
|
||||
below
|
||||
+ *New* libraries offering molecular dynamics simulation functionality - see
|
||||
=mdFoam= and =mdEquilibrationFoam=: below.
|
||||
below.
|
||||
+ Significant development of the libraries offering molecular dynamics
|
||||
simulation functionality - see =mdFoam= and =mdEquilibrationFoam= below.
|
||||
|
||||
** *New* surfMesh library
|
||||
*** *New* surfMesh library
|
||||
Provides a more efficient storage mechanism than possible with =triSurface=
|
||||
without restrictions on the shape of the face (templated parameter). It will
|
||||
however take quite some time before it can fully replace =triSurface= .
|
||||
without restrictions on the shape of the face (templated parameter).
|
||||
+ =MeshedSurface= class - with zero or more contiguous =surfZones= .
|
||||
+ =UnsortedMeshedSurface= class - unordered surface zones (as per
|
||||
=triSurface=)
|
||||
+ =surfMesh= class - for reading/writing in native OpenFOAM format
|
||||
=triSurface=).
|
||||
+ =surfMesh= class - for reading/writing in native OpenFOAM format.
|
||||
|
||||
* Solver restructuring
|
||||
The upgrade to the turbulence models means that the simulation type, i.e.
|
||||
laminar, RAS or LES can be selected at run time. This has allowed a reduction
|
||||
in the number of solvers, simplifying the overall code structure
|
||||
+ Solvers which support laminar, RAS and LES:
|
||||
- =turbFoam=, =oodles= \rightarrow =pisoFoam=
|
||||
- =turbDyMFoam= \rightarrow =pimpleDyMFoam=
|
||||
- =rhoTurbFoam=, =coodles= \rightarrow =rhoPisoFoam=
|
||||
- =xoodles= \rightarrow absorbed into =XiFoam=
|
||||
- =buoyantFoam=, =lesBuoyantFoam= \rightarrow =buoyantPisoFoam=
|
||||
- =interFoam=, =rasInterFoam=, =lesInterFoam= \rightarrow =interFoam=
|
||||
- =lesCavitatingFoam=, =rasCavitatingFoam= \rightarrow =cavitatingFoam=
|
||||
- =turbFoam=, =oodles= \rightarrow =pisoFoam=.
|
||||
- =turbDyMFoam= \rightarrow =pimpleDyMFoam=.
|
||||
- =rhoTurbFoam=, =coodles= \rightarrow =rhoPisoFoam=.
|
||||
- =xoodles= \rightarrow absorbed into =XiFoam=.
|
||||
- =buoyantFoam=, =lesBuoyantFoam= \rightarrow =buoyantPisoFoam=.
|
||||
- =interFoam=, =rasInterFoam=, =lesInterFoam= \rightarrow =interFoam=.
|
||||
- =lesCavitatingFoam=, =rasCavitatingFoam= \rightarrow =cavitatingFoam=.
|
||||
+ Solvers which support LES only:
|
||||
- =channelOodles= \rightarrow =channelFoam= (LES)
|
||||
- =channelOodles= \rightarrow =channelFoam= (LES).
|
||||
|
||||
* General changes
|
||||
+ pd to p ------------------------------------------------------------ [HENRY]
|
||||
+ gravity ------------------------------------------------------------ [HENRY]
|
||||
+ =pd= replaced by static pressure =p=. All solvers in which buoyancy affects
|
||||
might be strong have been converted from using =pd= to =p= with improved
|
||||
numerics to give equally good accuracy and stability. This change is
|
||||
prompted by the need to remove the confusion surrounding the meaning and
|
||||
purpose of =pd=.
|
||||
|
||||
+ =g= (acceleration due to gravity) is now a *new*
|
||||
=uniformDimensionedVectorField= which has the behaviour of a field, is
|
||||
registered to an =objectRegistry=, but stores only a single value. Thus
|
||||
=g= and other =UniformDimensionedFields= can be created and looked-up
|
||||
elsewhere in the code, /e.g./ in =fvPatchFields=.
|
||||
|
||||
** Solver control improvements
|
||||
Use dictionary entries instead of an =Istream= for the solver controls.
|
||||
+ This Allows dictionary substitutions and regular expressions in
|
||||
/system/fvSolution/
|
||||
/system/fvSolution/.
|
||||
+ The old solver control syntax is still supported (warning emitted), but
|
||||
the *new* =foamUpgradeFvSolution= utility can be used to convert
|
||||
/system/fvSolution/ to the new format.
|
||||
|
||||
* Tutorial restructuring
|
||||
to reflect solver application structure
|
||||
to reflect solver application structure.
|
||||
|
||||
* Post-processing
|
||||
* sampling on iso-surfaces, interpolated or non-interpolated
|
||||
* sampling on surface defined by distance to surface (distanceSurface)
|
||||
* cutting planes on non-convex cells
|
||||
* Output to any surface geometry format supported by the =surfMesh= library.
|
||||
* *New* Solvers
|
||||
+ =buoyantBoussinesqSimpleFoam= Steady state heat transfer solver using a
|
||||
Boussinesq approximation for buoyancy, with laminar, RAS or LES turbulence
|
||||
modelling
|
||||
modelling.
|
||||
+ =buoyantBoussinesqPisoFoam= Transient heat transfer solver using a
|
||||
Boussinesq approximation for buoyancy, with laminar, RAS or LES turbulence
|
||||
modelling
|
||||
modelling.
|
||||
+ =coalChemistryFoam= Transient, reacting lagrangian solver, employing a coal
|
||||
cloud and a thermo cloud, with chemistry, and laminar, RAS or LES turbulence
|
||||
modelling
|
||||
modelling.
|
||||
+ =porousExplicitSourceReactingParcelFoam= Transient, reacting lagrangian
|
||||
solver, employing a single phase reacting cloud, with porous media, explicit
|
||||
mass sources, and laminar, RAS or LES turbulence modelling
|
||||
mass sources, and laminar, RAS or LES turbulence modelling.
|
||||
+ =rhoReactingFoam= Density-based thermodynamics variant of the reactingFoam
|
||||
solver, i.e. now applicable to liquid systems
|
||||
solver, i.e. now applicable to liquid systems.
|
||||
+ =dsmcFoam= DSMC (Direct Simulation Monte-Carlo) solver for rarefied gas
|
||||
dynamics simulations, able to simulate mixtures of an arbitrary number of
|
||||
gas species. The variable hard sphere collision model with Larsen-Borgnakke
|
||||
@ -330,74 +264,81 @@
|
||||
molecule of any species can be built by specifying its sites of mass and
|
||||
charge. All molecules interact with short-range dispersion forces and
|
||||
pairwise electrostatic interactions using methods described in: Fennell and
|
||||
Gezelter, J. Chem. Phys. 124, 234104 (2006)
|
||||
Gezelter, J. Chem. Phys. 124, 234104 (2006).
|
||||
+ =mdEquilibrationFoam= Similar to mdFoam, but employs velocity scaling to
|
||||
adjust the simulation temperature to a target value. Useful to equilibrate a
|
||||
case before simulation.
|
||||
+ =chtMultiRegionFoam= New boundary condition allows independent decomposition
|
||||
of coupled regions without any constraint on the decomposition.
|
||||
|
||||
* Function objects
|
||||
* Post-processing
|
||||
+ Sampling on iso-surfaces, interpolated or non-interpolated.
|
||||
+ Sampling on surface defined by distance to surface (=distanceSurface=).
|
||||
+ Cutting planes for arbitrary meshes.
|
||||
+ Output to any surface geometry format supported by the =surfMesh= library.
|
||||
|
||||
** Improvements for function objects and time-looping
|
||||
+ The =functionObjectList= retains the order of the =functionObject= order,
|
||||
which allows a chaining of operations. It is thus internally more
|
||||
*** Function objects
|
||||
|
||||
***** Improvements for function objects and time-looping
|
||||
+ The =functionObjectList= retains the order of the =functionObject=
|
||||
order, which allows a chaining of operations. It is thus internally more
|
||||
efficient when /system/controlDict/ uses =functions {..}= instead of
|
||||
=functions (..)=, but both forms are supported.
|
||||
+ The =functionObject= now has an additional =end()= method that is called
|
||||
when =Time::loop()= or =Time::run()= determine that the time-loop exits.
|
||||
Accordingly, one of these two idioms should be used in solver code:
|
||||
1. =while (runTime.loop() { ... }=
|
||||
2. =while (runTime.run()) { runTime++; ... }=
|
||||
+ *New* - =functionObjectList= now tracks the SHA1 message digest of the
|
||||
1. =while (runTime.loop() { ... }=,
|
||||
2. =while (runTime.run()) { runTime++; ... }=.
|
||||
+ *New* =functionObjectList= now tracks the SHA1 message digest of the
|
||||
sub-directories. This avoids reloading a =functionObject= when
|
||||
something unrelated in /system/controlDict/ changed.
|
||||
|
||||
** *New* function objects:
|
||||
+ =systemCall= - executes a list of system instructions
|
||||
+ =fieldMinMax= - computes the min/max of a <field>
|
||||
+ =staticPressure= - converts kinematic pressure to static pressure
|
||||
+ =dsmcFields= - calculates intensive fields (velocity and temperature) from
|
||||
averaged extensive fields (i.e. momentum and energy)
|
||||
***** *New* function objects:
|
||||
+ =systemCall= - executes a list of system instructions.
|
||||
+ =fieldMinMax= - computes the min/max of a <field>.
|
||||
+ =staticPressure= - converts kinematic pressure to static pressure.
|
||||
+ =dsmcFields= - calculates intensive fields (velocity and temperature)
|
||||
from averaged extensive fields (i.e. momentum and energy).
|
||||
|
||||
** Usage
|
||||
+ Improved output control: =timeStep= or =outputTime=
|
||||
***** Usage
|
||||
+ Improved output control: =timeStep= or =outputTime=.
|
||||
|
||||
* Boundary conditions
|
||||
+ Improved set of direct mapped boundary conditions
|
||||
+ Buoyancy boundary condition ---------------------------------------- [HENRY]
|
||||
+ Improved set of direct mapped boundary conditions.
|
||||
+ =buoyantPressureFvPatchScalarField=, the *new* buoyancy pressure boundary
|
||||
condition now supports =p= and =pd= for backward compatibility.
|
||||
+ =uniformDensityHydrostaticPressure= is an additional pressure boundary
|
||||
condition to aid the transition from =pd= to =p= as it behaves similarly to
|
||||
specifying a uniform =pd= at an outlet for example.
|
||||
|
||||
* Utilities
|
||||
|
||||
** Improvements
|
||||
*** Improvements
|
||||
+ =blockMesh= has a *new* =-dict= option for specifying an alternative
|
||||
dictionary for the block mesh description. The '=convertToMeters=' entry
|
||||
is now optional, and the alternative '=scale=' entry can be used for
|
||||
less typing.
|
||||
|
||||
+ =foamToEnsight= has a *new* =-noPatches= option to suppress generation
|
||||
of patches.
|
||||
|
||||
+ =foamToEnsightParts= has *new* =-noMesh= and =-index= options that can
|
||||
be useful when post-processing results incrementally.
|
||||
|
||||
+ =snappyHexMesh= has lower memory footprint. New distributed triangulated
|
||||
surface type for meshing surfaces with extremely large triangle count.
|
||||
Now supports multi-region meshing of arbitrarily complex regions.
|
||||
|
||||
** *New* utilities
|
||||
+ =particleTracks= - generate particle tracks for lagrangian calculations
|
||||
+ =dsmcInitialise= - preprocessing utility to create initial configurations of
|
||||
DSMC particles in a geometry
|
||||
*** *New* utilities
|
||||
+ =particleTracks= - generate particle tracks for lagrangian calculations.
|
||||
+ =dsmcInitialise= - preprocessing utility to create initial configurations
|
||||
of DSMC particles in a geometry.
|
||||
+ =surfaceRedistributePar= - preprocessing utility to create distributed
|
||||
triangulated surface.
|
||||
|
||||
*** *New* foamCalc functions
|
||||
+ =interpolate= - performs fvc::interpolate(<field>)
|
||||
+ =randomise= - randomises a <field> by a given perturbation
|
||||
+ =addSubtract= - simple add/subtract field functionality
|
||||
+ =interpolate= performs fvc::interpolate(<field>).
|
||||
+ =randomise= randomises a <field> by a given perturbation.
|
||||
+ =addSubtract= provides simple add/subtract field functionality.
|
||||
|
||||
** Usage
|
||||
*** Usage
|
||||
+ =timeSelector= can now combine =-time ranges= and =-latestTime= options.
|
||||
For example, -time '0.01:0.09' -latestTime vs. -time '0.01:'.
|
||||
More reliable behaviour for cases missing /constant// or /0// directories.
|
||||
@ -407,11 +348,25 @@
|
||||
/0// directory in certain utilities (eg, =reconstructPar=).
|
||||
+ =-region= option added to more utilities.
|
||||
|
||||
** Improvements to Paraview reader module
|
||||
*** Improvements to Paraview reader module
|
||||
+ =PV3FoamReader= added mesh region handling. The region name is parsed
|
||||
from the filename. Eg, /case{region}.OpenFOAM/
|
||||
from the filename. Eg, /case{region}.OpenFOAM/.
|
||||
+ =paraFoam= with a *new* =-region= option for specifying an alternative
|
||||
region. A *new* =-touch= option to generate the /.OpenFOAM/ file only.
|
||||
Only creates (and removes) /.OpenFOAM/ files if they didn't already
|
||||
exist, which is useful in connection with the =-touch= option.
|
||||
|
||||
* Third-party Software
|
||||
+ =gcc= upgraded to version 4.3.3.
|
||||
+ =OpenMPI= upgraded to version 1.3.3.
|
||||
+ =ParaView= upgraded to version 3.6.1.
|
||||
+ =Scotch= *new* decomposition method: \\
|
||||
Scotch (http://gforge.inria.fr/projects/scotch/) is a general multi-level
|
||||
decomposition method originating from the ScAlApplix project (Inria). It is
|
||||
a framework for general recursive partitioning methods and a such comparable
|
||||
to Metis but with a permissive licence.
|
||||
|
||||
The corresponding decomposition method (in =decomposeParDict=) is
|
||||
=scotch=. An optional =strategy= string can be supplied to change the
|
||||
decomposition methods; initial testing shows the default strategy producing
|
||||
decompositions comparable in quality to Metis.
|
||||
|
||||
@ -25,10 +25,11 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "PDRkEpsilon.H"
|
||||
#include "wallFvPatch.H"
|
||||
#include "PDRDragModel.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
#include "backwardsCompatibilityWallFunctions.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
@ -82,53 +83,34 @@ PDRkEpsilon::PDRkEpsilon
|
||||
1.92
|
||||
)
|
||||
),
|
||||
alphak_
|
||||
sigmak_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"alphak",
|
||||
"sigmak",
|
||||
coeffDict_,
|
||||
1.0
|
||||
)
|
||||
),
|
||||
alphaEps_
|
||||
sigmaEps_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"alphaEps",
|
||||
"sigmaEps",
|
||||
coeffDict_,
|
||||
0.76923
|
||||
1.3
|
||||
)
|
||||
),
|
||||
alphah_
|
||||
Prt_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"alphah",
|
||||
"Prt",
|
||||
coeffDict_,
|
||||
1.0
|
||||
)
|
||||
),
|
||||
|
||||
kappa_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"kappa_",
|
||||
coeffDict_,
|
||||
0.41
|
||||
)
|
||||
),
|
||||
E_
|
||||
(
|
||||
dimensioned<scalar>::lookupOrAddToDict
|
||||
(
|
||||
"E",
|
||||
coeffDict_,
|
||||
9.8
|
||||
)
|
||||
),
|
||||
|
||||
k_
|
||||
(
|
||||
IOobject
|
||||
@ -166,9 +148,26 @@ PDRkEpsilon::PDRkEpsilon
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
Cmu_*rho_*sqr(k_)/(epsilon_ + epsilonSmall_)
|
||||
),
|
||||
|
||||
alphat_
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"alphat",
|
||||
runTime_.timeName(),
|
||||
mesh_,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
autoCreateAlphat("alphat", mesh_)
|
||||
)
|
||||
{
|
||||
# include "wallViscosityI.H"
|
||||
mut_ = Cmu_*rho_*sqr(k_)/(epsilon_ + epsilonSmall_);
|
||||
mut_.correctBoundaryConditions();
|
||||
|
||||
alphat_ = mut_/Prt_;
|
||||
alphat_.correctBoundaryConditions();
|
||||
|
||||
printCoeffs();
|
||||
}
|
||||
@ -233,9 +232,9 @@ bool PDRkEpsilon::read()
|
||||
Cmu_.readIfPresent(coeffDict_);
|
||||
C1_.readIfPresent(coeffDict_);
|
||||
C2_.readIfPresent(coeffDict_);
|
||||
alphak_.readIfPresent(coeffDict_);
|
||||
alphaEps_.readIfPresent(coeffDict_);
|
||||
alphah_.readIfPresent(coeffDict_);
|
||||
sigmak_.readIfPresent(coeffDict());
|
||||
sigmaEps_.readIfPresent(coeffDict());
|
||||
Prt_.readIfPresent(coeffDict());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -252,7 +251,12 @@ void PDRkEpsilon::correct()
|
||||
{
|
||||
// Re-calculate viscosity
|
||||
mut_ = rho_*Cmu_*sqr(k_)/(epsilon_ + epsilonSmall_);
|
||||
# include "wallViscosityI.H"
|
||||
mut_.correctBoundaryConditions();
|
||||
|
||||
// Re-calculate thermal diffusivity
|
||||
alphat_ = mut_/Prt_;
|
||||
alphat_.correctBoundaryConditions();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -269,6 +273,9 @@ void PDRkEpsilon::correct()
|
||||
volScalarField G = 2*mut_*(tgradU() && dev(symm(tgradU())));
|
||||
tgradU.clear();
|
||||
|
||||
// Update espsilon and G at the wall
|
||||
epsilon_.boundaryField().updateCoeffs();
|
||||
|
||||
// Add the blockage generation term so that it is included consistently
|
||||
// in both the k and epsilon equations
|
||||
const volScalarField& betav = U_.db().lookupObject<volScalarField>("betav");
|
||||
@ -278,8 +285,6 @@ void PDRkEpsilon::correct()
|
||||
|
||||
volScalarField GR = drag.Gk();
|
||||
|
||||
# include "wallFunctionsI.H"
|
||||
|
||||
// Dissipation equation
|
||||
tmp<fvScalarMatrix> epsEqn
|
||||
(
|
||||
@ -292,10 +297,10 @@ void PDRkEpsilon::correct()
|
||||
- fvm::Sp(C2_*betav*rho_*epsilon_/k_, epsilon_)
|
||||
);
|
||||
|
||||
# include "wallDissipationI.H"
|
||||
|
||||
epsEqn().relax();
|
||||
|
||||
epsEqn().boundaryManipulate(epsilon_.boundaryField());
|
||||
|
||||
solve(epsEqn);
|
||||
bound(epsilon_, epsilon0_);
|
||||
|
||||
@ -317,12 +322,13 @@ void PDRkEpsilon::correct()
|
||||
solve(kEqn);
|
||||
bound(k_, k0_);
|
||||
|
||||
|
||||
// Re-calculate viscosity
|
||||
mut_ = rho_*Cmu_*sqr(k_)/epsilon_;
|
||||
mut_.correctBoundaryConditions();
|
||||
|
||||
# include "wallViscosityI.H"
|
||||
|
||||
// Re-calculate thermal diffusivity
|
||||
alphat_ = mut_/Prt_;
|
||||
alphat_.correctBoundaryConditions();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -29,6 +29,20 @@ Description
|
||||
Standard k-epsilon turbulence model with additional source terms
|
||||
corresponding to PDR basic drag model (\link basic.H \endlink)
|
||||
|
||||
The default model coefficients correspond to the following:
|
||||
@verbatim
|
||||
kEpsilonCoeffs
|
||||
{
|
||||
Cmu 0.09;
|
||||
C1 1.44;
|
||||
C2 1.92;
|
||||
C3 -0.33; // only for compressible
|
||||
sigmak 1.0; // only for compressible
|
||||
sigmaEps 1.3;
|
||||
Prt 1.0; // only for compressible
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
The turbulence source term \f$ G_{R} \f$ appears in the
|
||||
\f$ \kappa-\epsilon \f$ equation for the generation of turbulence due to
|
||||
interaction with unresolved obstacles.
|
||||
@ -68,19 +82,21 @@ class PDRkEpsilon
|
||||
{
|
||||
// Private data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
dimensionedScalar Cmu_;
|
||||
dimensionedScalar C1_;
|
||||
dimensionedScalar C2_;
|
||||
dimensionedScalar alphak_;
|
||||
dimensionedScalar alphaEps_;
|
||||
dimensionedScalar alphah_;
|
||||
dimensionedScalar sigmak_;
|
||||
dimensionedScalar sigmaEps_;
|
||||
dimensionedScalar Prt_;
|
||||
|
||||
dimensionedScalar kappa_;
|
||||
dimensionedScalar E_;
|
||||
// Fields
|
||||
|
||||
volScalarField k_;
|
||||
volScalarField epsilon_;
|
||||
volScalarField mut_;
|
||||
volScalarField alphat_;
|
||||
|
||||
|
||||
public:
|
||||
@ -101,7 +117,7 @@ public:
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
//- Destructor
|
||||
virtual ~PDRkEpsilon()
|
||||
{}
|
||||
|
||||
@ -118,7 +134,7 @@ public:
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField("DkEff", alphak_*mut_ + mu())
|
||||
new volScalarField("DkEff", mut_/sigmak_ + mu())
|
||||
);
|
||||
}
|
||||
|
||||
@ -127,7 +143,7 @@ public:
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField("DepsilonEff", alphaEps_*mut_ + mu())
|
||||
new volScalarField("DepsilonEff", mut_/sigmaEps_ + mu())
|
||||
);
|
||||
}
|
||||
|
||||
@ -136,7 +152,7 @@ public:
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField("alphaEff", alphah_*mut_ + alpha())
|
||||
new volScalarField("alphaEff", alphat_ + alpha())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -116,7 +116,7 @@ mutSpalartAllmarasWallFunctionFvPatchScalarField::calcMut() const
|
||||
const scalarField& rhow = rasModel.rho().boundaryField()[patchI];
|
||||
const scalarField& muw = rasModel.mu().boundaryField()[patchI];
|
||||
|
||||
return max(0.0, rhow*sqr(calcUTau(magGradU))/magGradU - muw);
|
||||
return max(scalar(0), rhow*sqr(calcUTau(magGradU))/magGradU - muw);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -51,7 +51,7 @@ nutSpalartAllmarasWallFunctionFvPatchScalarField::calcNut() const
|
||||
const scalarField magGradU = mag(Uw.snGrad());
|
||||
const scalarField& nuw = rasModel.nu().boundaryField()[patchI];
|
||||
|
||||
return max(0.0, sqr(calcUTau(magGradU))/magGradU - nuw);
|
||||
return max(scalar(0), sqr(calcUTau(magGradU))/magGradU - nuw);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user