AcouSTO  version 2.0

◆ eval_phinc()

void eval_phinc ( COMPLEX  cfreq,
int  icounter 
)

This routine evaluates the total incident potential field at the control points and at microphones. If knw=2, it also evaluates the normal derivative of the total incident field at the boundary control points.

Parameters
[in]cfreqCOMPLEX frequency
[in]icounterfrequency index
55  {
56 
57  int i;
58  int npsiu,nphiu;
59  int ipsiu,isourc,icntr,iplanw,imics;
60  struct acoustic_point xs,ws;
61  COMPLEX grgr;
62  COMPLEX grg[3];
63  DOUBLE rad,theta;
64  DOUBLE wnum;
65  DOUBLE espo;
66  DOUBLE pi;
67  COMPLEX zero,one;
68  COMPLEX phincval,psincval,phincmval;
69 
70  int locRows;
71  int gRows;
72 
73  int locMRows;
74  int gMRows;
75  int izero = 0;
76 
77  struct dipole dip;
78  struct vector vdip;
79  DOUBLE cosdelta;
80  int idipole;
81 
82 #ifdef _ACOUSTO_DEBUG
83  FILE *f;
84  char fname[MAX_PATH];
85 #endif
86 
87  nphiu = modgeominfo->ncntr;
88  npsiu = modgeominfo->ncntr;
89 
90  gMRows = modgeominfo->nmics;
91  gRows = nphiu;
92 
93  locRows = numroc_(&gRows ,&runinfo->row_block_size,&runinfo->myrow,&izero,&runinfo->nprows);
94  locMRows = numroc_(&gMRows,&runinfo->mics_block_size,&runinfo->myrow,&izero,&runinfo->nprows);
95 
96  if(icounter == 0){
97  CREATE_VEC(solution->vecPhinc ,locRows);
98  CREATE_VEC(solution->vecPsinc ,locRows);
99  CREATE_VEC(solution->vecPhincm,locMRows);
100  }
101 
102  VecZeroEntries(solution->vecPhinc ,locRows);
103  VecZeroEntries(solution->vecPsinc ,locRows);
104  VecZeroEntries(solution->vecPhincm,locMRows);
105 
106  if(runinfo->mycol != 0){ // vectors are distributed only on first col of grid
107  return;
108  }
109 
110  pi = 4*atan(1.0);
111  wnum = CIMAG(cfreq)/runinfo->vsound;
112  zero = 0.0;
113  one = 1.0;
114 
115 
116 
117  for(i=0;i<locRows;i++){
119  ipsiu = icntr;
120 
121  /* sources contribution */
122  psincval = 0.0 + I*0.0;
123  phincval = 0.0 + I*0.0;
124  for(isourc=0;isourc<modsolinfo->nsourc;isourc++){
125  vec_copy(&xs.pos, solution->sources[isourc].pos);
126  xs.amplitude = solution->sources[isourc].amplitude;
127  delaysc2(geometry->cntr[icntr],xs.pos,&rad,&theta);
128 
129  phincval -= (xs.amplitude*CEXP(-cfreq*theta)/(4.*pi*rad));
130  if(2 == modsolinfo->knw){
131  grgr = -(xs.amplitude*(cfreq/runinfo->vsound+1.0/rad)*CEXP(-cfreq*theta)) / (4.*pi*rad*rad);
132 
133  grg[0] = grgr*(xs.pos.x - geometry->cntr[ipsiu].x);
134  grg[1] = grgr*(xs.pos.y - geometry->cntr[ipsiu].y);
135  grg[2] = grgr*(xs.pos.z - geometry->cntr[ipsiu].z);
136 
137  psincval += grg[0] * geometry->elements[ipsiu].n.x +
138  grg[1] * geometry->elements[ipsiu].n.y +
139  grg[2] * geometry->elements[ipsiu].n.z;
140 
141  }
142  }
143  /* dipoles contribution */
144  for(idipole=0;idipole<modsolinfo->ndipoles;idipole++){
145  vec_copy(&dip.pos, solution->dipoles[idipole].pos);
146  vec_copy(&dip.dir, solution->dipoles[idipole].dir);
147  dip.amplitude = solution->dipoles[idipole].amplitude;
148  dip.d = solution->dipoles[idipole].d;
149  delaysc2(geometry->cntr[icntr],dip.pos,&rad,&theta);
150 
151  vec_diff(&vdip, geometry->cntr[icntr],dip.pos);
152  cosdelta = vec_dot(dip.dir,vdip)/(vec_mod(vdip));
153  LOG_DIPOLE(LOG_DEBUG,idipole,dip);
154  phincval += (dip.amplitude*dip.d)*cosdelta*((cfreq/(runinfo->vsound*rad)) - (1.0/(rad*rad)))* CEXP(-cfreq*theta) /(4*pi);
155 // phincval += (dip.amplitude*dip.d)*cosdelta*((cfreq/(runinfo->vsound*rad)))* CEXP(-cfreq*theta) /(4*pi);
156 
157  if(2 == modsolinfo->knw){
158  grgr = ((dip.amplitude*dip.d*cosdelta)/(4*pi))*((2.0/(rad*rad*rad)) - ((cfreq*cfreq)/(runinfo->vsound*runinfo->vsound)))*CEXP(-cfreq*theta);
159 
160  grg[0] = grgr*(xs.pos.x - geometry->cntr[ipsiu].x);
161  grg[1] = grgr*(xs.pos.y - geometry->cntr[ipsiu].y);
162  grg[2] = grgr*(xs.pos.z - geometry->cntr[ipsiu].z);
163 
164  psincval += grg[0] * geometry->elements[ipsiu].n.x +
165  grg[1] * geometry->elements[ipsiu].n.y +
166  grg[2] * geometry->elements[ipsiu].n.z;
167 
168  }
169 
170  }
171 
172  /* planar waves contribution */
173  for(iplanw=0;iplanw<modsolinfo->nplanw;iplanw++){
174  vec_copy(&ws.pos,solution->planw[iplanw].pos);
175  vec_scale(&ws.pos,wnum);
176  ws.amplitude = solution->planw[iplanw].amplitude;
177  espo = vec_dot(ws.pos,geometry->cntr[icntr]);
178 
179  phincval += ws.amplitude*CEXP(-I*espo);
180 
181 
182  if(2 == modsolinfo->knw){
183  grgr = - I * ws.amplitude * CEXP(-I*espo);
184 
185  grg[0] = grgr * ws.pos.x;
186  grg[1] = grgr * ws.pos.y;
187  grg[2] = grgr * ws.pos.z;
188 
189  psincval += grg[0] * geometry->elements[ipsiu].n.x +
190  grg[1] * geometry->elements[ipsiu].n.y +
191  grg[2] * geometry->elements[ipsiu].n.z;
192  }
193 
194  }
195  solution->vecPsinc[i] = psincval;
196  solution->vecPhinc[i] = phincval;
197 
198  }
199 
200  /* microphones */
201  for(i=0;i<locMRows;i++){
203  phincmval = 0.0 +I*0.0;
204  // sources
205  for(isourc=0;isourc<modsolinfo->nsourc;isourc++){
206  vec_copy(&xs.pos,solution->sources[isourc].pos);
207  xs.amplitude = solution->sources[isourc].amplitude;
208  delaysc2(geometry->mics[imics],xs.pos,&rad,&theta);
209  phincmval -= xs.amplitude*CEXP(-cfreq*theta) / (4.0*pi*rad);
210  }
211  // dipoles
212  for(idipole=0;idipole<modsolinfo->ndipoles;idipole++){
213  vec_copy(&dip.pos, solution->dipoles[idipole].pos);
214  vec_copy(&dip.dir, solution->dipoles[idipole].dir);
215  dip.amplitude = solution->dipoles[idipole].amplitude;
216  dip.d = solution->dipoles[idipole].d;
217  delaysc2(geometry->mics[imics],dip.pos,&rad,&theta);
218 
219  vec_diff(&vdip, geometry->mics[imics],dip.pos);
220  cosdelta = vec_dot(dip.dir,vdip)/(vec_mod(vdip));
221  phincmval += (dip.amplitude * dip.d)*cosdelta*((cfreq/(runinfo->vsound*rad)) - (1.0/(rad*rad)))* CEXP(-cfreq*theta) /(4*pi);
222 // phincmval += (dip.amplitude*dip.d)*cosdelta*((cfreq/(runinfo->vsound*rad)))* CEXP(-cfreq*theta) /(4*pi);
223 
224  }
225  // planar waves
226  for(iplanw=0;iplanw<modsolinfo->nplanw;iplanw++){
227  vec_copy(&ws.pos,solution->planw[iplanw].pos);
228  vec_scale(&ws.pos,wnum);
229  ws.amplitude = solution->planw[iplanw].amplitude;
230  espo = vec_dot(ws.pos,geometry->mics[imics]);
231  phincmval += ws.amplitude*CEXP(-I*espo);
232  }
233  solution->vecPhincm[i] = phincmval;
234  }
235 
236 
237 //#define _ACOUSTO_DEBUG
238 #ifdef _ACOUSTO_DEBUG
239  FILE *f;
240  char fname[MAX_PATH];
241  sprintf(fname,"psi.%d.out",modgeominfo->nelmb);
242  f = fopen(fname,"w");
243  for(i=0;i<locRows;i++){
245  fprintf(f," %d %f %f %f %f %f %f %f \n",icntr,
246  geometry->cntr[icntr].x,
247  geometry->cntr[icntr].y,
248  geometry->cntr[icntr].z,
251  );
252  }
253  fclose(f);
254 
255 
256  sprintf(fname,"phincm.%d%d",runinfo->myrow,runinfo->mycol);
257  f = fopen(fname,"w");
258  for(i=0;i<locMRows;i++){
260  fprintf(f," %d %f %f \n",imics,
262  );
263  }
264  fclose(f);
265 #endif
266 //#undef _ACOUSTO_DEBUG
267 
268 
269 }
struct run_info * runinfo
Definition: globals.h:34
int ncntr
Definition: structs.h:299
DOUBLE vsound
Definition: structs.h:102
COMPLEX amplitude
Definition: structs.h:537
struct acoustic_point * planw
Definition: structs.h:575
#define CREAL(x)
Definition: functions.h:49
void vec_scale(struct vector *v1, DOUBLE d)
Definition: math.c:170
Vec vecPsinc
Definition: structs.h:580
int myrow
Definition: structs.h:115
void vec_copy(struct vector *vdest, const struct vector vsrc)
Definition: math.c:158
int nprows
Definition: structs.h:111
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
#define CIMAG(x)
Definition: functions.h:50
DOUBLE vec_mod(struct vector v1)
Definition: math.c:121
DOUBLE d
Definition: structs.h:547
int mics_block_size
Definition: structs.h:124
struct dipole * dipoles
Definition: structs.h:563
#define LOG_DIPOLE(ctx, i, v)
Definition: print.h:71
int nelmb
Definition: structs.h:295
#define CEXP(x)
Definition: functions.h:48
Vec vecPhinc
Definition: structs.h:578
int knw
Definition: structs.h:446
struct acoustic_point * sources
Definition: structs.h:561
struct solution_struct * solution
Definition: globals.h:52
#define COMPLEX
Definition: types.h:48
Vec vecPhincm
Definition: structs.h:582
struct modsol_info * modsolinfo
Definition: globals.h:44
int nmics
Definition: structs.h:304
void vec_diff(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:52
DOUBLE vec_dot(struct vector v1, struct vector v2)
Definition: math.c:34
#define LOG_DEBUG
Definition: logger.h:27
struct vector dir
Definition: structs.h:542
int mycol
Definition: structs.h:117
struct vector pos
Definition: structs.h:535
double DOUBLE
Definition: types.h:44
int numroc_(int *m, int *mb, int *p, int *ia, int *npr)
#define CREATE_VEC(v, lsize)
Definition: allocation.h:90
COMPLEX amplitude
Definition: structs.h:544
struct vector pos
Definition: structs.h:541
int nplanw
Definition: structs.h:454
Defines an acoustic point as its position and its amplitude.
Definition: structs.h:533
Geometry info structure.
Definition: structs.h:161
#define MAX_PATH
Definition: constants.h:29
int row_block_size
Definition: structs.h:119
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
#define VecZeroEntries(V, n)
Definition: allocation.h:99
void delaysc2(struct vector xcn, struct vector xs, DOUBLE *rad, DOUBLE *theta)
Definition: nrwash.c:39