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.

172 lines
5.2 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkGenericInterpolatedVelocityField.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 vtkGenericInterpolatedVelocityField
* @brief Interface for obtaining
* interpolated velocity values
*
* vtkGenericInterpolatedVelocityField acts as a continuous velocity field
* by performing cell interpolation on the underlying vtkDataSet.
* This is a concrete sub-class of vtkFunctionSet with
* NumberOfIndependentVariables = 4 (x,y,z,t) and
* NumberOfFunctions = 3 (u,v,w). Normally, every time an evaluation
* is performed, the cell which contains the point (x,y,z) has to
* be found by calling FindCell. This is a computationally expansive
* operation. In certain cases, the cell search can be avoided or shortened
* by providing a guess for the cell iterator. For example, in streamline
* integration, the next evaluation is usually in the same or a neighbour
* cell. For this reason, vtkGenericInterpolatedVelocityField stores the last
* cell iterator. If caching is turned on, it uses this iterator as the
* starting point.
*
* @warning
* vtkGenericInterpolatedVelocityField is not thread safe. A new instance
* should be created by each thread.
*
* @sa
* vtkFunctionSet vtkGenericStreamTracer
*/
#ifndef vtkGenericInterpolatedVelocityField_h
#define vtkGenericInterpolatedVelocityField_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkFunctionSet.h"
class vtkGenericDataSet;
class vtkGenericCellIterator;
class vtkGenericAdaptorCell;
class vtkGenericInterpolatedVelocityFieldDataSetsType;
class VTKCOMMONDATAMODEL_EXPORT vtkGenericInterpolatedVelocityField : public vtkFunctionSet
{
public:
vtkTypeMacro(vtkGenericInterpolatedVelocityField, vtkFunctionSet);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Construct a vtkGenericInterpolatedVelocityField with no initial data set.
* Caching is on. LastCellId is set to -1.
*/
static vtkGenericInterpolatedVelocityField* New();
using Superclass::FunctionValues;
/**
* Evaluate the velocity field, f, at (x, y, z, t).
* For now, t is ignored.
*/
int FunctionValues(double* x, double* f) override;
/**
* Add a dataset used for the implicit function evaluation.
* If more than one dataset is added, the evaluation point is
* searched in all until a match is found. THIS FUNCTION
* DOES NOT CHANGE THE REFERENCE COUNT OF dataset FOR THREAD
* SAFETY REASONS.
*/
virtual void AddDataSet(vtkGenericDataSet* dataset);
/**
* Set the last cell id to -1 so that the next search does not
* start from the previous cell
*/
void ClearLastCell();
/**
* Return the cell cached from last evaluation.
*/
vtkGenericAdaptorCell* GetLastCell();
/**
* Returns the interpolation weights cached from last evaluation
* if the cached cell is valid (returns 1). Otherwise, it does not
* change w and returns 0.
*/
int GetLastLocalCoordinates(double pcoords[3]);
//@{
/**
* Turn caching on/off.
*/
vtkGetMacro(Caching, vtkTypeBool);
vtkSetMacro(Caching, vtkTypeBool);
vtkBooleanMacro(Caching, vtkTypeBool);
//@}
//@{
/**
* Caching statistics.
*/
vtkGetMacro(CacheHit, int);
vtkGetMacro(CacheMiss, int);
//@}
//@{
/**
* If you want to work with an arbitrary vector array, then set its name
* here. By default this in nullptr and the filter will use the active vector
* array.
*/
vtkGetStringMacro(VectorsSelection);
void SelectVectors(const char* fieldName) { this->SetVectorsSelection(fieldName); }
//@}
//@{
/**
* Returns the last dataset that was visited. Can be used
* as a first guess as to where the next point will be as
* well as to avoid searching through all datasets to get
* more information about the point.
*/
vtkGetObjectMacro(LastDataSet, vtkGenericDataSet);
//@}
/**
* Copy the user set parameters from source. This copies
* the Caching parameters. Sub-classes can add more after
* chaining.
*/
virtual void CopyParameters(vtkGenericInterpolatedVelocityField* from);
protected:
vtkGenericInterpolatedVelocityField();
~vtkGenericInterpolatedVelocityField() override;
vtkGenericCellIterator* GenCell; // last cell
double LastPCoords[3]; // last local coordinates
int CacheHit;
int CacheMiss;
vtkTypeBool Caching;
vtkGenericDataSet* LastDataSet;
vtkSetStringMacro(VectorsSelection);
char* VectorsSelection;
vtkGenericInterpolatedVelocityFieldDataSetsType* DataSets;
int FunctionValues(vtkGenericDataSet* ds, double* x, double* f);
static const double TOLERANCE_SCALE;
private:
vtkGenericInterpolatedVelocityField(const vtkGenericInterpolatedVelocityField&) = delete;
void operator=(const vtkGenericInterpolatedVelocityField&) = delete;
};
#endif