When using spherical coords (r,theta,phi)
where r is the radius from center,
theta is the angle from the x axis (0..2pi),
and phi is the angle from the xy plane (pi/2..pi/2):
x = r*cos(theta)*cos(phi)
y = r*sin(theta)*cos(phi)
z = r*sin(phi)
In reverse:
r = sqrt(x^2+y^2+z^2)
theta = arctan(y/x)
phi = arctan(z/sqrt(x^2+y^2))
The following time derivative were derived using the above three equations for
r, theta, and phi. I tried to make it as legible as possible
Let me know if you would like a neater copy and I'll post a picture:
The first time derivative of r(t) is:
/ d \ / d \ / d \
x(t)  x(t) + y(t)  y(t) + z(t)  z(t)
\ dt / \ dt / \ dt /

(1/2)
/ 2 2 2\
\x(t) + y(t) + z(t) /
The second time derivative of r(t) is:
/ 2
1 / d \ / d / d \\
  x(t) + x(t)   x(t)
(1/2) \\ dt / \ dt \ dt //
/ 2 2 2\
\x(t) + y(t) + z(t) /
2 2
/ d \ / d / d \\ / d \ / d / d \\
+  y(t) + y(t)   y(t) +  z(t) + z(t)   z(t)
\ dt / \ dt \ dt // \ dt / \ dt \ dt //
2
/ / d \ / d \ / d \\
\ x(t)  x(t) + y(t)  y(t) + z(t)  z(t)
 \ \ dt / \ dt / \ dt //
  
/ (3/2)
/ 2 2 2\
\x(t) + y(t) + z(t) /
The first time derivative of theta is:
/ d \ / d \
 y(t) x(t)  y(t)  x(t)
\ dt / \ dt /

2 2
x(t) + y(t)
The second time derivative of theta is:
/ d / d \\ / d / d \\
  y(t) x(t)  y(t)   x(t)
\ dt \ dt // \ dt \ dt //

2 2
x(t) + y(t)

// d \ / d \\ / / d \ / d \\
 y(t) x(t)  y(t)  x(t) 2 x(t)  x(t) + 2 y(t)  y(t)
\\ dt / \ dt // \ \ dt / \ dt //

2
/ 2 2\
\x(t) + y(t) /
The first time derivative of phi is:
/ d \ / 2 2\ / d \ / d \
 z(t) \x(t) + y(t) /  z(t) x(t)  x(t)  z(t) y(t)  y(t)
\ dt / \ dt / \ dt /

(1/2)
/ 2 2\ / 2 2 2\
\x(t) + y(t) / \x(t) + y(t) + z(t) /
The second time derivative of phi is (might as well shoot yourself now):
/ 2
1 / 2 2\ / 2 2
 \x(t) + y(t) / \x(t) + y(t)
(3/2) 2 \
/ 2 2\ / 2 2 2\
\x(t) + y(t) / \x(t) + y(t) + z(t) /
2\ / d / d \\
+ z(t) /   z(t)
\ dt \ dt //
/ 2 2\ / 2 2 2\ / d / d \\
 x(t) z(t) \x(t) + y(t) / \x(t) + y(t) + z(t) /   x(t)
\ dt \ dt //
/ 2 2\ / 2 2 2\ / d / d \\
 z(t) y(t) \x(t) + y(t) / \x(t) + y(t) + z(t) /   y(t)
\ dt \ dt //
2 2
/ d \ / 2 2\ / 2 2\ / 2 2
 2 z(t)  z(t) \x(t) + y(t) /  2 \x(t) + y(t) / \x(t)  z(t)
\ dt /
/
2\ / / d \ / d \\ / d \ / 1 4
+ y(t) / x(t)  x(t) + y(t)  y(t)  z(t) + 2   y(t)
\ \ dt / \ dt // \ dt / \\ 2
2
4 1 2 2 1 2 2\ / d \
+ x(t)   y(t) z(t) +  x(t) y(t)   x(t)
2 2 / \ dt /
/ 2 2 1 2\ / d \ / d \
+ 3 x(t) + y(t) +  z(t)   y(t) y(t) x(t)  x(t)
\ 3 / \ dt / \ dt /
2\ \
1 / 4 / 2 2\ 2 4\ / d \  
  \x(t) + \z(t)  y(t) / x(t)  2 y(t) /  y(t)  z(t)
2 \ dt / / /
Happy Coding,
Josh,
there's a simpler set of expressions, not using x,y,z
ReplyDeletecoordinates. see Binney and Tremaine (as always!)
so  I wouldn't use these since it is very easy to make a coding mistake, plus the recomputing x,y,z <> r,phi,theta takes too much computing time.
I think you need to use r,phi,theta only.
It's even simpler if you use R,phi,z (cylindrical) only,
but for the purpose of computing tau(r,phi) you need the theta grid.
Let's do this: show me how a 2D code works, how you plot and do animations of a 2D disk with 1 mil particles and then we'll think how to generalize it.
Otherwise, you'll run out of time
Pawel
[from James] I believe we're stuck converting back and forth between cartesian and spherical anyway, because (as far as I can tell) OpenGL only uses cartesian coordinates for its display functions; so our programs can do the phyiscs in spherical (or cylindrical or polar), but must nonetheless then convert (r,phi,theta) to (x,y,z) for the display.
ReplyDelete[from Josh] This is true James. For each particle you need to do 5 trig functions and 3 multiplications since OpenGL only accept cartesian. So say that each trig function is 10 flops then each particle does 53 flops per frame display. 53 MFlops for million particles. In any case we only need to display every 10th frame or so. I see what Pawel means though we are running out of time.
ReplyDelete