ボーア模型の水素分子 (H2) の電子配置を視覚化するサンプルJAVAプログラム

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

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

このプログラムでは、水素原子核は灰色の円で示してある。
ここでは、新しい単位として ( 1 MM = 10-14 meter) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Z (MM)) は、これらの原子核からの”相対的な”位置座標を示している。
(ele 0 は水素原子核 0 (H0), ele1 は H1 からの座標である。)
"nuc (MM)" はこれらの核と電子の距離である。
V (eV) と T (eV) は各電子の位置エネルギーと運動エネルギーを示している。
tV (eV) は全位置エネルギーである。
(FX, FZ) は各粒子(電子や核)に作用する力の成分を意味する。
Waves (wn) は1軌道に含まれるド。ブロイ波の数を示している。
電子の座標 (+X, +Z) は自由に変更できる。
(テキストボックス内に数値を入力して、Enter キーを押せばいい。)
また、"H-H" の横のテキストボックスに、数値 (MM) を入力して、 Enter キーを押すと、核間距離が変わる。


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class hydd extends JPanel     // virial theorem of hydrogen molecule
 {
  public static void main(String arg[])
 {
   JFrame frame = new JFrame("H2 (hydrogen)");        // set frame
   J2DPanel j2dpanel = new J2DPanel();
   frame.getContentPane().add(j2dpanel); frame.setSize(900,500);
   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=electrons, mmpho=nuclei, impho=tV, imppo=internuclear distance

    JTextField elp[][]=new JTextField[2][8];  JTextField impho=new JTextField(7); 
    JTextField mmpho[][]=new JTextField[2][2];   JTextField imppo=new JTextField(7); 
   
    int mar=0;                                      // mar=marking             
    double rtw=Math.sqrt(2); double rth=Math.sqrt(3); 
    double rsi=Math.sqrt(6); double rfi=Math.sqrt(5);
    double hpr[][]=new double[2][8];            // hpr[0,1][]=electron's parameters
    double nleng=7414.0;                       // nleng=internuclear distance
                                              // nux=each nuclear coordinates
    double nux[][]={{8793.0, 12500.00},{8793.0+nleng, 12500.0}}; 
                                                 
     double ina[]={890.0, 4665.0};        // ina=initial coordinate of electron

  public J2DPanel()
 {
  setBackground(Color.black);
  JPanel p=new JPanel();
  p.setLayout(new GridLayout(4,9));
  String vv; int aaa=0;                    
                                        
  String sihy[]={"eNo.", "+X (MM)", "+Z (MM)", "nuc (MM)", 
   "V (eV)", "T (eV)",  "FX ", "FZ ", "Waves "};

  for (int el=0; el <=8; el++) { p.add(new Label(sihy[el])); }
                         
  for (int el=0; el <=1; el++) {          // elp[][0-1], hpr[][0-1] = electron's coordiate
  for (int pos=0; pos <=1; pos++) {
  elp[el][pos]=new JTextField(7); elp[el][pos].addActionListener(this);
  hpr[el][pos]=0.0;      
  }}
                                   
   for (int el=0; el <=1; el++) {      // electron's other parameters
  for (int pos=2; pos <=7; pos++) {
  elp[el][pos]=new JTextField(7);     
  hpr[el][pos]=0.0; 
  }}

   for (int el=0; el <=1; el++) {
   for (int pos=0; pos <=1; pos++) {
    mmpho[el][pos]=new JTextField(7);
   }}

                                        // layout
 
  for (int el=0; el <=1; el++) {       
  p.add(new Label("ele "+el+" "));
  for (int pos=0; pos <=7; pos++) {
  p.add(elp[el][pos]);
  }}

   p.add(new Label("H0nuc "));
  for (int pos=0; pos <=1; pos++) {
  p.add(mmpho[0][pos]);  
  }
    p.add(new Label("H1nuc "));
  for (int pos=0; pos <=1; pos++) {
  p.add(mmpho[1][pos]);  
  }
 
   p.add(impho); p.add(new Label("H-H")); p.add(imppo); 

  imppo.addActionListener(this);
  imppo.setText(Integer.toString((int)nleng)); 

  add(p,"South");
  
   double nnuc=Math.sqrt(ina[0]*ina[0]+ina[1]*ina[1]);
   aaa=(int)(nnuc);                       // nnuc=distance between nucleus and electron
   
   for (int el=0; el <=1; el++) {
   elp[el][2].setText(Integer.toString(aaa)); 
    double sig=1.0;  if (el==1) {sig=-1.0;}
    for (int jou=0; jou <=1; jou++) {      // set and show initial coordinates
    hpr[el][jou]=nux[el][jou]+ina[jou]*sig;
    elp[el][jou].setText(Integer.toString((int)(ina[jou]*sig)));
     }}
   
   }     // public J2DPanel() end
 
    public void actionPerformed(ActionEvent e) {  
    String ss;
    double Rf1,Rf2; mar=0; int teis=0;

    for (int ett=0; ett <=1; ett++) {    // when electron's position changes
    for (int sws=0; sws <=1; sws++) {             
    
    if (e.getSource()==elp[ett][sws] ) { mar=1;
    ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss); 
    Rf2=0.0;  
     Rf2=Rf1+nux[ett][sws];         // change relative coordinate to absolute coordinate
   
   if (sws==0) {                 // upper and lower limits of coordinates
   if (Rf1 >=nleng*0.5 && ett==0) {Rf1=nleng*0.5-1.0; Rf2=Rf1+nux[ett][sws]; teis=1;}  
   if (Rf1 <=-nleng*0.5 && ett==1) {Rf1=-nleng*0.5+1.0; Rf2=Rf1+nux[ett][sws]; teis=1;}
   }   
   if (Rf2 < 1.0) {Rf2=1.0; Rf1=Rf2-nux[ett][sws]; teis=1;}
   if (Rf2 > 24999.0) {Rf2=24999.0; Rf1=Rf2-nux[ett][sws]; teis=1;}    

    hpr[ett][sws]=Rf2; 
   if (teis==1) {elp[ett][sws].setText(Integer.toString((int)Rf1));}
    hpr[ett*-1+1][sws]=nux[ett*-1+1][sws]-Rf1;
    elp[ett*-1+1][sws].setText(Integer.toString((int)(-Rf1)));
     }
    }}
   
    if (e.getSource()==imppo) {mar=2; }    // mar=2 when internuclear distance changes

   repaint();
  }

  public void update(Graphics g)
 {
  paint(g);
 }
 public void paintComponent(Graphics g)
 {
   

  double kro,gx,gy,gz,ggx,ggy,ggz,ttav,toav,ppot; kro=0.0;
  int ex,ey,ez; String ww;
  double rhp[][]= {{0,0,0,0},{0,0,0,0}};  
  double mmp[][]={{0,0},{0,0}};  


   if (mar==2) {               // when internuclear distance changes    

    ww=imppo.getText(); ggz=Double.parseDouble(ww);
    if (ggz < 0) {ggz=ggz*-1.0; imppo.setText(Integer.toString((int)ggz));}
    ww=elp[1][0].getText(); ggx=Double.parseDouble(ww);
    
     if (nux[0][0]+ggz+ggx > 24999.0)  {ggz = 24999-ggx-nux[0][0]; 
     imppo.setText(Integer.toString((int)ggz));}

     if (ggz+ggx < ggz*0.5)  {ggz =-ggx*2.0+1.0; 
     imppo.setText(Integer.toString((int)ggz));}

      nux[1][0]=nux[0][0]+ggz; nleng=ggz;
      hpr[1][0]=ggx+nux[1][0];
    }
                                   

    toav=0.0;                // toav=total potential energy

                                   // interaction between two electrons
    kro=Math.sqrt((hpr[0][0]-hpr[1][0])*(hpr[0][0]-hpr[1][0])+
   (hpr[0][1]-hpr[1][1])*(hpr[0][1]-hpr[1][1]));
   if (kro==0) {kro=5000.0;}
     ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14); 
    toav=toav+ppot;
                                              //rhp[][2]=electron's potential energy (eV)
   rhp[0][2]=rhp[0][2]+ppot/2.0; rhp[1][2]=rhp[1][2]+ppot/2.0;  

    for (int jou=0; jou <=2; jou++) {        // calculate force between electrons=rhp[][0-1]
   ggx=(suh*(hpr[0][jou]-hpr[1][jou]))/(kro*kro*kro);
   rhp[0][jou]=rhp[0][jou]+ggx; rhp[1][jou]=rhp[1][jou]-ggx;     
    } 
    
   for (int el=0; el <=1; el++) {        // interaction between electron and nucleus
   for (int rv=0; rv <=1; rv++) {  
   kro=Math.sqrt((hpr[el][0]-nux[rv][0])*(hpr[el][0]-nux[rv][0])+
   (hpr[el][1]-nux[rv][1])*(hpr[el][1]-nux[rv][1])); 
    if (kro == 0) {kro=5000.0;}         
                                        // elp[][2]=show distance between electron and nucleus
    if (el==rv) {elp[el][2].setText(Integer.toString((int)kro));}

    ppot= -(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
   rhp[el][2]=rhp[el][2]+ppot;  toav=toav+ppot; 

     for (int kj=0; kj <=1; kj++) {     // mmp[][0-1]=force compoment acting on nuclei
   ggx=(suh*(hpr[el][kj]-nux[rv][kj]))/(kro*kro*kro); 
   mmp[rv][kj]=mmp[rv][kj]+ggx;  rhp[el][kj]=rhp[el][kj]-ggx;
   }               
   }}
  
                                        //  interaction between two nuclei
     kro=Math.sqrt((nux[0][0]-nux[1][0])*(nux[0][0]-nux[1][0])+
  (nux[0][1]-nux[1][1])*(nux[0][1]-nux[1][1]));
    ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
    toav=toav+ppot;  
    rhp[0][2]=rhp[0][2]+ppot/2.0; rhp[1][2]=rhp[1][2]+ppot/2.0; 
      for (int jou=0; jou <=1; jou++) {
     ggx=(suh*(nux[0][jou]-nux[1][jou]))/(kro*kro*kro);
     mmp[0][jou]=mmp[0][jou]+ggx;  mmp[1][jou]=mmp[1][jou]-ggx; 
    }
                                   
   ex=(int)(100*toav); ggx=ex/100.0;
   impho.setText("tV "+Double.toString(ggx));         // show total V
 
   for (int el=0; el <=1; el++) {                // show each electron's V and T (eV)
   ex=(int)(100*rhp[el][2]); ggx=ex/100.0;
   elp[el][3].setText("V "+Double.toString(ggx));
   ex=(int)(100*rhp[el][2]*-0.5); ggx=ex/100.0;
   elp[el][4].setText("T "+Double.toString(ggx));
   }
       
   
    for (int el=0; el <=1; el++) {              
    for (int jou=0; jou <=1; jou++) {      // show force component acting on each electron
    ex=(int)(1000*rhp[el][jou]); 
    elp[el][jou+5].setText(Integer.toString(ex));
     }
    }                                               

    for (int rv=0; rv <=1; rv++) {        // show force component acting on each nuclei
    for (int jou=0; jou <=1; jou++) {            
    ex=(int)(1000*mmp[rv][jou]); ww=" ";
   if (jou==0) {ww="FX=";}
   if (jou==1) {ww="FZ=";}
    mmpho[rv][jou].setText(ww+Integer.toString(ex));
    }}

                                                                                                                     
   for (int el=0; el <=1; el++) {         // show de Broglie wave
   
   gz=Math.sqrt(rhp[el][0]*rhp[el][0]+rhp[el][1]*rhp[el][1]);
   
   gy=(gz*elc*elc)/(4*pai*epsi*suh*1.0e-28);    // gy=force (N)
   gx=Math.sqrt((-rhp[el][2]*1.602177e-19)/me);  // gx=velocity (m/s)
   
   ggx=(me*gx*gx)/gy;                          // ggx="temporary" radius
   ggy=(2*pai*ggx*me*gx)/h;                     // ggy=number of de Broglie's waves
   ex=(int)(ggy*1000); ggy=ex/1000.0; 
   elp[el][7].setText("wn "+Double.toString(ggy));  }


                          // --------------------- show picture
   int nmx[][]=new int[2][2]; int hpk[][]=new int[2][2]; 

 
  for (int yp=0; yp <=1; yp++) {
  for (int kj=0; kj <=1; kj++) {     // change MM to pixel in nuclei
  nmx[yp][kj]=(int)(nux[yp][kj]/71.428);
  }}
  for (int yp=0; yp <=1; yp++) {
  for (int kj=0; kj <=1; kj++) {     // change MM to pixel in electrons
  hpk[yp][kj]=(int)(hpr[yp][kj]/71.428);
  }}

   g.clearRect(9,100,800,780);

   g.setColor(Color.cyan); 
   g.drawLine(nmx[0][0]+275,285, nmx[1][0]+275,285);

  g.setColor(Color.lightGray);         // show two nuclei
  g.fillOval(nmx[0][0]+265,450-nmx[0][1],20,20);
  g.fillOval(nmx[1][0]+265,450-nmx[1][1],20,20);

                                     
  g.setColor(Color.red);              // show electron 0
  g.fillOval(hpk[0][0]+268,453-hpk[0][1],14,14);
  
                                       // show electron 1
  g.setColor(Color.green);
   g.fillOval(hpk[1][0]+268,453-hpk[1][1],14,14);

    
  for (int rw=0; rw <=1; rw++) {         // show particle's number
  g.setColor(Color.white);
  g.drawString("H"+Integer.toString(rw),nmx[rw][0]+268,464-nmx[rw][1]);
  g.setColor(Color.blue);
  g.drawString(Integer.toString(rw),hpk[rw][0]+272,465-hpk[rw][1]);
  }
   }}