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/vtkTemporalFractal.h

259 lines
7.4 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkTemporalFractal.h
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html 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 vtkTemporalFractal
* @brief A source to test AMR data object.
*
* vtkTemporalFractal is a collection of uniform grids. All have the same
* dimensions. Each block has a different origin and spacing. It uses
* mandelbrot to create cell data. I scale the fractal array to look like a
* volme fraction.
* I may also add block id and level as extra cell arrays.
* This source produces a vtkHierarchicalBoxDataSet when
* GenerateRectilinearGrids is off, otherwise produces a vtkMultiBlockDataSet.
*/
#ifndef vtkTemporalFractal_h
#define vtkTemporalFractal_h
#include "vtkFiltersHybridModule.h" // For export macro
#include "vtkAlgorithm.h"
#include "vtkSmartPointer.h" //for ivars
class vtkCompositeDataSet;
class vtkDataSet;
class vtkHierarchicalBoxDataSet;
class vtkIntArray;
class vtkRectilinearGrid;
class vtkUniformGrid;
class TemporalFractalOutputUtil;
class VTKFILTERSHYBRID_EXPORT vtkTemporalFractal: public vtkAlgorithm
{
public:
static vtkTemporalFractal *New();
vtkTypeMacro(vtkTemporalFractal,vtkAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent);
//@{
/**
* Essentially the iso surface value.
* The fractal array is scaled to map this value to 0.5 for use as a volume
* fraction.
*/
vtkSetMacro(FractalValue, float);
vtkGetMacro(FractalValue, float);
//@}
//@{
/**
* Any blocks touching a predefined line will be subdivided to this level.
* Other blocks are subdivided so that neighboring blocks only differ
* by one level.
*/
vtkSetMacro(MaximumLevel, int);
vtkGetMacro(MaximumLevel, int);
//@}
//@{
/**
* XYZ dimensions of cells.
*/
vtkSetMacro(Dimensions, int);
vtkGetMacro(Dimensions, int);
//@}
//@{
/**
* For testing ghost levels.
*/
vtkSetMacro(GhostLevels, int);
vtkGetMacro(GhostLevels, int);
vtkBooleanMacro(GhostLevels, int);
//@}
//@{
/**
* Generate either rectilinear grids either uniform grids.
* Default is false.
*/
vtkSetMacro(GenerateRectilinearGrids, int);
vtkGetMacro(GenerateRectilinearGrids, int);
vtkBooleanMacro(GenerateRectilinearGrids, int);
//@}
//@{
/**
* Limit this source to discrete integer time steps
* Default is off (continuous)
*/
vtkSetMacro(DiscreteTimeSteps, int);
vtkGetMacro(DiscreteTimeSteps, int);
vtkBooleanMacro(DiscreteTimeSteps, int);
//@}
//@{
/**
* Make a 2D data set to test.
*/
vtkSetMacro(TwoDimensional, int);
vtkGetMacro(TwoDimensional, int);
vtkBooleanMacro(TwoDimensional, int);
//@}
//@{
/**
* Test the case when the blocks do not have the same sizes.
* Adds 2 to the x extent of the far x blocks (level 1).
*/
vtkSetMacro(Asymetric,int);
vtkGetMacro(Asymetric,int);
//@}
//@{
/**
* Make the division adaptive or not, defaults to Adaptive
*/
vtkSetMacro(AdaptiveSubdivision, int);
vtkGetMacro(AdaptiveSubdivision, int);
vtkBooleanMacro(AdaptiveSubdivision, int);
//@}
protected:
vtkTemporalFractal();
~vtkTemporalFractal();
virtual int FillOutputPortInformation(int vtkNotUsed(port), vtkInformation* info);
int StartBlock;
int EndBlock;
int BlockCount;
/**
* see vtkAlgorithm for details
*/
virtual int ProcessRequest(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
/**
* This is called by the superclass.
* This is the method you should override.
*/
virtual int RequestDataObject(vtkInformation*,
vtkInformationVector**,
vtkInformationVector*);
/**
* This is called by the superclass.
* This is the method you should override.
*/
virtual int RequestInformation(vtkInformation *request,
vtkInformationVector **inputVector,
vtkInformationVector *outputVector);
//@{
/**
* This is called by the superclass.
* This is the method you should override.
*/
virtual int RequestData(vtkInformation *request,
vtkInformationVector **inputVector,
vtkInformationVector *outputVector);
virtual int RequestOneTimeStep(vtkCompositeDataSet *output,
vtkInformation *request,
vtkInformationVector **inputVector,
vtkInformationVector *outputVector);
//@}
void Traverse(int &blockId, int level, vtkDataObject* output,
int x0,int x1, int y0,int y1, int z0,int z1,
int onFace[6]);
int LineTest2(float x0, float y0, float z0,
float x1, float y1, float z1,
double bds[6]);
int LineTest(float x0, float y0, float z0,
float x1, float y1, float z1,
double bds[6], int level, int target);
void SetBlockInfo(vtkUniformGrid *grid, int level, int* ext,int onFace[6]);
void SetRBlockInfo(vtkRectilinearGrid *grid, int level, int* ext,
int onFace[6]);
void AddVectorArray(vtkHierarchicalBoxDataSet *output);
void AddTestArray(vtkHierarchicalBoxDataSet *output);
void AddFractalArray(vtkCompositeDataSet* output);
void AddBlockIdArray(vtkHierarchicalBoxDataSet *output);
void AddDepthArray(vtkHierarchicalBoxDataSet *output);
void AddGhostLevelArray(vtkDataSet *grid,
int dim[3],
int onFace[6]);
int MandelbrotTest(double x, double y);
int TwoDTest(double bds[6], int level, int target);
void CellExtentToBounds(int level,
int ext[6],
double bds[6]);
void ExecuteRectilinearMandelbrot(vtkRectilinearGrid *grid,
double *ptr);
double EvaluateSet(double p[4]);
void GetContinuousIncrements(int extent[6],
vtkIdType &incX,
vtkIdType &incY,
vtkIdType &incZ);
// Dimensions:
// Specify blocks relative to this top level block.
// For now this has to be set before the blocks are defined.
vtkSetVector3Macro(TopLevelSpacing, double);
vtkGetVector3Macro(TopLevelSpacing, double);
vtkSetVector3Macro(TopLevelOrigin, double);
vtkGetVector3Macro(TopLevelOrigin, double);
void InternalImageDataCopy(vtkTemporalFractal *src);
int Asymetric;
int MaximumLevel;
int Dimensions;
float FractalValue;
int GhostLevels;
vtkIntArray *Levels;
int TwoDimensional;
int DiscreteTimeSteps;
// New method of specifing blocks.
double TopLevelSpacing[3];
double TopLevelOrigin[3];
int GenerateRectilinearGrids;
double CurrentTime;
int AdaptiveSubdivision;
vtkSmartPointer<TemporalFractalOutputUtil> OutputUtil;
private:
vtkTemporalFractal(const vtkTemporalFractal&) VTK_DELETE_FUNCTION;
void operator=(const vtkTemporalFractal&) VTK_DELETE_FUNCTION;
};
#endif