Loading...
Searching...
No Matches
DGF.tpp
1/*---------------------------------------------------------------------------*\
2 *
3 * bitpit
4 *
5 * Copyright (C) 2015-2021 OPTIMAD engineering Srl
6 *
7 * -------------------------------------------------------------------------
8 * License
9 * This file is part of bitpit.
10 *
11 * bitpit is free software: you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License v3 (LGPL)
13 * as published by the Free Software Foundation.
14 *
15 * bitpit is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with bitpit. If not, see <http://www.gnu.org/licenses/>.
22 *
23\*---------------------------------------------------------------------------*/
24
25// ========================================================================== //
26// DGF IO FUNCTIONS //
27// //
28// I/O functions for .dgf file formats //
29// ========================================================================== //
30// INTFO //
31// ========================================================================== //
32// Author : Alessandro Alaia //
33// Version : v3.0 //
34// //
35// All rights reserved. //
36// ========================================================================== //
37
38// ========================================================================== //
39// TEMPLATE IMPLEMENTATIONS //
40// ========================================================================== //
41
42// class DGFObj templated methods ========================================== //
43
44
45// -------------------------------------------------------------------------- //
57template< typename T, typename ... T2 >
58void DGFObj::loadVData(
59 const std::string &data_name,
60 int &n,
61 std::vector< T > &data,
62 T2 &... others
63) {
64
65// ========================================================================== //
66// VARIABLES DECLARATION //
67// ========================================================================== //
68
69// Local variables
70// none
71
72// Counters
73// none
74
75// ========================================================================== //
76// OPEN INPUT STREAM //
77// ========================================================================== //
78open("in");
79
80// ========================================================================== //
81// READ DATA SET //
82// ========================================================================== //
83err = dgf::readVertexData(ifile_handle, n, data, data_name);
84
85// ========================================================================== //
86// ITERATIVELY READ OTHER DATASET //
87// ========================================================================== //
88loadVData(others ...);
89
90return; };
91
92// -------------------------------------------------------------------------- //
104template< typename T, typename ... T2 >
105void DGFObj::loadSData(
106 const std::string &data_name,
107 int &n,
108 std::vector< T > &data,
109 T2 &... others
110) {
111
112// ========================================================================== //
113// VARIABLES DECLARATION //
114// ========================================================================== //
115
116// Local variables
117// none
118
119// Counters
120// none
121
122// ========================================================================== //
123// OPEN INPUT STREAM //
124// ========================================================================== //
125open("in");
126
127// ========================================================================== //
128// READ DATA SET //
129// ========================================================================== //
130err = dgf::readSimplexData(ifile_handle, n, data, data_name);
131
132// ========================================================================== //
133// ITERATIVELY READ OTHER DATASET //
134// ========================================================================== //
135loadSData(others ...);
136
137return; };
138
139// -------------------------------------------------------------------------- //
148template< typename T, typename ... T2 >
149void DGFObj::appendVData(
150 const std::string &data_name,
151 int &n,
152 std::vector< T > &data,
153 T2 &... others
154) {
155
156// ========================================================================== //
157// VARIABLES DECLARATION //
158// ========================================================================== //
159
160// Local variables
161// none
162
163// Counters
164// none
165
166// ========================================================================== //
167// OPEN OUTPUT STREAM //
168// ========================================================================== //
169open("app");
170
171// ========================================================================== //
172// SAVE DATA SET //
173// ========================================================================== //
174err = dgf::writeVertexData(ofile_handle, n, data, data_name);
175
176// ========================================================================== //
177// RECURSIVELY SAVE OTHERS DATASETS //
178// ========================================================================== //
179appendVData(others ...);
180
181return; }
182
183// -------------------------------------------------------------------------- //
192template< typename T, typename ... T2 >
193void DGFObj::appendSData(
194 const std::string &data_name,
195 int &n,
196 std::vector< T > &data,
197 T2 &... others
198) {
199
200// ========================================================================== //
201// VARIABLES DECLARATION //
202// ========================================================================== //
203
204// Local variables
205// none
206
207// Counters
208// none
209
210// ========================================================================== //
211// OPEN OUTPUT STREAM //
212// ========================================================================== //
213open("app");
214
215// ========================================================================== //
216// SAVE DATA SET //
217// ========================================================================== //
218err = dgf::writeSimplexData(ofile_handle, n, data, data_name);
219
220// ========================================================================== //
221// RECURSIVELY SAVE OTHERS DATASETS //
222// ========================================================================== //
223appendSData(others ...);
224
225return; }
226
231// Input routines =========================================================== //
232
233namespace dgf {
234
235// -------------------------------------------------------------------------- //
247template< typename T >
248unsigned int readData(
249 std::ifstream &file_handle,
250 int &N,
251 std::vector< T > &Data
252) {
253
254// ========================================================================== //
255// VARIABLES DECLARATION //
256// ========================================================================== //
257
258// Local variables
259bool check;
260std::streamoff start_pos;
261std::string word, line;
262std::stringstream sline;
263
264// Counters
265int n = 0;
266
267// ========================================================================== //
268// CHECK INPUT STREAM //
269// ========================================================================== //
270if (!file_handle.good()) { return(1); }
271
272// ========================================================================== //
273// SCAN DATA BLOCK //
274// ========================================================================== //
275file_handle.clear();
276start_pos = file_handle.tellg();
277dgf::scanData(file_handle, n);
278file_handle.clear();
279file_handle.seekg(start_pos);
280
281// ========================================================================== //
282// RESIZE INPUT DATA //
283// ========================================================================== //
284Data.resize(n+N);
285
286// ========================================================================== //
287// READ DATA //
288// ========================================================================== //
289n = 0;
290check = true;
291while (!file_handle.eof() && check) {
292
293 // Get current line
294 start_pos = file_handle.tellg();
295 std::getline(file_handle, line);
296 line = utils::string::trim(line);
297 sline.clear();
298 sline.str(line);
299
300 // Read data
301 if (sline >> word) {
302 check = ((word.compare("#") != 0)
303 && (word.compare("VERTEX") != 0)
304 && (word.compare("SIMPLEX") != 0)
305 && (word.compare("VERTEXDATA") != 0)
306 && (word.compare("SIMPLEXDATA") != 0));
307 if (check) {
308 sline.seekg(0);
309 sline >> Data[N+n];
310 n++;
311 }
312 }
313} //next line
314if (word.compare("#") != 0) {
315 file_handle.clear();
316 file_handle.seekg(start_pos);
317}
318
319// Update counters
320N+=n;
321
322return(0); }
323
324// -------------------------------------------------------------------------- //
340template <typename T>
341unsigned int readVertexData(
342 std::ifstream &file_handle,
343 int &n,
344 std::vector< T > &data,
345 const std::string &data_name
346) {
347
348// ========================================================================== //
349// VARIABLES DECLARATION //
350// ========================================================================== //
351
352// Local variables
353bool check = false;
354long int current_pos, start_pos;
355std::string header, line, word;
356std::stringstream sline;
357
358// Counters
359
360// ========================================================================== //
361// CHECK STREAM STATUS //
362// ========================================================================== //
363if (!file_handle.good()) { return(1); }
364
365// ========================================================================== //
366// PARAMETERS //
367// ========================================================================== //
368sline << "VERTEXDATA " << data_name << std::endl;
369header = sline.str();
370header = utils::string::trim(header);
371
372// ========================================================================== //
373// SCAN DGF FILE LOOKING FOR DATASET WITH SPECIFIED NAME //
374// ========================================================================== //
375file_handle.clear();
376start_pos = file_handle.tellg();
377current_pos = -1;
378while (start_pos != current_pos) {
379
380 // Get current line
381 std::getline(file_handle, line);
382 line = utils::string::trim(line);
383 sline.clear();
384 sline.str(line);
385
386 // Check eof
387 if (file_handle.eof()) {
388 file_handle.clear();
389 file_handle.seekg(0);
390 }
391 current_pos = file_handle.tellg();
392
393 // Look for keyword
394 if ((sline >> word) && (word.compare("VERTEXDATA") == 0)) {
395 if (data_name.compare("") == 0) {
396 start_pos = current_pos;
397 check = true;
398 }
399 else {
400 if (line.compare(header) == 0) {
401 start_pos = current_pos;
402 check = true;
403 }
404 }
405 }
406
407
408} //next line
409
410// ========================================================================== //
411// LOAD DATA //
412// ========================================================================== //
413if (check) {
414 dgf::readData(file_handle, n, data);
415}
416
417return(0); }
418
419// -------------------------------------------------------------------------- //
435template <typename T>
436unsigned int readSimplexData(
437 std::ifstream &file_handle,
438 int &n,
439 std::vector< T > &data,
440 const std::string &data_name
441) {
442
443// ========================================================================== //
444// VARIABLES DECLARATION //
445// ========================================================================== //
446
447// Local variables
448bool check = false;
449std::streamoff current_pos, start_pos;
450std::string header, line, word;
451std::stringstream sline;
452
453// Counters
454
455// ========================================================================== //
456// CHECK STREAM STATUS //
457// ========================================================================== //
458if (!file_handle.good()) { return(1); }
459
460// ========================================================================== //
461// PARAMETERS //
462// ========================================================================== //
463sline << "SIMPLEXDATA " << data_name << std::endl;
464header = sline.str();
465header = utils::string::trim(header);
466
467// ========================================================================== //
468// SCAN DGF FILE LOOKING FOR DATASET WITH SPECIFIED NAME //
469// ========================================================================== //
470file_handle.clear();
471start_pos = file_handle.tellg();
472current_pos = -1;
473while (start_pos != current_pos) {
474
475 // Get current line
476 std::getline(file_handle, line);
477 line = utils::string::trim(line);
478 sline.clear();
479 sline.str(line);
480
481 // Check eof
482 if (file_handle.eof()) {
483 file_handle.clear();
484 file_handle.seekg(0);
485 }
486 current_pos = file_handle.tellg();
487
488 // Look for keyword
489 if ((sline >> word) && (word.compare("SIMPLEXDATA") == 0)) {
490 if (data_name.compare("") == 0) {
491 start_pos = current_pos;
492 check = true;
493 }
494 else {
495 if (line.compare(header) == 0) {
496 start_pos = current_pos;
497 check = true;
498 }
499 }
500 }
501
502
503} //next line
504
505// ========================================================================== //
506// LOAD DATA //
507// ========================================================================== //
508if (check) {
509 dgf::readData(file_handle, n, data);
510}
511
512return(0); }
513
514// Output routines ========================================================== //
515
516// -------------------------------------------------------------------------- //
528template < typename T >
529unsigned int writeData(
530 std::ofstream &file_handle,
531 int &N,
532 std::vector< T > &Data
533) {
534
535// ========================================================================== //
536// VARIABLES DECLARATION //
537// ========================================================================== //
538
539// Local variables
540// none
541
542// Counters
543int i;
544
545// ========================================================================== //
546// CHECK STREAM STATUS //
547// ========================================================================== //
548if (!file_handle.good()) { return(1); }
549
550// ========================================================================== //
551// EXPORT DATA //
552// ========================================================================== //
553for (i = 0; i < N; i++) {
554 file_handle << Data[i] << std::endl;
555} //next i
556file_handle << "#" << std::endl << std::endl;
557
558return(0); }
559
560// -------------------------------------------------------------------------- //
573template < typename T >
574unsigned int writeVertexData(
575 std::ofstream &file_handle,
576 int &N,
577 std::vector< T > &Data,
578 const std::string &Data_name
579) {
580
581// ========================================================================== //
582// VARIABLES DECLARATION //
583// ========================================================================== //
584
585// Local variables
586unsigned int err = 0;
587std::stringstream sheader;
588std::string dataset;
589std::string header;
590
591// Counters
592// None
593
594// ========================================================================== //
595// CHECK STREAM STATUS //
596// ========================================================================== //
597if (!file_handle.good()) { return(1); }
598
599// ========================================================================== //
600// EXPORT DATA //
601// ========================================================================== //
602
603// Data header -------------------------------------------------------------- //
604dataset = Data_name;
605dataset = utils::string::trim(dataset);
606sheader << "VERTEXDATA " << dataset << std::endl;
607header = sheader.str();
608header = utils::string::trim(header);
609file_handle << header << std::endl;
610
611// Export data -------------------------------------------------------------- //
612err = dgf::writeData(file_handle, N, Data);
613
614return(err); };
615
616// -------------------------------------------------------------------------- //
629template < typename T >
630unsigned int writeSimplexData(
631 std::ofstream &file_handle,
632 int &N,
633 std::vector< T > &Data,
634 const std::string &Data_name
635) {
636
637// ========================================================================== //
638// VARIABLES DECLARATION //
639// ========================================================================== //
640
641// Local variables
642unsigned int err = 0;
643std::stringstream sheader;
644std::string dataset;
645std::string header;
646
647// Counters
648// None
649
650// ========================================================================== //
651// CHECK STREAM STATUS //
652// ========================================================================== //
653if (!file_handle.good()) { return(1); }
654
655// ========================================================================== //
656// EXPORT DATA //
657// ========================================================================== //
658
659// Data header -------------------------------------------------------------- //
660dataset = Data_name;
661dataset = utils::string::trim(dataset);
662sheader << "SIMPLEXDATA " << dataset << std::endl;
663header = sheader.str();
664header = utils::string::trim(header);
665file_handle << header << std::endl;
666
667// Export data -------------------------------------------------------------- //
668err = dgf::writeData(file_handle, N, Data);
669
670return(err); };
671
672}
Definition DGF.tpp:233
unsigned int writeSimplexData(std::ofstream &file_handle, int &N, std::vector< T > &Data, const std::string &Data_name)
Definition DGF.tpp:630
unsigned int readData(std::ifstream &file_handle, int &N, std::vector< T > &Data)
Definition DGF.tpp:248
unsigned int readVertexData(std::ifstream &file_handle, int &n, std::vector< T > &data, const std::string &data_name)
Definition DGF.tpp:341
unsigned int writeVertexData(std::ofstream &file_handle, int &N, std::vector< T > &Data, const std::string &Data_name)
Definition DGF.tpp:574
unsigned int writeData(std::ofstream &file_handle, int &N, std::vector< T > &Data)
Definition DGF.tpp:529
unsigned int readSimplexData(std::ifstream &file_handle, int &n, std::vector< T > &data, const std::string &data_name)
Definition DGF.tpp:436
--- layout: doxygen_footer ---