トップページ
分子結合のページに戻る。
分子結合 (付録) のページに戻る。
下のソースプログラムをそのままテキストエディタ(メモ帳など)にコピー and ペースト すれば、簡単にコンパイルと実行できる。
(この class file name は water なので、このテキストエディタを "water.java" とセーブしてコンパイルしてほしい。)
ここでは 1 MM = 1 × 10-14 meter という新しい単位を使用している。
この JAVA プログラムは ほぼすべてのブラウザで起動できると思います。
JAVA のあるバージョンによっては、コンパイル後に " -Xlint : unchecked --- " という注意書きが 画面上にでる可能性があります。
しかし それらのメッセージを無視して そのまま実行できます。
詳細な方法に関しては 分子結合 (付録) を参照のこと。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class water extends JPanel // virial theorem 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);
}
}
class J2DPanel extends JPanel implements ActionListener
{
double pai=3.141592653589793; // pi=3.14
double epsi=8.85418781787346e-12; // permittivity
double h=6.62606896e-34; // Planck constant
double elc=1.60217653e-19; // electron charge
double me=9.1093826e-31; // electron mass
double suh=5292.0*5292.0*1000.0; // Bohr radius^2 x 1000
int labe=0; // distinguish label
JTextField elp[][]=new JTextField[8][11]; // text of electron 0-7
JTextField elpp[][]=new JTextField[8][11]; // text after electron
JTextField mmpho[][]=new JTextField[6][4]; // text nucleus H0 H2
JTextField impho=new JTextField(7); // text total V (eV)
JTextField imphoo=new JTextField(7); // text after total V
JTextField averwa0=new JTextField(7); // text average de Broglie wave 0
JTextField averwa6=new JTextField(7); // text average de Broglie wave 6
JButton b1=new JButton("O-H (MM)");
JButton b2=new JButton("angle");
String ope[]={"8000","8500","9000","9584","10000","11000","12000"};
JComboBox coom=new JComboBox(ope);
String ope2[]={"70.0","80.0","90.0","104.45","110.0","120.0","130.0"};
JComboBox coom2=new JComboBox(ope2);
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]; // each electron's parameter
double hprr[][]=new double[8][11]; // after electron parameter
double den=6.273; // den=central charge
double lengt=9584.0; double angl=104.45; // lengt=O-H distance
// angl=H-O-H angle
double lengt2=lengt*Math.sin(angl*0.5*pai/180.0);
double lengt3=lengt*Math.cos(angl*0.5*pai/180.0);
//nux[n][0-2]=nucleus coordinate,
// O nuc (n=0), H0 and H1 nuclei ( n=1,2 )
double nux[][]={{0.0, 0.0, 0.0, den},
{lengt3, -lengt2, 0.0, 1.0},
{lengt3, lengt2, 0.0, 1.0}};
// te1,teez = each electron initial coordinate wrt. each close nucleus
double te1[][]={{3250,-3250, 0.0}, {3250, 3250, 0.0},
{-3250, 3250, 0}, {-3250, -3250, 0},
{0, 0, -4596}, {0,0, 4596},
{0.0, 0.0 , -4600.0}, {0.0, 0.0, 4600.0}};
double teez[][]={{3250,-3250, 0.0}, {3250, 3250, 0.0},
{-3250, 3250, 0}, {-3250, -3250, 0},
{0, 0, -4596}, {0,0, 4596},
{0.0, 0.0 , -4600.0}, {0.0, 0.0, 4600.0}};
public J2DPanel()
{
setBackground(Color.black);
JPanel p=new JPanel();
p.setLayout(new GridLayout(20,12));
int aaa=0;
for (int el=0; el <=7; el++) { // hpr[][0-2]=each electron's coordinate
for (int pos=0; pos <=2; pos++) {
elp[el][pos]=new JTextField(7); elpp[el][pos]=new JTextField(7);
if ( el == 0 || el == 2 || el == 4 || el == 6 ) {elp[el][pos].addActionListener(this);}
hpr[el][pos]=0.0; hprr[el][pos]=0.0;
}}
for (int el=0; el <=7; el++) { // elp[0-7][3-10]= other parameters
for (int pos=3; pos <=10; pos++) {
elp[el][pos]=new JTextField(7); elpp[el][pos]=new JTextField(7);
hpr[el][pos]=0.0; hprr[el][pos]=0.0;
}}
for (int el=0; el <=5; el++) { // mmpho[0-2][]=nuclei parameters
// mmpho[3-5][]=nuclei parameters after
for (int pos=0; pos <=3; pos++) {
mmpho[el][pos]=new JTextField(7);
}}
String stri,sang;
// layout
String sihy[]={"eNo ", "+X(MM)", "+Y(MM)", "+Z(MM)", "nuc(MM)",
"V(eV)", "tForce", "cforce", "rforce ", "Waves", " -- ", " -- "};
for (int el=0; el <=11; el++) {
p.add(new Label(sihy[el]));
}
for (int el=0; el <=7; el++) {
stri=" ";
if ( el == 0 || el == 2 || el == 4 || el == 6 ) {stri=" text";}
p.add(new Label("ele "+el+stri));
sang=" e0-nuc-e1 =";
if ( el== 2 ) { sang=" e2-nuc-e3 ="; }
if ( el== 4 ) { sang=" e4-nuc-e5 ="; }
if ( el==0 || el==2 || el==4 ) {
for (int pos=0; pos <=8; pos++) {
p.add(elp[el][pos]);
}
p.add(new Label(sang)); p.add(elp[el][10]);
}
if ( el != 0 && el !=2 && el !=4 ){
for (int pos=0; pos <=10; pos++) {
p.add(elp[el][pos]);
}}
}
p.add(new Label("O nuc "));
for (int pos=0; pos <=2; pos++) {
p.add(mmpho[0][pos]);
}
p.add(new Label("H0nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[1][pos]);
}
p.add(new Label("H1nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[2][pos]);
}
p.add(new Label("total V ")); p.add(impho);
p.add(new Label("aO nuc "));
for (int pos=0; pos <=2; pos++) {
p.add(mmpho[3][pos]);
}
p.add(new Label("aH0nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[4][pos]);
}
p.add(new Label("aH1nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[5][pos]);
}
p.add(new Label("af tV ")); p.add(imphoo);
p.add(new Label("aele 0"));
for (int pos=0; pos <=8; pos++) {
p.add(elpp[0][pos]);
}
p.add(new Label("0-avewave ")); p.add(averwa0);
p.add(new Label("aele 1"));
for (int pos=0; pos <=8; pos++) {
p.add(elpp[1][pos]);
}
p.add(new Label("6-avewave ")); p.add(averwa6);
p.add(new Label("aele 2"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[2][pos]);
}
p.add(new Label("aele 3"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[3][pos]);
}
p.add(new Label("aele 4"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[4][pos]);
}
p.add(new Label("aele 5"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[5][pos]);
}
p.add(new Label("aele 6"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[6][pos]);
}
p.add(new Label("aele 7"));
for (int pos=0; pos <=10; pos++) {
p.add(elpp[7][pos]);
}
p.add(new Label(" -- ")); p.add(new Label(" -- "));
p.add(new Label(" -- ")); p.add(new Label(" -- "));
p.add(b1); p.add(coom); p.add(b2); p.add(coom2);
for (int pos=0; pos <=3; pos++) {
p.add(new Label(" -- "));
}
coom.setSelectedItem("9584"); b1.addActionListener(this);
coom2.setSelectedItem("104.45"); b2.addActionListener(this);
add(p,"South");
for (int el=0; el <=7; el++) {
double nnuc=Math.sqrt(teez[el][0]*teez[el][0]+teez[el][1]*teez[el][1]+teez[el][2]*teez[el][2]);
aaa=(int)(nnuc);
elp[el][3].setText(Integer.toString(aaa));
for (int jou=0; jou <=2; jou++) {
hpr[el][jou]=teez[el][jou];
// hpr[el][0-2] = electron absolute coordinate
if (el==6) {hpr[el][jou]=hpr[el][jou]+nux[1][jou];}
if (el==7) {hpr[el][jou]=hpr[el][jou]+nux[2][jou];}
elp[el][jou].setText(Integer.toString((int)(teez[el][jou])));
}}
} // public J2DPanel() end
public void actionPerformed(ActionEvent e) {
String ss;
labe = 0;
if (e.getSource() == b1) { labe = 4;
ss=(String)coom.getSelectedItem();
if (ss=="8000") {lengt=8000;} if (ss=="8500") {lengt=8500;}
if (ss=="9000") {lengt=9000;} if (ss=="9584") {lengt=9584;}
if (ss=="10000") {lengt=10000;} if (ss=="11000") {lengt=11000;}
if (ss=="12000") {lengt=12000;}
}
if (e.getSource() == b2) { labe = 3;
ss=(String)coom2.getSelectedItem();
if (ss=="70.0") {angl=70.0;} if (ss=="80.0") {angl=80.0;}
if (ss=="90.0") {angl=90.0;} if (ss=="104.45") {angl=104.45;}
if (ss=="110.0") {angl=110.0;} if (ss=="120.0") {angl=120.0;}
if (ss=="130.0") {angl=130.0;}
}
if ( labe==3 || labe == 4 ) { // nuclei position change
lengt2=lengt*Math.sin(angl*0.5*pai/180.0);
lengt3=lengt*Math.cos(angl*0.5*pai/180.0);
double nuux[][]={{0.0, 0.0, 0.0},
{lengt3, -lengt2, 0.0},
{lengt3, lengt2, 0.0}};
for (int ett=0; ett <=2; ett++) {
for (int sws=0; sws <=2; sws++) {
nux[ett][sws]=nuux[ett][sws];
}}
}
repaint();
}
public void update(Graphics g)
{
paint(g);
}
public void paintComponent(Graphics g)
{
double kro,krr,kwr,kww,krk,kro2,krr2,krk2,pot,pota,potb,potc,pot2,pota2,potb2;
double gx,gy,gz,ggx,ggy,ggz,ttav,toav;
kro=0.0; krr=0.0; krk=0.0; kro2=0.0; krr2=0.0; krk2=0.0; kww=0.0; kwr=0.0;
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,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,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}};
double mpp[][]={{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,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}};
double teqqq[][]={{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 hevec[][]=new double[3][4];
for (int jou=0; jou <=2; jou++) {
hevec[0][jou]=nux[1][jou]-nux[0][jou]; // hevec[0] = O nuc - H0 nuc vector
hevec[1][jou]=nux[2][jou]-nux[0][jou]; // hevec[1] = O nuc - H1 nuc vector
}
// hevec[2][0-2] = vector perpendicular to H-O-H plane
// outer product of hevec[0] x hevec[1]
hevec[2][0]=hevec[0][1]*hevec[1][2]-hevec[0][2]*hevec[1][1];
hevec[2][1]=hevec[0][2]*hevec[1][0]-hevec[0][0]*hevec[1][2];
hevec[2][2]=hevec[0][0]*hevec[1][1]-hevec[0][1]*hevec[1][0];
// hevec[][3]=length of each vector
hevec[2][3]=Math.sqrt(hevec[2][0]*hevec[2][0]+hevec[2][1]*hevec[2][1]+hevec[2][2]*hevec[2][2]);
hevec[0][3]=Math.sqrt(hevec[0][0]*hevec[0][0]+hevec[0][1]*hevec[0][1]+hevec[0][2]*hevec[0][2]);
hevec[1][3]=Math.sqrt(hevec[1][0]*hevec[1][0]+hevec[1][1]*hevec[1][1]+hevec[1][2]*hevec[1][2]);
// get each electron coordinate from textboxes
ww=elp[6][0].getText(); hpr[6][0]=Double.parseDouble(ww)+nux[1][0];
hpr[7][0]=Double.parseDouble(ww);
elp[7][0].setText(Integer.toString((int)hpr[7][0]));
hpr[7][0]=hpr[7][0]+nux[2][0];
ww=elp[6][1].getText(); hpr[6][1]=Double.parseDouble(ww)+nux[1][1];
hpr[7][1]=Double.parseDouble(ww);
hpr[7][1] = - hpr[7][1];
elp[7][1].setText(Integer.toString((int)hpr[7][1]));
hpr[7][1]=hpr[7][1]+nux[2][1];
ww=elp[6][2].getText(); hpr[6][2]=Double.parseDouble(ww)+nux[1][2];
hpr[7][2]=Double.parseDouble(ww);
hpr[7][2]=-hpr[7][2];
elp[7][2].setText(Integer.toString((int)hpr[7][2]));
hpr[7][2]=hpr[7][2]+nux[2][2];
for (int yp=0; yp <=2; yp++) {
for (int jou=0; jou <=2; jou++) {
ww=elp[yp*2][jou].getText();
hpr[yp*2][jou]=Double.parseDouble(ww);
hpr[yp*2+1][jou] = -hpr[yp*2][jou];
if (jou == 0) { hpr[yp*2+1][jou] = hpr[yp*2][jou]; }
elp[yp*2+1][jou].setText(Integer.toString((int)hpr[yp*2+1][jou]));
}}
// show angle
double aa=Math.sqrt(hpr[0][0]*hpr[0][0]+hpr[0][1]*hpr[0][1]+hpr[0][2]*hpr[0][2]);
double bb =Math.sqrt((hpr[1][0]-hpr[0][0])*(hpr[1][0]-hpr[0][0])+(hpr[1][1]-hpr[0][1])*(hpr[1][1]-hpr[0][1])+(hpr[1][2]-hpr[0][2])*(hpr[1][2]-hpr[0][2]));
double ccos=(2.0*aa*aa - bb*bb)/(2.0*aa*aa);
double angg=(Math.acos(ccos)*180.0)/pai;
elp[0][10].setText(Integer.toString((int)angg) + " deg" );
aa=Math.sqrt(hpr[2][0]*hpr[2][0]+hpr[2][1]*hpr[2][1]+hpr[2][2]*hpr[2][2]);
bb =Math.sqrt((hpr[2][0]-hpr[3][0])*(hpr[2][0]-hpr[3][0])+(hpr[2][1]-hpr[3][1])*(hpr[2][1]-hpr[3][1])+(hpr[2][2]-hpr[3][2])*(hpr[2][2]-hpr[3][2]));
ccos=(2.0*aa*aa - bb*bb)/(2.0*aa*aa);
angg=(Math.acos(ccos)*180.0)/pai;
elp[2][10].setText(Integer.toString((int)angg) + " deg");
aa=Math.sqrt(hpr[4][0]*hpr[4][0]+hpr[4][1]*hpr[4][1]+hpr[4][2]*hpr[4][2]);
bb =Math.sqrt((hpr[4][0]-hpr[5][0])*(hpr[4][0]-hpr[5][0])+(hpr[4][1]-hpr[5][1])*(hpr[4][1]-hpr[5][1])+(hpr[4][2]-hpr[5][2])*(hpr[4][2]-hpr[5][2]));
ccos=(2.0*aa*aa - bb*bb)/(2.0*aa*aa);
angg=(Math.acos(ccos)*180.0)/pai;
elp[4][10].setText(Integer.toString((int)angg) + " deg");
double noxx[]={0,0,0}; // noxx[0-2]=center of six electrons 0-5
for (int yp=0; yp <=5; yp++) {
for (int jou=0; jou <=2; jou++) {
noxx[jou]=noxx[jou]+hpr[yp][jou];
}}
for (int jou=0; jou <=2; jou++) {
noxx[jou]=noxx[jou]/6.0;
}
toav=0.0; // toav = total potential energy
// interactions among electrons 0-7
double ppot=0.0;
for (int yp=0; yp <=7; yp++) {
for (int kj=0; 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.0*pai*epsi*kro*1.0e-14);
toav=toav+ppot;
rhp[yp][3]=rhp[yp][3]+ppot/2.0; rhp[kj][3]=rhp[kj][3]+ppot/2.0;
if ( yp < 6 && kj < 6 ) { // V only in oxygen 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[yp][jou]=rhp[yp][jou]+ggx; rhp[kj][jou]=rhp[kj][jou]-ggx;
if ( yp < 6 && kj < 6 ) { // force only in oxygen atom
teqq[yp][jou]=teqq[yp][jou]+ggx;
teqq[kj][jou]=teqq[kj][jou]-ggx;
}
}
}}}
// interaction between electrons and nuclei
for (int yp=0; yp <=7; yp++) {
for (int rv=0; rv <=2; rv++) {
kro=Math.sqrt((hpr[yp][0]-nux[rv][0])*(hpr[yp][0]-nux[rv][0])+
(hpr[yp][1]-nux[rv][1])*(hpr[yp][1]-nux[rv][1])+
(hpr[yp][2]-nux[rv][2])*(hpr[yp][2]-nux[rv][2]));
if (kro == 0) {kro=5000.0;}
ppot=-(nux[rv][3]*elc*elc*6.241509e18)/(4.0*pai*epsi*kro*1.0e-14);
toav = toav + ppot; rhp[yp][3] = rhp[yp][3] + ppot;
if ( yp < 6 ) { // interaction between electron and other nuclei
if ( rv > 0 ) { rhp[yp][6] = rhp[yp][6] + ppot; }
}
if ( yp > 5 ) {
if ( rv != yp-5 ) { rhp[yp][6] = rhp[yp][6] + ppot; }
}
for (int jou=0; jou <=2; jou++) { // force component
ggx=(suh*nux[rv][3]*(hpr[yp][jou]-nux[rv][jou]))/(kro*kro*kro);
rhp[yp][jou] = rhp[yp][jou] - ggx;
mmp[rv][jou] = mmp[rv][jou] + ggx; // mmp = force acting on each nuclei
}
}}
// between noxx (= center of ele0-5 ) and electron 0-5
for (int rv=0; rv <=5; rv++) {
kro=Math.sqrt((hpr[rv][0]-noxx[0])*(hpr[rv][0]-noxx[0])+
(hpr[rv][1]-noxx[1])*(hpr[rv][1]-noxx[1])+
(hpr[rv][2]-noxx[2])*(hpr[rv][2]-noxx[2]));
if (kro == 0) {kro=5000.0;}
ppot=(elc*elc*den*6.241509e18)/(4.0*pai*epsi*kro*1.0e-14);
teqq[rv][3]=teqq[rv][3]-ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*den*(hpr[rv][jou]-noxx[jou]))/(kro*kro*kro);
teqq[rv][jou]=teqq[rv][jou]-ggx;
}}
// among nuclei
pota = 0.0; // pota = potential V only among nuclei
for (int yp=0; yp <=2; yp++) {
for (int kj=0; kj <=2; kj++) {
if (yp < kj ) {
kro = Math.sqrt((nux[yp][0]-nux[kj][0])*(nux[yp][0]-nux[kj][0]) + (nux[yp][1]-nux[kj][1])*(nux[yp][1]-nux[kj][1]) + (nux[yp][2]-nux[kj][2])*(nux[yp][2]-nux[kj][2]) );
if (kro == 0) {kro=5000.0;}
ppot = (nux[yp][3]*nux[kj][3]*elc*elc*6.241509e18)/(4.0*pai*epsi*kro*1.0e-14);
toav=toav+ppot; pota=pota+ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*nux[yp][3]*nux[kj][3]*(nux[yp][jou]-nux[kj][jou]))/(kro*kro*kro);
mmp[yp][jou] = mmp[yp][jou] + ggx;
mmp[kj][jou] = mmp[kj][jou] - ggx;
// mmp[][3-5] = force only among nuclei
mmp[yp][jou+3] = mmp[yp][jou+3] + ggx;
mmp[kj][jou+3] = mmp[kj][jou+3] - ggx;
}
}}}
// show total V to two decimal places
ex=(int)(100.0*toav); ggx=ex/100.0;
impho.setText("tV "+Double.toString(ggx));
gz = 0.0; // distribute nuclear V to electron based on rhp[][6]
for (int yp=0; yp <=7; yp++) {
gz = gz + rhp[yp][6];
}
for (int yp=0; yp <=7; yp++) {
rhp[yp][3] = rhp[yp][3] + (pota * rhp[yp][6])/gz;
}
for (int yp=0; yp <=5; yp++) {
ex=(int)(rhp[yp][3]*100.0); ggx=ex/100.0;
elp[yp][4].setText("V "+Double.toString(ggx)); //show electron 0-5 's V
kro = Math.sqrt(hpr[yp][0]*hpr[yp][0]+hpr[yp][1]*hpr[yp][1]+hpr[yp][2]*hpr[yp][2]);
if (kro == 0) {kro=5000.0;}
ex=(int)(kro);
// show electron 0-5 and O nuc distance
elp[yp][3].setText("nuc "+Integer.toString(ex));
// rho[][4]=force toward center
rhp[yp][4] = -(hpr[yp][0]*rhp[yp][0] +hpr[yp][1]*rhp[yp][1] + hpr[yp][2]*rhp[yp][2])/kro;
rhp[yp][5] = 0.0;
ex=(int)(rhp[yp][4]);
elp[yp][5].setText("tF "+Integer.toString(ex));
elp[yp][6].setText("cf "+Integer.toString(ex));
elp[yp][7].setText(Integer.toString(0));
}
// vvh[0-1][0-2] = vector from ele 6,7 toward (perpendicular to ) O-H line
double vvh[][]=new double[2][6];
for (int yp=6; yp <=7; yp++) {
kro=(hpr[yp][0]*nux[yp-5][0]+hpr[yp][1]*nux[yp-5][1]+hpr[yp][2]*nux[yp-5][2])/lengt;
for (int kj=0; kj <=2; kj++) {
vvh[yp-6][kj] = (nux[yp-5][kj]*kro)/lengt;
vvh[yp-6][kj] = vvh[yp-6][kj] - hpr[yp][kj];
}
}
// show electron 6-7 data
for (int yp=6; yp <=7; yp++) {
ex=(int)(rhp[yp][3]*100.0); ggx=ex/100.0;
elp[yp][4].setText("V "+Double.toString(ggx)); //show electron 6-7 's V
kro=Math.sqrt((hpr[yp][0]-nux[yp-5][0])*(hpr[yp][0]-nux[yp-5][0])+
(hpr[yp][1]-nux[yp-5][1])*(hpr[yp][1]-nux[yp-5][1])+
(hpr[yp][2]-nux[yp-5][2])*(hpr[yp][2]-nux[yp-5][2]));
if (kro == 0) {kro=5000.0;}
ex=(int)(kro);
elp[yp][3].setText("nuc "+Integer.toString(ex)); // show electron 4-7's nuc
// rhp[ele 6,7][4] = force acting on ele 6,7 toward center
rhp[yp][4] = -(nux[yp-5][0]*rhp[yp][0] +nux[yp-5][1]*rhp[yp][1] + nux[yp-5][2]*rhp[yp][2])/lengt;
krr = Math.sqrt( vvh[yp-6][0]*vvh[yp-6][0]+vvh[yp-6][1]*vvh[yp-6][1]+ vvh[yp-6][2]*vvh[yp-6][2] );
// rhp[yp][5] = force acting on ele 6,7 toward O-H line
rhp[yp][5] = (vvh[yp-6][0]*rhp[yp][0] +vvh[yp-6][1]*rhp[yp][1] + vvh[yp-6][2]*rhp[yp][2])/krr;
gx=Math.sqrt(rhp[yp][0]*rhp[yp][0]+rhp[yp][1]*rhp[yp][1]+rhp[yp][2]*rhp[yp][2]);
ex=(int)(gx);
elp[yp][5].setText("tF "+Integer.toString(ex)); // total force on ele4-7
ex=(int)(rhp[yp][4]);
if (yp == 7){
elp[yp][6].setText("cf "+Integer.toString(ex));
}
if (yp == 6){
elp[yp][6].setText("cf "+Integer.toString(ex)+" *");
}
ex=(int)(rhp[yp][5]);
elp[yp][7].setText("rf "+Integer.toString(ex));
}
// vvh[0,1][3-5] = vector toward center based on force compoment ratio
for (int yp=6; yp <=7; yp++) {
krr = Math.sqrt( vvh[yp-6][0]*vvh[yp-6][0]+vvh[yp-6][1]*vvh[yp-6][1]+ vvh[yp-6][2]*vvh[yp-6][2] );
gx = rhp[yp][4] * krr / rhp[yp][5];
for (int kj=0; kj <=2; kj++) {
vvh[yp-6][kj+3] = -(nux[yp-5][kj] * gx)/lengt;
}
}
// show electron 6-7 de Broglie waves
for (int yp=6; yp <=7; yp++) {
gz = Math.sqrt(rhp[yp][0]*rhp[yp][0]+rhp[yp][1]*rhp[yp][1]+rhp[yp][2]*rhp[yp][2]);
gy=(gz*elc*elc)/(4.0*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((-1.0*rhp[yp][3]*1.602177e-19)/me); // gx=velocity (m/s)
ggx=(me*gx*gx)/gy; // ggx="temporary" radius
ggy=(2*pai*ggx*me*gx)/h; // ggy=de Broglie's waves in one orbit
hpr[yp][3]=ggy; // hpr[][3] = waves
ex=(int)(ggy*1000); ggy=ex/1000.0;
elp[yp][8].setText("wn "+Double.toString(ggy));
}
// ele 0-5 de Broglie wave
for (int yp=0; yp <=5; yp++) {
gz = Math.sqrt(teqq[yp][0]*teqq[yp][0]+teqq[yp][1]*teqq[yp][1]+teqq[yp][2]*teqq[yp][2]);
gy=(gz*elc*elc)/(4.0*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((-1.0*teqq[yp][3]*1.602177e-19)/me); // gx=velocity (m/s)
ggx=(me*gx*gx)/gy;
ggy=(2*pai*ggx*me*gx)/h;
hpr[yp][3]=ggy;
ex=(int)(ggy*1000); ggy=ex/1000.0;
elp[yp][8].setText("wn "+Double.toString(ggy));
}
// show force compoment acting on O-nuc
for (int kj=0; kj <=2; kj++) {
ex=(int)(mmp[0][kj]);
if (kj==0) { ww = " FX ";}
if (kj==1) { ww = " FY ";}
if (kj==2) { ww = " FZ ";}
mmpho[0][kj].setText(ww+Integer.toString(ex));
}
// show force acting on H0 H1 nuclei toward O and another H nucleus
for (int rv=1; rv <=2; rv++) {
gx = -(nux[rv][0]*mmp[rv][0] +nux[rv][1]*mmp[rv][1] + nux[rv][2]*mmp[rv][2])/lengt;
ex=(int)(gx);
mmpho[rv][0].setText("On "+Integer.toString(ex));
if (rv==1) {
ex=(int)(mmp[rv][1]);
mmpho[rv][1].setText("Hn "+Integer.toString(ex));
}
if (rv==2) {
ex=(int)(-mmp[rv][1]);
mmpho[rv][1].setText("Hn "+Integer.toString(ex));
}
}
// hprr[el][0-2]= another coordinate of each electron
for (int yp=0; yp <=5; yp++) {
for (int jou=0; jou <=2; jou++) {
hprr[yp][jou] = hpr[yp][jou];
gx = hprr[yp][jou] ;
elpp[yp][jou].setText(Integer.toString((int)gx));
} }
// hpr[6,7][0-2] = ele 6,7 another coordinate "after" moving by force
for (int yp=6; yp <=7; yp++) {
for (int kj=0; kj <=2; kj++) {
hprr[yp][kj] = hpr[yp][kj] + vvh[yp-6][kj+3] * 2.0 ;
gx = hprr[yp][kj] - nux[yp-5][kj];
elpp[yp][kj].setText(Integer.toString((int)gx));
}}
toav=0.0; // toav= "after" total potential energy
for (int yp=0; yp <=7; yp++) { // interaction between after ele 0-7
for (int kj=0; kj <=7; kj++) {
if (yp < kj ) { // kro=distance between electrons
kro=Math.sqrt((hprr[yp][0]-hprr[kj][0])*(hprr[yp][0]-hprr[kj][0])+
(hprr[yp][1]-hprr[kj][1])*(hprr[yp][1]-hprr[kj][1])+
(hprr[yp][2]-hprr[kj][2])*(hprr[yp][2]-hprr[kj][2]));
if (kro==0) {kro=5000.0;} // rpp[][3]=each electron's potential energy
ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
if ( yp < 6 && kj < 6 ) { // V only in oxygen atom
teqqq[yp][3]=teqqq[yp][3]+ppot/2.0;
teqqq[kj][3]=teqqq[kj][3]+ppot/2.0;
}
rpp[yp][3]=rpp[yp][3]+ppot/2.0; rpp[kj][3]=rpp[kj][3]+ppot/2.0;
toav=toav+ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*(hprr[yp][jou]-hprr[kj][jou]))/(kro*kro*kro);
rpp[yp][jou]=rpp[yp][jou]+ggx; rpp[kj][jou]=rpp[kj][jou]-ggx;
if ( yp < 6 && kj < 6 ) { // force only in oxygen atom
teqqq[yp][jou]=teqqq[yp][jou]+ggx;
teqqq[kj][jou]=teqqq[kj][jou]-ggx;
}
}
}}}
// between each nuclei and electron
for (int yp=0; yp <=7; yp++) {
for (int rv=0; rv <=2; rv++) {
kro=Math.sqrt((hprr[yp][0]-nux[rv][0])*(hprr[yp][0]-nux[rv][0])+
(hprr[yp][1]-nux[rv][1])*(hprr[yp][1]-nux[rv][1])+
(hprr[yp][2]-nux[rv][2])*(hprr[yp][2]-nux[rv][2]));
if (kro == 0) {kro=5000.0;}
ppot=-(nux[rv][3]*elc*elc*6.241509e18)/(4.0*pai*epsi*kro*1.0e-14);
toav = toav + ppot; rpp[yp][3] = rpp[yp][3] + ppot;
if ( yp < 6 ) { // rpp[][6]= V among electron and other nuclei
if ( rv > 0 ) {
rpp[yp][6] = rpp[yp][6] + ppot;
}}
if ( yp > 5 ) {
zk = yp -5;
if ( rv != zk ) { rpp[yp][6] = rpp[yp][6] + ppot;}
}
for (int jou=0; jou <=2; jou++) { // force component
ggx=(suh*nux[rv][3]*(hprr[yp][jou]-nux[rv][jou]))/(kro*kro*kro);
rpp[yp][jou] = rpp[yp][jou] - ggx; mpp[rv][jou] = mpp[rv][jou] + ggx;
}
}}
toav = toav + pota;
for (int rv=0; rv <=2; rv++) {
for (int jou=0; jou <=2; jou++) {
mpp[rv][jou]=mpp[rv][jou]+mmp[rv][jou+3];
}}
for (int rv=0; rv <=5; rv++) { // between noxx and ele0-5
kro=Math.sqrt((hprr[rv][0]-noxx[0])*(hprr[rv][0]-noxx[0])+
(hprr[rv][1]-noxx[1])*(hprr[rv][1]-noxx[1])+
(hprr[rv][2]-noxx[2])*(hprr[rv][2]-noxx[2]));
if (kro == 0) {kro=5000.0;}
ppot=(elc*elc*den*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
teqqq[rv][3]=teqqq[rv][3]-ppot;
for (int jou=0; jou <=2; jou++) {
ggx=(suh*den*(hprr[rv][jou]-noxx[jou]))/(kro*kro*kro);
teqqq[rv][jou]=teqqq[rv][jou]-ggx;
}}
gz = 0.0; // distribute nucler V to ele
for (int yp=0; yp <=7; yp++) {
gz = gz + rpp[yp][6];
}
for (int yp=0; yp <=7; yp++) {
rpp[yp][3] = rpp[yp][3] + (pota * rpp[yp][6])/gz;
}
// show each data "after" electrons
ex=(int)(100.0*toav); ggx=ex/100.0;
imphoo.setText("atV "+Double.toString(ggx));
for (int yp=0; yp <=5; yp++) {
ex=(int)(rpp[yp][3]*100.0); ggx=ex/100.0;
elpp[yp][4].setText("V "+Double.toString(ggx)); //show electron 0-5 's V
kro = Math.sqrt(hprr[yp][0]*hprr[yp][0]+hprr[yp][1]*hprr[yp][1]+hprr[yp][2]*hprr[yp][2]);
if (kro == 0) {kro=5000.0;}
ex=(int)(kro);
elpp[yp][3].setText("nuc "+Integer.toString(ex));
rpp[yp][4] = -(hprr[yp][0]*rpp[yp][0] +hprr[yp][1]*rpp[yp][1] + hprr[yp][2]*rpp[yp][2])/kro;
rpp[yp][5] = 0.0; // rhp[0-3][4,5] = 4 -- c force, 5-- r force
ex=(int)(rpp[yp][4]);
elpp[yp][5].setText("tF "+Integer.toString(ex));
elpp[yp][6].setText("cf "+Integer.toString(ex));
elpp[yp][7].setText("rf "+Integer.toString(0));
}
// show electron 6-7 data
for (int yp=6; yp <=7; yp++) {
ex=(int)(rpp[yp][3]*100.0); ggx=ex/100.0;
elpp[yp][4].setText("V "+Double.toString(ggx)); //show electron 4-7 's V
kro=Math.sqrt((hprr[yp][0]-nux[yp-5][0])*(hprr[yp][0]-nux[yp-5][0])+
(hprr[yp][1]-nux[yp-5][1])*(hprr[yp][1]-nux[yp-5][1])+
(hprr[yp][2]-nux[yp-5][2])*(hprr[yp][2]-nux[yp-5][2]));
if (kro == 0) {kro=5000.0;}
ex=(int)(kro);
elpp[yp][3].setText("nuc "+Integer.toString(ex));
rpp[yp][4] = -(nux[yp-5][0]*rpp[yp][0] +nux[yp-5][1]*rpp[yp][1] + nux[yp-5][2]*rpp[yp][2])/lengt;
krr = Math.sqrt( vvh[yp-6][0]*vvh[yp-6][0]+vvh[yp-6][1]*vvh[yp-6][1]+ vvh[yp-6][2]*vvh[yp-6][2] );
rpp[yp][5] = (vvh[yp-6][0]*rpp[yp][0] +vvh[yp-6][1]*rpp[yp][1] + vvh[yp-6][2]*rpp[yp][2])/krr;
gx=Math.sqrt(rpp[yp][0]*rpp[yp][0]+rpp[yp][1]*rpp[yp][1]+rpp[yp][2]*rpp[yp][2]);
ex=(int)(gx);
elpp[yp][5].setText("tF "+Integer.toString(ex)); // total force
ex=(int)(rpp[yp][4]);
if (yp == 7){
elpp[yp][6].setText("cf "+Integer.toString(ex));
}
if (yp == 6){
elpp[yp][6].setText("cf "+Integer.toString(ex)+" *"); } // cf force
ex=(int)(rpp[yp][5]);
elpp[yp][7].setText("rf "+Integer.toString(ex)); // r-force ele 4-7
}
// show electron 6-7 de Broglie waves
for (int yp=6; yp <=7; yp++) {
gz = Math.sqrt(rpp[yp][0]*rpp[yp][0]+rpp[yp][1]*rpp[yp][1]+rpp[yp][2]*rpp[yp][2]);
gy=(gz*elc*elc)/(4.0*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((-1.0*rpp[yp][3]*1.602177e-19)/me); // gx=velocity (m/s)
ggx=(me*gx*gx)/gy; // ggx="temporary" radius
ggy=(2.0*pai*ggx*me*gx)/h; // ggy=de Broglie's waves
hprr[yp][3]=ggy; // hprr[][3] = waves
ex=(int)(ggy*1000); ggy=ex/1000.0;
elpp[yp][8].setText("wn "+Double.toString(ggy));
}
// ele 0-5 de Broglie wave
for (int yp=0; yp <=5; yp++) {
gz = Math.sqrt(teqqq[yp][0]*teqqq[yp][0]+teqqq[yp][1]*teqqq[yp][1]+teqqq[yp][2]*teqqq[yp][2]);
gy=(gz*elc*elc)/(4.0*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((-1.0*teqqq[yp][3]*1.602177e-19)/me); // gx=velocity (m/s)
ggx=(me*gx*gx)/gy;
ggy=(2*pai*ggx*me*gx)/h;
hprr[yp][3]=ggy;
ex=(int)(ggy*1000); ggy=ex/1000.0;
elpp[yp][8].setText("wn "+Double.toString(ggy));
}
for (int kj=0; kj <=2; kj++) {
ex=(int)(mpp[0][kj]);
if (kj==0) { ww = "aFX ";}
if (kj==1) { ww = "aFY ";}
if (kj==2) { ww = "aFZ ";}
mmpho[3][kj].setText(ww+Integer.toString(ex));
}
// show force acting on "after" H0 H1 nuclei
for (int rv=1; rv <=2; rv++) {
gx = -(nux[rv][0]*mpp[rv][0] +nux[rv][1]*mpp[rv][1] + nux[rv][2]*mpp[rv][2])/lengt;
ex=(int)(gx);
mmpho[rv+3][0].setText("aOn "+Integer.toString(ex));
if (rv==1) {
ex=(int)(mpp[rv][1]);
mmpho[rv+3][1].setText("aHn "+Integer.toString(ex));
}
if (rv==2) {
ex=(int)(-mpp[rv][1]);
mmpho[rv+3][1].setText("aHn "+Integer.toString(ex));
}
}
gx = (hpr[0][3]+hprr[0][3])/2.0;
gy= (hpr[2][3]+hprr[2][3])/2.0;
gz= (hpr[4][3]+hprr[4][3])/2.0;
gx = (gx+gy+gz)/3.0;
ex=(int)(gx*1000); gx=ex/1000.0;
averwa0.setText("wn "+Double.toString(gx));
gx = (hpr[6][3]+hprr[6][3])/2.0;
ex=(int)(gx*1000); gx=ex/1000.0;
averwa6.setText("wn "+Double.toString(gx));
}
}