ボーア模型の窒素原子 (N) の配置を視覚化するサンプルJAVAプログラム

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

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

このプログラムでは、窒素原子核(灰色の円)は、(12500 MM, 12500 MM, 12500 MM) に位置している。
ここでは、新しい単位として ( 1 MM = 10-14 meter) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Y (MM), +Z (MM)) は、この原子核からの”相対的な”位置座標を示している。
(このテキストボックス内に値を入力して、エンターキーを押せば自由に座標の値を変更できる。)
"nuc (MM)" は各電子と核の距離を意味している。(すべての価電子で同じになるようにしてある。)
(この nuc の値も、最後の行に値を入力してエンターキーを押せば自由に変更できる。)

V (eV) と T (eV) は各電子の位置と運動エネルギーを意味している。
CF は各電子に作用する力の核方向の成分の量を表している。
(fx, fy, fz) は各電子に作用する力から、上の CF を除いた残りの力の各成分を表している。
最後の行の (FX, FY, FZ) は核に作用する力の各成分を表している。
(力の単位は、+e の原子核と -e の電子がボーア半径離れているときに、その間に働く力の大きさを 1000 としている。)
最後の行の tV は全位置エネルギー (eV) を意味する。
Waves (wn) は 各電子の 1 軌道に含まれるド・ブロイ波の数を表している。


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class Nit extends JPanel     // virial theorem of Nitrogen(N)
 {
  public static void main(String arg[])
 {
   JFrame frame = new JFrame("Nitrogen (N)");         // 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
 
                    // elp[0-4][0-10] = each textbox parameter of electron (0-4)

    JTextField elp[][]=new JTextField[5][11];  JTextField impho=new JTextField(7); 
    JTextField mmpho[]=new JTextField[3];   JTextField imppo=new JTextField(7); 
   
    int marki[]=new int[3]; int mar=0;             // 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[5][11];  
    double den=5.25; double tene=266.948;    // tene= (+) nitrogen atom energy (1-5th)
                                             // den= central positive charge  
     
    double nux[]={12500.0, 12500.0, 12500.0};   // nux[0-2]=nuclear coordinate
                                                 
    double ina1=5332.0;                  // ina1= distance between nucleus and electron

                                         // te1=initial conditions of each electron
   double te1[][]={{1128.34,-3324.12, 4013.38}, {-904.53, 3746.95, 3684.06}, 
    {2260.0, -3618.75, -3198.0}, {2439.32, 3754.34, -2895.64}, 
    {-5019.15, -629.02, -1686.0}};

  public J2DPanel()
 {
  setBackground(Color.black);
  JPanel p=new JPanel();
  p.setLayout(new GridLayout(7,12));
  String vv,zww; int aaa=0; 
                               
  for (int el=0; el <=4; el++) {      // hpr[0-4][0-2] = coordinate of each electron (0-4)
  for (int pos=0; pos <=2; pos++) {
  elp[el][pos]=new JTextField(7); elp[el][pos].addActionListener(this);
  hpr[el][pos]=0.0;      
  }}
                                   
   for (int el=0; el <=4; el++) {        // other parameters of each electron
  for (int pos=3; pos <=10; pos++) {
  elp[el][pos]=new JTextField(7);     
  hpr[el][pos]=0.0; 
  }}
                                     // mmpho[0-2] = force components acting on the nucleus
   for (int pos=0; pos <=2; pos++) {
    mmpho[pos]=new JTextField(7);
   }

                                        // layout
 
   String sihy[]={"eNo. ", "+X (MM)", "+Y (MM)", "+Z (MM)", "nux (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 <=4; el++) {       
  p.add(new Label("ele "+el+" "));
  for (int pos=0; pos <=10; pos++) {
  p.add(elp[el][pos]);
  }}

   p.add(new Label("N nuc "));
  for (int pos=0; pos <=2; pos++) {
  p.add(mmpho[pos]);  
  }                                      
                                     // imppo=textbox of ina1 (distance)
                                     // impho=textbox of total potential energy (tV)                                   

     p.add(imppo); p.add(impho);  imppo.addActionListener(this);
   for (int pos=0; pos <=5; pos++) {
  p.add(new Label(" -- "));
    }
 
  add(p,"South");
  
   for (int el=0; el <=4; 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(Integer.toString(aaa)); // show distance between nuclei and electrons 
    for (int jou=0; jou <=2; jou++) {
    hpr[el][jou]=te1[el][jou]+nux[jou]; 
                                              // show initial coordinate
    elp[el][jou].setText(Integer.toString((int)(te1[el][jou])));
     }}
   imppo.setText(Double.toString(ina1));
  }     // public J2DPanel() end
 
  
  public void actionPerformed(ActionEvent e) {     // when textboxes change
    String ss;  ss=" ";
    double Rf1,Rf4; mar=0; Rf4=0.0; Rf1=0.0;
    marki[0]=0; marki[1]=0;

    if (e.getSource()==imppo ) {mar=1;           // when radius changes
    ss=imppo.getText(); ina1=Double.parseDouble(ss);  
    if (ina1 > 9000.0) {ina1=9000.0;}    if (ina1 < 1000.0) {ina1=1000.0;}
     }

    for (int ett=0; ett <=4; ett++) {    
    for (int sws=0; sws <=2; sws++) {             // when each coordinate changes

   if (e.getSource()==elp[ett][sws] ) {marki[0]=ett+1; marki[1]=sws+1; 

      Rf4=Math.sqrt(ina1*ina1-hpr[ett][2]*hpr[ett][2]);
     ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss);
      if (Rf1 >ina1 && sws==2 ) {Rf1=ina1;}   if (Rf1 <-ina1 && sws==2 ) {Rf1=-ina1;}
      if (Rf1 >Rf4 && sws != 2 ) {Rf1=Rf4;}  if (Rf1 <-Rf4 && sws != 2 ) {Rf1=-Rf4;}
    hpr[ett][sws]=Rf1+nux[sws];
     }
    }}
   
   repaint();
  }

  public void update(Graphics g)
 {
  paint(g);
 }
 public void paintComponent(Graphics g)
 {
   
  double kro,pot,gx,gy,gz,ggx,ggy,ggz,ttav,toav;
  kro=0.0; gx=0.0;gy=0.0;gz=0.0;ggx=0.0; ggy=0.0; ggz=0.0;
  int ex,ey,ez; String ww;
  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}};
 
  double mmp[]={0,0,0};  
  
               // ---------------------  change radius

 if (mar==1) {         
     for (int yp=0; yp <=4; yp++) { 
      gx=Math.sqrt((hpr[yp][0]-nux[0])*(hpr[yp][0]-nux[0])+
   (hpr[yp][1]-nux[1])*(hpr[yp][1]-nux[1])+(hpr[yp][2]-nux[2])*(hpr[yp][2]-nux[2]));     
    for (int kj=0; kj <=2; kj++) { 
      gy=hpr[yp][kj]-nux[kj]; gy=(gy*ina1)/gx; hpr[yp][kj]=gy+nux[kj];
       elp[yp][kj].setText(Integer.toString((int)gy));
     }}  mar=0;
   }  
                                                                    
                // --------------------  change coordinate

 if (marki[0] !=0) {  ex=marki[0]-1;       // ex= electron number changed
   gy=Math.sqrt((hpr[ex][0]-nux[0])*(hpr[ex][0]-nux[0])+(hpr[ex][1]-nux[1])*(hpr[ex][1]-nux[1]));
   gx=Math.sqrt(ina1*ina1-(hpr[ex][2]-nux[2])*(hpr[ex][2]-nux[2]));

  if (marki[1]==3) {                      // when z coordinate is changed
   gz=((hpr[ex][0]-nux[0])*gx)/gy;  hpr[ex][0]=gz+nux[0];
   gz=((hpr[ex][1]-nux[1])*gx)/gy;  hpr[ex][1]=gz+nux[1];
    }
                                         // when x coordinate is changed
  if (marki[1] == 1) { gz=Math.sqrt(gx*gx-(hpr[ex][0]-nux[0])*(hpr[ex][0]-nux[0]));
   ggz=hpr[ex][1]-nux[1];
   if (ggz >= 0) {hpr[ex][1]=gz+nux[1];}   
   if (ggz < 0) {hpr[ex][1]=-gz+nux[1];}
    }
                                         // when y coordinate is changed
  if (marki[1] == 2) { gz=Math.sqrt(gx*gx-(hpr[ex][1]-nux[1])*(hpr[ex][1]-nux[1]));
     ggz=hpr[ex][0]-nux[0];
    if (ggz >= 0) {hpr[ex][0]=gz+nux[0];}   
    if (ggz < 0) {hpr[ex][0]=-gz+nux[0];}
    }
    for (int kj=0; kj <=2; kj++) {
    elp[ex][kj].setText(Integer.toString((int)(hpr[ex][kj]-nux[kj])));
     }
   }

   toav=0.0;                  // toav=total potential energy

  double ppot;
   for (int yp=0; yp <=4; yp++) {        // ------ interaction between electrons
    for (int kj=0; kj <=4; 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;}
                                       // ppot=repulsive potential energy (eV)
     ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14); 
    toav=toav+ppot;
                                      // rhp[][3]= potential energy of each electron
   rhp[yp][3]=rhp[yp][3]+ppot/2.0; rhp[kj][3]=rhp[kj][3]+ppot/2.0;
    for (int jou=0; jou <=2; jou++) {
                                    // rhp[][0-2]=force component acting on each electron
   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 nucleus and each electron
    for (int rv=0; rv <=4; rv++) {    
                                  // kro=distance between nucleus and electron
    kro=Math.sqrt((hpr[rv][0]-nux[0])*(hpr[rv][0]-nux[0])+
   (hpr[rv][1]-nux[1])*(hpr[rv][1]-nux[1])+
   (hpr[rv][2]-nux[2])*(hpr[rv][2]-nux[2]));
    if (kro == 0) {kro=5000.0;}   
     ex=(int)(kro);  elp[rv][3].setText("nuc "+Integer.toString(ex));
       ppot=-(elc*elc*den*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
     toav=toav+ppot; 
     rhp[rv][3]=rhp[rv][3]+ppot; 
    for (int jou=0; jou <=2; jou++) {   // ggx=force component between nucleus and electron
     ggx=(suh*den*(hpr[rv][jou]-nux[jou]))/(kro*kro*kro);
     rhp[rv][jou]=rhp[rv][jou]-ggx;  mmp[jou]=mmp[jou]+ggx;
     }}

   ex=(int)(100*toav); ggx=ex/100.0;
   impho.setText("tV "+Double.toString(ggx));       // show total V (eV)
 

    for (int rv=0; rv <=4; rv++) {               // show forces acting on electrons 
    gx=Math.sqrt((hpr[rv][0]-nux[0])*(hpr[rv][0]-nux[0])+
   (hpr[rv][1]-nux[1])*(hpr[rv][1]-nux[1])+(hpr[rv][2]-nux[2])*(hpr[rv][2]-nux[2]));

                                              // gy=forces toward nucleus (CF)
    gy=-(rhp[rv][0]*(hpr[rv][0]-nux[0])+rhp[rv][1]*(hpr[rv][1]-nux[1])+rhp[rv][2]*(hpr[rv][2]-nux[2]))/gx;
    ex=(int)(1000*gy); ww="CF ";
    elp[rv][6].setText(ww+Integer.toString(ex));
                                              // show  forces other than CF  
    for (int jou=0; jou <=2; jou++) {
    gz=rhp[rv][jou]-(gy*(nux[jou]-hpr[rv][jou]))/gx;
    ex=(int)(1000*gz); 
    elp[rv][jou+7].setText(Integer.toString(ex));
     }
    }

    for (int jou=0; jou <=2; jou++) {           // show forces acting on nucleus
    ex=(int)(1000*mmp[jou]); ww=" ";
   if (jou==0) {ww="FX=";}
   if (jou==1) {ww="FY=";}
   if (jou==2) {ww="FZ=";}
    
    mmpho[jou].setText(ww+Integer.toString(ex));
    }

                                                              
   double hiwa=0.0;double sa[]=new double[7];  double hiwa2=0.0;
                                   // sa[]=V differences between electron 0 and other 
  for (int rv=1; rv <=4; rv++) { sa[rv]=rhp[rv][3]-rhp[0][3]; hiwa=hiwa+sa[rv]; }
   for (int rv=0; rv <=4; rv++) { hiwa2=hiwa2+rhp[rv][3]; }
                                   // rhp[][4] = kinetic energy of each electron
  rhp[0][4]=(-tene-hiwa2+hiwa)/5.0;
  for (int rv=1; rv <=4; rv++) {rhp[rv][4]=rhp[0][4]-sa[rv];}                        
                              
                                   // show potential and kinetic energy 
  for (int rv=0; rv <=4; rv++) {
   ex=(int)(100*rhp[rv][3]); ggx=ex/100.0;
   elp[rv][4].setText("V "+Double.toString(ggx)); 
    ex=(int)(100*rhp[rv][4]); ggx=ex/100.0;
   elp[rv][5].setText("T "+Double.toString(ggx));
   }

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


                          
   int nmx[]=new int[3]; int hpk[][]=new int[8][4]; 

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

  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  nucleus
  g.fillOval(nmx[0]+10,650-nmx[1],20,20);g.fillOval(370+nmx[0],650-nmx[2],20,20);
  g.fillOval(730+nmx[1],650-nmx[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);
  
  g.setColor(Color.pink);                     // 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);
  
   g.setColor(Color.green);             // 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.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);
    
  for (int rw=0; rw <=4; rw++) {         // show each electron's number
  g.setColor(Color.blue);
  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] );
  }
   }
   }