Back to the chemical bond page
Top page ( correct Bohr model including the two electron atom )
This program is a little long. So if you copy and paste the below program source code into a text editor,
you can easily compile and run this.
This program's class file name is methane, so save this text editor as "methane.java", and compile it.
In this program, nuclei are gray circles.
Here we use the new units, ( 1 MM = 10-14 meter).
Each coordinate of electrons (+X (MM), +Y (MM), +Z (MM)) in the text box means "relative" position from these nuclei.
(ele 0-3 are from carbon nucleus, ele 4 is from hydrogen nucleus 0 (H0), ele5 is from H1, ele6 is from H2, and ele 7 is from H3.)
You can change the coordinate (+X, +Y, +Z) of only electron 4 (ele4).
(Enter the values into the textbox of ele4, and press the Enter key.)
"nuc (MM)" means the distance between these nuclei and electrons.
V (eV) and T (eV) means the potential, and kinetic energies of each electron.
tV (eV) is the total potential energy.
CF of ele0-3 means the force toward the center, CF of ele4-7 means the force toward each C-H line.
(fx, fy, fz) means force components other than CF.
(FX, FY, FZ) means the force component acting on each nucleus.
Cn means the force component acting on each H nucleus toward the C nucleus.
(In this program, the informations of only two nuclei (H0 and H2) are shown.)
Waves (wn) is number of de Broglie's waves contained in one orbit.
when you choose the C-H bond length (MM) in the scrollbar and click "C-H (MM)" button, the internuclear distance of C-H change.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class methane extends JPanel // virial theorem of CH4
{
public static void main(String arg[])
{
JFrame frame = new JFrame("CH4 (methane)"); // set frame
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);
}
}
class J2DPanel extends JPanel implements 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
// textboxes: elp[0-7][]=electrons, mmpho[0-2][]=C,H0,H2 nuclei, impho=total V (eV)
JTextField elp[][]=new JTextField[8][11]; JTextField impho=new JTextField(7);
JTextField mmpho[][]=new JTextField[3][4];
JButton b1=new JButton("C-H (MM)");
String ope[]={"9500","10000","10900","11400"}; // scrollbar of C-H distances
JComboBox coom=new JComboBox(ope);
double rtw=Math.sqrt(2); double rth=Math.sqrt(3);
double rsi=Math.sqrt(6); double rfi=Math.sqrt(5);
double hpr[][]=new double[8][11]; double den=4.23; // den= central positive charge
double hpr2[][]=new double[8][11]; // hpr=each electron's parameters
double hen3=10900.0; // 10900 = C-H distance (MM)
double hen1=(hen3*rsi)/3; double hen2=hen1/rtw; double cka=12500.0;
// nux[0][0-2]=coordinates of C nucleus
// nux[1][0-2]=coordinates of H0 nucleus
// nux[2][0-2]=coordinates of H1 nucleus
// nux[3][0-2]=coordinates of H2 nucleus
// nux[4][0-2]=coordinates of H3 nucleus
double nux[][]={{cka,cka,cka}, {cka+hen1, cka, cka+hen2}, {cka-hen1, cka, cka+hen2},
{cka, cka+hen1, cka-hen2},{cka, cka-hen1, cka-hen2}};
// te1=initial coordinates of eight electrons
double ina1=5260.426; double ina2=ina1/rtw;
double te1[][]={{ina1, 0, ina2}, {-ina1, 0, ina2},
{0, ina1, -ina2}, {0, -ina1, -ina2},
{1850, -4152, 1820}, {-1850, 4152, 1820},
{4152, 1850, -1819}, {-4152, -1850, -1819}};
double te2[][]={{1400, -3289, 2500}, {1700, -2940, 2070}, {1600,-4379,2000}, {1850,-4152,1820}};
public J2DPanel()
{
setBackground(Color.black);
JPanel p=new JPanel();
p.setLayout(new GridLayout(11,12));
int aaa=0;
for (int el=0; el <=7; el++) {
for (int pos=0; pos <=2; pos++) { // hpr[][0-2]=each electron's coordinate
elp[el][pos]=new JTextField(7);
// we can input the values only in electron 4's textboxes
if (el==4) {elp[el][pos].addActionListener(this);}
hpr[el][pos]=0.0;
}}
for (int el=0; el <=7; el++) {
for (int pos=3; pos <=10; pos++) { // hpr[][3-10]=electron's other parameters
elp[el][pos]=new JTextField(7);
hpr[el][pos]=0.0;
}}
for (int el=0; el <=2; el++) { // mmpho[0-2][]=C, H0 and H2 nuc's parameters
for (int pos=0; pos <=3; pos++) {
mmpho[el][pos]=new JTextField(7);
}}
// layout
String sihy[]={"eNo ", "+X(MM)", "+Y(MM)", "+Z(MM)", "nuc(MM)",
"V(eV)", "T(eV)", "Force", "fx ", "fy", "fz", "Waves"};
for (int el=0; el <=11; el++) {
p.add(new Label(sihy[el]));
}
for (int el=0; el <=7; el++) {
if (el != 4) {
p.add(new Label(" "+el+" "));}
if (el==4) {p.add(new Label("ele 4"));}
for (int pos=0; pos <=10; pos++) {
p.add(elp[el][pos]);
}}
p.add(new Label("C nuc "));
for (int pos=0; pos <=3; pos++) {
p.add(mmpho[0][pos]);
}
p.add(new Label("H0nuc "));
for (int pos=0; pos <=3; pos++) {
p.add(mmpho[1][pos]);
}
for (int pos=0; pos <=1; pos++) {
p.add(new Label(" -- "));
}
p.add(new Label("H2nuc "));
for (int pos=0; pos <=3; pos++) {
p.add(mmpho[2][pos]);
}
p.add(impho); p.add(b1); p.add(coom);
for (int pos=0; pos <=3; pos++) {
p.add(new Label(" -- "));
}
coom.setSelectedItem("10900"); b1.addActionListener(this);
add(p,"South");
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);
elp[el][3].setText("nuc "+Integer.toString(aaa)); // show distance between nuclei and electrons
for (int jou=0; jou <=2; jou++) {
hpr[el][jou]=te1[el][jou];
if (el < 4) {hpr[el][jou]=hpr[el][jou]+nux[0][jou];}
if (el==4) {hpr[el][jou]=hpr[el][jou]+nux[1][jou];}
if (el==5) {hpr[el][jou]=hpr[el][jou]+nux[2][jou];}
if (el==6) {hpr[el][jou]=hpr[el][jou]+nux[3][jou];}
if (el==7) {hpr[el][jou]=hpr[el][jou]+nux[4][jou];}
elp[el][jou].setText(Integer.toString((int)(te1[el][jou])));
}}
} // public J2DPanel() end
public void actionPerformed(ActionEvent e) {
String ss;
int RR=0; double Rf1,Rf2; int teis=0;
for (int el=0; el <=3; el++) {
for (int jou=0; jou <=2; jou++) {
hpr[el][jou]=te1[el][jou];
hpr[el][jou]=hpr[el][jou]+nux[0][jou];
elp[el][jou].setText(Integer.toString((int)(te1[el][jou])));
}}
if (e.getSource() == b1) { // when internuclear distance change (b1 click)
ss=(String)coom.getSelectedItem();
if (ss=="10000") {hen3=10000; RR=0;} if (ss=="9500") {hen3=9500; RR=1;}
if (ss=="10900") {hen3=10900; RR=3;} if (ss=="11400") {hen3=11400; RR=2;}
hen1=(hen3*rsi)/3; hen2=hen1/rtw;
double noxx[][]={{cka,cka,cka}, {cka+hen1, cka, cka+hen2}, {cka-hen1, cka, cka+hen2},
{cka, cka+hen1, cka-hen2},{cka, cka-hen1, cka-hen2}};
for (int ett=0; ett <=4; ett++) {
for (int sws=0; sws <=2; sws++) {
nux[ett][sws]=noxx[ett][sws];
}}
for (int sws=0; sws <=2; sws++) {
elp[4][sws].setText(Integer.toString((int)(te2[RR][sws])));
hpr[4][sws]=te2[RR][sws]+nux[1][sws];
}
}
teis=0;
// when electron's 4 positions change
for (int sws=0; sws <=2; sws++) {
ss=elp[4][sws].getText(); Rf1=Double.parseDouble(ss);
// change relative coordinate to absolute coordinate
Rf2=Rf1+nux[1][sws]; hpr[4][sws]=Rf2;
// upper and lower limits of coordinates
// if (Rf2 > 24999 ) {Rf2=24999; teis=1; hpr[4][sws]=Rf2;}
if (Rf2 < nux[0][sws] && sws !=1) {Rf2=nux[0][sws]+500.0; teis=1; hpr[4][sws]=Rf2;}
if (Rf2 < 1) {Rf2=1; teis=1; hpr[4][sws]=Rf2;}
Rf1=Rf2-nux[1][sws];
if (teis==1) {elp[4][sws].setText(Integer.toString((int)(Rf1)));}
}
repaint();
}
public void update(Graphics g)
{
paint(g);
}
public void paintComponent(Graphics g)
{
double kro,krr,krk,kwr,kww,kro2,krr2,krk2,kwr2,kww2,
pot,pota,potb,potc,potd,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,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}};
double rpp[][]= {{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,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}};
double mmp[][]={{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,0}};
double teqq[][]={{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,0,0,0},{0,0,0,0,0}};
double nuckan=0.0;
kro2=0.0 ; krr2=0.0; krk2=0.0; kwr2=0.0; kww2=0.0;
//---------- calculation each coordinate besed on electron 4
hpr[5][0]=-(hpr[4][0]-nux[0][0])+nux[0][0];
hpr[5][1]=-(hpr[4][1]-nux[0][1])+nux[0][1];
hpr[5][2]=hpr[4][2];
hpr[6][0]=-(hpr[4][1]-nux[0][1])+nux[0][0];
hpr[6][1]=(hpr[4][0]-nux[0][0])+nux[0][1];
hpr[6][2]=-(hpr[4][2]-nux[0][2])+nux[0][2];
hpr[7][0]=+(hpr[4][1]-nux[0][1])+nux[0][0];
hpr[7][1]=-(hpr[4][0]-nux[0][0])+nux[0][1];
hpr[7][2]=-(hpr[4][2]-nux[0][2])+nux[0][2];
for (int yp=1; yp <=3; yp++) { // set hpr [5-7][0-2] = ele 5-7 coordinates
for (int kj=0; kj <=2; kj++) {
ex=(int)(hpr[4+yp][kj]-nux[1+yp][kj]);
elp[yp+4][kj].setText(Integer.toString(ex));
}}
for (int yp=0; yp <=3; yp++) { // hpr [0-3][0-2] = ele 0-3 coordinates don't change
for (int kj=0; kj <=2; kj++) {
ex=(int)(hpr[yp][kj]-nux[0][kj]);
elp[yp][kj].setText(Integer.toString(ex));
}}
double vvh[][]=new double[4][4];
// calculate hpr2[4-7][] = symmetric positions of ele4-7 with respect to C-H lines
for (int yp=4; yp <=7; yp++) {
for (int kj=0; kj <=2; kj++) {
vvh[0][kj]=nux[yp-3][kj]-nux[0][kj]; vvh[1][kj]=hpr[yp][kj]-nux[0][kj];
}
vvh[0][3]=Math.sqrt(vvh[0][0]*vvh[0][0]+vvh[0][1]*vvh[0][1]+vvh[0][2]*vvh[0][2]);
vvh[2][3]=(vvh[1][0]*vvh[0][0]+vvh[1][1]*vvh[0][1]+vvh[1][2]*vvh[0][2])/vvh[0][3];
for (int kj=0; kj <=2; kj++) {
vvh[2][kj]=(vvh[0][kj]*vvh[2][3])/vvh[0][3];
hpr2[yp][kj]=hpr[yp][kj]+2*(vvh[2][kj]-vvh[1][kj]);
}
}
toav=0.0; // toav=total potential energy
double ppot;
for (int yp=0; yp <=3; yp++) { // interaction between electrons 0-3
for (int kj=0; kj <=3; kj++) {
if (yp < kj ) { // kro=distance between electrons
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;} // rhp[][3]=each electron's potential energy
ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
rhp[yp][3]=rhp[yp][3]+ppot/2.0; rhp[kj][3]=rhp[kj][3]+ppot/2.0;
toav=toav+ppot;
// teqq[][3]=each electron's V only in carbon atom
teqq[yp][3]=teqq[yp][3]+ppot/2.0; teqq[kj][3]=teqq[kj][3]+ppot/2.0;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*(hpr[yp][jou]-hpr[kj][jou]))/(kro*kro*kro);
// rhp[][0-2]=force component of each electron
// teqq[][0-2]=force component of electrons only in carbon atom
rhp[yp][jou]=rhp[yp][jou]+ggx; rhp[kj][jou]=rhp[kj][jou]-ggx;
teqq[yp][jou]=teqq[yp][jou]+ggx; teqq[kj][jou]=teqq[kj][jou]-ggx;
}
}}}
for (int yp=0; yp <=3; yp++) { // interaction between electron 0-3 and electron 4-7
for (int kj=4; kj <=7; 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]));
// kro2= distance between ele0-3 and symmetric positions(=hpr2) of ele4-7
kro2=Math.sqrt((hpr[yp][0]-hpr2[kj][0])*(hpr[yp][0]-hpr2[kj][0])+
(hpr[yp][1]-hpr2[kj][1])*(hpr[yp][1]-hpr2[kj][1])+
(hpr[yp][2]-hpr2[kj][2])*(hpr[yp][2]-hpr2[kj][2]));
if (kro==0) {kro=5000.0;} if (kro2==0) {kro2=5000.0;}
ppot=(elc*elc*6.241509e18*0.5*(1.0/kro+1.0/kro2))/(4*pai*epsi*1.0e-14);
rhp[yp][3]=rhp[yp][3]+ppot/2.0; rhp[kj][3]=rhp[kj][3]+ppot/2.0;
toav=toav+ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*0.5*(hpr[yp][jou]-hpr[kj][jou]))/(kro*kro*kro);
ggy=(suh*0.5*(hpr[yp][jou]-hpr2[kj][jou]))/(kro2*kro2*kro2);
rhp[yp][jou]=rhp[yp][jou]+ggx+ggy; rhp[kj][jou]=rhp[kj][jou]-ggx*2.0;
// rpp[0-3][0-2]=force component of ele0-3 influenced only by C,H0-3 nuc, and ele4-7
rpp[yp][jou]=rpp[yp][jou]+ggx+ggy;
}
}}
for (int yp=4; yp <=7; yp++) { // interaction between electrons 4-7
for (int kj=4; kj <=7; kj++) {
if (yp < 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;}
ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
rhp[yp][3]=rhp[yp][3]+ppot/2; rhp[kj][3]=rhp[kj][3]+ppot/2;
toav=toav+ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*(hpr[yp][jou]-hpr[kj][jou]))/(kro*kro*kro);
rhp[yp][jou]=rhp[yp][jou]+ggx; rhp[kj][jou]=rhp[kj][jou]-ggx;
}
}}}
// interaction between electron and each nucleus
for (int rv=0; rv <=7; rv++) {
// -------------------- C 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])); kro2=5000.0;
if (kro == 0) {kro=5000.0;}
// kro2= distance between C nucleus and symmetric positions(=hpr2) of ele4-7
if (rv > 3) { kro2=Math.sqrt((hpr2[rv][0]-nux[0][0])*(hpr2[rv][0]-nux[0][0])+
(hpr2[rv][1]-nux[0][1])*(hpr2[rv][1]-nux[0][1])+
(hpr2[rv][2]-nux[0][2])*(hpr2[rv][2]-nux[0][2]));
if (kro2 == 0) {kro2=5000.0;}
}
pot =-den/kro; if (rv > 3) { pot=(-den/kro-den/kro2)*0.5; }
// show distance between C nuc and ele 0-3
// teqq[][3]=potential energy of each electron only in carbon atom
if (rv < 4) {ex=(int)(kro); elp[rv][3].setText("nuc "+Integer.toString(ex));
teqq[rv][3]=teqq[rv][3]+(elc*elc*6.241509e18*pot)/(4*pai*epsi*1.0e-14);
}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*den*(hpr[rv][kj]-nux[0][kj]))/(kro*kro*kro); ggy=0.0;
rhp[rv][kj]=rhp[rv][kj]-ggx;
if (rv > 3) {ggx=ggx*0.5; ggy=(suh*den*0.5*(hpr2[rv][kj]-nux[0][kj]))/(kro2*kro2*kro2);}
mmp[0][kj]=mmp[0][kj]+ggx+ggy;
// mmp[0][0-2]= force component of carbon nucleus
// rpp[0-3][0-2]=force component of ele0-3 influenced only by C,H0-3 nuc, and ele4-7
// teqq[][0-2]=force component of each electron only in carbon atom
if (rv < 4) {rpp[rv][kj]=rpp[rv][kj]-ggx;
teqq[rv][kj]=teqq[rv][kj]-ggx;}
}
// ----------------------- 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;}
if (rv > 3) { krr2=Math.sqrt((hpr2[rv][0]-nux[1][0])*(hpr2[rv][0]-nux[1][0])+
(hpr2[rv][1]-nux[1][1])*(hpr2[rv][1]-nux[1][1])+
(hpr2[rv][2]-nux[1][2])*(hpr2[rv][2]-nux[1][2]));
if (krr2 == 0) {krr2=5000.0;}
}
pota=-1.0/krr; if (rv > 3) {pota=(-1.0/krr-1.0/krr2)*0.5; }
// show distance between electron 4 and H0 nucleus
if (rv==4) {ex=(int)(krr); elp[rv][3].setText("nuc "+Integer.toString(ex));}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*(hpr[rv][kj]-nux[1][kj]))/(krr*krr*krr);
rhp[rv][kj]=rhp[rv][kj]-ggx;
// mmp[1][0-2]=force component of H0 nucleus
if (rv < 4) {mmp[1][kj]=mmp[1][kj]+ggx; }
if (rv > 3) {mmp[1][kj]=mmp[1][kj]+ggx*0.5+(suh*0.5*(hpr2[rv][kj]-nux[1][kj]))/(krr2*krr2*krr2);}
if (rv < 4) {rpp[rv][kj]=rpp[rv][kj]-ggx; }
}
// --------------------- 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;}
if (rv > 3) { krk2=Math.sqrt((hpr2[rv][0]-nux[2][0])*(hpr2[rv][0]-nux[2][0])+
(hpr2[rv][1]-nux[2][1])*(hpr2[rv][1]-nux[2][1])+
(hpr2[rv][2]-nux[2][2])*(hpr2[rv][2]-nux[2][2]));
if (krk2 ==0) {krk2=5000.0;}
}
potb=-1.0/krk; if (rv > 3) {potb=(-1.0/krk-1.0/krk2)*0.5; }
// show distance between electron 5 and H1 nucleus
if (rv==5) {ex=(int)(krk); elp[rv][3].setText("nuc "+Integer.toString(ex));}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*(hpr[rv][kj]-nux[2][kj]))/(krk*krk*krk);
rhp[rv][kj]=rhp[rv][kj]-ggx;
if (rv < 4) {rpp[rv][kj]=rpp[rv][kj]-ggx;}
}
// ------------- H2 nucleus
kwr=Math.sqrt((hpr[rv][0]-nux[3][0])*(hpr[rv][0]-nux[3][0])+
(hpr[rv][1]-nux[3][1])*(hpr[rv][1]-nux[3][1])+
(hpr[rv][2]-nux[3][2])*(hpr[rv][2]-nux[3][2]));
if (kwr ==0) {kwr=5000.0;}
if (rv > 3) { kwr2=Math.sqrt((hpr2[rv][0]-nux[3][0])*(hpr2[rv][0]-nux[3][0])+
(hpr2[rv][1]-nux[3][1])*(hpr2[rv][1]-nux[3][1])+
(hpr2[rv][2]-nux[3][2])*(hpr2[rv][2]-nux[3][2]));
if (kwr2 ==0) {krk2=5000.0;}
}
potc=-1.0/kwr; if (rv > 3) {potc=(-1.0/kwr-1.0/kwr2)*0.5; }
// show distance between electron 6 and H2 nucleus
if (rv==6) {ex=(int)(kwr); elp[rv][3].setText("nuc "+Integer.toString(ex));}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*(hpr[rv][kj]-nux[3][kj]))/(kwr*kwr*kwr);
// mmp[2][0-2]=force component of H2 nucleus
if (rv < 4) {mmp[2][kj]=mmp[2][kj]+ggx;}
if (rv > 3) {mmp[2][kj]=mmp[2][kj]+ggx*0.5+(suh*0.5*(hpr2[rv][kj]-nux[3][kj]))/(kwr2*kwr2*kwr2);}
rhp[rv][kj]=rhp[rv][kj]-ggx;
if (rv < 4) {rpp[rv][kj]=rpp[rv][kj]-ggx; }
}
// ----------------------- H3 nucleus
kww=Math.sqrt((hpr[rv][0]-nux[4][0])*(hpr[rv][0]-nux[4][0])+
(hpr[rv][1]-nux[4][1])*(hpr[rv][1]-nux[4][1])+
(hpr[rv][2]-nux[4][2])*(hpr[rv][2]-nux[4][2]));
if (kww ==0) {kww=5000.0;}
if (rv > 3) { kww2=Math.sqrt((hpr2[rv][0]-nux[4][0])*(hpr2[rv][0]-nux[4][0])+
(hpr2[rv][1]-nux[4][1])*(hpr2[rv][1]-nux[4][1])+
(hpr2[rv][2]-nux[4][2])*(hpr2[rv][2]-nux[4][2]));
if (kww2 ==0) {kww2=5000.0;}
}
potd=-1.0/kww; if (rv >3) {potd=(-1.0/kww-1.0/kww2)*0.5; }
// show distance between electron 7 and H3 nucleus
if (rv==7) {ex=(int)(kww); elp[rv][3].setText("nuc "+Integer.toString(ex));}
for (int kj=0; kj <=2; kj++) {
ggx=(suh*(hpr[rv][kj]-nux[4][kj]))/(kww*kww*kww);
rhp[rv][kj]=rhp[rv][kj]-ggx;
if (rv < 4) {rpp[rv][kj]=rpp[rv][kj]-ggx; }
}
// ttav=potential energy between one electron and nuclei
ttav= (elc*elc*6.241509e18*(pot+pota+potb+potc+potd))/(4*pai*epsi*1.0e-14);
rhp[rv][3]=rhp[rv][3]+ttav; toav=toav+ttav;
// rhp[0-7][5]=interaction between each electron and other nuclei
if (rv < 4) {rhp[rv][5]=(elc*elc*6.241509e18*(pota+potb+potc+potd))/(4*pai*epsi*1.0e-14);}
if (rv == 4) {rhp[rv][5]=(elc*elc*6.241509e18*(pot+potb+potc+potd))/(4*pai*epsi*1.0e-14);}
if (rv == 5) {rhp[rv][5]=(elc*elc*6.241509e18*(pot+pota+potc+potd))/(4*pai*epsi*1.0e-14);}
if (rv == 6) {rhp[rv][5]=(elc*elc*6.241509e18*(pot+pota+potb+potd))/(4*pai*epsi*1.0e-14);}
if (rv == 7) {rhp[rv][5]=(elc*elc*6.241509e18*(pot+pota+potb+potc))/(4*pai*epsi*1.0e-14);}
}
// hen3=distance between C and H nuclei
kro=hen3; // forc=force between C and H nuclei
double forc=(suh*den)/(kro*kro)+(suh*rsi)/(4.0*hen1*hen1);
for (int rv=0; rv <=1; rv++) {
for (int kj=0; kj <=2; kj++) {
mmp[rv+1][kj]=mmp[rv+1][kj]+(forc*(nux[rv*2+1][kj]-nux[0][kj]))/kro;
}}
// nuckan=repulsive potential energy between 4 nuclei
nuckan=(elc*elc*6.241509e18*((4.0*rsi*den)/(3.0*hen1)+3.0/hen1))/(4*pai*epsi*1.0e-14);
toav=toav+nuckan;
ex=(int)(toav*100.0); ggx=ex/100.0;
impho.setText("tV "+Double.toString(ggx)); // show total V to two decimal places
for (int rv=0; rv <=3; rv++) { // show force component of electron 0-3
// CF=force toward rpp[][0-2] = inner product of rhp anf rpp
gx=Math.sqrt(rpp[rv][0]*rpp[rv][0]+rpp[rv][1]*rpp[rv][1]+rpp[rv][2]*rpp[rv][2]);
gy=(rhp[rv][0]*rpp[rv][0]+rhp[rv][1]*rpp[rv][1]+rhp[rv][2]*rpp[rv][2])/gx;
ex=(int)(1000*gy); ww="CF ";
elp[rv][6].setText(ww+Integer.toString(ex));
for (int jou=0; jou <=2; jou++) {
gz=rhp[rv][jou]-(gy*rpp[rv][jou])/gx; // show force component other than CF
ex=(int)(1000*gz);
elp[rv][jou+7].setText(Integer.toString(ex));
}
}
for (int rv=4; rv <=7; rv++) { // show force component of electron 0-3
for (int jou=0; jou <=2; jou++) {
vvh[0][jou]=nux[rv-3][jou]-nux[0][jou]; vvh[1][jou]=hpr[rv][jou]-nux[0][jou];
}
vvh[0][3]=Math.sqrt(vvh[0][0]*vvh[0][0]+vvh[0][1]*vvh[0][1]+vvh[0][2]*vvh[0][2]);
// vvh[2][3] = inner product of vectors vvh[0][] and vvh[1][]
vvh[2][3]=(vvh[0][0]*vvh[1][0]+vvh[0][1]*vvh[1][1]+vvh[0][2]*vvh[1][2])/vvh[0][3];
for (int jou=0; jou <=2; jou++) {
vvh[2][jou]=(vvh[2][3]*vvh[0][jou])/vvh[0][3];
vvh[3][jou]=vvh[2][jou]-vvh[1][jou]; // vvh[3][0-2]= vector from electron 4-7 to C-H line
}
vvh[3][3]=Math.sqrt(vvh[3][0]*vvh[3][0]+vvh[3][1]*vvh[3][1]+vvh[3][2]*vvh[3][2]);
// gy (CF) = force toward C-H line of electron 4-7 = inner product of rhp and vvh[3]
gy=(rhp[rv][0]*vvh[3][0]+rhp[rv][1]*vvh[3][1]+rhp[rv][2]*vvh[3][2])/vvh[3][3];
gx=Math.sqrt(gy*gy); elp[rv][6].setText("CF "+Integer.toString((int)(gx*1000)));
for (int jou=0; jou <=2; jou++) {
ggz=rhp[rv][jou]-(vvh[3][jou]*gy)/vvh[3][3];
ex=(int)(1000*ggz);
// show force component other than CF
elp[rv][jou+7].setText(Integer.toString(ex));
}
}
// show force toward C nucleus
for (int rv=0; rv <=1; rv++) {
mmp[rv+1][3]=-(mmp[rv+1][0]*(nux[rv*2+1][0]-nux[0][0])+
mmp[rv+1][1]*(nux[rv*2+1][1]-nux[0][1])+mmp[rv+1][2]*(nux[rv*2+1][2]-nux[0][2]))/hen3;
}
for (int rv=0; rv <=2; rv++) {
for (int jou=0; jou <=3; jou++) { // show mmpho[0-2][0-3]
ex=(int)(1000*mmp[rv][jou]); ww=" ";
if (rv==0 && jou > 2) {ex=0;}
if (jou==0) {ww="FX=";} if (jou==1) {ww="FY=";}
if (jou==2) {ww="FZ=";} if (jou==3 && rv !=0) {ww="Cn=";}
mmpho[rv][jou].setText(ww+Integer.toString(ex));
}}
double hiwa=0.0;
for (int rv=0; rv <=7; rv++) { hiwa=hiwa+rhp[rv][5]; }
for (int rv=0; rv <=7; rv++) {
// distribute repulsive potential energy between 4 nuclei to each electron
rhp[rv][3]=rhp[rv][3]+(nuckan*rhp[rv][5])/hiwa;
ex=(int)(100*rhp[rv][3]); ggx=ex/100.0;
elp[rv][4].setText("V "+Double.toString(ggx)); // show each V to two decimal places
}
gy=-toav*0.5; // gy=total kinetic energy (eV)
// distribute kinetic energy to each electron based on rhp[][3] (=V)
for (int rv=0; rv <=7; rv++) {
gz=(gy*rhp[rv][3])/toav; rhp[rv][4]=gz;
ex=(int)(100*gz); gz=ex/100.0; elp[rv][5].setText("T "+Double.toString(gz));
}
for (int rv=0; rv <=7; rv++) { // show de Broglie wave of each electron
// gz = force acting on each electron
gz=Math.sqrt(rhp[rv][0]*rhp[rv][0]+rhp[rv][1]*rhp[rv][1]+rhp[rv][2]*rhp[rv][2]);
if (rv < 4 ) { // teqq[0-3][0-2]= force only in carbon atom in electron 0-3
gz=Math.sqrt(teqq[rv][0]*teqq[rv][0]+teqq[rv][1]*teqq[rv][1]+teqq[rv][2]*teqq[rv][2]);
}
gy=(gz*elc*elc)/(4*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((2*rhp[rv][4]*1.602177e-19)/me); // gx=velocity (m/s)
if (rv < 4) {gx=Math.sqrt((-teqq[rv][3]*1.602177e-19)/me);} // only in carbon atom
ggx=(me*gx*gx)/gy; // ggx="temporary" radius
ggy=(2*pai*ggx*me*gx)/h; // ggy=number of de Broglie's waves contained in one orbit
ex=(int)(ggy*1000); ggy=ex/1000.0;
elp[rv][10].setText("wn "+Double.toString(ggy));
}
// --------------------- show picture
int nmx[][]=new int[5][3]; int hpk[][]=new int[8][3];
for (int yp=0; yp <=4; 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)(hpr[yp][kj]/71.428);
if (hpk[yp][kj] > 349) {hpk[yp][kj]=349;}
if (hpk[yp][kj] < 1) {hpk[yp][kj]=1;}
}}
g.clearRect(9,299,1170,699);
g.setColor(Color.cyan); g.drawLine(375,310,375,660); g.drawLine(735,310,735,660);
g.setColor(Color.lightGray); // show five nuclei
for (int yp=0; yp <=4; yp++) {
g.fillOval(nmx[yp][0]+10,650-nmx[yp][1],20,20);g.fillOval(370+nmx[yp][0],650-nmx[yp][2],20,20);
g.fillOval(730+nmx[yp][1],650-nmx[yp][2],20,20);
}
g.setColor(Color.white); // show electron 0 (particle)
g.fillOval(hpk[0][0]+13,653-hpk[0][1],14,14);
g.fillOval(hpk[0][0]+373,653-hpk[0][2],14,14);
g.fillOval(hpk[0][1]+733,653-hpk[0][2],14,14);
// show electron 1
g.fillOval(hpk[1][0]+13,653-hpk[1][1],14,14);
g.fillOval(hpk[1][0]+373,653-hpk[1][2],14,14);
g.fillOval(hpk[1][1]+733,653-hpk[1][2],14,14);
g.setColor(Color.red); // show electron 2
g.fillOval(hpk[2][0]+13,653-hpk[2][1],14,14);
g.fillOval(hpk[2][0]+373,653-hpk[2][2],14,14);
g.fillOval(hpk[2][1]+733,653-hpk[2][2],14,14);
// show electron 3
g.fillOval(hpk[3][0]+13,653-hpk[3][1],14,14);
g.fillOval(hpk[3][0]+373,653-hpk[3][2],14,14);
g.fillOval(hpk[3][1]+733,653-hpk[3][2],14,14);
// show electron 4
g.setColor(Color.green);
g.fillOval(hpk[4][0]+13,653-hpk[4][1],14,14);
g.fillOval(hpk[4][0]+373,653-hpk[4][2],14,14);
g.fillOval(hpk[4][1]+733,653-hpk[4][2],14,14);
// show electron 5
g.fillOval(hpk[5][0]+13,653-hpk[5][1],14,14);
g.fillOval(hpk[5][0]+373,653-hpk[5][2],14,14);
g.fillOval(hpk[5][1]+733,653-hpk[5][2],14,14);
// show electron 6
g.setColor(Color.pink);
g.fillOval(hpk[6][0]+13,653-hpk[6][1],14,14);
g.fillOval(hpk[6][0]+373,653-hpk[6][2],14,14);
g.fillOval(hpk[6][1]+733,653-hpk[6][2],14,14);
// show electron 7
g.fillOval(hpk[7][0]+13,653-hpk[7][1],14,14);
g.fillOval(hpk[7][0]+373,653-hpk[7][2],14,14);
g.fillOval(hpk[7][1]+733,653-hpk[7][2],14,14);
g.setColor(Color.blue); // show each particle's number
for (int rw=0; rw <=7; rw++) {
g.drawString(Integer.toString(rw),hpk[rw][0]+17,665-hpk[rw][1]);
g.drawString(Integer.toString(rw),hpk[rw][0]+377,665-hpk[rw][2] );
g.drawString(Integer.toString(rw),hpk[rw][1]+737,665-hpk[rw][2] );
}
for (int rw=1; rw <=4; rw++) {
g.drawString("H"+Integer.toString(rw-1),nmx[rw][0]+13,665-nmx[rw][1]);
g.drawString("H"+Integer.toString(rw-1),nmx[rw][0]+373,665-nmx[rw][2] );
g.drawString("H"+Integer.toString(rw-1),nmx[rw][1]+733,665-nmx[rw][2] );
}
}
}