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; }
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; } }