Esempio n. 1
0
static inline field
dlp_kernel_helmholtzbem3d(const real * x, const real * y,
			  const real * nx, const real * ny, void *data)
{
  pcbem3d   bem = (pcbem3d) data;
  real      k = bem->k;
  real      dist[3];
  real      norm, norm2, rnorm, s, c;

  field     res;

  (void) nx;

  dist[0] = x[0] - y[0];
  dist[1] = x[1] - y[1];
  dist[2] = x[2] - y[2];
  norm2 = REAL_NORMSQR3(dist[0], dist[1], dist[2]);
  rnorm = REAL_RSQRT(norm2);

  norm = k * norm2 * rnorm;
  s = sin(norm);
  c = cos(norm);
  res = (c + norm * s + (s - c * norm) * I);
  res *= (rnorm * rnorm * rnorm) * DOT3(dist, ny);

  return res;
}
Esempio n. 2
0
static inline field
hs_kernel_helmholtzbem3d(const real * x, const real * y,
			 const real * nx, const real * ny, void *data)
{
  pcbem3d   bem = (pcbem3d) data;
  real      k = bem->k;
  real      dist[3];
  real      norm, norm2, rnorm, s, c, dot, dotxy, hr, hi;

  field     res;

  dist[0] = x[0] - y[0];
  dist[1] = x[1] - y[1];
  dist[2] = x[2] - y[2];
  norm2 = REAL_NORMSQR3(dist[0], dist[1], dist[2]);
  rnorm = REAL_RSQRT(norm2);

  norm = k * norm2 * rnorm;
  rnorm = (rnorm * rnorm) * (rnorm * rnorm) * rnorm;
  s = sin(norm);
  c = cos(norm);

  dot = REAL_DOT3(dist, nx) * REAL_DOT3(dist, ny);
  dotxy = REAL_DOT3(nx, ny);

  hr = (norm * norm - 3.0) * dot + norm2 * dotxy;
  hi = 3.0 * norm * dot - norm * norm2 * dotxy;

  res = rnorm * (c * hr - s * hi + (c * hi + s * hr) * I);

  return res;
}
Esempio n. 3
0
static inline field
slp_kernel_helmholtzbem3d(const real * x, const real * y,
			  const real * nx, const real * ny, void *data)
{
  pcbem3d   bem = (pcbem3d) data;
  real      k = bem->k;
  real      dist[3];
  real      norm, norm2, rnorm;

  field     res;

  (void) nx;
  (void) ny;

  dist[0] = x[0] - y[0];
  dist[1] = x[1] - y[1];
  dist[2] = x[2] - y[2];
  norm2 = REAL_NORMSQR3(dist[0], dist[1], dist[2]);
  rnorm = REAL_RSQRT(norm2);

  norm = k * norm2 * rnorm;
  res = (cos(norm) + I * sin(norm)) * rnorm;

  return res;
}
Esempio n. 4
0
field
eval_brakhage_werner_c(pcbem3d bem, pcavector w, field eta, real * x)
{
  pcsurface3d gr = bem->gr;
  const     real(*gr_x)[3] = (const real(*)[3]) gr->x;
  const     uint(*gr_t)[3] = (const uint(*)[3]) gr->t;
  const     real(*gr_n)[3] = (const real(*)[3]) gr->n;
  const preal gr_g = (const preal) gr->g;
  const uint rows = gr->triangles;
  const field *kvec = bem->kvec;

  uint      nq = bem->sq->n_single;
  real     *xx = bem->sq->x_single;
  real     *yy = bem->sq->y_single;
  real     *ww = bem->sq->w_single + 3 * nq;

  const real *A, *B, *C, *ns;
  uint      s, ss, q;
  real      gs_fac, dx, dy, dz, tx, sx, Ax, Bx, Cx, norm, rnorm, norm2;
  field     k, sum;

  field     res;

  k = REAL_SQRT(ABSSQR(kvec[0]) + ABSSQR(kvec[1]) + ABSSQR(kvec[2]));

  /*
   *  integrate kernel function over first variable with constant basisfunctions
   */

  res = 0.0;

  for (s = 0; s < rows; ++s) {
    ss = s;
    gs_fac = gr_g[ss] * 0.0795774715459476679;
    ns = gr_n[ss];
    A = gr_x[gr_t[ss][0]];
    B = gr_x[gr_t[ss][1]];
    C = gr_x[gr_t[ss][2]];

    sum = 0.0;

    for (q = 0; q < nq; ++q) {
      tx = xx[q];
      sx = yy[q];
      Ax = 1.0 - tx;
      Bx = tx - sx;
      Cx = sx;

      dx = x[0] - (A[0] * Ax + B[0] * Bx + C[0] * Cx);
      dy = x[1] - (A[1] * Ax + B[1] * Bx + C[1] * Cx);
      dz = x[2] - (A[2] * Ax + B[2] * Bx + C[2] * Cx);

      norm2 = dx * dx + dy * dy + dz * dz;
      rnorm = REAL_RSQRT(norm2);
      norm = norm2 * rnorm;
      rnorm *= rnorm * rnorm;

      sum += ww[q]
	* cexp(I * k * norm)
	* rnorm
	* ((1.0 - I * k * norm) * (dx * ns[0] + dy * ns[1] + dz * ns[2]) - I
	   * eta * norm2);
    }

    res += sum * gs_fac * w->v[ss];
  }

  return res;
}
Esempio n. 5
0
static void
fill_dlp_cc_sing_cpu_wrapper_helmholtzbem3d(void *data)
{
  merge_data_nf *mdata = (merge_data_nf *) data;
  pcbem3d   bem = mdata->bem;
  const pcsurface3d gr = bem->gr;
  const     real(*gr_x)[3] = (const real(*)[3]) gr->x;
  const     uint(*gr_t)[3] = (const uint(*)[3]) gr->t;
  const     real(*gr_n)[3] = (const real(*)[3]) gr->n;
  const real *gr_g = (const real *) gr->g;
  field    *aa = mdata->N;
  uint      pos = mdata->pos;
  field   **addr = mdata->addr;
  field     k = bem->k;

  const real *A_t, *B_t, *C_t, *A_s, *B_s, *C_s, *ns;
  const uint *tri_t, *tri_s;
  real     *xq, *yq, *wq;
  uint      tp[3], sp[3];
  real      Ax, Bx, Cx, Ay, By, Cy, tx, sx, ty, sy, dx, dy, dz, factor, norm,
    norm2, rnorm, base;
  field     sum;
  uint      q, nq, ss, tt, t;

  for (t = 0; t < pos; ++t) {
    tt = ((uint *) aa)[0];
    tri_t = gr_t[tt];
    ss = ((uint *) aa)[1];
    tri_s = gr_t[ss];
    ns = gr_n[ss];
    factor = gr_g[ss] * gr_g[tt] * KERNEL_CONST_HELMHOLTZBEM3D;

    if (tt == ss) {
      sum = 0.5 * bem->alpha * gr_g[tt];

      *(addr[t]) = sum;
    }
    else {

      (void) select_quadrature_singquad2d(bem->sq, tri_t, tri_s, tp, sp, &xq,
					  &yq, &wq, &nq, &base);
      wq += 9 * nq;

      A_t = gr_x[tri_t[tp[0]]];
      B_t = gr_x[tri_t[tp[1]]];
      C_t = gr_x[tri_t[tp[2]]];
      A_s = gr_x[tri_s[sp[0]]];
      B_s = gr_x[tri_s[sp[1]]];
      C_s = gr_x[tri_s[sp[2]]];

      sum = base;

      for (q = 0; q < nq; ++q) {
	tx = xq[q];
	sx = xq[q + nq];
	ty = yq[q];
	sy = yq[q + nq];
	Ax = 1.0 - tx;
	Bx = tx - sx;
	Cx = sx;
	Ay = 1.0 - ty;
	By = ty - sy;
	Cy = sy;

	dx = A_t[0] * Ax + B_t[0] * Bx + C_t[0] * Cx
	  - (A_s[0] * Ay + B_s[0] * By + C_s[0] * Cy);
	dy = A_t[1] * Ax + B_t[1] * Bx + C_t[1] * Cx
	  - (A_s[1] * Ay + B_s[1] * By + C_s[1] * Cy);
	dz = A_t[2] * Ax + B_t[2] * Bx + C_t[2] * Cx
	  - (A_s[2] * Ay + B_s[2] * By + C_s[2] * Cy);

	norm2 = dx * dx + dy * dy + dz * dz;
	rnorm = REAL_RSQRT(norm2);

	if (IMAG(k) == 0.0) {
	  norm = REAL(k) * norm2 * rnorm;
	  sum += wq[q] * (cos(norm) + I * sin(norm)) * rnorm * rnorm * rnorm
	    * (1.0 - I * norm) * (dx * ns[0] + dy * ns[1] + dz * ns[2]);
	}
	else {
	  norm = norm2 * rnorm;
	  sum += wq[q] * exp(-IMAG(k) * norm)
	    * (cos(REAL(k) * norm) + I * sin(REAL(k) * norm)) * rnorm
	    * rnorm * rnorm * (1.0 - I * k * norm)
	    * (dx * ns[0] + dy * ns[1] + dz * ns[2]);
	}
      }
      *(addr[t]) = sum * factor;
    }
  }
}