1
8
9 #ifndef NCWRITEHELPER_HPP_
10 #define NCWRITEHELPER_HPP_
11 #include "WriteNC.hpp"
12
13 #ifdef WIN32
14 #ifdef size_t
15 #undef size_t
16 #endif
17 #endif
18
19 namespace moab
20 {
21
22 class NCWriteHelper
23 {
24 public:
25 NCWriteHelper( WriteNC* writeNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
26 : _writeNC( writeNC ), _fileId( fileId ), _opts( opts ), _fileSet( fileSet ), nTimeSteps( 0 ), nLevels( 1 ),
27 tDim( -1 ), levDim( -1 )
28 {
29 }
30 virtual ~NCWriteHelper(){};
31
32
33 static NCWriteHelper* get_nc_helper( WriteNC* writeNC, int fileId, const FileOptions& opts, EntityHandle fileSet );
34
35
36 virtual ErrorCode collect_mesh_info() = 0;
37
38
39 virtual ErrorCode collect_variable_data( std::vector< std::string >& var_names, std::vector< int >& tstep_nums );
40
41
42
43 ErrorCode init_file( std::vector< std::string >& var_names,
44 std::vector< std::string >& desired_names,
45 bool _append );
46
47
48 ErrorCode write_values( std::vector< std::string >& var_names, std::vector< int >& tstep_nums );
49
50 private:
51
52 ErrorCode write_set_variables( std::vector< WriteNC::VarData >& vsetdatas, std::vector< int >& tstep_nums );
53
54 protected:
55
56 virtual ErrorCode write_nonset_variables( std::vector< WriteNC::VarData >& vdatas,
57 std::vector< int >& tstep_nums ) = 0;
58
59
60 WriteNC* _writeNC;
61
62
63 int _fileId;
64 const FileOptions& _opts;
65 EntityHandle _fileSet;
66
67
68 int nTimeSteps, nLevels;
69
70
71 int tDim, levDim;
72
73
74 Range localCellsOwned, localEdgesOwned, localVertsOwned;
75
76
77 std::vector< double > timeStepVals;
78 };
79
80
81 class ScdNCWriteHelper : public NCWriteHelper
82 {
83 public:
84 ScdNCWriteHelper( WriteNC* writeNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
85 : NCWriteHelper( writeNC, fileId, opts, fileSet )
86 {
87 for( unsigned int i = 0; i < 6; i++ )
88 {
89 lDims[i] = -1;
90 lCDims[i] = -1;
91 }
92 }
93 virtual ~ScdNCWriteHelper() {}
94
95 private:
96
97 virtual ErrorCode collect_mesh_info();
98
99
100 virtual ErrorCode collect_variable_data( std::vector< std::string >& var_names, std::vector< int >& tstep_nums );
101
102
103 virtual ErrorCode write_nonset_variables( std::vector< WriteNC::VarData >& vdatas, std::vector< int >& tstep_nums );
104
105 template < typename T >
106 void jik_to_kji( size_t ni, size_t nj, size_t nk, T* dest, T* source )
107 {
108 size_t nik = ni * nk, nij = ni * nj;
109 for( std::size_t k = 0; k != nk; k++ )
110 for( std::size_t j = 0; j != nj; j++ )
111 for( std::size_t i = 0; i != ni; i++ )
112 dest[k * nij + j * ni + i] = source[j * nik + i * nk + k];
113 }
114
115 protected:
116
117 int lDims[6];
118
119
120 int lCDims[6];
121 };
122
123
124 class UcdNCWriteHelper : public NCWriteHelper
125 {
126 public:
127 UcdNCWriteHelper( WriteNC* writeNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
128 : NCWriteHelper( writeNC, fileId, opts, fileSet ), cDim( -1 ), eDim( -1 ), vDim( -1 )
129 {
130 }
131 virtual ~UcdNCWriteHelper() {}
132
133 protected:
134
135
136 template < typename T >
137 void jik_to_kji_stride( size_t, size_t nj, size_t nk, T* dest, T* source, Range& localGid )
138 {
139 std::size_t idxInSource = 0;
140
141
142 for( Range::pair_iterator pair_iter = localGid.pair_begin(); pair_iter != localGid.pair_end(); ++pair_iter )
143 {
144 std::size_t size_range = pair_iter->second - pair_iter->first + 1;
145 std::size_t nik = size_range * nk, nij = size_range * nj;
146 for( std::size_t k = 0; k != nk; k++ )
147 for( std::size_t j = 0; j != nj; j++ )
148 for( std::size_t i = 0; i != size_range; i++ )
149 dest[idxInSource + k * nij + j * size_range + i] = source[idxInSource + j * nik + i * nk + k];
150 idxInSource += ( size_range * nj * nk );
151 }
152 }
153
154
155 int cDim, eDim, vDim;
156
157
158 Range localGidCellsOwned, localGidEdgesOwned, localGidVertsOwned;
159 };
160
161 }
162
163 #endif