1 /*========================================================================= 2 3 Program: Visualization Toolkit 4 Module: vtkCPExodusIIElementBlock.h 5 6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 7 All rights reserved. 8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 9 10 This software is distributed WITHOUT ANY WARRANTY; without even 11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 12 PURPOSE. See the above copyright notice for more information. 13 14 =========================================================================*/ 15 /** 16 * @class vtkCPExodusIIElementBlock 17 * @brief Uses an Exodus II element block as a 18 * vtkMappedUnstructuredGrid's implementation. 19 * 20 * 21 * This class allows raw data arrays returned by the Exodus II library to be 22 * used directly in VTK without repacking the data into the vtkUnstructuredGrid 23 * memory layout. Use the vtkCPExodusIIInSituReader to read an Exodus II file's 24 * data into this structure. 25 */ 26 27 #ifndef vtkCPExodusIIElementBlock_h 28 #define vtkCPExodusIIElementBlock_h 29 30 #include "vtkIOExodusModule.h" // For export macro 31 #include "vtkObject.h" 32 33 #include "vtkMappedUnstructuredGrid.h" // For mapped unstructured grid wrapper 34 35 #include <string> // For std::string 36 37 class vtkGenericCell; 38 39 class VTKIOEXODUS_EXPORT vtkCPExodusIIElementBlockImpl : public vtkObject 40 { 41 public: 42 static vtkCPExodusIIElementBlockImpl* New(); 43 void PrintSelf(ostream& os, vtkIndent indent) override; 44 vtkTypeMacro(vtkCPExodusIIElementBlockImpl, vtkObject); 45 46 /** 47 * Set the Exodus element block data. 'elements' is the array returned from 48 * ex_get_elem_conn. 'type', 'numElements', and 'nodesPerElement' are obtained 49 * from ex_get_elem_block. Returns true or false depending on whether or not 50 * the element type can be translated into a VTK cell type. This object takes 51 * ownership of the elements array unless this function returns false. 52 */ 53 bool SetExodusConnectivityArray( 54 int* elements, const std::string& type, int numElements, int nodesPerElement); 55 56 // API for vtkMappedUnstructuredGrid's implementation. 57 vtkIdType GetNumberOfCells(); 58 int GetCellType(vtkIdType cellId); 59 void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds); 60 void GetPointCells(vtkIdType ptId, vtkIdList* cellIds); 61 int GetMaxCellSize(); 62 void GetIdsOfCellsOfType(int type, vtkIdTypeArray* array); 63 int IsHomogeneous(); 64 65 // This container is read only -- these methods do nothing but print a 66 // warning. 67 void Allocate(vtkIdType numCells, int extSize = 1000); 68 vtkIdType InsertNextCell(int type, vtkIdList* ptIds); 69 vtkIdType InsertNextCell(int type, vtkIdType npts, const vtkIdType ptIds[]) 70 VTK_SIZEHINT(ptIds, npts); 71 vtkIdType InsertNextCell(int type, vtkIdType npts, const vtkIdType ptIds[], vtkIdType nfaces, 72 const vtkIdType faces[]) VTK_SIZEHINT(ptIds, npts) VTK_SIZEHINT(faces, nfaces); 73 void ReplaceCell(vtkIdType cellId, int npts, const vtkIdType pts[]) VTK_SIZEHINT(pts, npts); 74 75 protected: 76 vtkCPExodusIIElementBlockImpl(); 77 ~vtkCPExodusIIElementBlockImpl() override; 78 79 private: 80 vtkCPExodusIIElementBlockImpl(const vtkCPExodusIIElementBlockImpl&) = delete; 81 void operator=(const vtkCPExodusIIElementBlockImpl&) = delete; 82 83 // Convert between Exodus node ids and VTK point ids. NodeToPoint(const int & id)84 static vtkIdType NodeToPoint(const int& id) { return static_cast<vtkIdType>(id - 1); } PointToNode(const vtkIdType & id)85 static int PointToNode(const vtkIdType& id) { return static_cast<int>(id + 1); } 86 87 // Convenience methods to get pointers into the element array. GetElementStart(vtkIdType cellId)88 int* GetElementStart(vtkIdType cellId) const 89 { 90 return this->Elements + (cellId * this->CellSize); 91 } GetElementEnd(vtkIdType cellId)92 int* GetElementEnd(vtkIdType cellId) const 93 { 94 return this->Elements + (cellId * this->CellSize) + this->CellSize; 95 } GetStart()96 int* GetStart() const { return this->Elements; } GetEnd()97 int* GetEnd() const { return this->Elements + (this->NumberOfCells * this->CellSize); } 98 99 int* Elements; 100 int CellType; 101 int CellSize; 102 vtkIdType NumberOfCells; 103 }; 104 105 vtkMakeExportedMappedUnstructuredGrid( 106 vtkCPExodusIIElementBlock, vtkCPExodusIIElementBlockImpl, VTKIOEXODUS_EXPORT); 107 108 #endif // vtkCPExodusIIElementBlock_h 109