33 const std::string prefix =
"tree";
34 const std::string separator =
"-";
35 std::size_t start = _file.find(
"tree" + separator );
36 if (start != std::string::npos) {
37 start += std::string(
"tree" + separator).length();
38 std::size_t end = _file.find( separator, start );
39 std::string identifier = _file.substr( start, end-start );
40 result = std::atoi( identifier.c_str() );
47 logInfo(
"parse()",
"reading file " << _file );
49 bool isFirstDataSet =
true;
51 std::vector< PeanoTextPatchFileReader > subReaders;
56 std::ifstream ifs(_file);
57 std::vector<std::string> lines;
58 for (std::string line; std::getline(ifs, line); ) {
59 lines.push_back(line);
64 logError(
"parse()",
"file " << _file <<
" is empty (or does not exist)" );
67 int treeNumber = extractTreeNumberFromFileName();
68 logDebug(
"parse()",
"file " << _file <<
" will yield data with tree number " << treeNumber );
71 for(uint i = 0; i < lines.size(); i++) {
72 std::string line = lines[i];
78 else if ( tokens[0]==
"begin" and tokens[1]==
"dataset" ) {
79 if (_data.size()==1 and isFirstDataSet) {
80 logInfo(
"parse()",
"data file is meta file including multiple data sets");
81 isFirstDataSet =
false;
87 else if ( tokens[0]==
"end" and tokens[1]==
"dataset" ) {
88 const int NumberOfSubreaders = subReaders.size();
89 #pragma omp parallel for
90 for (
int i=0; i<NumberOfSubreaders; i++) {
91 subReaders[i].parse();
92 std::vector< convert::data::DataSet > subData = subReaders[i].getData();
94 if ( subData.size()>1 ) {
95 logError(
"parse()",
"included dataset seems to hold more than one dataset, i.e. seems to be series of datasets again. This is not supported" );
98 if ( not subData.empty() ) {
101 _data.back().merge( subData[0] );
109 else if ( tokens[0]==
"include") {
111 if ( directory.empty() ) directory =
".";
114 logInfo (
"parse()",
"create a new reader (with new task) for file " << filename <<
" resulting from token " << tokens[1] );
118 else if ( tokens[0]==
"begin" and tokens[1]==
"cell-metadata" ) {
120 std::vector<std::string> variableDeclarationLines;
121 while ( i<lines.size() and lines[i].find(
"end cell-metadata" )==std::string::npos ) {
122 variableDeclarationLines.push_back( lines[i] );
125 if (i==lines.size()) {
126 logError(
"parse()",
"file " << _file <<
" is corrupt as cell-metadata for " << variableName <<
" is not terminated properly. Quit parsing" );
133 else if ( tokens[0]==
"begin" and tokens[1]==
"vertex-metadata" ) {
135 std::vector<std::string> variableDeclarationLines;
136 while ( i<lines.size() and lines[i].find(
"end vertex-metadata" )==std::string::npos ) {
137 variableDeclarationLines.push_back( lines[i] );
140 if (i==lines.size()) {
141 logError(
"parse()",
"file " << _file <<
" is corrupt as vertex-metadata for " << variableName <<
" is not terminated properly. Quit parsing" );
148 else if ( tokens[0]==
"dimensions" ) {
150 _dimensions = std::stoi(tokens[1]);
152 catch (std::out_of_range& e) {
153 logError(
"parse()",
"error reading data for data set for _dimensions" );
154 logError(
"parse()",
"invalid token: " << tokens[1] );
155 logError(
"parse()",
"have to quit" );
158 logDebug(
"parse()",
"dimensions=" << _dimensions );
160 else if( tokens[0]==
"begin" and tokens[1]==
"patch" ) {
161 logDebug(
"parse()",
"start to parse patch" );
162 std::vector<std::string> patchLines;
163 while ( i<lines.size() and lines[i].find(
"end patch" )==std::string::npos ) {
164 patchLines.push_back( lines[i] );
167 if (i==lines.size()) {
168 logError(
"parse()",
"file " << _file <<
" is corrupt as begin patch is not terminated properly. Quit parsing" );
171 parsePatch( _data.size()-1, treeNumber, patchLines );
175 logDebug(
"parse()",
"ignore line " << line );
179 if (_data.size()>1) {
180 logDebug(
"parse()",
"file " << _file <<
" hosts " << _data.size() <<
" data sets (time steps or iterations, e.g.)");
183 logDebug(
"parse()",
"file " << _file <<
" hosts " << _data[0].data.size() <<
" variable(s)");
184 for (
auto p: _data[0].data) {
185 logDebug(
"parse()",
"variable " << p.first.name <<
" is held by " << p.second.size() <<
" patch(es)");
193 int numberOfUnknowns = -1;
194 int numberOfDofs = -1;
195 for (
auto p: description) {
197 if (tokens[0]==
"number-of-unknowns") {
199 numberOfUnknowns = std::stoi(tokens[1]);
201 catch (std::out_of_range& e) {
202 logError(
"parse()",
"error reading data for data set for number-of-unknowns" );
203 logError(
"parse()",
"invalid token: " << tokens[1] );
204 logError(
"parse()",
"have to quit" );
208 if (tokens[0]==
"number-of-dofs-per-axis") {
210 numberOfDofs = std::stoi(tokens[1]);
212 catch (std::out_of_range& e) {
213 logError(
"parse()",
"error reading data for data set for number-of-dofs-per-axis" );
214 logError(
"parse()",
"invalid token: " << tokens[1] );
215 logError(
"parse()",
"have to quit" );
254 logDebug(
"parse()",
"added new variables " << variableName <<
" with " << numberOfDofs <<
" dof per axis (Cartesian layout) and " << numberOfUnknowns <<
" unknowns per dof" );
256 if (numberOfUnknowns<=0) {
257 logError(
"parseVariablesDeclaration(int,...)",
"corrupted data file " << _file <<
" as number-of-unknowns for " << variableName <<
" is smaller or equal to 0. Terminate parsing" );
259 else if (numberOfDofs<=0) {
260 logError(
"parseVariablesDeclaration(int,...)",
"corrupted data file " << _file <<
" as number-of-dofs-per-axis for " << variableName <<
" is smaller or equal to 0. Terminate parsing" );
264 _data[dataSetCounter].data.insert(
267 std::vector<convert::data::PatchData>()
293 assertion( _dimensions==2 or _dimensions==3 );
295 logDebug(
"parsePatch(...)",
"create patch described by " << text.size() <<
" lines" );
297 std::vector<double> offset;
298 std::vector<double> size;
300 for (
int i=0; i<text.size(); i++) {
303 if( tokens[0]==
"offset" ) {
304 logDebug(
"parsePatch(...)",
"set offset to " << text[i] );
305 for(
int j = 0; j < _dimensions; j++) {
307 offset.push_back( std::stod(tokens[j+1]) );
309 catch (std::out_of_range& e) {
310 logError(
"parsePatch(...)",
"error reading data for data set " << dataSetCounter );
311 logError(
"parsePatch(...)",
"invalid token: " << tokens[j+1] );
312 logError(
"parsePatch(...)",
"have to quit" );
317 else if ( tokens[0]==
"size" ) {
318 logDebug(
"parsePatch(...)",
"set sizes to " << text[i] );
319 for(
int j = 0; j < _dimensions; j++) {
321 size.push_back( std::stod(tokens[j+1]) );
323 catch (std::out_of_range& e) {
324 logError(
"parsePatch(...)",
"error reading data for data set " << dataSetCounter );
325 logError(
"parsePatch(...)",
"invalid token: " << tokens[j+1] );
326 logError(
"parsePatch(...)",
"have to quit" );
331 else if ( tokens[0]==
"begin" and tokens[1]==
"cell-values") {
335 std::vector<std::string> data;
336 while ( i<text.size() and text[i].find(
"end cell-values" )==std::string::npos ) {
338 data.insert( data.end(), tokens.begin(), tokens.end() );
342 if (i==text.size()) {
343 logError(
"parsePatch()",
"file " << _file <<
" is corrupt as begin cell-values is not terminated properly. Quit parsing" );
346 logDebug(
"parsePatch(...)",
"found " << data.size() <<
" entries for " << variableName );
347 addDataToPatch(dataSetCounter,variableName,offset.data(),size.data(),treeNumber,data);
350 else if ( tokens[0]==
"begin" and tokens[1]==
"vertex-values" ) {
354 std::vector<std::string> data;
355 while ( i<text.size() and text[i].find(
"end vertex-values" )==std::string::npos ) {
357 data.insert( data.end(), tokens.begin(), tokens.end() );
360 if (i==text.size()) {
361 logError(
"parsePatch()",
"file " << _file <<
" is corrupt as begin vertex-values is not terminated properly. Quit parsing" );
364 addDataToPatch(dataSetCounter,variableName,offset.data(),size.data(),treeNumber,data);
372 logDebug(
"parsePatch(...)",
"set data of variable " << variableName <<
" (parse " << textData.size() <<
" entries)");
374 if (!_data[dataSetCounter].hasVariable(variableName)) {
375 logError(
"parsePatch(...)",
"no variables for " << variableName <<
" have been declared. Ignore data set");
382 if ( textData.size()!=expectedDataEntries ) {
383 logError(
"parsePatch(...)",
"expected " << expectedDataEntries <<
" data entries for variable " << variableName <<
" but got " << textData.size() <<
". Ignore data set. Key=" << key.
toString() );
388 for (
int i=0; i<expectedDataEntries; i++) {
390 newEntry.
data[i] = std::stod(textData[i]);
392 catch (std::out_of_range& e) {
393 logError(
"parsePatch(...)",
"error reading data for " << variableName );
394 logError(
"parsePatch(...)",
"invalid value: " << textData[i] );
395 logError(
"parsePatch(...)",
"have to quit" );
400 _data[dataSetCounter].data[key].push_back( newEntry );