[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