void makedisk(bool randspin) { int i; bodyptr bp; double m, r, v, phi; matrix xmat, zmat; vector tmpv; for (i = 0; i < ndisk; i++) { // loop initializing bodies bp = NthBody(disk, i); // set ptr to body number i m = mdtab[NTAB-1] * ((double) i + 0.5) / ndisk; r = gsl_interp_eval(rm_spline, mdtab, rdtab, m, NULL); v = gsl_interp_eval(vr_spline, rdtab, vctab, r, NULL); phi = xrandom(0.0, 2 * M_PI); Pos(bp)[0] = r * sin(phi); Pos(bp)[1] = r * cos(phi); Pos(bp)[2] = 0.0; Vel(bp)[0] = v * cos(phi); Vel(bp)[1] = - v * sin(phi); Vel(bp)[2] = 0.0; pickshell(AuxVec(bp), NDIM, 1.0); if (randspin) { xmatrix(xmat, acos(AuxVec(bp)[2])); zmatrix(zmat, atan2(AuxVec(bp)[0], AuxVec(bp)[1])); MULMV(tmpv, xmat, Pos(bp)); MULMV(Pos(bp), zmat, tmpv); MULMV(tmpv, xmat, Vel(bp)); MULMV(Vel(bp), zmat, tmpv); } } }
void rotate(snapshot *snap, string *tags, string *vecs, char axis, real thetax, real thetay, real thetaz) { matrix rmat; bodyptr bp; switch (tolower(axis)) { case 'x': xmatrix(rmat, thetax); break; case 'y': ymatrix(rmat, thetay); break; case 'z': zmatrix(rmat, thetaz); break; default: error("%s: unknown axis %c\n", getargv0(), axis); } if (set_member(tags, PosTag) && set_member(vecs, PosTag)) for_all_bodies(bp, *snap) rotatevec(Pos(bp), rmat); if (set_member(tags, VelTag) && set_member(vecs, VelTag)) for_all_bodies(bp, *snap) rotatevec(Vel(bp), rmat); if (set_member(tags, AccTag) && set_member(vecs, AccTag)) for_all_bodies(bp, *snap) rotatevec(Acc(bp), rmat); if (set_member(tags, AuxVecTag) && set_member(vecs, AuxVecTag)) for_all_bodies(bp, *snap) rotatevec(AuxVec(bp), rmat); }