[cig-commits] r9184 - cs/benchmark/cigma/trunk/src
luis at geodynamics.org
luis at geodynamics.org
Tue Jan 29 11:47:56 PST 2008
Author: luis
Date: 2008-01-29 11:47:55 -0800 (Tue, 29 Jan 2008)
New Revision: 9184
Added:
cs/benchmark/cigma/trunk/src/VtkReader.cpp
cs/benchmark/cigma/trunk/src/VtkReader.h
Log:
Generic VTK Reader
Added: cs/benchmark/cigma/trunk/src/VtkReader.cpp
===================================================================
--- cs/benchmark/cigma/trunk/src/VtkReader.cpp (rev 0)
+++ cs/benchmark/cigma/trunk/src/VtkReader.cpp 2008-01-29 19:47:55 UTC (rev 9184)
@@ -0,0 +1,206 @@
+#include <iostream>
+#include <cstdlib>
+#include <cassert>
+
+#include "VtkReader.h"
+
+#include "vtkCellArray.h"
+#include "vtkPointData.h"
+#include "vtkDoubleArray.h"
+#include "vtkFloatArray.h"
+
+
+// ---------------------------------------------------------------------------
+
+cigma::VtkReader::VtkReader()
+{
+ reader = 0;
+ grid = 0;
+}
+
+cigma::VtkReader::~VtkReader()
+{
+ if (reader != 0)
+ reader->Delete();
+}
+
+
+
+// ---------------------------------------------------------------------------
+
+void cigma::VtkReader::open(std::string filename)
+{
+ int ierr;
+
+ /* XXX: throw exception if file doesn't exist */
+ reader = vtkUnstructuredGridReader::New();
+ reader->SetFileName(filename.c_str());
+
+
+ /* detect bad vtk file
+ ierr = reader->OpenVTKFile();
+ if (ierr == 0)
+ {
+ reader->Delete();
+ reader = 0;
+ return;
+ }
+
+ ierr = reader->ReaderHeader();
+ if (ierr == 0)
+ {
+ reader->Delete();
+ reader = 0;
+ return;
+ } // */
+
+
+ reader->Update();
+ //reader->PrintSelf(std::cout, 0);
+
+ grid = reader->GetOutput();
+ //grid->PrintSelf(std::cout, 4);
+
+}
+
+void cigma::VtkReader::close()
+{
+}
+
+
+
+// ---------------------------------------------------------------------------
+
+void cigma::VtkReader::
+get_coordinates(double **coordinates, int *nno, int *nsd)
+{
+ assert(grid != 0);
+
+ vtkPoints *points = grid->GetPoints();
+ //points->PrintSelf(std::cout, 0);
+
+ int dims[2];
+ dims[0] = points->GetNumberOfPoints();
+ dims[1] = 3;
+
+ int size = dims[0] * dims[1];
+ int dataType = points->GetDataType();
+ double *coords = new double[size];
+
+ if (dataType == VTK_DOUBLE)
+ {
+ double *ptr = static_cast<double*>(points->GetVoidPointer(0));
+ for (int i = 0; i < size; i++)
+ {
+ coords[i] = ptr[i];
+ }
+ }
+ else if (dataType == VTK_FLOAT)
+ {
+ float *ptr = static_cast<float*>(points->GetVoidPointer(0));
+ for (int i = 0; i < size; i++)
+ {
+ coords[i] = ptr[i];
+ }
+ }
+ else
+ {
+ assert(false);
+ }
+
+ *coordinates = coords;
+ *nno = dims[0];
+ *nsd = dims[1];
+}
+
+void cigma::VtkReader::
+get_connectivity(int **connectivity, int *nel, int *ndofs)
+{
+ assert(grid != 0);
+
+ vtkCellArray *cellArray = grid->GetCells();
+ //cellArray->PrintSelf(std::cout, 0);
+
+ vtkIdType numCells = grid->GetNumberOfCells();
+ vtkIdType *cellArrayPtr = cellArray->GetPointer();
+
+ int dofs_per_elt = cellArrayPtr[0];
+ int offset = dofs_per_elt + 1;
+ int *connect = new int[numCells * dofs_per_elt];
+
+ for (int e = 0; e < numCells; ++e)
+ {
+ for (int i = 1; i <= dofs_per_elt; ++i)
+ {
+ connect[dofs_per_elt * e + (i-1)] = cellArrayPtr[offset*e + i];
+ }
+ }
+
+ *connectivity = connect;
+ *nel = numCells;
+ *ndofs = dofs_per_elt;
+}
+
+
+void cigma::VtkReader::
+get_vector_point_data(const char *name, double **vectors, int *num, int *dim)
+{
+ assert(grid != 0);
+
+ vtkPointData *pointData = grid->GetPointData();
+ //pointData->PrintSelf(std::cout, 0);
+
+ vtkDataArray *dataArray;
+ if (name != 0) {
+ assert(pointData->HasArray(name) == 1);
+ dataArray = pointData->GetVectors(name);
+ } else {
+ dataArray = pointData->GetScalars();
+ }
+ //dataArray->PrintSelf(std::cout, 0);
+
+ int dataType = dataArray->GetDataType();
+ assert(dataType == VTK_DOUBLE);
+ double *ptr = static_cast<double*>(dataArray->GetVoidPointer(0));
+
+ // XXX: copy the data, or keep the reference?
+ // if dataType from the file is float, then we'd need to copy anyway
+ // perhaps we need a void pointer and a type
+ // new function signature would be
+ // void get_vector_point_data(const char *name, void **vectors, int *num, int *dim, int *type)
+
+ *vectors = ptr;
+ *num = dataArray->GetNumberOfTuples();
+ *dim = dataArray->GetNumberOfComponents();
+}
+
+void cigma::VtkReader::
+get_scalar_point_data(const char *name, double **scalars, int *num, int *dim)
+{
+ assert(grid != 0);
+
+ vtkPointData *pointData = grid->GetPointData();
+ //pointData->PrintSelf(std::cout, 0);
+
+ vtkDataArray *dataArray;
+ if (name != 0) {
+ assert(pointData->HasArray(name) == 1);
+ dataArray = pointData->GetScalars(name);
+ } else {
+ dataArray = pointData->GetScalars();
+ }
+ //dataArray->PrintSelf(std::cout, 0);
+
+
+ int dataType = dataArray->GetDataType();
+ assert(dataType == VTK_DOUBLE);
+ double *ptr = static_cast<double*>(dataArray->GetVoidPointer(0));
+
+ // XXX: see comment in get_vector_point_data()
+
+ *scalars = ptr;
+ *num = dataArray->GetNumberOfTuples();
+ *dim = dataArray->GetNumberOfComponents();
+}
+
+// ---------------------------------------------------------------------------
Added: cs/benchmark/cigma/trunk/src/VtkReader.h
===================================================================
--- cs/benchmark/cigma/trunk/src/VtkReader.h (rev 0)
+++ cs/benchmark/cigma/trunk/src/VtkReader.h 2008-01-29 19:47:55 UTC (rev 9184)
@@ -0,0 +1,78 @@
+#ifndef __VTK_READER_H__
+#define __VTK_READER_H__
+
+#include <string>
+
+#include "Reader.h"
+
+#include "vtkDataSetReader.h"
+#include "vtkUnstructuredGridReader.h"
+#include "vtkUnstructuredGrid.h"
+
+namespace cigma
+{
+ class VtkReader;
+}
+
+class cigma::VtkReader : cigma::Reader
+{
+public:
+ typedef enum {
+ VTK_FILE_NONE,
+ VTK_FILE_POLYDATA,
+ VTK_FILE_STRUCTURED_POINTS,
+ VTK_FILE_STRUCTURED_GRID,
+ VTK_FILE_UNSTRUCTURED_GRID,
+ VTK_FILE_RECTILINEAR_GRID
+ } VtkFileType;
+
+public:
+ VtkReader();
+ ~VtkReader();
+
+public:
+
+ ReaderType getType()
+ {
+ return VTK_READER;
+ }
+
+ VtkFileType getFileType()
+ {
+ if (reader != 0)
+ {
+ // XXX: are these mutually exclusive?
+ if (reader->IsFilePolyData())
+ return VTK_FILE_POLYDATA;
+ if (reader->IsFileStructuredPoints())
+ return VTK_FILE_STRUCTURED_POINTS;
+ if (reader->IsFileStructuredGrid())
+ return VTK_FILE_STRUCTURED_GRID;
+ if (reader->IsFileUnstructuredGrid())
+ return VTK_FILE_UNSTRUCTURED_GRID;
+ if (reader->IsFileRectilinearGrid())
+ return VTK_FILE_RECTILINEAR_GRID;
+ }
+ return VTK_FILE_NONE;
+ }
+
+
+public:
+ void open(std::string filename);
+ void close();
+
+public:
+ void get_coordinates(double **coordinates, int *nno, int *nsd);
+ void get_connectivity(int **connectivity, int *nel, int *ndofs);
+ void get_vector_point_data(const char *name, double **vectors, int *num, int *dim);
+ void get_scalar_point_data(const char *name, double **scalars, int *num, int *dim);
+
+public:
+ vtkUnstructuredGridReader *reader;
+ //vtkDataSetReader *reader;
+ vtkUnstructuredGrid *grid;
+};
+
+// ---------------------------------------------------------------------------
+
+#endif
More information about the cig-commits
mailing list