AcouSTO  version 2.0

◆ acoustic_mics_coefs()

int acoustic_mics_coefs ( )

Evaluates B and C coefficients (please refer to the user manual for details on the theory) The actual evaluation is done in parallel on all the nodes of the domain (SPMD). The matrices are partitioned according to scalapack 2d block cyclic distribution (locRows x locCols) In each loop over the microphones, krow lines of the coefficient matrices can be loaded into memory to minimize memory usage and then written on two different files:

mbcoefs.bin.<nodeid> B coefficients
mccoefs.bin.<nodeid> C coefficients

where <nodeid> is the rank of the node (to avoid name-clashing on multiple process running on the same node) The same files are then read in the Matrices assembly procedure (matrices.c), basically we dictate here the overall partitioning method for the run.

See also
ac_coef_body.c
matrices.c
integrals.c
48  {
49 
50 
51  int npsib,nphib;
52  int icntr,ielmb;
53  int ielmu,is;
54  int mpi_nelmb;
55  struct panel4* mpi_elements;
56  int mpi_ncntr,mpi_nelmu;
57  struct vector* mpi_cntr;
58 
59  int kode;
60  int bstride;
61  int cstride;
62 
63  DOUBLE theta;
64  DOUBLE source,doublet,ratelet;
65 
66  int gRows,gCols; // global dim of coefficient matrix
67  int locRows,locCols; // local dim of coefficient matrix
68 
69  int izero=0;
70 
71 #ifdef _ACOUSTO_DEBUG
72  FILE* f;
73  char fname[15];
74 #endif
75 
76  FILE* fbcoef = NULL;
77  FILE* fccoef = NULL;
78  int nrow,nrowi,iloop,nloop,irow,nio,nrlast;
79  char fbname[20];
80  char fcname[20];
81  DOUBLE* ctmp;
82  int i,j;
83  int ic;
84  long long int perc,io,icr,ioldcurrent,icurrent,ntotal;
85  int bsymmoffset,csymmoffset;
86 
88 
89  // assigning number of psi and phi points (coincident with number of elements)
90  npsib = modgeominfo->nelmb;
91  nphib = modgeominfo->nelmb;
92 
93 
94  /* copying variables into local storage (just for ease of use) */
95  mpi_nelmb = modgeominfo->nelmb;
96  mpi_elements = geometry->elements;
97 
98  mpi_ncntr = modgeominfo->nmics; // control points here are = number of microphones
99  mpi_nelmu = modgeominfo->ncntr; // control points here are = number of microphones
100  mpi_cntr = geometry->mics;
101 
102 
103 #ifdef _ACOUSTO_DEBUG
104  sprintf(fname,"mics.%d%d",runinfo->myrow,runinfo->mycol);
105  logger(LOG_DEBUG,"filename [%s]\n",fname);
106  f = fopen(fname,"w");
107  for(i=0;i<mpi_ncntr;i++){
108  fprintf(f,VECTOR_PRINTF,mpi_cntr[i].x, mpi_cntr[i].y, mpi_cntr[i].z);
109  }
110  fclose(f);
111 #endif
112 
113 
114  gRows = mpi_ncntr;
115  //gCols = mpi_nelmb;
116  gCols = modgeominfo->ncntr;
117 
118  micscoefs = calloc(1,sizeof(struct micscoefs_struct)); // allocating main mics coefficients struct
119 
120  // Building array descriptor
121  locRows = numroc_(&gRows,&runinfo->mics_block_size,&runinfo->myrow,&izero,&runinfo->nprows);
122  locCols = numroc_(&gCols,&runinfo->col_block_size,&runinfo->mycol,&izero,&runinfo->npcols);
123 
124  // nrow lines each loop
125  nrow = runinfo->krow;
126  if(runinfo->krow <= 0 || runinfo->krow >= locRows) nrow = locRows;
127 
128  // ALLOCATING COEFS
129  // micscoefs->B = calloc(2*nrow*locCols,sizeof(DOUBLE)); // 2 B coefficients, nrow*partition size
130  // micscoefs->C = calloc(3*nrow*locCols,sizeof(DOUBLE)); // 3 B coefficients, nrow*partition size
131  // logger(LOG_DEBUG,"Total allocated memory for microphones coefficients=%d bytes\n",
132  // (2*nrow*locCols*sizeof(DOUBLE) + 3*nrow*locCols*sizeof(DOUBLE)));
133  micscoefs->B = calloc(2*nrow*locCols*runinfo->nsymm,sizeof(DOUBLE)); // 2 B coefficients, nrow*partition size*symmetry factor
134  micscoefs->C = calloc(3*nrow*locCols*runinfo->nsymm,sizeof(DOUBLE)); // 3 B coefficients, nrow*partition size*symmetry factor
135  logger(LOG_DEBUG,"Total allocated memory for microphones coefficients=%d bytes\n",
136  (2*nrow*locCols*runinfo->nsymm*sizeof(DOUBLE) + 3*nrow*locCols*runinfo->nsymm*sizeof(DOUBLE)));
137 
138  ctmp = calloc(locRows,sizeof(DOUBLE));
139 
140 
141  if(runinfo->krow > 0){ // only if krow is used
142  // setting names of files (different for each node in case of multi-process run)
143  sprintf(fbname,"mbcoefs.bin.%d",rank);
144  sprintf(fcname,"mccoefs.bin.%d",rank);
145  logger(LOG_DEBUG,"mics coefficients will be in files \"%s\" and \"%s\"\n", fbname,fcname);
146  // opening files in binary-write mode
147  fbcoef = fopen(fbname,"wb");
148  fccoef = fopen(fcname,"wb");
149  }
150 
151  // evaluating local block of coefficient
152  j12(locRows,nrow,&nrlast,&nloop); // calculating start row and number of loops
153 
154  ntotal = (nloop-1) * nrow * locCols * runinfo->nsymm;
155  ioldcurrent = 0;
156  icurrent = 0;
157  ioldcurrent = -1;
158 
159  for(iloop=0;iloop<nloop;iloop++){ // LOOP ON NLOOP
160  ic = 0;
161  nrowi = nrow;
162  if(iloop == nloop-1) nrowi = nrlast; // setting number of rows=number of last rows on final loop
163  //calculating stride for arrays
164  bstride = nrowi*locCols;
165  cstride = nrowi*locCols;
166 
167  for(irow=0;irow<nrowi;irow++){ // LOOP ON NROW
168  i= j21(irow,iloop,nrow); // calculating control point index
170  for(j=0;j<locCols;j++){ // LOOP ON LOCCOLS
171  // getting local indices
173 
174  for(is=0;is<runinfo->nsymm;is++){
175 
176  bsymmoffset = is * 2*nrowi*locCols;
177  csymmoffset = is * 3*nrowi*locCols;
178  ielmb = ielmu + is*mpi_nelmu;
179 
180  kode = 0; // singular panels flag not applicable here
181 
182  delaya(&theta,ielmb,&mpi_elements[ielmb],mpi_cntr[icntr]); // evaluating acoustic delay
183  intgba(1, 0, kode, &mpi_cntr[icntr], &mpi_elements[ielmb], &source, &doublet, &ratelet); // integrating
184 
185  ic = irow*locCols +j;
186 
187  /*
188  micscoefs->B[(irow*locCols+j) ] = source;
189  micscoefs->B[(irow*locCols+j) + bstride ] = theta/runinfo->vsound;
190 
191  micscoefs->C[(irow*locCols+j) ] = doublet;
192  micscoefs->C[(irow*locCols+j) + cstride ] = ratelet/runinfo->vsound ;
193  micscoefs->C[(irow*locCols+j) + cstride*2] = theta/runinfo->vsound;
194  */
195  micscoefs->B[ic + bsymmoffset] = source;
196  micscoefs->B[ic + bstride + bsymmoffset] = theta/runinfo->vsound;
197 
198  micscoefs->C[ic + csymmoffset] = doublet;
199  micscoefs->C[ic + cstride + csymmoffset] = ratelet/runinfo->vsound ;
200  micscoefs->C[ic + cstride*2+ csymmoffset] = theta/runinfo->vsound;
201  // ic++;
202 
203  icurrent++;
204  io = ioldcurrent*10/ntotal;
205  icr = icurrent*10/ntotal;
206  if(icr != io){
207  perc = icurrent*100/ntotal;
208  logger(LOG_INFO,"Completed %lld \%% \n",perc);
209  }
210  ioldcurrent = icurrent;
211  }
212 
213  } // END OF LOOP ON LOCCOLS
214  } // END OF LOOP ON NROW
215  if(runinfo->krow > 0){
216  // append on files
217  nio = fwrite(micscoefs->B,sizeof(DOUBLE),2*nrowi*locCols*runinfo->nsymm,fbcoef);
218  nio = fwrite(micscoefs->C,sizeof(DOUBLE),3*nrowi*locCols*runinfo->nsymm,fccoef);
219  }
220  } // END OF LOOP ON NLOOP
221 
222  if(runinfo->krow > 0){
223  fclose(fbcoef);
224  fclose(fccoef);
225  }
226 
227 
228 #ifdef _ACOUSTO_DEBUG
229  if(runinfo->krow > 0){ // only if krow is used
230  sprintf(fbname,"mbcoefs.bin.%d",rank); sprintf(fcname,"mccoefs.bin.%d",rank);
231  fbcoef = fopen(fbname,"rb"); fccoef = fopen(fcname,"rb");
232  }
233 
234  sprintf(fname,"mcoef.%d%d",runinfo->myrow,runinfo->mycol);
235  f = fopen(fname,"w");
236  j12(locRows,nrow,&nrlast,&nloop);
237  for(iloop=0;iloop<nloop;iloop++){ // LOOP ON NLOOP
238  nrowi = nrow;
239  if(iloop == nloop-1) nrowi = nrlast;
240  bstride = nrowi*locCols;
241  cstride = nrowi*locCols;
242  if(runinfo->krow > 0){ // only if krow is used
243  nio = fread(micscoefs->B,sizeof(DOUBLE),2*nrowi*locCols*runinfo->nsymm,fbcoef);
244  nio = fread(micscoefs->C,sizeof(DOUBLE),3*nrowi*locCols*runinfo->nsymm,fccoef);
245  }
246  for(irow=0;irow<nrowi;irow++){ // LOOP ON NROW
247  i= j21(irow,iloop,nrow);
249  for(j=0;j<locCols;j++){
251  for(is=0;is<runinfo->nsymm;is++){
252 
253  ielmb = ielmu + is*mpi_nelmu;
254  bsymmoffset = is * 2*nrowi*locCols;
255  csymmoffset = is * 3*nrow*locCols;
256  fprintf(f,"%d %d %f %f %f %f %f\n",icntr,ielmb,
257  micscoefs->B[(irow*locCols+j) + bsymmoffset],
258  micscoefs->B[(irow*locCols+j) + bstride + bsymmoffset],
259  micscoefs->C[(irow*locCols+j) + csymmoffset],
260  micscoefs->C[(irow*locCols+j) + cstride + csymmoffset],
261  micscoefs->C[(irow*locCols+j) + cstride*2+ csymmoffset]);
262  }
263  }
264  }
265  }
266  if(runinfo->krow > 0){ // only if krow is used
267  fclose(fbcoef);
268  fclose(fccoef);
269  }
270 
271  fclose(f);
272 #endif
273 
274 
275  if(runinfo->krow > 0){
276  free(micscoefs->B);
277  free(micscoefs->C);
278  }
279 
281  return 1;
282 
283 }
struct run_info * runinfo
Definition: globals.h:34
int npcols
Definition: structs.h:113
int ncntr
Definition: structs.h:299
DOUBLE vsound
Definition: structs.h:102
DOUBLE * C
Definition: structs.h:372
#define VECTOR_PRINTF
Definition: formats.h:66
void delaya(DOUBLE *theta, int ielmb, struct panel4 *element, struct vector xc)
Definition: integrals.c:268
int myrow
Definition: structs.h:115
int nprows
Definition: structs.h:111
vector struct to hold triplets.
Definition: structs.h:29
int mics_block_size
Definition: structs.h:124
#define LOG_INFO
Definition: logger.h:26
#define MSG_MICSCOEF_END
Definition: messages.h:49
int nelmb
Definition: structs.h:295
DOUBLE * B
Definition: structs.h:370
#define MSG_MICSCOEF_START
Definition: messages.h:47
Definition of a quadrilateral panel.
Definition: structs.h:44
int nmics
Definition: structs.h:304
DOUBLE z
Definition: structs.h:35
void j12(int i12, int n1, int *i1, int *i2)
Definition: math.c:206
#define LOG_DEBUG
Definition: logger.h:27
int j21(int i1, int i2, int n1)
Definition: math.c:202
int mycol
Definition: structs.h:117
int nsymm
Definition: structs.h:97
double DOUBLE
Definition: types.h:44
int numroc_(int *m, int *mb, int *p, int *ia, int *npr)
int rank
Definition: globals.h:79
DOUBLE x
Definition: structs.h:31
int col_block_size
Definition: structs.h:121
struct to hold Coefficients at microphones
Definition: structs.h:364
void intgba(int kcrce, int kelem, int kode, struct vector *xcntr, struct panel4 *element, DOUBLE *source, DOUBLE *doublet, DOUBLE *ratelet)
Definition: integrals.c:40
int krow
Definition: structs.h:105
Geometry info structure.
Definition: structs.h:161
struct micscoefs_struct * micscoefs
Definition: globals.h:50
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
void sc_l2g(int il, int p, int n, int np, int nb, int *i)
Definition: matutils.c:116
DOUBLE y
Definition: structs.h:33