水分子のページに戻る
トップページ(2電子原子も含む新ボーア模型)
このプログラムは少し長いので、下に示すソースプログラムをコピーして、テキストエディタ(メモ帳など)にそのまま貼り付けて、コンパイルすれば簡単に実行できる。
このプログラムの class file name は H2OW なので、このデキストエディタを "H2OW.java" のファイル名で保存してコンパイルしてほしい。
このプログラムでは、酸素原子核(灰色の円)は、(9285.6 MM, 12499 MM, 7857 MM) に位置している。
また、O-H, H-H の結合長はそれぞれ、9584 MM と 15150 MM である。
ここでは、新しい単位として ( 1 MM = 10-14 meter, 1 SS = 10-21 second, 1 MM/SS = 107 m/s ) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Y (MM), +Z (MM)) は、この原子核からの”相対的な”位置座標を示している。
(電子 0-5 は酸素原子核 (O)からの相対座標、電子 6 は水素原子核 (H0) からの相対座標、電子 7 は水素原子核 (H1) からの相対座標である。)
"nuc (MM)" は、これらの原子核と各電子の距離を示す。
V (eV) と T (eV) は、それぞれ位置と運動エネルギーである。
"VX: VY: VZ" は電子の初速度の各成分の比を示している。
つまり、(VX: VY; VZ)=(100:100;0) は、(VX: VY: VZ) = (10:10:0) と同じ意味である。
スクロールバーの中から、ド・ブロイ波 (wn) の数 (0.1 -- 2.0) を選んで、"orbit" ボタンをクリックすると、このプログラムは、軌道に含まれるド・ブロイ波の数が wn になるまで電子軌道計算を続ける。
それから、"retur" ボタンをクリックすると、すべての電子は、また最初のスタートラインの状態に戻ることができる。
また、"initi" ボタンをクリックすると、各座標と各速度はすべて、一番最初の設定値に初期化される。
また、各電子の座標と速度ベクトルの方向は、テキストボックス内の値をかえて、"Enter" キーを押せば、自由に変更可能である。
また、"radiu" ボタンの下のテキストボックスに a (MM) の値を入力して "radiu" ボタンをクリックすれば、Fig.1 に示すように、6つの電子の正八面体の大きさ(半径)が変化する。
また、最後の行のスクロールバーの中の電子の番号 (el0-el7)を二つ選んで、その横のテキストボックスに値 (eV) を入力して、"Enter" キーを押すと、指定された電子間で、入力した量の運動エネルギーが移動する。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class H2OW extends JPanel // visualization of H2O(water)
{
public static void main(String arg[])
{
JFrame frame = new JFrame("H2O (water)");
J2DPanel j2dpanel = new J2DPanel();
frame.getContentPane().add(j2dpanel); frame.setSize(1180,700);
frame.setVisible(true); frame.setBackground(Color.black);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // oxygen only
}
}
class J2DPanel extends JPanel implements AdjustmentListener, ActionListener
{
double pai=3.141592653589793; double epsi=8.85418781787346e-12;
double h=6.62606896e-34; double elc=1.60217653e-19;
double me=9.1093826e-31; double suh=5200.0*5200.0; // suh=(Bohr radius)^2
JTextField elp[][]=new JTextField[8][9]; JTextField impho[]=new JTextField[2];
JTextField mmpho[]=new JTextField[3]; // elp=each electron's parameter
JButton b1=new JButton("orbit"); JButton b2=new JButton("retur");
JButton b3=new JButton("radiu"); JButton b4=new JButton("initi");
String ope[]={"0.1","0.3","0.5","0.7","0.9","1.1","1.3","1.5","1.7","1.9","2.0"};
String ompe[]={"el0","el1","el2","el3","el4","el5","el6","el7"};
String oppe[]={"el0","el1","el2","el3","el4","el5","el6","el7"};
// scrollbar
JComboBox coom=new JComboBox(ope); JComboBox coom2=new JComboBox(ompe);
JComboBox coom3=new JComboBox(oppe);
double rtw=Math.sqrt(2); double rth=Math.sqrt(3); double rsi=Math.sqrt(6); double rfi=Math.sqrt(5);
int marki[]={0,0,0,0,0,0,0}; double hpr[][]=new double[8][9]; double hhpr[][]=new double[8][9];
// marki=marking, hpr(hhpr)=parameters of each electron
// nux=three nuclear coordinates and charge
// nux[0][]=O nuc, nux[1][]=H0 nuc, nux[2][]=H1 nuc
double nux[][]={{9285.64, 12499.9, 7857.08, 6.0},
{5870.79/rth+9285.64, 12499.9-7575.40, (5870.79*rtw)/rth+7857.08, 1.0},
{5870.79/rth+9285.64, 12499.90+7575.40,(5870.79*rtw)/rth+7857.08, 1.0}};
// te1=initial conditions of each electron
double te1[][]={{1775.0,-3376.05, 2551.65,64.32,866,505,0}, {1875.0,2947.59,2951.62, 65.69, -866,500,0},
{-1875.0,3247.59,-2651.66, 64.7, -866,-475.3,0}, {-1875.0,-3247.6,-2651.66, 63.11, 866,-484.4,0},
{3700.0, 0, -2651.66, 64.6, 89.0,999,0}, {-3700.0, 0, 2651.62, 64.66, -20, -999,0},
{-2700.0, 1100.0, 3705.59, 15.2, 10,35,-42}, {1947.5,-400.0,-4400.0, 13.7, 0, 67, 5}};
public J2DPanel()
{
setBackground(Color.black);
JPanel p=new JPanel();
p.setLayout(new GridLayout(10,11));
String vv,zww; int aaa=0;
//elp[0-7][0-2]=each electron's relative coordinate from nucleus
for (int el=0; el <=7; el++) {
for (int pos=0; pos <=2; pos++) {
elp[el][pos]=new JTextField(7); elp[el][pos].addActionListener(this);
hpr[el][pos]=0.0; hhpr[el][pos]=0.0; // initialization of hpr,hhpr
}}
//elp[0-7][3-8]=other parameters of electrons
for (int el=0; el <=7; el++) {
for (int pos=3; pos <=8; pos++) {
elp[el][pos]=new JTextField(7); //elp[0-7][6-8]=velocity vector
if (pos > 5) {elp[el][pos].addActionListener(this);}
hpr[el][pos]=0.0; hhpr[el][pos]=0.0;
}}
for (int el=0; el <=2; el++) {
mmpho[el]=new JTextField(7);
}
impho[0]=new JTextField(7);impho[0].addActionListener(this);
impho[1]=new JTextField(7);
// layout
String sihy[]={"Electron","+ X (MM)","+ Y (MM)","+ Z (MM)","nuc (MM)",
"V (eV)","T (eV)","VX :","VY :","VZ :"," --- "};
for (int jou=0; jou <=10; jou++) {
p.add(new Label(sihy[jou]));
}
// row of each electron
p.add(new Label("ele "+0+" "));
for (int jou=0; jou <=8; jou++) { p.add(elp[0][jou]);} p.add(b4);
p.add(new Label("ele "+1+" "));
for (int jou=0; jou <=8; jou++) { p.add(elp[1][jou]);} p.add(b3);
p.add(new Label("ele "+2+" "));
for (int jou=0; jou <=8; jou++) { p.add(elp[2][jou]);} p.add(impho[1]);
p.add(new Label("ele "+3+" "));
for (int jou=0; jou <=8; jou++) { p.add(elp[3][jou]);} p.add(new Label(" --- "));
for (int el=4; el <=7; el++) {
p.add(new Label("ele "+el+" "));
for (int jou=0; jou <=8; jou++) { p.add(elp[el][jou]);}
p.add(new Label(" --- "));
}
// last row
p.add(new Label("O nucleus"));
for (int jou=0; jou <=2; jou++) { p.add(mmpho[jou]);}
p.add(b1); p.add(coom); p.add(b2); p.add(impho[0]);
p.add(coom2); p.add(new Label(" to ")); p.add(coom3);
coom.setSelectedItem("1.9"); coom2.setSelectedItem("el0"); coom3.setSelectedItem("el1");
b1.addActionListener(this);b2.addActionListener(this);
b3.addActionListener(this);b4.addActionListener(this);
add(p,"South");
impho[0].setText("0.1"); impho[1].setText("3750.00");
// set initial condition of each electron
for (int el=0; el <=7; el++) {
double nnuc=Math.sqrt(te1[el][0]*te1[el][0]+te1[el][1]*te1[el][1]+te1[el][2]*te1[el][2]);
aaa=(int)(nnuc*100); nnuc=aaa/100.0;
elp[el][3].setText(Double.toString(nnuc)); // show distance between nuclei and electrons
for (int jou=0; jou <=2; jou++) {
hpr[el][jou]=te1[el][jou];
if (el < 6) {hpr[el][jou]=hpr[el][jou]+nux[0][jou];}
if (el==6) {hpr[el][jou]=hpr[el][jou]+nux[1][jou];}
if (el==7) {hpr[el][jou]=hpr[el][jou]+nux[2][jou];}
hhpr[el][jou]=hpr[el][jou]; elp[el][jou].setText(Double.toString(te1[el][jou]));}
for (int jou=3; jou <=6; jou++) {
hpr[el][jou+2]=te1[el][jou]; hhpr[el][jou+2]=hpr[el][jou+2];
elp[el][jou+2].setText(Double.toString(te1[el][jou])); }
}
} // public J2DPanel() end
public void adjustmentValueChanged(AdjustmentEvent e) {
repaint(); }
public void actionPerformed(ActionEvent e) { // change textfield or put button
String ss;
int RR, RRR; double Rf1,Rf2,Rf3,Rf4; int teis=0;
for (int ett=0; ett <=7; ett++) { // when electron's positions change
for (int sws=0; sws <=2; sws++) {
if (e.getSource()==elp[ett][sws] && marki[2] !=2) {marki[4]=1;
ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss); Rf2=0.0;
// change relative coordinate to absolute coordinate
if (ett < 6) {Rf2=Rf1+nux[0][sws];}
if (ett==6) {Rf2=Rf1+nux[1][sws];}
if (ett==7) {Rf2=Rf1+nux[2][sws];}
Rf3=Rf2/71.428; // change MM to pixel
// upper and lower limits of coordinates
if (Rf3 > 319 && sws==0) {Rf3=319; Rf2=Rf3*71.428; teis=1;}
if (Rf3 > 349 && sws==2) {Rf3=349; Rf2=Rf3*71.428; teis=1;}
if (Rf3 > 349 && sws==1) {Rf3=349; Rf2=Rf3*71.428; teis=1;}
if (Rf3 < 1) {Rf3=1; Rf2=Rf3*71.428; teis=1;}
hpr[ett][sws]=Rf2; hhpr[ett][sws]=Rf2;
if (ett < 6) {Rf1=Rf2-nux[0][sws];}
if (ett==6) {Rf1=Rf2-nux[1][sws];}
if (ett==7) {Rf1=Rf2-nux[2][sws];}
if (teis==1) {RR=(int)(100*Rf1); Rf1=RR/100.0;elp[ett][sws].setText(Double.toString(Rf1));}
}}}
// marki[2] becomes 2 only after orbit calculation
if (e.getSource() == b1 && marki[2] !=2 ) {marki[0]=1;} // put "orbit" button
if (e.getSource() == b2 && marki[2]==2 ) {marki[1]=1;} // put "return" button
if (e.getSource() == b4 && marki[2] !=2) { // put "initial" button
marki[3]=1;
for (int el=0; el <=7; el++) {
for (int jou=0; jou <=2; jou++) {
hpr[el][jou]=te1[el][jou];
if (el < 6) {hpr[el][jou]=hpr[el][jou]+nux[0][jou];}
if (el==6) {hpr[el][jou]=hpr[el][jou]+nux[1][jou];}
if (el==7) {hpr[el][jou]=hpr[el][jou]+nux[2][jou];}
hhpr[el][jou]=hpr[el][jou]; elp[el][jou].setText(Double.toString(te1[el][jou]));}
for (int jou=3; jou <=6; jou++) {
hpr[el][jou+2]=te1[el][jou]; hhpr[el][jou+2]=hpr[el][jou+2];
elp[el][jou+2].setText(Double.toString(te1[el][jou])); }
}
}
if (e.getSource()==impho[0] && marki[2] !=2) {marki[5]=1;}
if (e.getSource()==b3 && marki[2] !=2 ) {
marki[4]=1; ss=impho[1].getText(); Rf1=Double.parseDouble(ss);
Rf2=Rf1/rtw; Rf3=(rth*Rf1)/2.0; Rf4=Rf1/2.0;
hpr[0][0]=Rf4+nux[0][0]; hpr[1][0]=hpr[0][0]; hpr[2][0]=nux[0][0]-Rf4; hpr[3][0]=hpr[2][0];
hpr[0][1]=nux[0][1]-Rf3; hpr[3][1]=hpr[0][1]; hpr[1][1]=nux[0][1]+Rf3; hpr[2][1]=hpr[1][1];
hpr[4][0]=nux[0][0]+Rf1; hpr[5][0]=nux[0][0]-Rf1; hpr[4][1]=nux[0][1]; hpr[5][1]=hpr[4][1];
hpr[0][2]=nux[0][2]+Rf2; hpr[1][2]=hpr[0][2]; hpr[5][2]=hpr[0][2];
hpr[2][2]=nux[0][2]-Rf2; hpr[3][2]=hpr[2][2]; hpr[4][2]=hpr[2][2];
for (int ett=0; ett <=5; ett++) {
for (int sws=0; sws <=2; sws++) { // calculate the values to two decimal places
RR=(int)(100*(hpr[ett][sws]-nux[0][sws])); Rf1=RR/100.0;
elp[ett][sws].setText(Double.toString(Rf1)); hhpr[ett][sws]=hpr[ett][sws];
}}
}
repaint();
}
public void update(Graphics g)
{
paint(g);
}
public void paintComponent(Graphics g)
{
double kro,krr,krk,pot,pota,potb,gx,gy,gz,ggx,ggy,ggz,ttav,toav;
int ex,ey,ez,xk,yk,zk; String ww,pyw;
double rhp[][]= {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
double mmp[]={0,0,0};
if (marki[2] !=2 && marki[3] !=1) { // get values from textfields
for (int ett=0; ett <=7; ett++) {
for (int sws=0; sws <=2; sws++) {
ww=elp[ett][sws].getText(); hpr[ett][sws]=Double.parseDouble(ww);
if (ett < 6) {hpr[ett][sws]=hpr[ett][sws]+nux[0][sws];}
if (ett==6) {hpr[ett][sws]=hpr[ett][sws]+nux[1][sws];}
if (ett==7) {hpr[ett][sws]=hpr[ett][sws]+nux[2][sws];}
hhpr[ett][sws]=hpr[ett][sws]; ww=elp[ett][sws+6].getText();
hpr[ett][sws+6]=Double.parseDouble(ww); hhpr[ett][sws+6]=hpr[ett][sws+6];
}} }
if (marki[1]==1) { // return to the condition before orbiting
for (int qz=0; qz <=7; qz++) {
for (int ka=0; ka <=8; ka++) {
hhpr[qz][ka]=hpr[qz][ka]; gx=hpr[qz][ka];
ex=(int)(100*hpr[qz][ka]); gx=ex/100.0;
if (qz < 6 && ka < 3) {ex=(int)(100*(hpr[qz][ka]-nux[0][ka])); gx=ex/100.0; }
if (qz==6 && ka < 3) {ex=(int)(100*(hpr[qz][ka]-nux[1][ka])); gx=ex/100.0; }
if (qz==7 && ka < 3) {ex=(int)(100*(hpr[qz][ka]-nux[2][ka])); gx=ex/100.0; }
elp[qz][ka].setText(Double.toString(gx));
marki[1]=0; marki[2]=0;
}}}
if (marki[2] !=2) {
toav=0.0; // toav=total potential energy
for (int yp=0; yp <=7; yp++) {
for (int kj=0; kj <=7; kj++) { // interaction between electrons
if (yp < kj ) {
// kro= distance between two electrons (yp and kj)
kro=Math.sqrt((hpr[yp][0]-hpr[kj][0])*(hpr[yp][0]-hpr[kj][0])+
(hpr[yp][1]-hpr[kj][1])*(hpr[yp][1]-hpr[kj][1])+
(hpr[yp][2]-hpr[kj][2])*(hpr[yp][2]-hpr[kj][2]));
if (kro==0) {kro=5000.0;}
// pot=potential energy between electrons
pot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
// rhp[][0]=potential energy of each electron
rhp[yp][0]=rhp[yp][0]+pot/2; rhp[kj][0]=rhp[kj][0]+pot/2;
toav=toav+pot;
} } }
for (int rv=0; rv <=7; rv++) { // kro=distance between electron and O nucleus
kro=Math.sqrt((hpr[rv][0]-nux[0][0])*(hpr[rv][0]-nux[0][0])+
(hpr[rv][1]-nux[0][1])*(hpr[rv][1]-nux[0][1])+
(hpr[rv][2]-nux[0][2])*(hpr[rv][2]-nux[0][2]));
if (kro == 0) {kro=5000.0;}
pot =-6.0/kro; // show kro (to two decimal place) in ele 0-5
if (rv < 6) {ex=(int)(100*kro); gx=ex/100.0; elp[rv][3].setText(Double.toString(gx));}
// krr=distance between electron and H0 nucleus
krr=Math.sqrt((hpr[rv][0]-nux[1][0])*(hpr[rv][0]-nux[1][0])+
(hpr[rv][1]-nux[1][1])*(hpr[rv][1]-nux[1][1])+
(hpr[rv][2]-nux[1][2])*(hpr[rv][2]-nux[1][2]));
if (krr ==0) {krr=5000.0;}
pota=-1.0/krr; // show krr (to two decimal places) in ele 6
if (rv==6) {ex=(int)(100*krr); gx=ex/100.0; elp[rv][3].setText(Double.toString(gx));}
// krk=distance between electron and H1 nucleus
krk=Math.sqrt((hpr[rv][0]-nux[2][0])*(hpr[rv][0]-nux[2][0])+
(hpr[rv][1]-nux[2][1])*(hpr[rv][1]-nux[2][1])+
(hpr[rv][2]-nux[2][2])*(hpr[rv][2]-nux[2][2]));
if (krk ==0) {krk=5000.0;}
potb=-1.0/krk; // show krk (to two decimal places) in ele 7
if (rv==7) {ex=(int)(100*krk); gx=ex/100.0; elp[rv][3].setText(Double.toString(gx));}
// ttav=potential energy between one electron and three nuclei
ttav= (elc*elc*6.241509e18*(pot+pota+potb))/(4*pai*epsi*1.0e-14);
rhp[rv][0]=rhp[rv][0]+ttav; toav=toav+ttav; //rhp[rv][1]=interaction with other nuclei
if (rv < 6) {rhp[rv][1]=(elc*elc*6.241509e18*(pota+potb))/(4*pai*epsi*1.0e-14);}
if (rv > 5) {rhp[rv][1]=(elc*elc*6.241509e18*(pot))/(4*pai*epsi*1.0e-14);}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*6*(hpr[rv][kj]-nux[0][kj]))/(kro*kro*kro); // ggx=force between electron and O nucleus
// mmp[0-2]=each component of force acting on O nucleus
mmp[kj]=mmp[kj]+ggx;
}}
gx=0.0;
for (int rv=0; rv <=7; rv++) { gx=gx+rhp[rv][0]; }
// kro=distance between O and H0 nuclei
kro=Math.sqrt((nux[0][0]-nux[1][0])*(nux[0][0]-nux[1][0])+
(nux[0][1]-nux[1][1])*(nux[0][1]-nux[1][1])+
(nux[0][2]-nux[1][2])*(nux[0][2]-nux[1][2]));
// forces between O and H0 nuclei
ggx=(suh*6*(nux[1][0]-nux[0][0]))/(kro*kro*kro); ggy=(suh*6*(nux[1][1]-nux[0][1]))/(kro*kro*kro);
ggz=(suh*6*(nux[1][2]-nux[0][2]))/(kro*kro*kro);
mmp[0]=mmp[0]-ggx; mmp[1]=mmp[1]-ggy; mmp[2]=mmp[2]-ggz;
// krr=distance between O and H1 nuclei
krr=Math.sqrt((nux[0][0]-nux[2][0])*(nux[0][0]-nux[2][0])+
(nux[0][1]-nux[2][1])*(nux[0][1]-nux[2][1])+
(nux[0][2]-nux[2][2])*(nux[0][2]-nux[2][2]));
// forces between O and H1 nuclei
ggx=(suh*6*(nux[2][0]-nux[0][0]))/(krr*krr*krr); ggy=(suh*6*(nux[2][1]-nux[0][1]))/(krr*krr*krr);
ggz=(suh*6*(nux[2][2]-nux[0][2]))/(krr*krr*krr);
mmp[0]=mmp[0]-ggx; mmp[1]=mmp[1]-ggy; mmp[2]=mmp[2]-ggz;
for (int rv=0; rv <=2; rv++) { // show forces acting on O nucleus
ex=(int)(1000*mmp[rv]); ww=Integer.toString(ex);
pyw="FX "; if (rv==1) {pyw="FY ";} if (rv==2) {pyw="FZ ";}
mmpho[rv].setText(pyw+ww);
}
krk=(nux[2][1]-nux[1][1]); // distance between two H nuclei
// pot=total potential energy
pot=toav+(elc*elc*6.241509e18*((6/kro)+(6/krr)+(1/krk)))/(4*pai*epsi*1.0e-14);
// distribute repulsive potential energy between nuclei to each electron
double ohkan=(elc*elc*6.241509e18*((6/kro)+(6/krr)))/(4*pai*epsi*1.0e-14);
double hhkan=(elc*elc*6.241509e18)/(4*pai*epsi*1.0e-14*krk);
double hiwa=0.0;
for (int rv=0; rv <=7; rv++) { hiwa=hiwa+rhp[rv][1]; }
for (int rv=0; rv <=7; rv++) {
rhp[rv][1]=rhp[rv][0]+(ohkan*rhp[rv][1])/hiwa;
if (rv > 5) {rhp[rv][1]=rhp[rv][1]+hhkan/2.0;}
}
for (int rv=0; rv <=7; rv++) { // calculate each V(eV) to two decimal places
ex=(int)(100*rhp[rv][1]); gx=ex/100.0;
hpr[rv][4]=rhp[rv][1]; hhpr[rv][4]=hpr[rv][4];
elp[rv][4].setText(Double.toString(gx)); }
gx=0.0; // gx=sum of each potential energy
for (int rv=0; rv <=7; rv++) { gx=gx+rhp[rv][1]; }
// calculate each kinetic energy from each V (eV)
gy=-469.92-pot; // -469.92 (eV)=energy of H2O, gy=total kinetic energy
if (marki[4]==1) {
for (int rv=0; rv <=7; rv++) {
gz=(gy*rhp[rv][1])/gx; hpr[rv][5]=gz; hhpr[rv][5]=gz;
ex=(int)(100*gz); gz=ex/100.0; elp[rv][5].setText(Double.toString(gz));
marki[4]=0; }
}
if (marki[5] ==1 ) { // transfer kinetic energies between electrons
String sswe; double RRWE,RRWD; int nmel1=0; int nmel2=0;
sswe=impho[0].getText(); RRWE=Double.parseDouble(sswe);
// transfer T from ele(nmel1) to ele(nmel2)
sswe=(String)coom2.getSelectedItem();
if (sswe == "el0") {nmel1=0;} if (sswe == "el1") {nmel1=1;}
if (sswe == "el2") {nmel1=2;} if (sswe == "el3") {nmel1=3;}
if (sswe == "el4") {nmel1=4;} if (sswe == "el5") {nmel1=5;}
if (sswe == "el6") {nmel1=6;} if (sswe == "el7") {nmel1=7;}
sswe=(String)coom3.getSelectedItem();
if (sswe == "el0") {nmel2=0;} if (sswe == "el1") {nmel2=1;}
if (sswe == "el2") {nmel2=2;} if (sswe == "el3") {nmel2=3;}
if (sswe == "el4") {nmel2=4;} if (sswe == "el5") {nmel2=5;}
if (sswe == "el6") {nmel2=6;} if (sswe == "el7") {nmel2=7;}
hpr[nmel1][5]=hpr[nmel1][5]-RRWE; hhpr[nmel1][5]=hpr[nmel1][5];
hpr[nmel2][5]=hpr[nmel2][5]+RRWE; hhpr[nmel2][5]=hpr[nmel2][5];
ex=(int)(100*hpr[nmel1][5]); RRWD=ex/100.0;
elp[nmel1][5].setText(Double.toString(RRWD));
ex=(int)(100*hpr[nmel2][5]); RRWD=ex/100.0;
elp[nmel2][5].setText(Double.toString(RRWD));
marki[5]=0;
}
} // if (marki !=2) end
// -------- start computing each electron's orbit ----------
if (marki[0]==1) {
double sj[][]=new double[8][13]; double wn=0.0; double nvx[][]=new double[3][4];
String pew=(String)coom.getSelectedItem(); //coom = number of de Broglie's waves
if (pew == "0.1") {wn=0.1;} if (pew == "0.3") {wn=0.3;}
if (pew == "0.5") {wn=0.5;} if (pew == "0.7") {wn=0.7;}
if (pew == "0.9") {wn=0.9;} if (pew == "1.1") {wn=1.1;}
if (pew == "1.3") {wn=1.3;} if (pew == "1.5") {wn=1.5;}
if (pew == "1.7") {wn=1.7;} if (pew == "1.9") {wn=1.9;}
if (pew == "2.0") {wn=2.0;}
for (int yp=0; yp <=2; yp++) { // change MM to meter in nuclei's coordinates
for (int kj=0; kj <=2; kj++) {
nvx[yp][kj]=nux[yp][kj]*1.0e-14; } nvx[yp][3]=nux[yp][3]; }
for (int yp=0; yp <=7; yp++) {
sj[yp][9]=0.0; // sj[][9]=number of de Broglie's waves
gx=Math.sqrt(hpr[yp][6]*hpr[yp][6]+hpr[yp][7]*hpr[yp][7]+hpr[yp][8]*hpr[yp][8]);
gy=Math.sqrt((2.0*hpr[yp][5]*1.602177e-19)/me); // gy=initial velocity (m/s)
for (int kj=0; kj <=2; kj++) { // sj[][0-2, 6-8] =electron's coordinate
sj[yp][kj] =hpr[yp][kj]; sj[yp][kj+6]=sj[yp][kj];
sj[yp][kj+3]=(gy*1.0e-7*hpr[yp][kj+6])/gx; //sj[][3-5]=each component of velocity (MM/SS)
sj[yp][kj+10]=0.0; // sj[][10-12]=each component of acceleration
}}
double ac=(elc*elc)/(4*pai*epsi*me);
do {
for (int yp=0; yp <=7; yp++) {
for (int kj=0; kj <=2; kj++) {
sj[yp][kj]=sj[yp][kj+6]+sj[yp][kj+3]; // electron's position after 1 SS
sj[yp][10+kj]=0.0;
}}
for (int yp=0; yp <=7; yp++) {
gx=sj[yp][3]*sj[yp][3]+sj[yp][4]*sj[yp][4]+sj[yp][5]*sj[yp][5];
sj[yp][9]=sj[yp][9]+(me*gx*1.0e-7)/h; // add de Broglie's waves
for (int kj=0; kj <=2; kj++) {
sj[yp][kj+6]=sj[yp][kj+6]*1.0e-14; // change MM to meter
}}
for (int yp=0; yp <=7; yp++) {
for (int kj=0; kj <=7; kj++) { // interaction between electrons
if (yp < kj) {
gy=Math.sqrt((sj[yp][6]-sj[kj][6])*(sj[yp][6]-sj[kj][6])+
(sj[yp][7]-sj[kj][7])*(sj[yp][7]-sj[kj][7])+(sj[yp][8]-sj[kj][8])*(sj[yp][8]-sj[kj][8]));
for (int rv=0; rv <=2; rv++) { // change velocity vector by other electrons
gx=(1.0e-28*ac*(sj[yp][rv+6]-sj[kj][rv+6]))/(gy*gy*gy);
sj[yp][rv+10]=sj[yp][rv+10]+gx ;sj[kj][rv+10]=sj[kj][rv+10]-gx ;
} } } }
for (int yp=0; yp <=7; yp++) { // interaction between electrons and nuclei
for (int kj=0; kj <=2; kj++) {
gy=Math.sqrt((sj[yp][6]-nvx[kj][0])*(sj[yp][6]-nvx[kj][0])+
(sj[yp][7]-nvx[kj][1])*(sj[yp][7]-nvx[kj][1])+(sj[yp][8]-nvx[kj][2])*(sj[yp][8]-nvx[kj][2]));
for (int rv=0; rv <=2; rv++) { // change velocity vector by nuclei
gx=(1.0e-28*nvx[kj][3]*ac*(sj[yp][rv+6]-nvx[kj][rv]))/(gy*gy*gy);
sj[yp][rv+10]=sj[yp][rv+10]-gx;
}}}
for (int yp=0; yp <=7; yp++) {
for (int kj=0; kj <=2; kj++) {
sj[yp][kj+6]=sj[yp][kj];
sj[yp][kj+3]=sj[yp][kj+3]+sj[yp][kj+10];
}}
} while (sj[0][9] < wn ); // repeat above until de Broglie's waves = wn
System.out.println("wn of e6 = " + sj[6][9]); // show de Broglie's waves of electron 6
marki[2]=2; marki[6]=1; marki[0]=0;
for (int yp=0; yp <=7; yp++) {
kro=Math.sqrt(sj[yp][3]*sj[yp][3]+sj[yp][4]*sj[yp][4]+sj[yp][5]*sj[yp][5]);
for (int kj=0; kj <=2; kj++) {
hhpr[yp][kj]=sj[yp][kj]; ggx=sj[yp][kj]/71.428; // change to pixel
if (ggx > 319 && kj==0) {ggx=319; hhpr[yp][kj]=ggx*71.428;}
if (ggx > 349 && kj==1) {ggx=349; hhpr[yp][kj]=ggx*71.428;}
if (ggx > 349 && kj==2) {ggx=349; hhpr[yp][kj]=ggx*71.428;}
if (ggx < 1) {ggx=1; hhpr[yp][kj]=ggx*71.428;}
yk=(int)(100*(hhpr[yp][kj]-nux[0][kj])); // change to relative coordinate
if (yp==6) {yk=(int)(100*(hhpr[yp][kj]-nux[1][kj]));}
if (yp==7) {yk=(int)(100*(hhpr[yp][kj]-nux[2][kj]));}
// show electron's coordinate
gx=yk/100.0; elp[yp][kj].setText(Double.toString(gx));
// show electron's velocity vector
ggy=(1000*sj[yp][kj+3])/kro; ex=(int)ggy; hhpr[yp][kj+6]=ggy;
elp[yp][kj+6].setText(Double.toString((double)ex));
}
ggz=Math.sqrt((hhpr[yp][0]-nux[0][0])*(hhpr[yp][0]-nux[0][0])+
(hhpr[yp][1]-nux[0][1])*(hhpr[yp][1]-nux[0][1])+(hhpr[yp][2]-nux[0][2])*(hhpr[yp][2]-nux[0][2]));
if (yp==6) {ggz=Math.sqrt((hhpr[yp][0]-nux[1][0])*(hhpr[yp][0]-nux[1][0])+
(hhpr[yp][1]-nux[1][1])*(hhpr[yp][1]-nux[1][1])+(hhpr[yp][2]-nux[1][2])*(hhpr[yp][2]-nux[1][2]));}
if (yp==7) {ggz=Math.sqrt((hhpr[yp][0]-nux[2][0])*(hhpr[yp][0]-nux[2][0])+
(hhpr[yp][1]-nux[2][1])*(hhpr[yp][1]-nux[2][1])+(hhpr[yp][2]-nux[2][2])*(hhpr[yp][2]-nux[2][2]));}
ex=(int)(100.0*ggz); ggz=ex/100.0; // calculate to two decimal places
elp[yp][3].setText(Double.toString(ggz));
}
} // if (mark[0]==1) end
int nmx[][]=new int[3][3]; int hpk[][]=new int[8][4]; int qpp[][]=new int[8][3];
if (marki[2] != 2 || marki[6]==1 ) { // show particle's picture on the screen
for (int yp=0; yp <=7; yp++) { // adjusting each velocity vector for printing
pota=Math.sqrt(60)*4.25;
potb=Math.sqrt(hhpr[yp][6]*hhpr[yp][6]+hhpr[yp][7]*hhpr[yp][7]+hhpr[yp][8]*hhpr[yp][8]);
ggx=(pota*hhpr[yp][6])/potb; qpp[yp][0]=(int)ggx;
ggx=(pota*hhpr[yp][7])/potb; qpp[yp][1]=(int)ggx;
ggx=(pota*hhpr[yp][8])/potb; qpp[yp][2]=(int)ggx;
}
for (int yp=0; yp <=2; yp++) {
for (int kj=0; kj <=2; kj++) { // change MM to pixel in nuclei
nmx[yp][kj]=(int)(nux[yp][kj]/71.428);
}}
for (int yp=0; yp <=7; yp++) {
for (int kj=0; kj <=2; kj++) { // change MM to pixel in electrons
hpk[yp][kj]=(int)(hhpr[yp][kj]/71.428);
}}
g.clearRect(9,299,1170,699);
g.setColor(Color.cyan); g.drawLine(345,310,345,660); g.drawLine(675,310,675,660);
g.setColor(Color.lightGray); // show three nuclei
g.fillOval(nmx[0][0]+10,650-nmx[0][1],20,20);g.fillOval(340+nmx[0][0],650-nmx[0][2],20,20);
g.fillOval(670+nmx[0][1],650-nmx[0][2],20,20);
g.fillOval(13+nmx[1][0],653-nmx[1][1],14,14);g.fillOval(343+nmx[1][0],653-nmx[1][2],14,14);
g.fillOval(673+nmx[1][1],653-nmx[1][2],14,14);
g.fillOval(13+nmx[2][0],653-nmx[2][1],14,14);g.fillOval(343+nmx[2][0],653-nmx[2][2],14,14);
g.fillOval(673+nmx[2][1],653-nmx[2][2],14,14);
g.setColor(Color.white); // show electron 0 (particle and velocity line)
g.fillOval(hpk[0][0]+13,653-hpk[0][1],14,14);
g.fillOval(hpk[0][0]+343,653-hpk[0][2],14,14);
g.fillOval(hpk[0][1]+673,653-hpk[0][2],14,14);
g.drawLine(hpk[0][0]+20,660-hpk[0][1], hpk[0][0]+20+qpp[0][0],660-hpk[0][1]-qpp[0][1]);
g.drawLine(hpk[0][0]+350,660-hpk[0][2], hpk[0][0]+350+qpp[0][0],660-hpk[0][2]-qpp[0][2]);
g.drawLine(hpk[0][1]+680,660-hpk[0][2],hpk[0][1]+680+qpp[0][1],660-hpk[0][2]-qpp[0][2]);
// show electron 1
g.fillOval(hpk[1][0]+13,653-hpk[1][1],14,14);
g.fillOval(hpk[1][0]+343,653-hpk[1][2],14,14);
g.fillOval(hpk[1][1]+673,653-hpk[1][2],14,14);
g.drawLine(hpk[1][0]+20,660-hpk[1][1], hpk[1][0]+20+qpp[1][0],660-hpk[1][1]-qpp[1][1]);
g.drawLine(hpk[1][0]+350,660-hpk[1][2], hpk[1][0]+350+qpp[1][0],660-hpk[1][2]-qpp[1][2]);
g.drawLine(hpk[1][1]+680,660-hpk[1][2],hpk[1][1]+680+qpp[1][1],660-hpk[1][2]-qpp[1][2]);
g.setColor(Color.red); // show electron 2
g.fillOval(hpk[2][0]+13,653-hpk[2][1],14,14);
g.fillOval(hpk[2][0]+343,653-hpk[2][2],14,14);
g.fillOval(hpk[2][1]+673,653-hpk[2][2],14,14);
g.drawLine(hpk[2][0]+20,660-hpk[2][1], hpk[2][0]+20+qpp[2][0],660-hpk[2][1]-qpp[2][1]);
g.drawLine(hpk[2][0]+350,660-hpk[2][2], hpk[2][0]+350+qpp[2][0],660-hpk[2][2]-qpp[2][2]);
g.drawLine(hpk[2][1]+680,660-hpk[2][2],hpk[2][1]+680+qpp[2][1],660-hpk[2][2]-qpp[2][2]);
// show electron 3
g.fillOval(hpk[3][0]+13,653-hpk[3][1],14,14);
g.fillOval(hpk[3][0]+343,653-hpk[3][2],14,14);
g.fillOval(hpk[3][1]+673,653-hpk[3][2],14,14);
g.drawLine(hpk[3][0]+20,660-hpk[3][1], hpk[3][0]+20+qpp[3][0],660-hpk[3][1]-qpp[3][1]);
g.drawLine(hpk[3][0]+350,660-hpk[3][2], hpk[3][0]+350+qpp[3][0],660-hpk[3][2]-qpp[3][2]);
g.drawLine(hpk[3][1]+680,660-hpk[3][2],hpk[3][1]+680+qpp[3][1],660-hpk[3][2]-qpp[3][2]);
// show electron 4
g.setColor(Color.green);
g.fillOval(hpk[4][0]+13,653-hpk[4][1],14,14);
g.fillOval(hpk[4][0]+343,653-hpk[4][2],14,14);
g.fillOval(hpk[4][1]+673,653-hpk[4][2],14,14);
g.drawLine(hpk[4][0]+20,660-hpk[4][1], hpk[4][0]+20+qpp[4][0],660-hpk[4][1]-qpp[4][1]);
g.drawLine(hpk[4][0]+350,660-hpk[4][2], hpk[4][0]+350+qpp[4][0],660-hpk[4][2]-qpp[4][2]);
g.drawLine(hpk[4][1]+680,660-hpk[4][2],hpk[4][1]+680+qpp[4][1],660-hpk[4][2]-qpp[4][2]);
// show electron 5
g.fillOval(hpk[5][0]+13,653-hpk[5][1],14,14);
g.fillOval(hpk[5][0]+343,653-hpk[5][2],14,14);
g.fillOval(hpk[5][1]+673,653-hpk[5][2],14,14);
g.drawLine(hpk[5][0]+20,660-hpk[5][1], hpk[5][0]+20+qpp[5][0],660-hpk[5][1]-qpp[5][1]);
g.drawLine(hpk[5][0]+350,660-hpk[5][2], hpk[5][0]+350+qpp[5][0],660-hpk[5][2]-qpp[5][2]);
g.drawLine(hpk[5][1]+680,660-hpk[5][2],hpk[5][1]+680+qpp[5][1],660-hpk[5][2]-qpp[5][2]);
// show electron 6
g.setColor(Color.pink);
g.fillOval(hpk[6][0]+13,653-hpk[6][1],14,14);
g.fillOval(hpk[6][0]+343,653-hpk[6][2],14,14);
g.fillOval(hpk[6][1]+673,653-hpk[6][2],14,14);
g.drawLine(hpk[6][0]+20,660-hpk[6][1], hpk[6][0]+20+qpp[6][0],660-hpk[6][1]-qpp[6][1]);
g.drawLine(hpk[6][0]+350,660-hpk[6][2], hpk[6][0]+350+qpp[6][0],660-hpk[6][2]-qpp[6][2]);
g.drawLine(hpk[6][1]+680,660-hpk[6][2],hpk[6][1]+680+qpp[6][1],660-hpk[6][2]-qpp[6][2]);
// show electron 7
g.fillOval(hpk[7][0]+13,653-hpk[7][1],14,14);
g.fillOval(hpk[7][0]+343,653-hpk[7][2],14,14);
g.fillOval(hpk[7][1]+673,653-hpk[7][2],14,14);
g.drawLine(hpk[7][0]+20,660-hpk[7][1], hpk[7][0]+20+qpp[7][0],660-hpk[7][1]-qpp[7][1]);
g.drawLine(hpk[7][0]+350,660-hpk[7][2], hpk[7][0]+350+qpp[7][0],660-hpk[7][2]-qpp[7][2]);
g.drawLine(hpk[7][1]+680,660-hpk[7][2],hpk[7][1]+680+qpp[7][1],660-hpk[7][2]-qpp[7][2]);
for (int rw=0; rw <=7; rw++) { // show each electron's number
g.setColor(Color.blue);
g.drawString(Integer.toString(rw),hpk[rw][0]+17,665-hpk[rw][1]);
g.drawString(Integer.toString(rw),hpk[rw][0]+347,665-hpk[rw][2] );
g.drawString(Integer.toString(rw),hpk[rw][1]+677,665-hpk[rw][2] );
}
marki[6]=0; marki[3]=0;
} // if (marki[2] !=2 || marki[6]==1) end
}
}