File: VtkPiece.h

package info (click to toggle)
esys-particle 2.3.4%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 13,036 kB
  • ctags: 10,805
  • sloc: cpp: 80,009; python: 5,872; makefile: 1,243; sh: 313; perl: 225
file content (135 lines) | stat: -rw-r--r-- 4,149 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2014 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.apache.org/licenses/LICENSE-2.0          //
//                                                         //
/////////////////////////////////////////////////////////////


#ifndef ESYS_LSM_VTKPIECE_H
#define ESYS_LSM_VTKPIECE_H

#include <vector>
#include <map>
#include <iostream>
#include <sstream>

#include "Tools/StressCalculator/VtkDataType.h"
#include "Tools/StressCalculator/VtkDataArray.h"
#include "Tools/StressCalculator/VtkDataTypeTuple.h"

namespace esys
{
  namespace lsm
  {
    namespace vtk
    {
      class XmlPiece
      {
      public:
        virtual void writeXml(std::ostream &oStream) = 0;
      };

      template <typename TmplPointType, typename TmplPointDataTypeTuple>
      class Piece : public XmlPiece
      {
      public:
        typedef TmplPointType                               PointType;
        typedef typename PointType::value_type              PointValue;        
        typedef TmplPointDataTypeTuple                      PointDataTypeTuple;
        typedef typename PointDataTypeTuple::DataValueTuple PointData;

        Piece(const PointType &pointType, const PointDataTypeTuple &pointDataType)
          : m_pointData(pointDataType),
            m_pointValueArray(pointType),
            m_pointIndexMap()
        {
        }

        virtual ~Piece()
        {
        }

        int getIndex(const PointValue &point) const
        {
          typename PointIndexMap::const_iterator it = m_pointIndexMap.find(point);
          return ((it != m_pointIndexMap.end()) ? it->second : -1);
        }

        void setPoint(const PointValue &point, const PointData &data)
        {
          int index = getIndex(point);
          if (index < 0) {
            index = m_pointValueArray.size();
            m_pointIndexMap.insert(
              typename PointIndexMap::value_type(point, index)
            );
            m_pointValueArray.setData(index, point);
          }
          m_pointData.setData(index, data);
        }
        
        int getNumPoints() const
        {
          return m_pointValueArray.size();
        }

        int getNumCells() const
        {
          return 0;
        }
        
        virtual void writeXml(std::ostream &oStream) = 0;
        
        virtual void writePointsXml(std::ostream &oStream)
        {
          oStream << "<Points>" << "\n";
          m_pointValueArray.writeXml(oStream);
          oStream << "\n</Points>" << "\n";
        }

        virtual void writePointDataXml(std::ostream &oStream)
        {
          oStream << "<PointData>" << "\n";
          m_pointData.writeXml(oStream);
          oStream << "\n</PointData>" << "\n";
        }

        virtual void writeCellsXml(std::ostream &oStream)
        {
          oStream << "<Cells>" << "\n";
          DataArray<Int32Type> connectivity(Int32Type("connectivity"));
          connectivity.writeXml(oStream);
          oStream << "\n";
          DataArray<Int32Type> offsets(Int32Type("offsets"));
          offsets.writeXml(oStream);
          oStream << "\n";
          DataArray<UInt8Type> types(UInt8Type("types"));
          types.writeXml(oStream);
          oStream << "\n</Cells>" << "\n";
        }

        virtual void writeCellDataXml(std::ostream &oStream)
        {
          oStream << "<CellData>" << "\n";
          oStream << "</CellData>" << "\n";        
        }

      private:
        typedef DataArray<PointType>      PointValueArray;
        typedef std::map<PointValue, int> PointIndexMap;

        PointDataTypeTuple m_pointData;
        PointValueArray    m_pointValueArray;
        PointIndexMap      m_pointIndexMap;
      };
    }
  }
}

#endif