Shows an example of the new recyclePatchInteraction model
- particles that escape from the outlet are recycled back into the
domain via the second inlet
Signed-off-by: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
Parcels that hit an 'outflow' patch are recycled to an 'inflow' patch, with
optional:
- recycle fraction < 1
Example usage:
RecycleInteractionCoeffs
{
recyclePatches
(
(outlet1 inlet1)
(outlet2 inlet2)
);
recycleFraction 0.8; // [0-1]
}
Signed-off-by: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
- weight fields are combined by multiplication
- volFieldValue:
* 0-N scalar fields
- surfaceFieldValue:
* 0-N scalar fields
* 0-1 vector fields
In some cases this can be used to avoid creating additional
fields.
weightFields (rho U);
vs.
derivedFields (rhoU);
weightField rhoU;
- when sampling onto a meshed surface, the sampling surface may be
outside of the mesh region, or simply too far away to be considered
reasonable.
Can now specify a max search distance and default values for samples
that are too distant.
If a default value is not specified, uses Type(Zero).
Eg,
maxDistance 0.005;
defaultValue
{
"p.*" 1e5;
T 273.15;
U (-100 -100 -100);
}
- additional "names" entry to specify a word/regex list of selections
For example,
{
type patch;
name inlets;
names ("inlet_[0-9].*" inlet);
}
- if "names" exists AND contains a literal (non-regex) that can be used
as a suitable value for "name", the "name" entry becomes optional.
For example,
{
type patch;
names ("inlet_[0-9].*" inlet);
// inferred name = inlet
}
- reduce some overhead in surfaceFieldValue
TUT: surfaceFieldValue on patches : reactingParcelFoam/verticalChannel
- read surfaces which are defined in terms of solid element sides. Eg,
```
*ELEMENT, TYPE=C3D4, ELSET=...
1, ...
2, ...
*SURFACE, NAME=Things, TYPE=ELEMENT
1, S1
2, S1
```
The element and side number are encoded as a synthetic face id
according to
-(10 * elemId + sideNum)
but the underlying solid geometry is discarded, since there is no
reasonable way to pass it through the surface sampling mechanism.
- bitSet and PackedList fill() as per boost dynamic_bitset.
Silently deprecate assign(val), which is potentially confusing
with other forms of assign().
- FixedList fill() as per std::array.
Add missing assignment from Foam::zero
- minor code simplication in bitSet and PackedList
STYLE: fix typo in comment, qualify Foam::zero
Example usage,
wmake -with-bear src/OpenFOAM
src/Allwmake -with-bear -s -j
- bin/tools/vscode-settings
Emit some json content suitable for setting up Visual Studio Code
for use with OpenFOAM.
For example,
bin/tools/vscode-settings > .vscode/settings.json
Ideas from Volker Weissman
----
install-dirs: a general directory installer
Copy installs non-binary (platform) directories.
Eg,
install-dirs -prefix=... -devel
install-dirs -prefix=... -default -no-app
----
install-platform: a platform (binary) installer
This is primarily driven by the need to install into system mpi
directories. The problem noted in issue #1893 is caused by the
rpm-mpi-hooks (fedora and redhat-8).
For the additional mpi library qualifier (openmpi-x86_64) to be
added to the requirements, the mpi-specific libraries (eg,
libPstream.so) need to be installed in the mpi system directory
(eg, /usr/lib64/openmpi).
However, then need symlinks from the system locations back to our
local directories to ensure that the libraries are correctly found
via our LD_LIBRARY_PATH and we don't get dummy libraries.
----
update-mpi-links: a post-install update hook
Expected paths are registered as persistent information into the
hook during packaging. Triggering the hook after installation
completes the creation of the symlinks.
Normal usage,
```
prefix="/tmp/local-install/openfoam"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -prefix="$prefix"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/platforms/linux64GccDPInt32Opt/bin
- /tmp/local-install/openfoam/platforms/linux64GccDPInt32Opt/lib
Can also place architecture-dependent bits elsewhere,
```
prefix="/tmp/local-install/openfoam"
multi_arch="$(dpkg-architecture -qDEB_TARGET_MULTIARCH)"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -exec-prefix="$prefix/$multi_arch"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/x86_64-linux-gnu/bin
- /tmp/local-install/openfoam/x86_64-linux-gnu/lib
Can use it to flatten out platforms entirely,
```
prefix="/tmp/local-install/openfoam"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -exec-prefix="$prefix"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/lib
- findZone(), cfindZone() to return pointer to existing or nullptr if
not found. This fits with methods such as findObject() etc for other
classes and can simplify code without checks for '-1' as not found.
- use simpler constructors for empty cell/face/point zones
- change to a templated implementation instead of relying on
the container's writeList() method.
This inlines the generation while also adding the flexibility to
define different delimiters (at compile time) without the
performance penalty of passing run-time parameters.
- deprecate get(key, deflt) in favour of lookup(key, deflt).
Method name compatibility with HashTable.
- deprecate operator().
The meaning is too opaque and equally served by other means:
- use get(key) instead of operator()(key).
Const access whereas HashTable::operator()(key)
creates missing entry.
- lookup(key, deflt) - instead of operator()(key, deflt).
Const access whereas HashTable::operator()(key, deflt)
creates a missing entry.
- make Enum iterable to allow participation in range-for etc.
- non-uniform offsets are generated due to truncation errors,
which can lead to problems later on (e.g. redistributePar).
Detect if the offsets are close to being uniform.
This also is to do with redistributePar:
this uses subsetMesh to generate parts to
send to different processors.
2) related to 1558: make sure not to choose 'mapped'
patches to move the processor patches into so
we can use the mapper cloning and correctly
size additional data (e.g. offsets). This should
be generalised to hold for any patch type
holding local data ...
- For slow oscillations it can be more intuitive to specify the
period.
ENH: separate mark/space for Square
- makes it easier to tailor the desired intervals.
BUG: incorrect square wave fraction with negative phase shifts
ENH: additional cosine Function1
STYLE: avoid code duplication by inheriting Cosine/Square from Sine.
- deprecated Feb-2018, but not marked as such.
The set() method originally enforce an additional run-time check
(Fatal if pointer was already set), but this was rarely used.
In fact, the set() method was invariably used in constructors
where the pointer by definition was unset.
Can now mark as deprecated to catch the last of these.
We prefer reset() for similarity with std::unique_ptr
Eg,
FOAM_EXTRA_CXXFLAGS="-DFoam_autoPtr_deprecate_setMethod" wmake
- easier support for non-mandatory functions.
In some boundary conditions it can be desirable to support
additional functions, but not necessarily require them. Make this
easier to support with a Function1, PatchFunction1 NewIfPresent()
selector.
- support for compatibility lookups
- harmonize branching logic and error handling between Function1 and
PatchFunction1.
ENH: refactor a base class for Function1, PatchFunction1
- includes base characteristics, patch or scalar information
ENH: additional creation macros
- makeConcreteFunction1, makeConcretePatchFunction1Type for adding a
non-templated function into the correct templated selection table.
makeScalarPatchFunction1 for similarity with makeScalarFunction1
ENH: support construction of zero-sized IndirectList
- useful when addressing is to be generated in-place after construction.
Eg,
indirectPrimitivePatch myPatches
(
IndirectList<face>(mesh.faces(), Zero),
mesh.points()
);
labelList& patchFaces = myPatches.addressing();
patchFaces.resize(...);
// populate patchFaces
STYLE: add noexcept for zero/one fields and remove old dependency files
COMP: correct typedefs for geometricOneField, geometricZeroField
- uses ocountstream for the output, which swallows all output.
Improves portability
ENH: improved efficiency in countstreambuf
- xsputn() instead of overflow
- more consistent seek* methods
Computes a histogram for the distribution of particle diameters
and corresponding number of particles hitting on a given list of patches.
A minimal example by using `constant/reactingCloud1Properties.cloudFunctions`:
```
patchParticleHistogram1
{
// Mandatory entries (unmodifiable)
type patchParticleHistogram;
patches (<patch1> <patch2> ... <patchN>);
nBins 10;
min 0.1;
max 10.0;
maxStoredParcels 20;
}
```
DOC: heatTransferCoeff models: complete remaining header docs
STYLE: heatTransferCoeff models: use auto specifier when appropriate
Optionally, the Nusselt number (i.e. the ratio of convective to conductive
heat transfer at a boundary in a fluid) can be output:
```math
Nu = \frac{h L}{\kappa}
```
where
```
Nu | Nusselt number
h | Convective heat transfer coefficient of the flow
L | Characteristic length that defines the scale of the physical system
\kappa | Thermal conductivity of the fluid
```
It was observed in a MPPICDyMFoam simulation involving a single particle
in a moving mesh that the barocentric trajectory of the particle follows
an unexpected path at some arbitrary instant in time.
The issue was tracked to "hitEqn()" where cubicEqn/quadraticEqn computes
one of the roots wrongly due to the discriminant limit we set, e.g. for:
0x^3 + 1.4334549e-33 x^2 - 9.0869006e-10 x + 0.0027666538
Although the discriminant limit was carefully selected to avoid various
problems at the time, the new change is required more due to its exposition
to a wider spectrum of applications.
From OpenFOAM Foundation e4d89daf5d
The main issue here was that reconstructPar is serial but coupled() in
cyclicAMIFvPatch.C could return true if both sides of the patch was present
(this->size() && neighbFvPatch().size()). However, this would result in an
evaluate call in cyclicAMIFvPatchField. This would only work if both sides
were completely contained on the same processor. The change in logic prevents
coupled() from returning true when called in serial for a decomposed case.
Signed-off-by: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
- prefix FOAM_MPI and library directories with 'sys-' for system
versions for uniform identication.
WM_MPLIB | libdir (FOAM_MPI) | old naming |
SYSTEMMPI | sys-mpi | mpi |
SYSTEMOPENMPI | sys-openmpi | openmpi-system |
- prefix preferences with 'prefs.' to make them more easily
identifiable, and update bin/tools/create-mpi-config accordingly
Old name: config.{csh,sh}/openmpi
New name: config.{csh,sh}/prefs.openmpi
- additional mpi preferences now available:
* prefs.intelmpi
* prefs.mpich
...
CONFIG: added hook for EASYBUILDMPI (eb-mpi), somewhat like USERMPI
- EasyBuild uses mpicc when compiling, so no explicit wmake rules are
used
ENH: support different major versions for system openmpi
- for example, with
WM_MPLIB=SYSTEMOPENMPI2
defines FOAM_MPI=sys-openmpi2 and thus creates lib/sys-openmpi2
ENH: centralize handling of mpi as 'mpi-rules'
Before:
sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)
sinclude $(DEFAULT_RULES)/mplib$(WM_MPLIB)
ifeq (,$(FOAM_MPI_LIBBIN))
FOAM_MPI_LIBBIN := $(FOAM_LIBBIN)/$(FOAM_MPI)
endif
After:
include $(GENERAL_RULES)/mpi-rules
- also allows variants such as SYSTEMOPENMPI2 to be handled separately
ENH: provide fallback prefix for cmake detection
STYLE: simplify some shell syntax, avoid uname call in sysFunctions
STYLE: report FOAM_MPI during mpiLib builds
- no limit to the number of ways of filing ptscotch libraries.
RedHat/Fedora/CentOS should look for these directories:
ptscotch include=/usr/include/openmpi-x86_64
ptscotch library=/usr/lib64/openmpi/lib
when MPI_ARCH_PATH=/usr/lib64/openmpi
and mpicc --showme:compile yields -I/usr/include/openmpi-x86_64
- ensures that subsequent Allwmake scripts know about it.
ENH: add bin/tools/query-detect wrapper for wmake have_* scripts
CONFIG: use project/ThirdParty without additional sanity checks
- no need to test for Allwmake or platforms/ if ThirdParty is located
within the project directory itself.
COMP: add simple mpi test to 00-dummy
- for testing library linkage, etc.
- blockMesh <- extrudeModel <- dynamicMesh
COMP: bad constructor in searchableSphere
- used brace initializer instead of bracket initializer, which
triggered component-wise construction instead of copy/move
construction (gcc 4.8)
STYLE: use uint8_t instead of relying on definition of 'direction'
ENH: limit output to 25 cell types per line for readability
- makes it easier to trace potential format errors etc
STYLE: downgrade warning about polyhedrals to a simple info message
- can assume that polyhedral support is widespread enough to not
warrant a warning.
- first sort the cells into their ijk bins, and restrict testing for
face orientation to those faces with an owner or neighbour that has
an ijk bin.
ENH: ensure polyMesh from PDRblockMesh is marked as AUTO_WRITE
- the particular polyMesh constructor inherits the writeOpt, which
makes is dependent on the caller and thus somewhat fragile for the
top level caller.
- a sphere/spheroid can be specified as a single radius or three radii.
If all three values happen to be identical, they are collapsed to a
single value. Examples,
radius 2;
radius (2 2 2);
radius (2 3 4);
radius (2 2 4);
The search for nearest point on an ellipse or ellipsoid follows the
description given by Geometric Tools (David Eberly), which also
include some pseudo code. The content is CC-BY 4.0
In the search algorithm, symmetry is exploited and the searching is
confined to the first (+x,+y,+z) octant, and the radii are ordered
from largest to smallest.
Searching is optimized for sphere, prolate and oblate spheroids.
- code reduction, documentation, code stubs for spheroid (#1901)
- make searchableSurfaceCollection available as 'collection'
for consistency with other objects
- make handling of verbosity more consistent.
Make all setter return the old value, remove (unused) default
parameter as being counter-intuitive. This makes it easier to
restore the original values.
For example,
const bool oldVerbose = sampler.verbose(false);
...
sampler.verbose(oldVerbose);
- can help when designing/debugging blockMesh layouts
- propagate low-level cellModel methods face() and edge() to cellShape
STYLE: relocate blockMesh OBJ output to application only
- remove blockTopology files in cleanCase function
- improve code consistency in top-level blockMesh, PDRblockMesh
generation.
- consistent with FOAM_SIGFPE etc.
- centralize code as error::useAbort() static function to avoid
scattering the logic throughout the code.
ENH: also accept "0" and "1" string values for Switch
- not the normal path for Switch input (eg, from a dictionary), but
consistent with bool definitions and simplifies string parsing.
This means that `FOAM_SIGFPE=1 application` will now also work.
- use refPtr to simplify some logic.
- avoid copying field if an average will be used
- initialize geometric fields with a uniform value instead of Zero
- minor tweak of method names
- apply bugfix #1889 (longer description elsewhere)
- add -recentre option to shift points according to the bounding box
centre before performing other operations
- add -auto-origin to use the bounding box centre as the origin for
rotations. Has lower priority than the -origin option.
- surfaceTransformPoints now has distinct -read-scale, -write-scale
options (as per surfaceMeshConvert). Silently accepts -scale as
equivalent to -write-scale, for backwards compatibility and
similarity with transformPoints
- add -steps option for surfaceRefineRedGreen for successive
refinement
Allows specification of extrusion path using blockMesh 'edges' syntax.
See tutorials/mesh/extrudeMesh/polyline
Contribution by Ivor Clifford/Paul Scherrer Institut
ENH: add some scalar constants for .org compatibility (#1881)
Although it can very much be a moving target, it can prove partly
useful to have some compatibility constants/methods.
- The wholesale change of 'GREAT' -> 'great' etc (JAN-2018), makes
user coding for multiple versions problematic. When
COMPAT_OPENFOAM_ORG is defined, now define constants (aliases) named
as per the openfoam.org version. Values, however, remain identical.
- For type-safe dictionary value retrieval, we have the templated
get<> methods added around NOV-2018 and deprecated the lookupType
method.
The .org version followed suit in NOV-2019, but opted for renaming
the templated lookupType method as a templated 'lookup' method.
Using this is discouraged, but allowed when COMPAT_OPENFOAM_ORG is
defined.
- flips state while preserving the textual representation.
Eg, OFF <-> ON, YES <-> NO etc.
- fix test case to avoid triggering abort(), which we cannot try/catch
- provides a more direct means of generating a compound token without
an Istream
- add transferCompoundToken() without Istream reference
- mark more token methods as noexcept
- was marked as transitional/deprecated (2018-02), now deleted.
- avoids unexpected stealing of the pointer.
Use the move assignment it that is the intention.
- support construct face from subset of labels.
- additional cellModel face() method to return a single face.
- reduce some allocations in cellModel centre/mag methods
STYLE: mark old cellModeller methods as compile-time deprecated
- deprecated in 2017, but not marked as such
STYLE: indentation, spacing in some headers
- in most cases this eliminates manually calculation of circumferential
points.
TUT: improve parameterization of sphere blockMeshDict
- allow separate parameterization of radius, ratio of inner to outer,
and the number of divisions in x/y/z and radial directions
- The arc will frequently enclose an angle less than 180 degrees.
For the case, it is possible to define the arc by its endpoints
and its centre (origin) point. For example,
arc 0 1 origin (0 0 0);
When defined in the way, any discrepancy in the arc radius for the
endpoints is resolved by adjusting the origin to ensure that the
average radius is satisfied.
It is also possible to specify a \em flatness factor as a multiplier
of the radius. For example,
arc 0 1 origin 1.1 (0 0 0);
ENH: minor code cleanup for block edges
ENH: expose point appending as polyList::concat
- contents to be filled with a later assignment.
This can help avoid deduction issues when populating from a list of
tokens, and the templated version is selected:
```
template<class T>
primitiveEntry(const keyType&, const T&);
```
ENH: support construct empty ITstream with given name
- populate contents later by assigment
- provides consistency with identity(label, label) and looks more
familiar than using labelRange::labels()
- relocates labelRange IO operators to IntRange
ENH: make sliceRange interators random access
STYLE: scalarRanges::match() instead of predicate operator
- returns a range of `int` values that can be iterated across.
For example,
for (const int proci : Pstream::subProcs()) { ... }
instead of
for
(
int proci = Pstream::firstSlave();
proci <= Pstream::lastSlave();
++proci
)
{
...
}
- returns a range of `int` values that can be iterated across.
For example,
for (const int proci : Pstream::allProcs()) { ... }
instead of
for (label proci = 0; proci < Pstream::nProcs(); ++proci) { ... }
- timeVaryingUniformFixedValue -> uniformFixedValue
- allows a variety of functions (eg, coded, expressions, tables, ...)
- more similarity to finiteVolume patch type
STYLE: remove unused timeVarying... from etc/controlDict
- add reverse iterators and replace std::iterator
(deprecated in C++17) with full definitions
- simplify construction of iterators
- construct labelRange from a single single parameter.
This creates a (0,len) range.
- make basic constructors forms constexpr.
Remove unused size checks.
- Derive labelRange from new IntRange template class.
Allows reuse of base functionality with different integral sizes.
Deprecations:
- deprecate labelRange::valid() in favour of using
labelRange::empty() or the bool operator.
For example,
if (range) ... vs older if (range.valid()) ...
DEFEATURE: drop labelRange::null, scalarRange::null static variables
- turned out to be not particularly useful.
Can simply use constexpr contructor forms
DEFEATURE: drop labelRange::identity static method
- simply use the single-parameter constructor
1) Adding LiquidEvapFuchsKnudsen model for lagrangian evaporation.
This models is based on a diffusion type of evaporation/
condensation on particles composed of solution (liquid + solid).
2) Adding modes of calculating the particle rho and volume change.
The new keyword in constantProperties is 'volumeUpdateMethod'
which three options:
a) constantRho
b) constantVolume
c) updateRhoAndVol
The old keyword 'constantVolume' true/face is still valid
3) The entry rho0 is now optional for multicomponent parcels.
If defined , it is used, but if it is not the actual mixture
provided is used to calculate rho0 of the particle.
T0 is still used as initial T and Cp0 is over-written in the
multicomponent cloud but still required.
4) Adding tutorial for evaporation/condensation model
BUG: faMatrix::residual changes source vector (fixes#1835)
ENH: improve code alignment between faMatrix and fvMatrix
- support setValues() with a single value
- can use ListOps::appendEqOp as the more general form.
Note that this uses a different template parameter.
Eg,
`globalMeshData::ListPlusEqOp<labelList>()`
vs. `ListOps::appendEqOp<label>()`
- select default nastran PLOAD2 or PLOAD4 based on field type.
Default to PLOAD2 for scalar types and PLOAD4 for vectors etc.
- relocate nastran SHELL/MAT cards.
Previously wrote at the end of the file, now emit when writing the
geometry itself. This improves modularity (of code and files)
- initial support for common geometry file for nastran
- for CAE formats such as abaqus, nastran, starcd, etc, the element id
is already part of the output format itself. For these cases, there
is no use in generating an additional "Ids" field.
ENH: add code to ignore negative face ids
- these will arise from very special cases, such as when a
solid element and side are encoded into a single integer.
BUG: starcd surface values output did not use original face ids
- introduce WM_COMPILE_CONTROL variable to convey control information
into the build rules.
The convention (as per spack):
- '+' to select a feature
- '~' to deselect a feature
Eg, to select the gold linker, and disable openmp
(spaces are not required):
WM_COMPILE_CONTROL="+gold ~openmp"
CONFIG: accept FOAM_EXTRA_LDFLAGS for AMD, gold, Mingw linkers
CONFIG: generalize PROJECT_LIBS (-ldl used almost universally)
- originally (incorrectly) was a Field(0.0), which was generalized
to Field(Zero), but Field() is the correct form
STYLE: rename 'mustGet' to more standard 'mandatory' variable
- read header info once and reuse
- short-circuit logic to avoid unneeded checks
- additional debug information if field cannot be found
STYLE: remove unused old code remnants from #1206
Script to copy/create mingw run-time installation from the Linux
cross-compilation. Packs everything into a tar or a zip file.
To accommodate Windows, all .dll files are also placed in the
platforms bin/ directory where they are easily found via the PATH.
Futhermore, ThirdParty dll files (including those from mingw itself)
are also placed in the same directory.
---
Steps
- bundles common files and directories (bin, etc, META-INFO, ...)
- copies .exe files from FOAM_APPBIN and .dll files from FOAM_LIBBIN
to the new target platforms/win64MingwDPInt32Opt/bin.
- copies mingw sys-root .dll files to the new target
platforms/win64MingwDPInt32Opt/bin
- copies other ThirdParty dll files (scotch, fftw, etc) to
platforms/win64MingwDPInt32Opt/bin
- copies tutorials (can be deactivated)
---
Note
Can only be called when the linux64Mingw environment is active.
- makes it easier to use in combination with various 'New' selectors,
which mostly return an autoPtr.
ENH: add very simple FFT test
- basic sanity test that the library links properly
- previously hidden as Detail::[IO]FstreamAllocator, now exposed
directly as [io]fstreamPointer, which allows reuse for
std::ifstream, std::ofstream wrapping, without the additional
ISstream, OSstream layers.
These stream pointers have some characteristics similar to a
unique_ptr.
- restrict direct gzstream usage to two files (fstreamPointers.C,
gzstream.C) which improves localization and makes it simpler to
enable/disable with the `HAVE_LIBZ` define.
The HAVE_LIBZ define is currently simply hard-coded in the
Make/options.
If compiled WITHOUT libz support:
- reading gz files : FatalError
- writing gz files : emit warning and downgrade to uncompressed
- warn if compression is specified in the case controlDict
and downgrade to uncompressed
ENH: minor updates to gzstream interface for C++11
- support construct/open with std::string for the file names.
CONFIG: provisioning for have_libz detection as wmake/script
- the various information queries MUST be executed with
the '--no-print-directory' or risk polluting values
in the information queries.
This is mostly seen with the 'canCompile' test for tutorials running
in parallel.
Reduce the number of phaseSystems libraries:
- phaseSystems previously had a number of smaller libraries to provide
interface and model properties, etc. This potential flexibility was
never actually used anywhere, but causes cyclic dependencies between
phaseSystem and the models (and turbulence) that causes extreme
difficulty for mingw linking (issue #1238).
- libincompressibleMultiphaseSystems
- removed: libmassTransferModels
- libmultiphaseSystem
- removed: libcompressibleMultiphaseEulerianInterfacialModels
- libreactingMultiphaseSystem
- removed: libreactingPhaseSystem
- removed: libreactingEulerianFvPatchFields
- removed: libreactingEulerianInterfacialCompositionModels
- removed: libreactingEulerianInterfacialModels
- removed: libmultiphaseReactingTurbulenceModels
- libreactingTwoPhaseSystem
- removed: libreactingPhaseSystem
- removed: libreactingEulerianFvPatchFields
- removed: libreactingEulerianInterfacialCompositionModels
- removed: libreactingEulerianInterfacialModels
Avoid duplicate symbol for phaseCompressibleTurbulenceModels
Common turbulence models are defined in libreactingMultiphaseSystem,
and libmultiphaseReactingTurbulenceModels is now redundant.
The libtwoPhaseReactingTurbulenceModels extends the common models
for reactingTwoPhaseSystem.
- since the context (laminar/RAS/LES) is already given by the
sub-dictionary, it is redundant to use as prefix as well.
- silently support the longer names as compat methods
- old code just checked for pointer vs non-pointer.
Should actually treat CREF and REF types differently
Overseen in commit be058bec7d. Only affects develop branch
ENH: improved naming consistency in tmp, refPtr
- also use long-form to check for pointer type instead of the isTmp()
method. Makes differences between PTR, CREF, REF easier to spot.
STYLE: typeName() for tmp, refPtr is static
In fvSolution is possible to cache the limiter. This surface field
is stored in the database to be read later.
The internal tmp management of the field was not working properly.
In certain turbulence models such as kEpsilon, kOmegaSST, etc when used
in the multiphase context throw an error in the preconditioner. This
is due to alpha being zero. Fixes#1789.
- using HashPtrTable::set() with the same key twice did not guarantee
proper cleanup of memory since it simply used the underlying
HashTable::set() without doing anything about the old memory. Now
check for pre-existing storage and delete it when it does not
correspond to the newly stored pointer.
This problem is independent of potential memory slicing previously
flagged (#1286) and only partially resolved.
- naming similarity with autoPtr, unique_ptr and other containers.
For UPtrList derivatives, this is equivalent to the existing
operator(). The read-only variant is also equivalent to the
single-parameter 'set(label)' method.
With PtrList<T> list(...) :
const T* ptr = list.get(10);
if (ptr)
{
ptr->method();
}
vs.
if (list.set(10))
{
list[10].method();
}
For HashPtrTable there is only a read-only variant which is equivalent
to testing for existence and for value.
With HashPtrTable<T> hash(...) :
const T* ptr = list.get("key");
if (ptr)
{
ptr->method();
}
vs.
if (list.found("key"))
{
// Fails on null pointer!!
list["key"].method();
}
Use of get() is largely a matter of taste or local coding requirements
- forwarding like the emplace() method, but overwriting existing
entries as required
- propagate similar changes to HashPtrTable
For example, with HashPtrTable<labelList> table(...) :
With 'insert' semantics
table.emplace("list1", 1000);
vs
if (!table.found("list1"))
{
table.set("list1", new labelList(1000));
}
or
table.insert("list1", autoPtr<labelList>::New(1000));
Note that the last example invokes an unnecessary allocation/deletion
if the insertion is unsuccessful.
With 'set' semantics:
table.emplace_set("list1", 15);
vs
table.set("list1", new labelList(15));
- constructs such as the following will no longer worked, but that is
also a good thing.
ptrlist.set(i, scalarField(nFaces, Zero));
this called set(.., const tmp<scalarField>&), which meant under
the hood:
- create local temporary const scalarField&
- wrap as const tmp&
- use tmp::ptr(), to clone the const-ref
This implies an additional allocation (for the const scalarField&)
which is immediately discarded. Doubtful that compiler optimization
would do anything.
The fakeError function object emits FatalError at different stages (or
does nothing), which is useful for testing purposes (issue #1779).
Can request errors from constructor, execute and write methods.
- previously setting FOAM_ABORT would preempt checks for throwing
exceptions.
Now check for throwing first, to allow try/catch code to do its job.
However, ignore exception throwing for abort(). These are used
infrequently in the code, but indicate that recovery is deemed
impossible.
STYLE: use unique_ptr for internal stream buffer management
The function evaluate was returning true every outer loop, triggering
the re-calculation of ddt0 in every outer loop.
The evaluation of the term ddt0 should be performed once per time step.
The corrected function updates the timeIndex of ddt0 to avoid the
re-evaluation of this term in the outer loops.
- improves flexibility. Can tag a tmp as allowing non-const access to
the reference and skip additional const_cast in following code. For
example,
tmp<volScalarField> tfld(nullptr);
auto* ptr = getObjectPtr<volScalarField>("field");
if (ptr)
{
tfld.ref(*ptr);
}
else
{
tfld.reset(volScalarField::New(...));
}
auto& fld = tfld.ref();
ENH: renamed tmpNrc to refPtr
- the name 'refPtr' (reference|pointer) should be easier to remember
than tmpNrc (tmp, but non-ref-counted).
- provide tmpNrc typedef and header for code compatibility
NOTE
- in some places refPtr and tmp can be used instead of a
std::reference_wrapper for handling external references.
Unlike std::reference_wrapper, it can be default constructed
(holding nothing), whereas reference_wrapper may need a dummy
reference. However, the lifetime extension of references _may_ be
better with reference_wrapper.
- previously this was marked as '= delete' for consistency with
assignment from an empty pointer being a runtime error.
However, these can be considered semantically different and it makes
sense to permit this as equivalent to reset(nullptr).
This change does not break existing code since the operator was
previously unavailable (deleted).
STYLE: refactor tmp operator=(T*)
- delegate to reset() after initial checks
- Previously considered to be valid() if it was any reference
(null or non-null) or a non-null pointer.
This appears to be a holdover from old code (pre-2015) where
reinterpret_cast<..>(0) was used instead of the NullObject.
A reference via a null pointer isn't really possible anywhere. Even
for things like labelList::null(), they now use the NullObject,
which has a non-zero memory location.
- now simply check for a non-zero memory address. Regardless of
pointer or referenced object.
- combine reset() methods by adding a default parameter
- improve top-level visibility of empty/valid/get methods for symmetry
symmetry with autoPtr, future adjustment
- with '&&' conditions, often better to check for non-null autoPtr
first (it is cheap)
- check as bool instead of valid() method for cleaner code, especially
when the wrapped item itself has a valid/empty or good.
Also when handling multiple checks.
Now
if (ptr && ptr->valid())
if (ptr1 || ptr2)
instead
if (ptr.valid() && ptr->valid())
if (ptr1.valid() || ptr2.valid())
- This reflects the pre-existing coding situation where const_cast was
used throughout to effect the same.
STYLE: fix private/protected access
- CodedField, codedMixedFvPatchField
- libs() singleton method for global library handling
- explicit handling of empty filename for dlLibraryTable open/close.
Largely worked before, but now be more explicit about its behaviour.
- add (key, dict) constructor and open() methods.
More similarity to dimensionedType, Enum etc, and there is no
ambiguity with the templated open().
- construct or open from initializer_list of names
- optional verbosity when opening with auxiliary table,
avoid duplicate messages or spurious messages for these.
- basename and fullname methods (migrated from dynamicCode).
- centralise low-level load/unload hooks
- adjust close to also dlclose() aliased library names.
This is for a very specific use case where the faceZones are
imprinted after meshing the normal geometry. This sometimes
splits off badly connected bits of the mesh. One way to remove
these is to use e.g. subsetMesh. This embeds the
same functionality inside snappyHexMesh.
- replace `%namespace` directive with simpler `%static` directive.
We always encapsulate Lemon parser routines in an anonymous
namespace, so a simpler static linkage directive suffices.
This reduces the size of the Lemon patch (program and template).
- makes it easier to distinguish between pointers referring to pool
data versus pointers actually holding storage, avoids
manual demand-driven deletion and autoPtr.
ENH: simplify/improve Pstream profiling
- times now double (not scalar) for consistency with what cpuTime
delivers
- use bool to track suspend state
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.