AcouSTO  version 2.0

◆ read_arrays()

read_arrays ( )

Actual file reading. Reads arrays from different files of file_info struct

72  {
73  FILE* fchief = NULL;
74  FILE* fmics;
75  float ver;
76  long double x,y,z;
77  int i,j, imic, ivbase, icount;
78  int ntmp,netmp;
79  char line[100];
80  int i1,i2,i3;
81  long double d1,d2,d3;
82  int j1,j2,j3,j4,ftype,datasize,eltype;
83  int ielg,ntag,nphy,ngeo,npart;
84 
85  // CHIEF points
86  if( 0 < modgeominfo->nchief){
87  logger(LOG_DEBUG,"reading file %s\n",fileinfo->chief_file);
88  fchief = fopen(fileinfo->chief_file,"r");
89  if(NULL == fchief){
92  }
93  }
94 
95  // Microphones
96  logger(LOG_DEBUG,"reading file %s\n",fileinfo->mics_file);
97  fmics = fopen(fileinfo->mics_file,"r");
98  if(NULL == fmics){
100  return ACOUSTO_ERROR_GEOMETRY;
101  }
102 
103 
104  /* Reading chief */
105  if(0 < modgeominfo->nchief){
106  for(i=0;i<modgeominfo->nchief;i++){
107  fgets(line,100,fchief);
108  sscanf(line,VECTOR_SCANF,&x,&y,&z);
109 
110  geometry->chief[i].x = x;
111  geometry->chief[i].y = y;
112  geometry->chief[i].z = z;
113 
114  /* Adding CHIEF points into geometry */
115  vec_copy(&geometry->cntrc[modgeominfo->ncntr+i], geometry->chief[i]);
116 
117  _DEBUG_IDX_AND_VECTOR("CHIEF",i,geometry->chief[i]);
118  }
119  }
120  /* Reading mics */
121  fgets(line,100,fmics);
122  if(0 == strcmp("$MeshFormat\n", line)){
123  /* Reading header */
124  fgets(line,100,fmics);
125  sscanf(line,GMSH_VER_SCANF,&ver,&ftype,&datasize);
126  if(ver < 2.2){
127  logger(LOG_ERROR,"Gmsh file version %f not supported\n",ver);
128  return ACOUSTO_ERROR_GEOMETRY;
129  }
130  if(0 != ftype){
131  logger(LOG_ERROR,"Gmsh file type %d not supported\n",ftype);
132  return ACOUSTO_ERROR_GEOMETRY;
133  }
134 
135  icount=0;
136  while (fgets(line,100,fmics)!=NULL){
137  if(0 == strcmp("$Nodes\n",line)){
138  fgets(line,100,fmics);
139  sscanf(line,"%d",&ntmp);
140  for(imic=0;imic<ntmp;imic++){
141  fgets(line,100,fmics);
142  sscanf(line,GMSH_NOD_SCANF,&i,&x,&y,&z);
143  geometry->mics[imic].x = x;
144  geometry->mics[imic].y = y;
145  geometry->mics[imic].z = z;
146  }
147  }
148  if(0 == strcmp("$Elements\n",line)){
149  fgets(line,100,fmics);
150  sscanf(line,"%d",&netmp);
151  for(j=0;j<netmp;j++){
152  fgets(line,100,fmics);
153  sscanf(line,"%d %d %d",&ielg,&eltype,&ntag);
154  if(2==eltype){ // Triangle
155  ivbase=icount*4;
156  if(2==ntag){
157  sscanf(line,"%d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&j1,&j2,&j3);
158  geometry->jnodm[ivbase ] = j1-1;
159  geometry->jnodm[ivbase+1 ] = j2-1;
160  geometry->jnodm[ivbase+2 ] = j3-1;
161  geometry->jnodm[ivbase+3 ] = j3-1;
162  }
163  if(3==ntag){
164  sscanf(line,"%d %d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&npart,&j1,&j2,&j3);
165  geometry->jnodm[ivbase ] = j1-1;
166  geometry->jnodm[ivbase+1 ] = j2-1;
167  geometry->jnodm[ivbase+2 ] = j3-1;
168  geometry->jnodm[ivbase+3 ] = j3-1;
169  }
170  geometry->kelmm[icount] = 2;
171  icount++;
172  }
173  if(3==eltype){ // Quadrangle
174  ivbase=icount*4;
175  if(2==ntag){
176  sscanf(line,"%d %d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&j1,&j2,&j3,&j4);
177  geometry->jnodm[ivbase ] = j1-1;
178  geometry->jnodm[ivbase+1 ] = j2-1;
179  geometry->jnodm[ivbase+2 ] = j3-1;
180  geometry->jnodm[ivbase+3 ] = j4-1;
181  }
182  if(3==ntag){
183  sscanf(line,"%d %d %d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&npart,&j1,&j2,&j3,&j4);
184  geometry->jnodm[ivbase ] = j1-1;
185  geometry->jnodm[ivbase+1 ] = j2-1;
186  geometry->jnodm[ivbase+2 ] = j3-1;
187  geometry->jnodm[ivbase+3 ] = j4-1;
188  }
189  geometry->kelmm[icount] = 3;
190  icount++;
191  }
192  if(4==eltype){ // Tetrahedra
193  ivbase=icount*4;
194  if(2==ntag){
195  sscanf(line,"%d %d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&j1,&j2,&j3,&j4);
196  geometry->jnodm[ivbase ] = j1-1;
197  geometry->jnodm[ivbase+1 ] = j2-1;
198  geometry->jnodm[ivbase+2 ] = j3-1;
199  geometry->jnodm[ivbase+3 ] = j4-1;
200  }
201  if(3==ntag){
202  sscanf(line,"%d %d %d %d %d %d %d %d %d %d\n",&ielg,&eltype,&ntag,&nphy,&ngeo,&npart,&j1,&j2,&j3,&j4);
203  geometry->jnodm[ivbase ] = j1-1;
204  geometry->jnodm[ivbase+1 ] = j2-1;
205  geometry->jnodm[ivbase+2 ] = j3-1;
206  geometry->jnodm[ivbase+3 ] = j4-1;
207  }
208  geometry->kelmm[icount] = 4;
209  icount++;
210  }
211  }
212  if(icount != modgeominfo->nemics){
213  logger(LOG_ERROR,"Number of read elements %d not equal to mics elements %d \n",icount,modgeominfo->nemics);
214  return ACOUSTO_ERROR_GEOMETRY;
215  }
216  }
217  }
218  }else{
219  sscanf(line,f3I3FSCAN,&i1,&i2,&i3,&d1,&d2,&d3);
220  for(i=0;i<modgeominfo->nmics;i++){
221  fgets(line,100,fmics);
222  if(NULL != line){ // if EOF it means we declared less microphones than node numbers
223  sscanf(line,VECTOR_SCANF,&x,&y,&z);
224  }
225  geometry->mics[i].x = x;
226  geometry->mics[i].y = y;
227  geometry->mics[i].z = z;
228  _DEBUG_IDX_AND_VECTOR("MICS",i,geometry->mics[i]);
229  }
230  }
231 
232  if(modgeominfo->nchief > 0) fclose(fchief);
233  fclose(fmics);
234 
235  if(modgeominfo->nchief > 0 )logger(LOG_DEBUG,"file %s read\n",fileinfo->chief_file);
236  if(fileinfo->mics_file) logger(LOG_DEBUG,"file %s read\n",fileinfo->mics_file);
237  return 1;
238 
239 }
#define MSG_GEOM_FILE_NOTFOUND
Definition: messages.h:38
int ncntr
Definition: structs.h:299
int nemics
Definition: structs.h:305
#define GMSH_VER_SCANF
Definition: formats.h:69
void vec_copy(struct vector *vdest, const struct vector vsrc)
Definition: math.c:158
#define _DEBUG_IDX_AND_VECTOR(ctx, i, x)
Definition: print.h:54
int nchief
Definition: structs.h:301
struct file_info * fileinfo
Definition: globals.h:32
#define LOG_ERROR
Definition: logger.h:24
#define ACOUSTO_ERROR_GEOMETRY
Definition: constants.h:25
const char * chief_file
Definition: structs.h:405
#define VECTOR_SCANF
Definition: formats.h:65
int nmics
Definition: structs.h:304
DOUBLE z
Definition: structs.h:35
#define LOG_DEBUG
Definition: logger.h:27
#define GMSH_NOD_SCANF
Definition: formats.h:70
DOUBLE x
Definition: structs.h:31
#define f3I3FSCAN
Definition: formats.h:67
const char * mics_file
Definition: structs.h:407
Geometry info structure.
Definition: structs.h:161
void logger(int level, char *msg,...)
Definition: logger.c:56
struct modgeom_info * modgeominfo
Definition: globals.h:38
DOUBLE y
Definition: structs.h:33