Feature function objects
Lots of updates migrated from internal development line
### Updated functionObjectFile
Old code maintained a list of file pointers, and provided a clunky interface to output to file. Although OK for function objects that only created a single file, those that created multiple files were required to refer to each by an index and making it very easy to introduce errors.
The new code simplifies the functionObjectFile class so that it provides helper functions to create and write to files, and no longer maintains a list of file pointers. Instead, each function object must create and take responsibility for all of the file streams that it requires.
Changes propagated across dependencies:
* fieldValues
* forces/forceCoeffs
* yPlus
* fieldMinMax
* residuals
* regionSizeDistribution
* fieldMinMax
* cloudInfo
### Created new functionObjectState
Previously, if function objects required to store data on disk to enable smooth restarts, e.g. fieldAverage, the object would need to provide the mechanism for reading/writing state information itself. This class abstracts out the reading/writing of state information in a straightforward manner, whereby an object can retrieve its own data, or retrieve e.g. the latest available data from another object (e.g. see fieldValueDelta).
* fieldAverage
* fieldMinMax
* forces
* forceCoeffs
### Created new runTimePostProcessing function object
New function object to generate images at run-time, or in 'post-processing' mode via the execFlowFunctionObjects utility
* Constant DataEntry - added construct from components
* Set and surface writers updated to enable retrieval of filename of generated output
* Additional changes to surface writers from internal line:
+ Ensight collate times option
+ Nastran output updated based on user feedback
+ new boundaryData output
See merge request !5
- Allows generation of images (currently PNG files) during the run
- ... or afterwards by invoking the execFlowFunctionObjects utility
- Wrapper around VTK functionality
- Support for objects:
- text
- points (glyphs: sphere, arrow)
- lines (tubes)
- surfaces (wireframe, shaded, combination)
- Colour using:
- user-defined
- field values (several colour maps availale)
- For image sequences:
- dynamic views (camera movement)
- objects can appear/disappear using opacity
- Building
- VTK dependency v6+
- satisfied using ParaView from ThirdParty directory
- or separate VTK installation
- New boundaryData surface writer
- Moved templated code into separate files
- Output filenames written to functionObjectState dictionary
- Ensight surface writer now supports a 'collate times' option [mattijs]
- Nastran surface writer updated based on user feedback
functionObjects only get detroyed when the runTime gets destroyed. So the
mesh is already destroyed and we cannot hold e.g. a volScalarField since
that will try to 'checkOut' from the objectRegistry(=mesh) upon destruction.
Note that we only see this in chtMultiRegionFoam.
This bc was in compressible turbulence library which made it dependent
on liquidProperties. It was moved to a separate library since it is only
used in a single tutorial.
Original fix (http://www.openfoam.org/mantisbt/view.php?id=1780)
did an increment to create a new communicator. This might
access the communicator-to-mpi_structure tables in PstreamGlobals.H outside
range. Instead allocate and release communicator.
- shoot rays to nearest point on surface and two perpendicular rays
(instead of always shooting in the 3 coordinate directions)
- avoid bleeding through the surface intersection
1. multi-ray shooting. It now shoots rays in all the 3 coordinate directions
from the cell centre. Before it would shoot just a single ray from the
nearest point on the surface, going through the cell centre.
There is a cost overhead in that now it shoots 6 rays (+-x, +-y, +-z)
instead of just 1.
2. bleeding of refinement. It marks the cells inside a gap and walks out
the gap-size to neighbouring cells (which are just outside the gap). This
should make for a smoother refinement pattern.
The start of the layer addition loop does a synchronisation of the wanted
displacement. This also does a truncation of the displacement if it is <
minThickness. At the first iteration the displacement was initialised to
vector::one which might trigger the truncation logic (and then disable
extrusion altogether). Instead we now initialise the displacement to
vector::GREAT before entering the synchronisation.
The built-in explicit symplectic integrator has been replaced by a
general framework supporting run-time selectable integrators. Currently
the explicit symplectic, implicit Crank-Nicolson and implicit Newmark
methods are provided, all of which are 2nd-order in time:
Symplectic 2nd-order explicit time-integrator for 6DoF solid-body motion:
Reference:
Dullweber, A., Leimkuhler, B., & McLachlan, R. (1997).
Symplectic splitting methods for rigid body molecular dynamics.
The Journal of chemical physics, 107(15), 5840-5851.
Can only be used for explicit integration of the motion of the body,
i.e. may only be called once per time-step, no outer-correctors may be
applied. For implicit integration with outer-correctors choose either
CrankNicolson or Newmark schemes.
Example specification in dynamicMeshDict:
solver
{
type symplectic;
}
Newmark 2nd-order time-integrator for 6DoF solid-body motion:
Reference:
Newmark, N. M. (1959).
A method of computation for structural dynamics.
Journal of the Engineering Mechanics Division, 85(3), 67-94.
Example specification in dynamicMeshDict:
solver
{
type Newmark;
gamma 0.5; // Velocity integration coefficient
beta 0.25; // Position integration coefficient
}
Crank-Nicolson 2nd-order time-integrator for 6DoF solid-body motion:
The off-centering coefficients for acceleration (velocity integration) and
velocity (position/orientation integration) may be specified but default
values of 0.5 for each are used if they are not specified. With the default
off-centering this scheme is equivalent to the Newmark scheme with default
coefficients.
Example specification in dynamicMeshDict:
solver
{
type CrankNicolson;
aoc 0.5; // Acceleration off-centering coefficient
voc 0.5; // Velocity off-centering coefficient
}
Both the Newmark and Crank-Nicolson are proving more robust and reliable
than the symplectic method for solving complex coupled problems and the
tutorial cases have been updated to utilize this.
In this new framework it would be straight forward to add other methods
should the need arise.
Henry G. Weller
CFD Direct
Refinement:
-----------
// Optionally avoid patch merging - keeps hexahedral cells
// (to be used with automatic refinement/unrefinement)
//mergePatchFaces off;
// Optional multiple locationsInMesh with corresponding optional cellZone
// (automatically generates faceZones inbetween)
locationsInMesh
(
((-0.09 -0.039 -0.049) bottomAir) // cellZone bottomAir
((-0.09 0.009 -0.049) topAir) // cellZone topAir
);
// Optional faceType and patchType specification for these faceZones
faceZoneControls
{
bottomAir_to_topAir
{
faceType baffle;
}
}
/ Optional checking of 'bleeding' of mesh through a specifying a locations
// outside the mesh
locationsOutsideMesh ((0 0 0)(12.3 101.17 3.98));
// Improved refinement: refine all cells with all (or all but one) sides refined
// Improved refinement: refine all cells with opposing faces with different
// refinement level. These cells can happen on multiply curved surfaces.
// Default on, can be switched off with
//interfaceRefine false;
Snapping
--------
// Optional smoothing of points at refinement interfaces. This will reduce
// the non-orthogonality at refinement interfaces.
//nSmoothInternal $nSmoothPatch;
Layering
--------
// Layers can be added to patches or to any side of a faceZone.
// (Any faceZone internally gets represented as two patches)
// The angle to merge patch faces can be set independently of the
// featureAngle. This is especially useful for large feature angles
// Default is the same as the featureAngle.
//mergePatchFacesAngle 45;
// Optional mesh shrinking type 'displacementMotionSolver'. It uses any
// displacementMotionSolver, e.g. displacementSBRStress
// (default is the medial-axis algorithm, 'displacementMedialAxis')
//meshShrinker displacementMotionSolver;
Refinement:
-----------
// Optionally avoid patch merging - keeps hexahedral cells
// (to be used with automatic refinement/unrefinement)
//mergePatchFaces off;
// Optional multiple locationsInMesh with corresponding optional cellZone
// (automatically generates faceZones inbetween)
locationsInMesh
(
((-0.09 -0.039 -0.049) bottomAir) // cellZone bottomAir
((-0.09 0.009 -0.049) topAir) // cellZone topAir
);
// Optional faceType and patchType specification for these faceZones
faceZoneControls
{
bottomAir_to_topAir
{
faceType baffle;
}
}
/ Optional checking of 'bleeding' of mesh through a specifying a locations
// outside the mesh
locationsOutsideMesh ((0 0 0)(12.3 101.17 3.98));
// Improved refinement: refine all cells with all (or all but one) sides refined
// Improved refinement: refine all cells with opposing faces with different
// refinement level. These cells can happen on multiply curved surfaces.
// Default on, can be switched off with
//interfaceRefine false;
Snapping
--------
// Optional smoothing of points at refinement interfaces. This will reduce
// the non-orthogonality at refinement interfaces.
//nSmoothInternal $nSmoothPatch;
Layering
--------
// Layers can be added to patches or to any side of a faceZone.
// (Any faceZone internally gets represented as two patches)
// The angle to merge patch faces can be set independently of the
// featureAngle. This is especially useful for large feature angles
// Default is the same as the featureAngle.
//mergePatchFacesAngle 45;
// Optional mesh shrinking type 'displacementMotionSolver'. It uses any
// displacementMotionSolver, e.g. displacementSBRStress
// (default is the medial-axis algorithm, 'displacementMedialAxis')
//meshShrinker displacementMotionSolver;