@@ -52,34 +52,38 @@ void MDAL::LoaderAsciiDat::load( MDAL::Mesh *mesh, MDAL_Status *status )
52
52
return ;
53
53
}
54
54
line = trim ( line );
55
- std::string basename = baseName ( mDatFile );
56
55
57
56
// http://www.xmswiki.com/xms/SMS:ASCII_Dataset_Files_*.dat
58
57
// Apart from the format specified above, there is an older supported format used in BASEMENT (and SMS?)
59
58
// which is simpler (has only one dataset in one file, no status flags etc)
60
59
bool oldFormat;
61
60
bool isVector = false ;
62
- bool readingDataset = false ; // whether we are in process of reading the dataset
63
61
64
- std::string baseDatasetName ( basename );
65
- std::vector<std::shared_ptr<Dataset>> datOutputs; // DAT outputs data
62
+ std::shared_ptr<DatasetGroup> group; // DAT outputs data
63
+ std::string name ( MDAL::baseName ( mDatFile ) );
66
64
67
65
if ( line == " DATASET" )
68
66
oldFormat = false ;
69
67
else if ( line == " SCALAR" || line == " VECTOR" )
70
68
{
71
69
oldFormat = true ;
72
70
isVector = ( line == " VECTOR" );
73
- baseDatasetName = basename;
74
- readingDataset = true ;
71
+
72
+ group.reset ( new DatasetGroup () );
73
+ group->uri = mDatFile ;
74
+ group->setName ( name );
75
+ group->isScalar = !isVector;
75
76
}
76
77
else
77
78
EXIT_WITH_ERROR ( MDAL_Status::Err_UnknownFormat );
78
79
79
- // see if it contains element-centered results - supported by BASEMENT
80
- bool elementCentered = false ;
81
- if ( !oldFormat && contains ( basename, " _els_" ) )
82
- elementCentered = true ;
80
+ // see if it contains face-centered results - supported by BASEMENT
81
+ bool faceCentered = false ;
82
+ if ( !oldFormat && contains ( name, " _els_" ) )
83
+ faceCentered = true ;
84
+
85
+ if ( group )
86
+ group->isOnVertices = !faceCentered;
83
87
84
88
while ( std::getline ( in, line ) )
85
89
{
@@ -107,28 +111,32 @@ void MDAL::LoaderAsciiDat::load( MDAL::Mesh *mesh, MDAL_Status *status )
107
111
}
108
112
else if ( !oldFormat && ( cardType == " BEGSCL" || cardType == " BEGVEC" ) )
109
113
{
110
- if ( readingDataset )
114
+ if ( group )
111
115
{
112
116
debug ( " New dataset while previous one is still active!" );
113
117
EXIT_WITH_ERROR ( MDAL_Status::Err_UnknownFormat );
114
118
}
115
119
isVector = cardType == " BEGVEC" ;
116
- baseDatasetName = basename;
117
- readingDataset = true ;
120
+
121
+ group.reset ( new DatasetGroup () );
122
+ group->uri = mDatFile ;
123
+ group->setName ( name );
124
+ group->isScalar = !isVector;
125
+ group->isOnVertices = !faceCentered;
118
126
}
119
127
else if ( !oldFormat && cardType == " ENDDS" )
120
128
{
121
- if ( !readingDataset )
129
+ if ( !group )
122
130
{
123
131
debug ( " ENDDS card for no active dataset!" );
124
132
EXIT_WITH_ERROR ( MDAL_Status::Err_UnknownFormat );
125
133
}
126
-
127
- addDatasets ( mesh, baseDatasetName, datOutputs );
134
+ mesh-> datasetGroups . push_back ( group );
135
+ group. reset ( );
128
136
}
129
137
else if ( !oldFormat && cardType == " NAME" && items.size () >= 2 )
130
138
{
131
- if ( !readingDataset )
139
+ if ( !group )
132
140
{
133
141
debug ( " NAME card for no active dataset!" );
134
142
EXIT_WITH_ERROR ( MDAL_Status::Err_UnknownFormat );
@@ -137,7 +145,7 @@ void MDAL::LoaderAsciiDat::load( MDAL::Mesh *mesh, MDAL_Status *status )
137
145
size_t quoteIdx1 = line.find ( ' \" ' );
138
146
size_t quoteIdx2 = line.find ( ' \" ' , quoteIdx1 + 1 );
139
147
if ( quoteIdx1 != std::string::npos && quoteIdx2 != std::string::npos )
140
- baseDatasetName = line.substr ( quoteIdx1 + 1 , quoteIdx2 - quoteIdx1 - 1 );
148
+ group-> setName ( line.substr ( quoteIdx1 + 1 , quoteIdx2 - quoteIdx1 - 1 ) );
141
149
}
142
150
else if ( oldFormat && ( cardType == " SCALAR" || cardType == " VECTOR" ) )
143
151
{
@@ -147,14 +155,14 @@ void MDAL::LoaderAsciiDat::load( MDAL::Mesh *mesh, MDAL_Status *status )
147
155
{
148
156
double t = toDouble ( items[oldFormat ? 1 : 2 ] );
149
157
150
- if ( elementCentered )
158
+ if ( faceCentered )
151
159
{
152
- readFaceTimestep ( mesh, datOutputs , t, isVector, in );
160
+ readFaceTimestep ( mesh, group , t, isVector, in );
153
161
}
154
162
else
155
163
{
156
164
bool hasStatus = ( oldFormat ? false : toBool ( items[1 ] ) );
157
- readVertexTimestep ( mesh, datOutputs , t, isVector, hasStatus, in );
165
+ readVertexTimestep ( mesh, group , t, isVector, hasStatus, in );
158
166
}
159
167
160
168
}
@@ -168,45 +176,32 @@ void MDAL::LoaderAsciiDat::load( MDAL::Mesh *mesh, MDAL_Status *status )
168
176
169
177
if ( oldFormat )
170
178
{
171
- if ( datOutputs .size () == 0 )
179
+ if ( !group || group-> datasets .size () == 0 )
172
180
EXIT_WITH_ERROR ( MDAL_Status::Err_UnknownFormat );
173
181
174
- addDatasets ( mesh, baseDatasetName, datOutputs );
182
+ mesh->datasetGroups .push_back ( group );
183
+ group.reset ();
175
184
}
176
185
}
177
186
178
- void MDAL::LoaderAsciiDat::addDatasets ( MDAL::Mesh *mesh,
179
- const std::string &name,
180
- const Datasets &datOutputs ) const
187
+ void MDAL::LoaderAsciiDat::readVertexTimestep (
188
+ const MDAL::Mesh *mesh,
189
+ std::shared_ptr<DatasetGroup> group,
190
+ double t,
191
+ bool isVector,
192
+ bool hasStatus,
193
+ std::ifstream &stream )
181
194
{
182
- for ( const std::shared_ptr<Dataset> &ds : datOutputs )
183
- {
184
- ds->uri = mDatFile ;
185
- ds->setName ( name );
186
- ds->isValid = true ;
187
- }
188
-
189
- // https://stackoverflow.com/a/2551785/2838364
190
- mesh->datasets .insert (
191
- mesh->datasets .end (),
192
- datOutputs.begin (),
193
- datOutputs.end ()
194
- );
195
- }
195
+ assert ( group );
196
196
197
- void MDAL::LoaderAsciiDat::readVertexTimestep ( const MDAL::Mesh *mesh, Datasets &datOutputs,
198
- double t, bool isVector,
199
- bool hasStatus, std::ifstream &stream )
200
- {
201
197
size_t vertexCount = mesh->vertices .size ();
202
198
size_t faceCount = mesh->faces .size ();
203
199
204
200
std::shared_ptr<MDAL::Dataset> dataset ( new MDAL::Dataset );
205
- dataset->isScalar = !isVector; // everything else to be set in addDatasets
206
- dataset->setMetadata ( " time" , std::to_string ( t / 3600 . ) );
201
+ dataset->time = t / 3600 .; // TODO read TIMEUNITS
207
202
dataset->values .resize ( vertexCount );
208
203
dataset->active .resize ( faceCount );
209
- dataset->isOnVertices = true ;
204
+ dataset->parent = group. get () ;
210
205
211
206
// only for new format
212
207
for ( size_t i = 0 ; i < faceCount; ++i )
@@ -258,18 +253,24 @@ void MDAL::LoaderAsciiDat::readVertexTimestep( const MDAL::Mesh *mesh, Datasets
258
253
}
259
254
}
260
255
261
- datOutputs .push_back ( std::move ( dataset ) );
256
+ group-> datasets .push_back ( dataset );
262
257
}
263
258
264
- void MDAL::LoaderAsciiDat::readFaceTimestep ( const MDAL::Mesh *mesh, Datasets &datOutputs, double t, bool isVector, std::ifstream &stream )
259
+ void MDAL::LoaderAsciiDat::readFaceTimestep (
260
+ const MDAL::Mesh *mesh,
261
+ std::shared_ptr<DatasetGroup> group,
262
+ double t,
263
+ bool isVector,
264
+ std::ifstream &stream )
265
265
{
266
+ assert ( group );
267
+
266
268
size_t faceCount = mesh->faces .size ();
267
269
268
270
std::shared_ptr<MDAL::Dataset> dataset ( new MDAL::Dataset );
269
- dataset->isScalar = !isVector; // everything else to be set in addDatasets
270
- dataset->setMetadata ( " time" , std::to_string ( t / 3600 . ) );
271
+ dataset->time = t / 3600 .;
271
272
dataset->values .resize ( faceCount );
272
- dataset->isOnVertices = false ;
273
+ dataset->parent = group. get () ;
273
274
274
275
// TODO: hasStatus
275
276
for ( size_t index = 0 ; index < faceCount; ++index )
@@ -303,5 +304,5 @@ void MDAL::LoaderAsciiDat::readFaceTimestep( const MDAL::Mesh *mesh, Datasets &d
303
304
}
304
305
}
305
306
306
- datOutputs .push_back ( std::move ( dataset ) );
307
+ group-> datasets .push_back ( dataset );
307
308
}
0 commit comments