static int compareVectors(mwvector a, mwvector b) { int rc; real ar, br; ar = mw_absv(a); br = mw_absv(b); if (ar > br) return 1; else if (ar < br) return -1; else { /* Resort to comparing by each component */ if ((rc = compareComponents(X(a), X(b)))) return rc; if ((rc = compareComponents(Y(a), Y(b)))) return rc; if ((rc = compareComponents(Z(a), Z(b)))) return rc; } return 0; /* Equal */ }
mwvector nbExtAcceleration(const Potential* pot, mwvector pos) { mwvector acc, acctmp; const real r = mw_absv(pos); /*Calculate the Disk Accelerations*/ switch (pot->disk.type) { case ExponentialDisk: acc = exponentialDiskAccel(&pot->disk, pos, r); break; case MiyamotoNagaiDisk: acc = miyamotoNagaiDiskAccel(&pot->disk, pos, r); break; case InvalidDisk: default: mw_fail("Invalid disk type in external acceleration\n"); } /*Calculate the Halo Accelerations*/ switch (pot->halo.type) { case LogarithmicHalo: acctmp = logHaloAccel(&pot->halo, pos, r); break; case NFWHalo: acctmp = nfwHaloAccel(&pot->halo, pos, r); break; case TriaxialHalo: acctmp = triaxialHaloAccel(&pot->halo, pos, r); break; case CausticHalo: acctmp = causticHaloAccel(&pot->halo, pos, r); break; case InvalidHalo: default: mw_fail("Invalid halo type in external acceleration\n"); } mw_incaddv(acc, acctmp); /*Calculate the Bulge Accelerations*/ acctmp = sphericalAccel(&pot->sphere[0], pos, r); mw_incaddv(acc, acctmp); return acc; }