AcouSTO  version 2.0

◆ read_boundary_conditions()

int read_boundary_conditions ( COMPLEX  cfreq,
int  ifreq 
)

Reads boundary conditions files.

28  {
29 
30  FILE* file_imped = NULL;
31  FILE* file_radiants = NULL;
32 
33  FILE* file_lambda = NULL;
34  FILE* file_gamma = NULL;
35  FILE* file_func = NULL;
36  FILE* file_g = NULL;
37 
38 
39  char line[200];
40  int i=0,j=0;
41  long double d1,d2,d3;
42  COMPLEX imped;
43  COMPLEX radian;
44  int i1;
45 
46  int nfreq;
47 // int isig=0,iome=0;
48 
49  char flambda[MAX_PATH];
50  char fgamma[MAX_PATH];
51  char ffunc[MAX_PATH];
52  char fg[MAX_PATH];
53 
54  int nlambda = 0;
55  int ngamma = 0;
56  int nfunc = 0;
57  int ng = 0;
58  int mpi_ncntr;
59  int nphiu;
60 
61  COMPLEX rhos;
62 
63  nfreq = modsolinfo->nsig * modsolinfo->nome;
64  mpi_ncntr = modgeominfo->ncntr + modgeominfo->nchief;
65  nphiu = modgeominfo->ncntr;
66 
67  /* open files */
68 
70  if(NULL != fileinfo->imped_file){
71  logger(LOG_DEBUG," reading file %s\n",fileinfo->imped_file);
72  file_imped = fopen(fileinfo->imped_file,"r");
73  if(NULL == file_imped && modsolinfo->nimped > 0){
74  perror("Coudln't find IMPEDANCE file ");
75  return 0;
76  }
77  }
78  }
79 
80  if(!modsolinfo->radiantbody){
81  if(NULL != fileinfo->radiants_file){
82  logger(LOG_DEBUG," reading file %s\n",fileinfo->radiants_file);
83  file_radiants = fopen(fileinfo->radiants_file,"r");
84  if(NULL == file_radiants && modsolinfo->nradian > 0){
85  perror("Coudln't find RADIATING PANELS file ");
86  return 0;
87  }
88  }
89  }
90 
91  /* Reading */
92 
93  if(0 != modsolinfo->custombc){
94  //READING BOUNDARY CONDITIONS
95  if(NULL != fileinfo->bc_lambda_file){
96  sprintf(flambda,fileinfo->bc_lambda_file,ifreq);
97  }
98  if(NULL != fileinfo->bc_gamma_file){
99  sprintf(fgamma ,fileinfo->bc_gamma_file ,ifreq);
100  }
101  if(NULL != fileinfo->bc_func_file){
102  sprintf(ffunc ,fileinfo->bc_func_file ,ifreq);
103  }
104  if(NULL != fileinfo->bc_g_file){
105  sprintf(fg ,fileinfo->bc_g_file ,ifreq);
106  }
107  logger(LOG_DEBUG,"Lambda file: %s\n",flambda);
108  logger(LOG_DEBUG,"Gamma file: %s\n",fgamma);
109  logger(LOG_DEBUG,"Func file: %s\n",ffunc);
110  logger(LOG_DEBUG,"g vec file: %s\n",fg);
111 
112  // opening files
113  file_lambda = NULL;
114  file_gamma = NULL;
115  file_func = NULL;
116  file_g = NULL;
117 
118  nlambda = 0;
119  ngamma = 0;
120  nfunc = 0;
121  ng = 0;
122 
123  file_lambda = fopen(flambda,"r");
124  file_gamma = fopen(fgamma ,"r");
125  file_func = fopen(ffunc ,"r");
126  file_g = fopen(fg ,"r");
127 
128  nlambda = getlines(file_lambda); logger(LOG_DEBUG,"Read %d lines from file %s\n",nlambda,flambda);
129  ngamma = getlines(file_gamma ); logger(LOG_DEBUG,"Read %d lines from file %s\n",ngamma ,fgamma);
130  nfunc = getlines(file_func ); logger(LOG_DEBUG,"Read %d lines from file %s\n",nfunc ,ffunc);
131  ng = getlines(file_g ); logger(LOG_DEBUG,"Read %d lines from file %s\n",ng ,fg );
132 
133  bc.nlambda = nlambda;
134  bc.ngamma = ngamma;
135  bc.nfunc = nfunc ;
136  bc.ng = ng ;
137 
138  if(bc.nlambda > nphiu){
139  logger(LOG_WARN,"Number of lines in file %s > number of unsymmetrized panels: %d > %d, only %d lines will be read\n",flambda,bc.nlambda,mpi_ncntr,mpi_ncntr);
140  bc.nlambda = nphiu;
141  nlambda = nphiu;
142  }
143  if(bc.ngamma > nphiu){
144  logger(LOG_WARN,"Number of lines in file %s > number of unsymmetrized panels: %d > %d, only %d lines will be read\n",fgamma,bc.ngamma,mpi_ncntr,mpi_ncntr);
145  bc.ngamma = nphiu;
146  ngamma = nphiu;
147  }
148  if(bc.nfunc > nphiu){
149  logger(LOG_WARN,"Number of lines in file %s > number of unsymmetrized panels: %d > %d, only %d lines will be read\n",ffunc,bc.nfunc,mpi_ncntr,mpi_ncntr);
150  bc.nfunc = nphiu;
151  nfunc = nphiu;
152  }
153  if(bc.ng > 1){
154  logger(LOG_WARN,"Number of lines in file %s > 1, only 1 lines will be read (g is constant in space) \n",fg);
155  bc.ng = 1;
156  ng = 1;
157  }
158 
159  logger(LOG_DEBUG,"N.Lambda[%d] = %d\n",i,nlambda);
160  logger(LOG_DEBUG,"N.Gamma [%d] = %d\n",i,ngamma);
161  logger(LOG_DEBUG,"N.Func [%d] = %d\n",i,nfunc);
162  logger(LOG_DEBUG,"N.g [%d] = %d\n",i,ng);
163 
164  // Initialize B.C. - Defaults is Sound-Hard
165  for(j =0;j<nlambda;j++){
166  bc.lambda[j] = 1.0 + I*0.0;
167  }
168  for(j =0;j<ngamma;j++){
169  bc.gamma[j] = 0.0 + I*0.0;
170  }
171  for(j =0;j<nfunc;j++){
172  bc.func[j] = 0.0 + I*0.0;
173  }
174  bc.g.x = 0.0;
175  bc.g.y = 0.0;
176  bc.g.z = 0.0;
177 
178  // Reading lambda
179  if(file_lambda){
180  for(j =0;j<nlambda;j++){
181  fgets(line,100,file_lambda);
182  sscanf(line,IMPED_SCANF,&i1,&d1,&d2);
183  bc.lambda[i1-1] = d1 + I*d2;
184  logger(LOG_DEBUG,"LAMBDA[%d]: %d - (%f,%f)\n",j,i1,CREAL(bc.lambda[i1-1]),CIMAG(bc.lambda[i1-1]));
185  }
186  fclose(file_lambda);
187  }
188 
189  // Reading gamma
190  if(file_gamma){
191  for(j =0;j<ngamma;j++){
192  fgets(line,100,file_gamma);
193  sscanf(line,IMPED_SCANF,&i1,&d1,&d2);
194  bc.gamma[i1-1] = d1 + I*d2;
195  logger(LOG_DEBUG,"GAMMA[%d]: %d - (%f,%f)\n",j,i1,CREAL(bc.gamma[i1-1]),CIMAG(bc.gamma[i1-1]));
196  }
197  fclose(file_gamma);
198  }
199 
200  // Reading func
201  if(file_func){
202  for(j =0;j<nfunc;j++){
203  fgets(line,100,file_func);
204  sscanf(line,IMPED_SCANF,&i1,&d1,&d2);
205  bc.func[i1-1] = d1 + I*d2;
206  logger(LOG_DEBUG,"FUNC[%d]: %d - (%f,%f)\n",j,i1,CREAL(bc.func[i1-1]),CIMAG(bc.func[i1-1]));
207  }
208  fclose(file_func);
209  }
210 
211  // Reading g STILL VALID ONLY FOR CONSTANT g
212  if(file_g){
213  for(j =0;j<ng;j++){
214  fgets(line,100,file_g);
215  sscanf(line,VECTOR_SCANF,&d1,&d2,&d3);
216  bc.g.x = d1;
217  bc.g.y = d2;
218  bc.g.z = d3;
219  logger(LOG_DEBUG,"G[%d]: (%f,%f,%f)\n",j,bc.g.x,bc.g.y,bc.g.z);
220  }
221  fclose(file_g);
222  }
223 
224  }else if (0 == modsolinfo->custombc) { // NO custom bc declared... must reconstruct matrices from radiant panels and impedent panels
225 
226  /* IMPEDANCES */
227  for(i=0;i<modsolinfo->nimped;i++){
228  if(!modsolinfo->impedentbody){
229  fgets(line,100,file_imped);
230  sscanf(line,IMPED_SCANF,&i1,&d1,&d2);
231  imped = d1+I*d2;
232  }else{
233  i1 = i+1;
234  imped = modsolinfo->impedance;
235  }
236 // Evaluating BC Matrices
237 // cfreq = solution->sig[isig] + I*solution->ome[iome];
238  rhos = modsolinfo->rho * cfreq;
239  if(imped != 0.0){
240  bc.gamma[i1-1] = - rhos/imped;
241  }
242  logger(LOG_DEBUG,"Read IMPED[%d]: %d - (%f,%f)\n",i,i1,CREAL(imped),CIMAG(imped));
243  logger(LOG_DEBUG,"Calculated GAMMA[%d]: %d - (%f,%f)\n",i,i1,CREAL(bc.gamma[i1-1]),CIMAG(bc.gamma[i1-1]));
244  }
245  /* RADIATING PANELS */
246  for(i=0;i<modsolinfo->nradian;i++){
247  if(!modsolinfo->radiantbody){
248  fgets(line,100,file_radiants);
249  sscanf(line,IMPED_SCANF,&i1,&d1,&d2);
250  radian = d1 + I*d2;
251  }else{
252  i1 = i+1;
253  radian = modsolinfo->radiantfield;
254  }
255  // Evaluating BC Matrices
256  bc.func[i1-1] = radian;
257  logger(LOG_DEBUG,"FUNC[%d]: %d - (%f,%f)\n",i,i1,CREAL(bc.func[i1-1]),CIMAG(bc.func[i1-1]));
258  }
259  if(!modsolinfo->impedentbody && NULL != file_imped) logger(LOG_DEBUG,"file %s read\n",fileinfo->imped_file);
260  if(!modsolinfo->radiantbody && NULL != file_radiants) logger(LOG_DEBUG,"file %s read\n",fileinfo->radiants_file);
261  }
262 
263  if(modsolinfo->nradian > 0 && NULL != file_radiants && !modsolinfo->radiantbody) fclose(file_radiants);
264  if(modsolinfo->nimped > 0 && NULL != file_imped && !modsolinfo->impedentbody) fclose(file_imped);
265 
266  return 1;
267 }
const char * bc_gamma_file
Definition: structs.h:422
int nlambda
Definition: structs.h:618
int ncntr
Definition: structs.h:299
int nimped
Definition: structs.h:450
#define CREAL(x)
Definition: functions.h:49
int nfunc
Definition: structs.h:620
BOOL radiantbody
Definition: structs.h:489
#define CIMAG(x)
Definition: functions.h:50
COMPLEX * lambda
Definition: structs.h:623
int nchief
Definition: structs.h:301
struct bc_struct bc
Definition: globals.h:54
int nsig
Definition: structs.h:456
struct file_info * fileinfo
Definition: globals.h:32
int ng
Definition: structs.h:621
COMPLEX radiantfield
Definition: structs.h:493
int ngamma
Definition: structs.h:619
DOUBLE rho
Definition: structs.h:476
#define COMPLEX
Definition: types.h:48
int custombc
Definition: structs.h:523
#define VECTOR_SCANF
Definition: formats.h:65
struct modsol_info * modsolinfo
Definition: globals.h:44
const char * bc_g_file
Definition: structs.h:424
DOUBLE z
Definition: structs.h:35
struct vector g
Definition: structs.h:626
#define LOG_DEBUG
Definition: logger.h:27
COMPLEX * gamma
Definition: structs.h:624
const char * bc_func_file
Definition: structs.h:423
int nradian
Definition: structs.h:452
#define LOG_WARN
Definition: logger.h:25
int getlines(FILE *file)
Definition: utils.c:29
DOUBLE x
Definition: structs.h:31
#define IMPED_SCANF
Definition: formats.h:64
int nome
Definition: structs.h:458
COMPLEX * func
Definition: structs.h:625
BOOL impedentbody
Definition: structs.h:491
const char * imped_file
Definition: structs.h:411
const char * bc_lambda_file
Definition: structs.h:421
const char * radiants_file
Definition: structs.h:413
#define MAX_PATH
Definition: constants.h:29
void logger(int level, char *msg,...)
Definition: logger.c:56
struct modgeom_info * modgeominfo
Definition: globals.h:38
COMPLEX impedance
Definition: structs.h:495
DOUBLE y
Definition: structs.h:33