サンプル JAVA コンピュータープログラム(H2O)

トップページ
分子結合のページに戻る。
分子結合 (付録) のページに戻る。

下のソースプログラムをそのままテキストエディタ(メモ帳など)にコピー 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));

   }
   }