/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/* * (#) Particle Orbit around Schwarzshild Black Hole * * * * 97/02/10 by T.Murauchi * *_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/* */ import java.applet.Applet; import java.awt.*; public class Particle extends Applet { static double re,se,alpha,r0,s0,vr0,vs0,dt0,tend0; static double pai,paideg,xe,ze,tend,rmax,rmax0,dt,x0,y0; static int mesh,nr; Panel inputpanel,controlpanel,checkpanel; Panel pre,pse,palpha,pr0,ps0,pvr0,pvs0,pdt0,ptend0; Label lre,lse,lalpha,lr0,ls0,lvr0,lvs0,ldt0,ltend0; TextField tre,tse,talpha,tr0,ts0,tvr0,tvs0,tdt0,ttend0; Checkbox axis,relative; Button calcu,res; Choice example; Particle_Canvas p_canvas; Title_Canvas t_canvas; Variable_Canvas v_canvas; public void init() { re = 25; se = 0; alpha = 30; r0 = 10; s0 = 0; vr0 = 0; vs0 = 0.2; dt0 = 0; tend0 = 4; mesh = 0; nr = 0; setData(); lre = new Label("Re"); lse = new Label("Se"); lalpha = new Label("Alpha"); lr0 = new Label("R0"); ls0 = new Label("F0"); lvr0 = new Label("Vr0"); lvs0 = new Label("Vs0"); ldt0 = new Label("dt"); ltend0 = new Label("END"); tre = new TextField("25",5); tse = new TextField("0",5); talpha = new TextField("30",5); tr0 = new TextField("10",5); ts0 = new TextField("0",5); tvr0 = new TextField("0",5); tvs0 = new TextField("0.2",5); tdt0 = new TextField("0",5); ttend0 = new TextField("4",5); pre = new Panel(); pse = new Panel(); palpha = new Panel(); pr0 = new Panel(); ps0 = new Panel(); pvr0 = new Panel(); pvs0 = new Panel(); pdt0 = new Panel(); ptend0 = new Panel(); pre.setLayout(new FlowLayout(FlowLayout.RIGHT)); pse.setLayout(new FlowLayout(FlowLayout.RIGHT)); palpha.setLayout(new FlowLayout(FlowLayout.RIGHT)); pr0.setLayout(new FlowLayout(FlowLayout.RIGHT)); ps0.setLayout(new FlowLayout(FlowLayout.RIGHT)); pvr0.setLayout(new FlowLayout(FlowLayout.RIGHT)); pvs0.setLayout(new FlowLayout(FlowLayout.RIGHT)); pdt0.setLayout(new FlowLayout(FlowLayout.RIGHT)); ptend0.setLayout(new FlowLayout(FlowLayout.RIGHT)); pre.add(lre); pre.add(tre); pse.add(lse); pse.add(tse); palpha.add(lalpha); palpha.add(talpha); pr0.add(lr0); pr0.add(tr0); ps0.add(ls0); ps0.add(ts0); pvr0.add(lvr0); pvr0.add(tvr0); pvs0.add(lvs0); pvs0.add(tvs0); pdt0.add(ldt0); pdt0.add(tdt0); ptend0.add(ltend0); ptend0.add(ttend0); inputpanel = new Panel(); inputpanel.setLayout(new GridLayout(9,1)); inputpanel.add(pre); inputpanel.add(pse); inputpanel.add(palpha); inputpanel.add(pr0); inputpanel.add(ps0); inputpanel.add(pvr0); inputpanel.add(pvs0); inputpanel.add(pdt0); inputpanel.add(ptend0); example = new Choice(); example.addItem("example 1"); example.addItem("example 2"); example.addItem("example 3"); example.addItem("example 4"); example.addItem("example 5"); calcu = new Button("Calculate"); res = new Button("Reset"); axis = new Checkbox("Draw Coordinates Lattice"); relative = new Checkbox("Ignore Relativistic Effect"); checkpanel = new Panel(); checkpanel.setLayout(new GridLayout(2,1)); checkpanel.add(axis); checkpanel.add(relative); controlpanel = new Panel(); controlpanel.setLayout(new FlowLayout(FlowLayout.CENTER)); controlpanel.add(example); controlpanel.add(calcu); controlpanel.add(res); controlpanel.add(checkpanel); p_canvas = new Particle_Canvas(); t_canvas = new Title_Canvas(); v_canvas = new Variable_Canvas(); p_canvas.setBackground(Color.black); t_canvas.setBackground(Color.orange); v_canvas.setBackground(Color.orange); t_canvas.resize(size().width,30); v_canvas.resize(250,size().height); setBackground(Color.orange); setLayout(new BorderLayout()); add("Center",p_canvas); add("West",inputpanel); add("South",controlpanel); add("North",t_canvas); add("East",v_canvas); } public boolean action(Event e, Object o) { String label = o.toString(); if (e.target instanceof Button) { if (label.equals("Calculate")) { re = Double.valueOf(tre.getText()).doubleValue(); se = Double.valueOf(tse.getText()).doubleValue(); alpha = Double.valueOf(talpha.getText()).doubleValue(); r0 = Double.valueOf(tr0.getText()).doubleValue(); s0 = Double.valueOf(ts0.getText()).doubleValue(); vr0 = Double.valueOf(tvr0.getText()).doubleValue(); vs0 = Double.valueOf(tvs0.getText()).doubleValue(); dt0 = Double.valueOf(tdt0.getText()).doubleValue(); tend0 = Double.valueOf(ttend0.getText()).doubleValue(); if (axis.getState() == true) { mesh = 1; } else { mesh = 0; } if (relative.getState() == true) { nr = 1; } else { nr = 0; } setData(); p_canvas.repaint(); } else { example.select("example 1"); setState("25","0","30","10","0","0","0.2","0","4",false,false); } } if (e.target instanceof Choice) { if (label.equals("example 1")) { setState("25","0","30","10","0","0","0.2","0","4",false,false); } if (label.equals("example 2")) { setState("25","50","25","10","0","0","0.2","0","4",true,false); } if (label.equals("example 3")) { setState("10000","0","0.6","100","0","0","0.03","0","5",false,false); } if (label.equals("example 4")) { setState("10000","0","0.6","100","0","0","0.03","0","1",false,true); } if (label.equals("example 5")) { setState("25","0","9","3","0","0","0.577","0","7",false,false); } } return true; } public void setState(String re,String se,String alpha,String r0,String s0, String vr0,String vs0,String dt0,String tend0, boolean mesh,boolean nr) { tre.setText(re); tse.setText(se); talpha.setText(alpha); tr0.setText(r0); ts0.setText(s0); tvr0.setText(vr0); tvs0.setText(vs0); tdt0.setText(dt0); ttend0.setText(tend0); axis.setState(mesh); relative.setState(nr); } public void setData() { // setData 1 pai = Math.PI; paideg = pai/180; se = se*paideg; xe = re*Math.sin(se); ze = re*Math.cos(se); alpha = alpha*paideg; rmax = re*Math.tan(alpha); rmax0 = 10; if (rmax > 1000) { rmax0 = 1000; } else { if (rmax > 100) { rmax0 = 100; } } // setData 2 if (dt0 <= 0) { dt = Math.pow(r0,1.5)/10; } else { dt = dt0; } tend0 = tend0*pai*Math.pow(r0,1.5); tend = tend0; if (tend0 <= 0) { tend0 = pai*Math.pow(r0,1.5); tend = tend0; } x0 = r0*Math.cos(s0); y0 = r0*Math.sin(s0); } } class Particle_Canvas extends Canvas { double pai,re,rmax,rmax0,R,Z; double dt,r,s,vr,vs; double xe,ze,x,y,z; double x0,y0,r0,t0; double s1rkg,s2rkg,s3rkg,s4rkg,s5rkg,s6rkg; double xrkg,zrkg,vrkg,hrkg; int mrkg; double yrkg[] = new double[4]; double frkg[] = new double[4]; double brkg[] = new double[4]; double crkg[] = new double[4]; double fx(double X, double Y, double Z) { return re*Y*re/(re*re-xe*X-ze*Z); } double fy(double X, double Y, double Z) { return (xe*Z-ze*X)*re/(re*re-xe*X-ze*Z); } double gx(double phi, double R) { return R*Math.cos(phi); } double gy(double phi, double R) { return R*Math.sin(phi); } public void paint(Graphics g) { pai = Particle.pai; rmax = Particle.rmax; rmax0 = Particle.rmax0; re = Particle.re; xe = Particle.xe; ze = Particle.ze; x0 = Particle.x0; y0 = Particle.y0; r0 = Particle.r0; s1rkg = 0.2928932188134527; s2rkg = 0.1213203435596426; s3rkg = 0.5857864376269054; s4rkg = 1.707106781186548; s5rkg = -4.121320343559643; s6rkg = 3.414213562373097; xrkg = t0; yrkg[0] = r0; yrkg[1] = Particle.s0; yrkg[2] = Particle.vr0; yrkg[3] = r0*Particle.vs0; mrkg = 1; Rectangle c = bounds(); double xrate = c.width/(2*rmax); double yrate = c.height/(2*rmax); g.setColor(new Color(13,100,219)); for (int i = 0 ; i <= 2; i++) { g.drawRect(i,i,c.width-1-2*i,c.height-1-2*i); } for (int i = 1; i <=3; i++) { g.drawLine(i*c.width/4,0,i*c.width/4,c.height/40); g.drawLine(i*c.width/4,c.height,i*c.width/4,c.height-c.height/40-1); g.drawLine(0,i*c.height/4,c.width/40,i*c.height/4); g.drawLine(c.width,i*c.height/4,c.width-c.width/40-1,i*c.height/4); } g.setColor(Color.red); R = 1; Z = 0; for (double phi = 0; phi <= 2*pai+pai/20; phi=phi+pai/20) { g.drawLine((int)((rmax+fx(gx(phi,R),gy(phi,R),Z))*xrate), (int)((rmax-fy(gx(phi,R),gy(phi,R),Z))*yrate), (int)((rmax-fx(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*xrate), (int)((rmax-fy(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*yrate)); } if (Particle.mesh == 1) { for (int i = 1; i <= 10; i++) { R = rmax0/10*i; if (R <= 1) continue; Z = 2*Math.sqrt(R-1); if (i%5 == 0) { g.setColor(Color.pink); } else { g.setColor(Color.lightGray); } for (double phi = 0; phi <= 2*pai+pai/20; phi=phi+pai/20) { g.drawLine((int)((rmax+fx(gx(phi,R),gy(phi,R),Z))*xrate), (int)((rmax-fy(gx(phi,R),gy(phi,R),Z))*yrate), (int)((rmax+fx(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*xrate), (int)((rmax-fy(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*yrate)); } } for (int i = 0; i <= 23; i++) { double phi = pai/12*i; if (i%6 == 0) { g.setColor(Color.pink); } else { g.setColor(Color.lightGray); } for (R =1; R <= rmax; R = R+rmax/80) { Z = 2*Math.sqrt(R-1); g.drawLine((int)((rmax+fx(gx(phi,R),gy(phi,R),Z))*xrate), (int)((rmax-fy(gx(phi,R),gy(phi,R),Z))*yrate), (int)((rmax+fx(gx(phi,R+rmax/80),gy(phi,R+rmax/80),Z))*xrate), (int)((rmax-fy(gx(phi,R+rmax/80),gy(phi,R+rmax/80),Z))*yrate)); } } } g.setColor(Color.cyan); R = 3; Z = 2*Math.sqrt(R-1); for (double phi = 0; phi <= 2*pai+pai/20; phi=phi+pai/20) { g.drawLine((int)((rmax+fx(gx(phi,R),gy(phi,R),Z))*xrate), (int)((rmax-fy(gx(phi,R),gy(phi,R),Z))*yrate), (int)((rmax+fx(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*xrate), (int)((rmax-fy(gx(phi+pai/20,R),gy(phi+pai/20,R),Z))*yrate)); } g.setColor(Color.yellow); g.drawOval((int)((-rmax/40+rmax+fx(x0,y0,2*Math.sqrt(r0-1)))*xrate), (int)((-rmax/40+rmax-fy(x0,y0,2*Math.sqrt(r0-1)))*yrate), (int)(rmax/20*xrate), (int)(rmax/20*yrate)); PRNTRKG(); g.fillOval((int)((-rmax/100+rmax+fx(x,y,z))*xrate), (int)((-rmax/100+rmax-fy(x,y,z))*yrate), (int)(rmax/50*xrate), (int)(rmax/50*yrate)); zrkg = xrkg; vrkg = xrkg; while (zrkg <= Particle.tend) { if (Particle.dt0 <= 0) { dt = Math.pow(yrkg[0],1.5)/10; } else { dt = Particle.dt; } hrkg = dt/mrkg; for (int i = 1; i <= mrkg; i++) { xrkg = vrkg; FUNRKG(); for (int j = 0; j < 4; j++) { brkg[j] = hrkg*frkg[j]; yrkg[j] = yrkg[j]+0.5*brkg[j]; crkg[j] = brkg[j]; } xrkg = vrkg+0.5*hrkg; FUNRKG(); for (int j = 0; j < 4; j++) { brkg[j] = hrkg*frkg[j]; yrkg[j] = yrkg[j]+s1rkg*(brkg[j]-crkg[j]); crkg[j] = s2rkg*crkg[j]+s3rkg*brkg[j]; } xrkg = vrkg+0.5*hrkg; FUNRKG(); for (int j = 0; j < 4; j++) { brkg[j] = hrkg*frkg[j]; yrkg[j] = yrkg[j]+s4rkg*(brkg[j]-crkg[j]); crkg[j] = s5rkg*crkg[j]+s6rkg*brkg[j]; } xrkg = vrkg+hrkg; FUNRKG(); for (int j = 0; j < 4; j++) { brkg[j] =hrkg*frkg[j]; yrkg[j] = yrkg[j]+brkg[j]/6-crkg[j]/3; } vrkg = vrkg+hrkg; } zrkg = zrkg+dt; vrkg = zrkg; if (yrkg[0] <= 0) break; PRNTRKG(); mrkg = mrkg+1; g.fillOval((int)((-rmax/100+rmax+fx(x,y,z))*xrate), (int)((-rmax/100+rmax-fy(x,y,z))*yrate), (int)(rmax/50*xrate), (int)(rmax/50*yrate)); } } public void PRNTRKG() { r = yrkg[0]; s = yrkg[1]; x = r*Math.cos(s); y = r*Math.sin(s); if (r >1) { z = 2*Math.sqrt(r-1); } else { z = 0; } } public void FUNRKG() { r = yrkg[0]; vs = yrkg[3]/r; frkg[0] = yrkg[2]; frkg[1] = vs/r; frkg[2] = -0.5/(r*r)+(1-1.5/r)*vs*vs/r; frkg[3] = 0; if ( Particle.nr == 1) { frkg[2] = -0.5/(r*r)+vs*vs/r; } } } class Title_Canvas extends Canvas { public void paint(Graphics g) { g.setFont(new Font("TimesRoman",Font.PLAIN,15)); g.drawString("Particle Orbit around Schwarzshild Black Hole",120,20); } } class Variable_Canvas extends Canvas { public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(15,10,10,10); g.setColor(Color.cyan); g.drawLine(15,30,25,30); g.drawLine(15,31,25,31); g.setColor(Color.black); g.setFont(new Font("Courier",Font.PLAIN,12)); g.drawString("Black Hole",35,18); g.drawString("Last Stable Orbit",35,35); g.setFont(new Font("Courier",Font.PLAIN,10)); g.drawString("Re,Se: position of view point",15,110); g.drawString(" [spherical coordinates (R, Sita, Fai)]",15,120); g.drawString("Alpha: extent of veiwing field",15,150); g.drawString("R0,F0: initial position of particle",15,180); g.drawString(" [polar coordinates (R, Fai)]",15,190); g.drawString("Vr0,Vs0: initial velocity of particle",15,220); g.drawString("dt: time step",15,250); g.drawString("END: end of calculation",15,280); } }