ボーア模型のメタン (CH4) の電子配置を視覚化するサンプルJAVAプログラム

化学結合のページに戻る
トップページ(2電子原子も含む新ボーア模型)

このプログラムは少し長いので、下に示すソースプログラムをコピーして、テキストエディタ(メモ帳など)にそのまま貼り付けて、コンパイルすれば簡単に実行できる。
このプログラムの class file name は methane なので、このデキストエディタを "methane.java" のファイル名で保存してコンパイルしてほしい。

このプログラムでは、原子核は灰色の円で示してある。
ここでは、新しい単位として ( 1 MM = 10-14 meter) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Y (MM), +Z (MM)) は、これらの原子核からの”相対的な”位置座標を示している。
(ele 0-3 は炭素原子核からの、 ele 4 は 水素原子核 0 (H0)からの、ele5 はH1 からの、ele6 は H2 からの、ele7 はH3 からの相対座標である。)
ここでは、電子4 (ele 4) の座標 (+X, +Y, +Z) のみ変更することができる。
(ele 4 のテキストボックス内に値を入力して、Enter キーを押せばいい。)
"nuc (MM)" はこれらの核と電子の距離である。
V (eV) と T (eV) は各電子の位置エネルギーと運動エネルギーを示している。
tV (eV) は全位置エネルギーである。
ele 0-3 の CF は、中心方向への力を意味し、ele 4-7 のCF は C-H line 方向への(C-H line に垂直な方向への)力を意味する。
(fx, fy, fz) は CF を除いた残りの力の成分を意味する。 (FX, FY, FZ) は各原子核に作用する力の成分を意味する。
Cn は H 核に作用する C 核方向への力の成分を意味する。
(このプログラムでは、H0 と H2 の2つの核の情報のみ示す。)
Waves (wn) は1軌道に含まれるド。ブロイ波の数を示している。
スクロールバーの中から、C-H 結合長 (MM) を選択して、"C-H (MM)" ボタンをクリックすると、C-H の核間距離が変化する。


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] );
  }
   }
   }