Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SMF_Reader.h
Go to the documentation of this file.
1 /* *******************************************************************
2  * Rocstar Simulation Suite *
3  * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4  * *
5  * Illinois Rocstar LLC *
6  * Champaign, IL *
7  * www.illinoisrocstar.com *
8  * sales@illinoisrocstar.com *
9  * *
10  * License: See LICENSE file in top level of distribution package or *
11  * http://opensource.org/licenses/NCSA *
12  *********************************************************************/
13 /* *******************************************************************
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21  * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22  *********************************************************************/
23 // $Id: SMF_Reader.h,v 1.5 2008/12/06 08:43:24 mtcampbe Exp $
24 
25 #ifndef SMF_READER_H
26 #define SMF_READER_H
27 
28 #include "../Rocsurf/include/surfbasic.h"
29 #include <vector>
30 #include <string>
31 #include <fstream>
32 #include <cstdlib>
33 #include <cstdio>
34 
36 
37 // This class provides an interface for reading in a surface mesh
38 // from the ".smf" or ".obj" file.
39 class SMF_Reader {
40 public:
41  // Constructor from an MPI communicator and a scale factor.
43 
44  // Assuming the window has been created, read in the local panes from
45  // given file and return the number of local panes.
46  int read_mesh( const char *fname, const std::string &wname) {
47  std::ifstream is( fname);
48  if ( is == NULL) {
49  std::cerr << "Error: Could not open file " << fname << std::endl;
50  exit(-1);
51  }
52 
53  // Create the window if not yet exist
54  int h=COM_get_window_handle(wname.c_str());
55  if ( h<=0) COM_new_window( wname.c_str());
56 
57  std::cout << "Reading file " << fname << std::endl;
58 
59  read_pane_coors( is, wname);
60  read_pane_elems( is, wname);
61 
62  return 1;
63  }
64 
65 private:
66  void get_nextline( std::istream &is, char *str) {
67  char accpet[]={'0','1','2','3','4','5','6','7','8','9',
68  '.','+','-','e','E'};
69 
70  do {
71  if ( is.eof()) { str[0] = '\0'; return; }
72  str[0] = '\1'; str[1] = '\0';
73  is.getline( str, MAXLEN);
74  if ( str[0] == '\1') return;
75  } while ( (str[0]!='v' && str[0]!='f') || strpbrk( str,accpet)==NULL);
76  }
77 
78  // Read in coordinates of a pane into a window if local
79  void read_pane_coors( std::istream &is, const std::string &wname) {
80  std::vector<SURF::Point_3<double> > coors;
81 
82  int n=0;
83  for (;;) {
84  get_nextline( is, buf);
85 
86  if ( buf[0] == 'v') {
87  if ( buf[1] == 't' || buf[1] == 'n') continue;
88  SURF::Point_3<double> p;
89 
90  std::sscanf( &buf[2], "%lf %lf %lf", &p[0], &p[1], &p[2]);
91  coors.push_back( p);
92 
93  ++n;
94  }
95  else
96  break;
97  }
98  COM_assertion_msg( n>0, "Did not find any nodes");
99  std::cout << "Read in " << n << " nodes" << std::endl;
100 
101  COM_set_size( (wname+".nc").c_str(), 1, n);
102  SURF::Point_3<double> *p;
103  COM_allocate_array( (wname+".nc").c_str(), 1, &(void*&)p);
104 
105  std::copy( coors.begin(), coors.end(), p);
106  }
107 
108  // Read in element connectivity of a pane into a window if local
109  void read_pane_elems( std::istream &is, const std::string &wname){
110  std::vector<SURF::Vector_3<int> > elems;
111 
112  // When entering this routine, buf[0] should start with 'f'
113  int n=0;
114  for (;;) {
115  if ( buf[0] == 'f') {
116  if ( buf[1] != 't' && buf[1] != 'n') {
117  SURF::Vector_3<int> p;
118 
119  std::sscanf( &buf[2], "%d %d %d", &p[0], &p[1], &p[2]);
120  elems.push_back( p);
121 
122  ++n;
123  }
124  get_nextline( is, buf);
125  }
126  else break;
127  }
128  COM_assertion_msg( n>0, "Did not find any faces");
129  std::cout << "Read in " << n << " faces" << std::endl;
130 
131  COM_set_size( (wname+".:t3:").c_str(), 1, n);
132  SURF::Vector_3<int> *p;
133  COM_allocate_array( (wname+".:t3:").c_str(), 1, &(void*&)p);
134 
135  std::copy( elems.begin(), elems.end(), p);
136  }
137 
138 private:
139  enum {MAXLEN=255};
140  char buf[MAXLEN+1];
141 };
142 
143 #endif
144 
145 
146 
147 
148 
149 
#define COM_assertion_msg(EX, msg)
void COM_set_size(const char *wa_str, int pane_id, int size, int ng=0)
Set sizes of for a specific attribute.
Definition: roccom_c++.h:136
int read_mesh(const char *fname, const std::string &wname)
Definition: SMF_Reader.h:46
void get_nextline(std::istream &is, char *str)
Definition: SMF_Reader.h:66
*********************************************************************Illinois Open Source License ****University of Illinois NCSA **Open Source License University of Illinois All rights reserved ****Developed free of to any person **obtaining a copy of this software and associated documentation to deal with the Software without including without limitation the rights to ** copy
Definition: roccomf90.h:20
void read_pane_elems(std::istream &is, const std::string &wname)
Definition: SMF_Reader.h:109
Definition: Rocin.h:64
const NT & n
void COM_new_window(const char *wname, MPI_Comm c=MPI_COMM_NULL)
Definition: roccom_c++.h:86
void COM_allocate_array(const char *wa_str, int pane_id=0, void **addr=NULL, int strd=0, int cap=0)
Allocate space for an attribute on a specific pane and return the address by setting addr...
Definition: roccom_c++.h:196
int COM_get_window_handle(const char *wname)
Definition: roccom_c++.h:404
char buf[MAXLEN+1]
Definition: SMF_Reader.h:140
void read_pane_coors(std::istream &is, const std::string &wname)
Definition: SMF_Reader.h:79
#define COM_EXTERN_MODULE(moduleName)
Definition: roccom_basic.h:116