Esempio n. 1
0
static gint ass_diff (AranSphericalSeriesd *res, AranSphericalSeriesd *ref)
{
  gint faults = 0;
  gint L = aran_spherical_seriesd_get_posdeg (ref);

  if (L != aran_spherical_seriesd_get_posdeg (res))
    {
      g_printerr ("AranSphericalSeriesd degree error %d != %d\n", L,
                  aran_spherical_seriesd_get_posdeg (res));
      faults ++;
    }
  else
    {
      faults += buffer_diff (L,
                             aran_spherical_seriesd_get_term (ref, 0, 0),
                             aran_spherical_seriesd_get_term (res, 0, 0));
    }

  L = aran_spherical_seriesd_get_negdeg (ref);

  if (L != aran_spherical_seriesd_get_negdeg (res))
    {
      g_printerr ("AranSphericalSeriesd degree error %d != %d\n", L,
                  aran_spherical_seriesd_get_negdeg (res));
      faults ++;
    }
  else if (L > 0)
    {
      faults += buffer_diff (L-1,
                             aran_spherical_seriesd_get_term (ref, -1, 0),
                             aran_spherical_seriesd_get_term (res, -1, 0));
    }

  return faults;
}
/**
 * aran_development3d_clone:
 * @src: an #AranDevelopment3d.
 *
 * Duplicates @src.
 *
 * Returns: newly allocated copy of @src.
 */
AranDevelopment3d *aran_development3d_clone (AranDevelopment3d *src)
{
  AranDevelopment3d *dst;

  g_return_val_if_fail (src != NULL, NULL);

  dst =
    aran_development3d_new (aran_spherical_seriesd_get_posdeg (src->multipole),
			    aran_spherical_seriesd_get_negdeg (src->multipole));

  aran_development3d_copy (src, dst);

  return dst;
}
Esempio n. 3
0
static void p2m (PointAccum *particle, const VsgVector3d *center,
		 AranDevelopment3d *devel)
{
  VsgVector3d tmp;
  guint deg = aran_spherical_seriesd_get_negdeg (devel->multipole);
  gint l, m;
  gcomplex128 harmonics[((deg+1)*(deg+2))/2];
  gdouble r, cost, sint, cosp, sinp;
  gcomplex128 expp;
  gdouble fact;

  vsg_vector3d_sub (&particle->vector, center, &tmp);

  vsg_vector3d_to_spherical_internal (&tmp, &r, &cost, &sint, &cosp, &sinp);
  expp = cosp + G_I * sinp;

  aran_spherical_harmonic_evaluate_multiple_internal (deg, cost, sint, expp,
						      harmonics);


  *aran_spherical_seriesd_get_term (devel->multipole, 0, 0) += 0.;

  fact = particle->density;

  for (l=0; l<deg; l ++)
    {
      gcomplex128 *ptr;
      gcomplex128 term;

      term = fact * (4.*G_PI / (l+l+1.)) *
	*aran_spherical_harmonic_multiple_get_term (l, 0, harmonics);

      ptr = aran_spherical_seriesd_get_term (devel->multipole, -l-1, 0);
      ptr[0] += conj (term);

      for (m=1; m<=l; m ++)
	{

	  term = fact * (4.*G_PI / (l+l+1.)) *
	    *aran_spherical_harmonic_multiple_get_term (l, m, harmonics);

          ptr[m] += conj (term);
	}
      fact *= r;
    }

}