// draw_sphere_deriv.java sphereical coordinates // x = r cos(theta) sin(phi) 0 < theta < 2 Pi // y = r sin(theta) sin(phi) 0 < phi < Pi restricted for derivatives // z = r cos(phi) r < 0 restricted for derivatives // r = sqrt(x^2+y^2+z^2) // theta = arctan(y,x) if theta<0 then theta = 2 Pi - theta // phi = arctan(sqrt(x^2+y^2),z) // // compute del U(radius,theta,phi) r=radius, t=theta angle, p=phi angle // del U = (d/dr U, 1/(r*sin(p)) d/dt U, (1/r) d/dp U) // // compute del^2 U(radius,theta,phi) r=radius, t=theta angle, p=phi angle // del^2 U = (1/r^2) d/dr(r^2 d/dr U) + 1/(r^2 sin(p)^2) d^2/dt^2 U + // (1/(r^2 sin(p) d/dp(sin(p) d/dp U) // = (2/r) d/dr U + d^2/dr^2 U + (1/(r^2 sin(p)^2) d^2/dt^2 U + // (cos(p)/(r^2 sin(t)) d/dp U + (1/(r^2)) d^2/dp^2 U import java.awt.*; import java.awt.event.*; import java.text.*; import java.io.*; // uses nuderiv,java public class draw_sphere_deriv extends Frame { double Pi = 3.1415926535897932384626433832795028841971; int Nr = 5; double Rmin = 0.3; double Rmax = 1.0; int Nt = 7; double Tmin = 0.1; double Tmax = 300.0*Pi/180.0; int Np = 5; double Pmin = 0.2; double Pmax = Pi-0.5; double Rg[] = new double[Nr]; // r grid values double Tg[] = new double[Nt]; // theta grid values double Pg[] = new double[Np]; // p grid values int Nrtp = Nr*Nt*Np; double Ua[] = new double[Nrtp]; double Cr[] = new double[Nr]; // first deriv wrt r double Crr[] = new double[Nr]; // second deriv wrt r double Ct[] = new double[Nt]; // first deriv wrt t double Ctt[] = new double[Nt]; // second deriv wrt t double Cp[] = new double[Np]; // first deriv wrt p double Cpp[] = new double[Np]; // second deriv wrt p double R, T, P, Ana, Cmp, Err; double Urv, Urrv, Utv, Uttv, Upv, Uppv; // computed derivatives double x, y, z, rtr, ttr, ptr; double Maxerrur=0.0, Maxerrurr=0.0, Maxerrut=0.0, Maxerrutt=0.0; double Maxerrup=0.0, Maxerrupp=0.0, Maxerr=0.0, Maxerrlap=0.0; // for plotting int width = 500; int height = 500; double xmin = -1.0; double xmax = 1.0; double ymin = -1.0; double ymax = 1.0; double zmin = -1.0; double zmax = 1.0; double ya = 0.5; // orthographic typ 0.1 to 0.5 double xs = (0.666*(width-100))/(xmax-xmin); double ys = (0.666*(height-100))/(ymax-ymin); int xp, yp; // computed by parab draw_sphere_deriv() { System.out.println("draw_sphere_deriv.java starting"); System.out.println("r gird values, not equally spaced"); Rg[0] = 0.3; Rg[1] = 0.5; Rg[2] = 0.7; Rg[3] = 0.9; Rg[4] = 1.0; for(int I=0; I9) {g.setColor(Color.gray); return; } switch(i) { case 0: g.setColor(Color.black); break; case 1: g.setColor(Color.pink); break; // should be brown case 2: g.setColor(Color.red); break; case 3: g.setColor(Color.orange); break; case 4: g.setColor(Color.yellow); break; case 5: g.setColor(Color.green); break; case 6: g.setColor(Color.blue); break; case 7: g.setColor(Color.magenta); break; case 8: g.setColor(Color.cyan); break; case 9: g.setColor(Color.gray); break; } } // end set_color void write_file() { BufferedWriter outp; PrintWriter file_out; double x, y, z; double rgv, tgv, pgv; // steping values for plot try { outp = new BufferedWriter(new FileWriter("spherical_deriv.plot")); file_out = new PrintWriter(outp); } catch(Exception e) { System.out.println("could not open spherical_deriv.plot for write "); return; } file_out.println("set hidden3d "); file_out.println("set xrange ["+xmin+":"+xmax+"]"); file_out.println("set yrange ["+ymin+":"+ymax+"]"); file_out.println("splot \"spherical_deriv.dat\" with lines "); file_out.println("exit"); file_out.close(); try { outp = new BufferedWriter(new FileWriter("spherical_deriv.dat")); file_out = new PrintWriter(outp); } catch(Exception e) { System.out.println("can't open spherical.dat for write"); return; } for(int I=0; Ipgv+0.1) { pgv = pgv + 0.1; x = Rg[I]*Math.cos(Tg[J])*Math.sin(pgv); y = Rg[I]*Math.sin(Tg[J])*Math.sin(pgv); z = Rg[I]*Math.cos(pgv); file_out.println(x+" "+y+" "+z); } // end while x = Rg[I]*Math.cos(Tg[J])*Math.sin(Pg[K+1]); y = Rg[I]*Math.sin(Tg[J])*Math.sin(Pg[K+1]); z = Rg[I]*Math.cos(Pg[K+1]); file_out.println(x+" "+y+" "+z); } // end if } // end loop K file_out.println(" "); } // end loop J } // end loop I for(int J=0; Jtgv+0.1) { tgv = tgv + 0.1; x = Rg[I]*Math.cos(tgv)*Math.sin(Pg[K]); y = Rg[I]*Math.sin(tgv)*Math.sin(Pg[K]); z = Rg[I]*Math.cos(Pg[K]); file_out.println(x+" "+y+" "+z); } // end while x = Rg[I]*Math.cos(Tg[J+1])*Math.sin(Pg[K]); y = Rg[I]*Math.sin(Tg[J+1])*Math.sin(Pg[K]); z = Rg[I]*Math.cos(Pg[K]); file_out.println(x+" "+y+" "+z); } // end if } // end J } // end I } // end K file_out.close(); System.out.println("wrote spherical_deriv.dat for gnuplot plotting "); System.out.println(" "); } // end write_file public static void main (String[] args) { new draw_sphere_deriv(); } } // end draw_sphere_deriv.java