/*=========================================================================
Program: Visualization Toolkit
Module: vtkYoungsMaterialInterface.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 vtkYoungsMaterialInterface
* @brief reconstructs material interfaces
*
*
* Reconstructs material interfaces from a mesh containing mixed cells (where several materials are
* mixed) this implementation is based on the youngs algorithm, generalized to arbitrary cell types
* and works on both 2D and 3D meshes. the main advantage of the youngs algorithm is it guarantees
* the material volume correctness. for 2D meshes, the AxisSymetric flag allows to switch between a
* pure 2D (planar) algorithm and an axis symmetric 2D algorithm handling volumes of revolution.
*
* @par Thanks:
* This file is part of the generalized Youngs material interface reconstruction algorithm
* contributed by
CEA/DIF - Commissariat a l'Energie Atomique, Centre DAM Ile-De-France
* BP12, F-91297 Arpajon, France.
* Implementation by Thierry Carrard (thierry.carrard@cea.fr)
* Modification by Philippe Pebay (philippe.pebay@kitware.com)
*/
#ifndef vtkYoungsMaterialInterface_h
#define vtkYoungsMaterialInterface_h
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkMultiBlockDataSetAlgorithm.h"
#include "vtkSmartPointer.h" // For SP ivars
class vtkIntArray;
class vtkInformation;
class vtkInformationVector;
class vtkYoungsMaterialInterfaceInternals;
class VTKFILTERSGENERAL_EXPORT vtkYoungsMaterialInterface : public vtkMultiBlockDataSetAlgorithm
{
public:
static vtkYoungsMaterialInterface* New();
vtkTypeMacro(vtkYoungsMaterialInterface, vtkMultiBlockDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Set/Get whether the normal vector has to be flipped.
*/
vtkSetMacro(InverseNormal, vtkTypeBool);
vtkGetMacro(InverseNormal, vtkTypeBool);
vtkBooleanMacro(InverseNormal, vtkTypeBool);
//@}
//@{
/**
* If this flag is on, material order in reversed.
* Otherwise, materials are sorted in ascending order depending on the given ordering array.
*/
vtkSetMacro(ReverseMaterialOrder, vtkTypeBool);
vtkGetMacro(ReverseMaterialOrder, vtkTypeBool);
vtkBooleanMacro(ReverseMaterialOrder, vtkTypeBool);
//@}
//@{
/**
* Set/Get OnionPeel flag. if this flag is on, the normal vector of the first
* material (which depends on material ordering) is used for all materials.
*/
vtkSetMacro(OnionPeel, vtkTypeBool);
vtkGetMacro(OnionPeel, vtkTypeBool);
vtkBooleanMacro(OnionPeel, vtkTypeBool);
//@}
//@{
/**
* Turns on/off AxisSymetric computation of 2D interfaces.
* in axis symmetric mode, 2D meshes are understood as volumes of revolution.
*/
vtkSetMacro(AxisSymetric, vtkTypeBool);
vtkGetMacro(AxisSymetric, vtkTypeBool);
vtkBooleanMacro(AxisSymetric, vtkTypeBool);
//@}
//@{
/**
* when UseFractionAsDistance is true, the volume fraction is interpreted as the distance
* of the cutting plane from the origin.
* in axis symmetric mode, 2D meshes are understood as volumes of revolution.
*/
vtkSetMacro(UseFractionAsDistance, vtkTypeBool);
vtkGetMacro(UseFractionAsDistance, vtkTypeBool);
vtkBooleanMacro(UseFractionAsDistance, vtkTypeBool);
//@}
//@{
/**
* When FillMaterial is set to 1, the volume containing material is output and not only the
* interface surface.
*/
vtkSetMacro(FillMaterial, vtkTypeBool);
vtkGetMacro(FillMaterial, vtkTypeBool);
vtkBooleanMacro(FillMaterial, vtkTypeBool);
//@}
//@{
/**
* Set/Get minimum and maximum volume fraction value. if a material fills a volume above the
* minimum value, the material is considered to be void. if a material fills a volume fraction
* beyond the maximum value it is considered as filling the whole volume.
*/
vtkSetVector2Macro(VolumeFractionRange, double);
vtkGetVectorMacro(VolumeFractionRange, double, 2);
//@}
//@{
/**
* Sets/Gets the number of materials.
*/
virtual void SetNumberOfMaterials(int n);
virtual int GetNumberOfMaterials();
//@}
//@{
/**
* Set/Get whether all material blocks should be used, irrespective of the material block mapping.
*/
vtkSetMacro(UseAllBlocks, bool);
vtkGetMacro(UseAllBlocks, bool);
vtkBooleanMacro(UseAllBlocks, bool);
//@}
//@{
/**
* Only meaningful for LOVE software. returns the maximum number of blocks containing the same
* material
*/
vtkGetMacro(NumberOfDomains, int);
//@}
//@{
/**
* Set ith Material arrays to be used as volume fraction, interface normal and material ordering.
* Each parameter name a cell array.
*/
virtual void SetMaterialArrays(int i, const char* volume, const char* normalX,
const char* normalY, const char* normalZ, const char* ordering);
virtual void SetMaterialArrays(
int i, const char* volume, const char* normal, const char* ordering);
virtual void SetMaterialVolumeFractionArray(int i, const char* volume);
virtual void SetMaterialNormalArray(int i, const char* normal);
virtual void SetMaterialOrderingArray(int i, const char* ordering);
//@}
/**
* Removes all materials previously added.
*/
virtual void RemoveAllMaterials();
//@{
/**
* Alternative API for associating Normal and Ordering arrays to materials
* identified by its volume-fraction array.
* Note that these mappings are cleared by a call to RemoveAllMaterials() but
* not by SetNumberOfMaterials().
* If one uses the SetMaterial*Array(int, ...) API to set the normal or
* ordering arrays, then that supersedes the values set using this API.
*/
virtual void SetMaterialNormalArray(const char* volume, const char* normal);
virtual void SetMaterialOrderingArray(const char* volume, const char* ordering);
//@}
//@{
/**
* select blocks to be processed for each described material.
*/
virtual void RemoveAllMaterialBlockMappings();
virtual void AddMaterialBlockMapping(int b);
//@}
enum
{
MAX_CELL_POINTS = 256
};
protected:
vtkYoungsMaterialInterface();
~vtkYoungsMaterialInterface() override;
int FillInputPortInformation(int port, vtkInformation* info) override;
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector) override;
/**
* Serial implementation of the material aggregation.
*/
virtual void Aggregate(int, int*);
void UpdateBlockMapping();
int CellProduceInterface(int dim, int np, double fraction, double minFrac, double maxFrac);
//@{
/**
* Read-Write Properties
*/
vtkTypeBool FillMaterial;
vtkTypeBool InverseNormal;
vtkTypeBool AxisSymetric;
vtkTypeBool OnionPeel;
vtkTypeBool ReverseMaterialOrder;
vtkTypeBool UseFractionAsDistance;
double VolumeFractionRange[2];
//@}
vtkSmartPointer MaterialBlockMapping;
bool UseAllBlocks;
/**
* Read only properties
*/
int NumberOfDomains;
// Description:
// Internal data structures
vtkYoungsMaterialInterfaceInternals* Internals;
private:
vtkYoungsMaterialInterface(const vtkYoungsMaterialInterface&) = delete;
void operator=(const vtkYoungsMaterialInterface&) = delete;
};
#endif /* VTK_YOUNGS_MATERIAL_INTERFACE_H */