AcouSTO  version 2.0

◆ acoustic_solution()

void acoustic_solution ( )

Acoustic Solution main function. The solution is evaluated and output files are printed.

32  {
33 
34  int i,j;
35  int isig,iome,ifreq;
36  DOUBLE delome,delsig,sigma,omega;
37  int nfreq;
38  int nphiu,npsiu;
39  int mpi_ncntr;
40 
41  COMPLEX cfreq,hfreq;
42 
43  //DOUBLE norm, cond;
44 
45 
46  int nelmb,ncntrc;
47  int icounter;
48  //KSP ksp;
49  char fname[MAX_PATH];
50  char fsolname[MAX_PATH];
51  FILE *f;
52 #ifdef _ACOUSTO_DEBUG
53  FILE *file;
54  Vec vrhs;
55  COMPLEX vrhsval;
56  COMPLEX vrhsvalc;
57  int istart,iend;
58 #endif
59 
60  delome = (modsolinfo->maxome-modsolinfo->minome) / (modsolinfo->nome-1);
61  if(1 == modsolinfo->nome) delome = 0.0;
62  if(0.0 == delome ) delome = 0.0;
63  delsig = (modsolinfo->maxsig-modsolinfo->minsig) / (modsolinfo->nsig-1);
64  if(1 == modsolinfo->nsig) delsig = 0.0;
65  if(0.0 == delsig ) delsig = 0.0;
66 
67  nfreq = modsolinfo->nsig * modsolinfo->nome;
68 
69  nphiu = modgeominfo->ncntr; // MAKE THIS COHERENT
70  npsiu = modgeominfo->ncntr;
71  nelmb = modgeominfo->nelmb;
72  ncntrc = modgeominfo->ncntr + modgeominfo->nchief;
73 
74  // Allocation
75  //solution = calloc(1,sizeof(struct solution_struct));
76  solution->sig = calloc(modsolinfo->nsig, sizeof(DOUBLE));
77  solution->ome = calloc(modsolinfo->nome, sizeof(DOUBLE));
79  solution->dipoles = calloc(modsolinfo->ndipoles, sizeof(struct dipole));
80 
81  // Custom BC Allocation
82  bc.lambda = calloc(nphiu,sizeof(COMPLEX));
83  for(j=0;j<nphiu;j++) bc.lambda[j] = 1.0;
84 
85  bc.gamma = calloc(nphiu,sizeof(COMPLEX));
86  for(j=0;j<nphiu;j++) bc.gamma[j] = COMPLEX_ZERO;
87 
88  bc.func = calloc(nphiu,sizeof(COMPLEX));
89  for(j=0;j<nphiu;j++) bc.func[j] = COMPLEX_ZERO;
90 
91  bc.g.x = 0.0;
92  bc.g.y = 0.0;
93  bc.g.z = 0.0;
94 
95  solution->planw = calloc(modsolinfo->nplanw, sizeof(struct acoustic_point));
96 
97 // if(modsolinfo->nsig == 1){
98 // solution->sig[0] = modsolinfo->minsig;
99 // }else{
100 // for(i=0;i<modsolinfo->nsig;i++){
101 // solution->sig[i] = modsolinfo->minsig + i*delsig;
102 // }
103 // }
104 // if(modsolinfo->nome == 1){
105 // solution->ome[0] = modsolinfo->minome;
106 // }else{
107 // for(i=0;i<modsolinfo->nome;i++){
108 // solution->ome[i] = modsolinfo->minome + i*delome;
109 // }
110 // }
111 
112  // Read data from files
113  // Sources and plane wave.
114  if(rank == 0){
115  if(!read_acoustic_files()){
116  logger(LOG_ERROR," **************************** \n");
117  logger(LOG_ERROR," Error reading acoustic files \n");
118  logger(LOG_ERROR," **************************** \n");
119  }
120  }
121 
122 
123  // allocating indices on slave nodes for freq resp at microphones
124  if(0 != rank){
126  }
127 
128  // Broadcasting files read on node 0 to all nodes
129  MPI_Bcast(solution->sources,modsolinfo->nsourc ,mpi_acoustic_point_type,0,MPI_COMM_WORLD);
130  MPI_Bcast(solution->dipoles,modsolinfo->ndipoles ,mpi_dipole_type,0,MPI_COMM_WORLD);
131  MPI_Bcast(solution->planw ,modsolinfo->nplanw ,mpi_acoustic_point_type,0,MPI_COMM_WORLD);
132  MPI_Bcast(solution->i_freqresp_mic ,modsolinfo->n_freqresp_mic ,MPI_INT,0,MPI_COMM_WORLD);
133 
134 
135 #ifdef _ACOUSTO_DEBUG
136  sprintf(fname,"checkcast.%d",rank);
137  logger(LOG_DEBUG,"filename [%s]\n",fname);
138  file = fopen(fname,"w");
139  fprintf(file,"SOURCES (%d)\n",modsolinfo->nsourc);
140  for(i=0;i<modsolinfo->nsourc;i++){
141  fprintf(file,f1I5F,
142  i,
143  solution->sources[i].pos.x,
144  solution->sources[i].pos.y,
145  solution->sources[i].pos.z,
148  }
149  fprintf(file,"IMPEDANCES (%d)\n",modsolinfo->nimped);
150  for(i=0;i<modsolinfo->nimped;i++){
151  fprintf(file,f1I2F,solution->izimp[i],CREAL(solution->zimp[i]),CIMAG(solution->zimp[i]));
152  }
153  fprintf(file,"RADIANTS (%d)\n",modsolinfo->nradian);
154  for(i=0;i<modsolinfo->nradian;i++){
155  fprintf(file,f1I2F,solution->iradian[i],CREAL(solution->radian[i]),CIMAG(solution->radian[i]));
156  }
157  fclose(file);
158 #endif
159 
160  mpi_ncntr = modgeominfo->ncntr + modgeominfo->nchief;
161  CREATE_VEC(solution->sol,mpi_ncntr);
162 
163 // Init frequency response files if needed
164  if( 0 == rank){
165  if(0 != modsolinfo->n_freqresp_cnt){
166  for(i=0;i<modsolinfo->n_freqresp_cnt;i++){
167  get_filename(fname,"%s-fresp-cnt%d.out",rundetails->title,solution->i_freqresp_cnt[i]);
168  f = fopen(fname,"w+");
169  fprintf(f,"# Frequency response at control point %d\n",solution->i_freqresp_cnt[i]);
170  fclose(f);
171  }
172  }
173  if(0 != modsolinfo->n_freqresp_mic){
174  for(i=0;i<modsolinfo->n_freqresp_mic;i++){
175  get_filename(fname,"%s-fresp-mic%d.out",rundetails->title,solution->i_freqresp_mic[i]);
176  f = fopen(fname,"w+");
177  fprintf(f,"# Frequency response at microphone %d\n",solution->i_freqresp_mic[i]);
178  fclose(f);
179  }
180  }
181  }
182 
183 
184  /***********************************
185  * Starting loop
186  ***********************************/
187  icounter =0;
188  for(isig=0;isig<modsolinfo->nsig;isig++){
189  sigma = modsolinfo->minsig + isig*delsig;
190  for(iome=0;iome<modsolinfo->nome;iome++){
191  omega = modsolinfo->minome + iome*delome;
192 // cfreq = solution->sig[isig] + I*solution->ome[iome];
193  cfreq = sigma + I*omega;
194  hfreq = cfreq;
195 
196  ifreq = iome + modsolinfo->nome*isig;
197  logger(LOG_INFO,"ifreq = %d, s=(%f +i %f), f=%f Hz\n",ifreq,(double)CREAL(cfreq),(double)CIMAG(cfreq),(double)(0.5*omega/(PI)));
198 
199  // Read and broadcast bc from files
200  if(rank == 0){read_boundary_conditions(cfreq, ifreq);}
201 
202  logger(LOG_INFO,"Boundary conditions: transferring %d bytes to nodes\n",(3*nphiu*sizeof(COMPLEX)+sizeof(struct vector)));
203  MPI_Bcast(&bc.nlambda ,1 ,MPI_INT,0,MPI_COMM_WORLD);
204  MPI_Bcast(&bc.ngamma ,1 ,MPI_INT,0,MPI_COMM_WORLD);
205  MPI_Bcast(&bc.nfunc ,1 ,MPI_INT,0,MPI_COMM_WORLD);
206  MPI_Bcast(&bc.ng ,1 ,MPI_INT,0,MPI_COMM_WORLD);
207  MPI_Bcast(bc.lambda ,nphiu ,MPI_ACOUSTO_COMPLEX,0,MPI_COMM_WORLD);
208  MPI_Bcast(bc.gamma ,nphiu ,MPI_ACOUSTO_COMPLEX,0,MPI_COMM_WORLD);
209  MPI_Bcast(bc.func ,nphiu ,MPI_ACOUSTO_COMPLEX,0,MPI_COMM_WORLD);
210  MPI_Bcast(&bc.g ,1 ,mpi_vector_type ,0,MPI_COMM_WORLD);
211 
212  logger(LOG_DEBUG," Evaluating Phi inc.\n");
213  eval_phinc(cfreq,icounter);
214 
215  logger(LOG_DEBUG," Evaluating Normal Wash\n");
216  eval_nw(cfreq,icounter);
217 
218  if(modsolinfo->onlyrep == 0){
219  // building matrices and RHS
221  logger(LOG_DEBUG," Evaluating Y\n");
222  matyfd(cfreq,icounter);
223  }else{
224  matyfdc(cfreq,icounter);
225  }
226 
227  // Estimating condition number of matrix
229  solve_linear_system(icounter);
230  }else if (GMRES == modsolinfo->solver){
231  gmres(icounter);
232  }
233 
234  if(modsolinfo->printout){
235  printsol_on_master(icounter,cfreq);
236  }
237  }else{ // reading solution
238  get_filename(fsolname,"%s-surf-%.4fHz.out",rundetails->title,(double)HZFREQ(cfreq));
239  logger(LOG_INFO,"Skipping evaluation, reading solution from file %s. on master node\n",fsolname);
240  if(0 == rank){
241  read_solution(fsolname);
242  }
243  // Broadcast
244  logger(LOG_INFO,"Solution read on master node. Broadcasting to nodes\n");
245  MPI_Bcast(solution->sol,mpi_ncntr,mpi_complex,0,MPI_COMM_WORLD);
246 
247  }
248 
250  pre_mic(cfreq,icounter); /* evaluating pressure at microphones */
251  }else{
252  pre_mic_coef(cfreq,icounter); /* evaluating pressure at microphones */
253  }
254 
255 #ifdef _MYSQL_
256  // Storing run on MySQL if enabled.
257  if(mysqlinfo->active){
258  mysql_save(cfreq);
259  }
260 #endif
261 
262  // Frequency response analysis printout
263  // Centers
264  if( 0 == rank){
265  if(0 != modsolinfo->n_freqresp_cnt){
266  for(i=0;i<modsolinfo->n_freqresp_cnt;i++){
267  get_filename(fname,"%s-fresp-cnt%d.out",rundetails->title,solution->i_freqresp_cnt[i]);
268  f = fopen(fname,"a");
269  fr_print_sol_cntr(f,solution->i_freqresp_cnt[i],icounter,cfreq);
270  fclose(f);
271  }
272  }
273  }
274 
275  // Microphones
276  if(0 != modsolinfo->n_freqresp_mic){
277  for(i=0;i<modsolinfo->n_freqresp_mic;i++){
278  if(0 == rank){
279  get_filename(fname,"%s-fresp-mic%d.out",rundetails->title,solution->i_freqresp_mic[i]);
280  f = fopen(fname,"a");
281  }
282  fr_print_pre_mic(f,solution->i_freqresp_mic[i],icounter,cfreq);
283  if(0 == rank){
284  fclose(f);
285  }
286  }
287  }
288 
289 /* VTK files printout */
290  if(modsolinfo->printvtk){
291  vtkoutb(icounter, cfreq);
292  if(1==havemicsmesh){
293  vtkoutmmesh(icounter, cfreq);
294  }else{
295  vtkoutmu2(icounter, cfreq);
296  }
297  }
298  if(modsolinfo->printmsh){
299  mshoutb(icounter, cfreq);
300  mshoutm(icounter, cfreq);
301  }
302 
303  icounter++;
304  }
305  }
306 
307 }
void pre_mic_coef(COMPLEX cfreq, int icounter)
Definition: pre_mic.c:337
void eval_phinc(COMPLEX cfreq, int icounter)
Definition: nrwash.c:55
int * i_freqresp_cnt
Definition: structs.h:610
#define Vec
Definition: types.h:63
const char * title
Definition: structs.h:135
int nlambda
Definition: structs.h:618
int ncntr
Definition: structs.h:299
int nimped
Definition: structs.h:450
COMPLEX amplitude
Definition: structs.h:537
void fr_print_pre_mic(FILE *file, int imic, int icounter, COMPLEX cfreq)
Definition: print_solution.c:151
void read_solution(char *fname)
Definition: read_solution.c:33
void vtkoutmu2(int icounter, COMPLEX cfreq)
Definition: vtkout_mu2.c:42
MPI_Datatype mpi_complex
Definition: globals.h:93
struct acoustic_point * planw
Definition: structs.h:575
#define CREAL(x)
Definition: functions.h:49
int * i_freqresp_mic
Definition: structs.h:612
DOUBLE minsig
Definition: structs.h:480
int nfunc
Definition: structs.h:620
#define f1I5F
Definition: formats.h:75
void vtkoutmmesh(int icounter, COMPLEX cfreq)
Definition: vtkout_mmesh.c:44
void printsol_on_master(int icounter, COMPLEX cfreq)
Definition: print_solution.c:32
#define MPI_ACOUSTO_COMPLEX
Definition: types.h:56
Definition: structs.h:430
void get_filename(char *filename, const char *format,...)
Definition: utils.c:59
int ndipoles
Definition: structs.h:503
vector struct to hold triplets.
Definition: structs.h:29
int nsourc
Definition: structs.h:448
Definition: structs.h:540
int n_freqresp_mic
Definition: structs.h:499
#define CIMAG(x)
Definition: functions.h:50
COMPLEX * lambda
Definition: structs.h:623
int nchief
Definition: structs.h:301
DOUBLE maxome
Definition: structs.h:466
COMPLEX * sol
Definition: structs.h:607
struct dipole * dipoles
Definition: structs.h:563
BOOL onlyrep
Definition: structs.h:526
#define LOG_INFO
Definition: logger.h:26
struct bc_struct bc
Definition: globals.h:54
int nsig
Definition: structs.h:456
int n_freqresp_cnt
Definition: structs.h:497
int nelmb
Definition: structs.h:295
#define COMPLEX_ZERO
Definition: constants.h:44
Definition: structs.h:429
DOUBLE * ome
Definition: structs.h:558
DOUBLE * sig
Definition: structs.h:556
COMPLEX * zimp
Definition: structs.h:566
int ng
Definition: structs.h:621
int * iradian
Definition: structs.h:573
#define f1I2F
Definition: formats.h:73
struct acoustic_point * sources
Definition: structs.h:561
#define LOG_ERROR
Definition: logger.h:24
int ngamma
Definition: structs.h:619
struct solution_struct * solution
Definition: globals.h:52
#define COMPLEX
Definition: types.h:48
MPI_Datatype mpi_dipole_type
Definition: globals.h:129
MPI_Datatype mpi_vector_type
Definition: globals.h:97
BOOL pre_calculate_coefs
Definition: structs.h:519
BOOL printout
Definition: structs.h:486
enum SUPPORTED_SOLVERS solver
Definition: structs.h:507
struct modsol_info * modsolinfo
Definition: globals.h:44
DOUBLE z
Definition: structs.h:35
#define HZFREQ(x)
Definition: functions.h:28
DOUBLE maxsig
Definition: structs.h:478
struct vector g
Definition: structs.h:626
int * izimp
Definition: structs.h:568
#define LOG_DEBUG
Definition: logger.h:27
COMPLEX * gamma
Definition: structs.h:624
int nradian
Definition: structs.h:452
void matyfdc(COMPLEX cfreq, int icounter)
Definition: matrices.c:37
COMPLEX * radian
Definition: structs.h:571
DOUBLE minome
Definition: structs.h:468
void pre_mic(COMPLEX cfreq, int icounter)
Definition: pre_mic.c:36
void solve_linear_system(int icounter)
Definition: linsys.c:42
BOOL printvtk
Definition: structs.h:482
struct vector pos
Definition: structs.h:535
double DOUBLE
Definition: types.h:44
int rank
Definition: globals.h:79
DOUBLE x
Definition: structs.h:31
#define CREATE_VEC(v, lsize)
Definition: allocation.h:90
BOOL printmsh
Definition: structs.h:483
void matyfd(COMPLEX cfreq, int icounter)
Definition: matrices_precalc.c:37
void eval_nw(COMPLEX freq, int icounter)
Definition: nrwash.c:279
void gmres(int icounter)
Definition: ac_gmres.c:50
void mshoutb(int icounter, COMPLEX cfreq)
Definition: gmsh_out_b.c:39
int nome
Definition: structs.h:458
COMPLEX * func
Definition: structs.h:625
struct run_details * rundetails
Definition: globals.h:36
MPI_Datatype mpi_acoustic_point_type
Definition: globals.h:105
int read_acoustic_files()
Definition: read_acoustic_files.c:27
int mysql_save(COMPLEX cfreq)
Definition: mysqlsave.c:85
int read_boundary_conditions(COMPLEX cfreq, int ifreq)
Definition: read_boundary_conditions.c:28
void vtkoutb(int icounter, COMPLEX cfreq)
Definition: vtkout_b.c:42
int nplanw
Definition: structs.h:454
void fr_print_sol_cntr(FILE *file, int icntr, int icounter, COMPLEX cfreq)
Definition: print_solution.c:137
Defines an acoustic point as its position and its amplitude.
Definition: structs.h:533
void mshoutm(int icounter, COMPLEX cfreq)
Definition: gmsh_out_m.c:40
#define PI
Definition: constants.h:35
#define MAX_PATH
Definition: constants.h:29
void logger(int level, char *msg,...)
Definition: logger.c:56
#define calloc(n, size)
Definition: allocation.h:37
struct modgeom_info * modgeominfo
Definition: globals.h:38
int havemicsmesh
Definition: globals.h:72
DOUBLE y
Definition: structs.h:33