You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/VTK7.1/include/vtkSPHInterpolator.h

445 lines
14 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSPHInterpolator.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkSPHInterpolator
* @brief interpolate over point cloud using SPH kernels
*
*
* This filter uses SPH (smooth particle hydrodynamics) kernels to
* interpolate a data source onto an input structure. For example, while the
* data source is a set of particles, the data from these particles can be
* interpolated onto an input object such as a line, plane or volume. Then
* the output (which consists of the input structure plus interpolated data)
* can then be visualized using classical visualization techniques such as
* isocontouring, slicing, heat maps and so on.
*
* To use this filter, besides setting the input P and source Pc, specify a
* point locator (which accelerates queries about points and their neighbors)
* and an interpolation kernel (a subclass of vtkSPHKernel). In addition, the
* name of the source's density and mass arrays can optionally be provided;
* however if not provided then the local volume is computed from the
* kernel's spatial step. Finally, a cutoff distance array can optionall be
* provided when the local neighborhood around each point varies. The cutoff
* distance defines a local neighborhood in which the points in that
* neighborhood are used to interpolate values. If not provided, then the
* cutoff distance is computed from the spatial step size times the cutoff
* factor (see vtkSPHKernel).
*
* Other options to the filter include specifying which data attributes to
* interpolate from the source. By default, all data attributes contained in
* the source are interpolated. However, by adding array names to the
* exclusion list, these arrays will not be interpolated. Also, it is
* possible to use a SPH derivative formulation to interpolate from the
* source data attributes. This requires adding arrays (by name) to the
* derivative list, in which case the derivative formulation will be applied
* to create a new output array named "X_deriv" where X is the name of a
* source point attribute array.
*
* @warning
* This class has been threaded with vtkSMPTools. Using TBB or other
* non-sequential type (set in the CMake variable
* VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
*
* @warning
* For widely spaced points in Pc, or when p is located outside the bounding
* region of Pc, the interpolation may behave badly and the interpolation
* process will adapt as necessary to produce output. For example, if the N
* closest points within R are requested to interpolate p, if N=0 then the
* interpolation will switch to a different strategy (which can be controlled
* as in the NullPointsStrategy).
*
* @warning
* For more information and technical reference, see D.J. Price, Smoothed
* particle hydrodynamics and magnetohydrodynamics,
* J. Comput. Phys. 231:759-794, 2012. Especially equation 49.
*
* @par Acknowledgments:
* The following work has been generously supported by Altair Engineering
* and FluiDyna GmbH. Please contact Steve Cosgrove or Milos Stanic for
* more information.
*
* @sa
* vtkPointInterpolator vtkSPHKernel vtkSPHQuinticKernel
*/
#ifndef vtkSPHInterpolator_h
#define vtkSPHInterpolator_h
#include "vtkFiltersPointsModule.h" // For export macro
#include "vtkDataSetAlgorithm.h"
#include "vtkStdString.h" // For vtkStdString ivars
#include <vector> //For STL vector
class vtkAbstractPointLocator;
class vtkIdList;
class vtkDoubleArray;
class vtkSPHKernel;
class vtkCharArray;
class vtkFloatArray;
class VTKFILTERSPOINTS_EXPORT vtkSPHInterpolator : public vtkDataSetAlgorithm
{
public:
//@{
/**
* Standard methods for instantiating, obtaining type information, and
* printing.
*/
static vtkSPHInterpolator *New();
vtkTypeMacro(vtkSPHInterpolator,vtkDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent);
//@}
//@{
/**
* Specify the dataset Pc that will be probed by the input points P. The
* Input P defines the dataset structure (the points and cells) for the
* output, while the Source Pc is probed (interpolated) to generate the
* scalars, vectors, etc. for the output points based on the point
* locations.
*/
void SetSourceData(vtkDataObject *source);
vtkDataObject *GetSource();
//@}
/**
* Specify the dataset Pc that will be probed by the input points P. The
* Input P defines the structure (the points and cells) for the output,
* while the Source Pc is probed (interpolated) to generate the scalars,
* vectors, etc. for the output points based on the point locations.
*/
void SetSourceConnection(vtkAlgorithmOutput* algOutput);
//@{
/**
* Specify a point locator. By default a vtkStaticPointLocator is
* used. The locator performs efficient searches to locate near a
* specified interpolation position.
*/
void SetLocator(vtkAbstractPointLocator *locator);
vtkGetObjectMacro(Locator,vtkAbstractPointLocator);
//@}
//@{
/**
* Specify an interpolation kernel. By default a vtkSPHQuinticKernel is used
* (i.e., closest point). The interpolation kernel changes the basis of the
* interpolation.
*/
void SetKernel(vtkSPHKernel *kernel);
vtkGetObjectMacro(Kernel,vtkSPHKernel);
//@}
//@{
/**
* Specify an (optional) cutoff distance for each point in the input P. If
* not specified, then the kernel cutoff is used.
*/
vtkSetMacro(CutoffArrayName,vtkStdString);
vtkGetMacro(CutoffArrayName,vtkStdString);
//@}
//@{
/**
* Specify the density array name. This is optional. Typically both the density
* and mass arrays are specified together (in order to compute the local volume).
* Both the mass and density arrays must consist of tuples of 1-component. (Note that
* the density array name specifies a point array found in the Pc source.)
*/
vtkSetMacro(DensityArrayName,vtkStdString);
vtkGetMacro(DensityArrayName,vtkStdString);
//@}
//@{
/**
* Specify the mass array name. This is optional. Typically both the
* density and mass arrays are specified together (in order to compute the
* local volume). Both the mass and density arrays must consist of tuples
* of 1-component. (Note that the mass array name specifies a point
* array found in the Pc source.)
*/
vtkSetMacro(MassArrayName,vtkStdString);
vtkGetMacro(MassArrayName,vtkStdString);
//@}
//@{
/**
* Adds an array to the list of arrays which are to be excluded from the
* interpolation process.
*/
void AddExcludedArray(const vtkStdString &excludedArray)
{
this->ExcludedArrays.push_back(excludedArray);
this->Modified();
}
//@}
//@{
/**
* Clears the contents of excluded array list.
*/
void ClearExcludedArrays()
{
this->ExcludedArrays.clear();
this->Modified();
}
//@}
/**
* Return the number of excluded arrays.
*/
int GetNumberOfExcludedArrays()
{return static_cast<int>(this->ExcludedArrays.size());}
//@{
/**
* Return the name of the ith excluded array.
*/
const char* GetExcludedArray(int i)
{
if ( i < 0 || i >= static_cast<int>(this->ExcludedArrays.size()) )
{
return NULL;
}
return this->ExcludedArrays[i].c_str();
}
//@}
//@{
/**
* Adds an array to the list of arrays whose derivative is to be taken. If
* the name of the array is "derivArray" this will produce an output array
* with the name "derivArray_deriv" (after filter execution).
*/
void AddDerivativeArray(const vtkStdString &derivArray)
{
this->DerivArrays.push_back(derivArray);
this->Modified();
}
//@}
//@{
/**
* Clears the contents of derivative array list.
*/
void ClearDerivativeArrays()
{
this->DerivArrays.clear();
this->Modified();
}
//@}
/**
* Return the number of derivative arrays.
*/
int GetNumberOfDerivativeArrays()
{return static_cast<int>(this->DerivArrays.size());}
//@{
/**
* Return the name of the ith derivative array.
*/
const char* GetDerivativeArray(int i)
{
if ( i < 0 || i >= static_cast<int>(this->DerivArrays.size()) )
{
return NULL;
}
return this->DerivArrays[i].c_str();
}
//@}
// How to handle NULL points
enum NullStrategy
{
MASK_POINTS=0,
NULL_VALUE=1
};
//@{
/**
* Specify a strategy to use when encountering a "null" point during the
* interpolation process. Null points occur when the local neighborhood (of
* nearby points to interpolate from) is empty. If the strategy is set to
* MaskPoints, then an output array is created that marks points as being
* valid (=1) or null (invalid =0) (and the NullValue is set as well). If
* the strategy is set to NullValue, then the output data value(s) are set
* to the NullPoint value.
*/
vtkSetMacro(NullPointsStrategy,int);
vtkGetMacro(NullPointsStrategy,int);
void SetNullPointsStrategyToMaskPoints()
{ this->SetNullPointsStrategy(MASK_POINTS); }
void SetNullPointsStrategyToNullValue()
{ this->SetNullPointsStrategy(NULL_VALUE); }
//@}
//@{
/**
* If the NullPointsStrategy == MASK_POINTS, then an array is generated for
* each input point. This vtkCharArray is placed into the output of the filter,
* with a non-zero value for a valid point, and zero otherwise. The name of
* this masking array is specified here.
*/
vtkSetMacro(ValidPointsMaskArrayName, vtkStdString);
vtkGetMacro(ValidPointsMaskArrayName, vtkStdString);
//@}
//@{
/**
* Specify the null point value. When a null point is encountered then all
* components of each null tuple are set to this value. By default the
* null value is set to zero.
*/
vtkSetMacro(NullValue,double);
vtkGetMacro(NullValue,double);
//@}
//@{
/**
* Indicate whether to compute the summation of weighting coefficients (the
* so-called Shepard sum). In the interior of a SPH point cloud, the
* Shephard summation value should be ~1.0. Towards the boundary, the
* Shepard summation generally falls off <1.0. If ComputeShepardSum is specified, then the
* output will contain an array of summed Shepard weights for each output
* point. On by default.
*/
vtkSetMacro(ComputeShepardSum, bool);
vtkBooleanMacro(ComputeShepardSum, bool);
vtkGetMacro(ComputeShepardSum, bool);
//@}
//@{
/**
* If ComputeShepardSum is on, then an array is generated with name
* ShepardSumArrayName for each input point. This vtkFloatArray is placed
* into the output of the filter, and NullPoints have value =0.0. The
* default name is "Shepard Summation".
*/
vtkSetMacro(ShepardSumArrayName, vtkStdString);
vtkGetMacro(ShepardSumArrayName, vtkStdString);
//@}
//@{
/**
* If enabled, then input arrays that are non-real types (i.e., not float
* or double) are promoted to float type on output. This is because the
* interpolation process may not be well behaved when integral types are
* combined using interpolation weights.
*/
vtkSetMacro(PromoteOutputArrays, bool);
vtkBooleanMacro(PromoteOutputArrays, bool);
vtkGetMacro(PromoteOutputArrays, bool);
//@}
//@{
/**
* Indicate whether to shallow copy the input point data arrays to the
* output. On by default.
*/
vtkSetMacro(PassPointArrays, bool);
vtkBooleanMacro(PassPointArrays, bool);
vtkGetMacro(PassPointArrays, bool);
//@}
//@{
/**
* Indicate whether to shallow copy the input cell data arrays to the
* output. On by default.
*/
vtkSetMacro(PassCellArrays, bool);
vtkBooleanMacro(PassCellArrays, bool);
vtkGetMacro(PassCellArrays, bool);
//@}
//@{
/**
* Indicate whether to pass the field-data arrays from the input to the
* output. On by default.
*/
vtkSetMacro(PassFieldArrays, bool);
vtkBooleanMacro(PassFieldArrays, bool);
vtkGetMacro(PassFieldArrays, bool);
//@}
/**
* Get the MTime of this object also considering the locator and kernel.
*/
vtkMTimeType GetMTime();
protected:
vtkSPHInterpolator();
~vtkSPHInterpolator();
vtkAbstractPointLocator *Locator;
vtkSPHKernel *Kernel;
vtkStdString CutoffArrayName;
vtkStdString DensityArrayName;
vtkStdString MassArrayName;
std::vector<vtkStdString> ExcludedArrays;
std::vector<vtkStdString> DerivArrays;
int NullPointsStrategy;
double NullValue;
vtkStdString ValidPointsMaskArrayName;
vtkCharArray *ValidPointsMask;
bool ComputeShepardSum;
vtkStdString ShepardSumArrayName;
vtkFloatArray *ShepardSumArray;
bool PromoteOutputArrays;
bool PassCellArrays;
bool PassPointArrays;
bool PassFieldArrays;
virtual int RequestData(vtkInformation *, vtkInformationVector **,
vtkInformationVector *);
virtual int RequestInformation(vtkInformation *, vtkInformationVector **,
vtkInformationVector *);
virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **,
vtkInformationVector *);
/**
* Virtual for specialized subclass(es)
*/
virtual void Probe(vtkDataSet *input, vtkDataSet *source, vtkDataSet *output);
/**
* Call at end of RequestData() to pass attribute data respecting the
* PassCellArrays, PassPointArrays, PassFieldArrays flags.
*/
virtual void PassAttributeData(
vtkDataSet* input, vtkDataObject* source, vtkDataSet* output);
/**
* Internal method to extract image metadata
*/
void ExtractImageDescription(vtkImageData *input, int dims[3],
double origin[3], double spacing[3]);
private:
vtkSPHInterpolator(const vtkSPHInterpolator&) VTK_DELETE_FUNCTION;
void operator=(const vtkSPHInterpolator&) VTK_DELETE_FUNCTION;
};
#endif