窒素 (N) と リン (P) の配置を視覚化するサンプルJAVAプログラム

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

このプログラムは少し長いので、下に示すソースプログラムをコピーして、テキストエディタ(メモ帳など)にそのまま貼り付けて、コンパイルすれば簡単に実行できる。
このプログラムの class file name は nitrr なので、このデキストエディタを "nitrr.java" のファイル名で保存してコンパイルしてほしい。
JAVA の あるバージョンでは コンパイル後 "-Xlint : unchecked ---" などの警告がでることがあるが それを無視して そのまま実行できる。

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

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 nitrr extends JPanel     // virial theorem of Nitrogen(N)
 {
  public static void main(String arg[])
 {
   JFrame frame = new JFrame("Nitrogen, phosphate");   // 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=5291.0*5291.0; // suh=(Bohr radius)^2
 
                // elp[0-4][0-10] = Textboxes of each electron (0-4)

    JTextField elp[][]=new JTextField[5][11]; 

    JTextField impho=new JTextField(7);    // total V text
    JTextField mmpho[]=new JTextField[3];  // nucleus text

            // imppo = distance between electron and nucleus text   
    JTextField imppo=new JTextField(7);    

    JTextField charge=new JTextField(7);   // charge text
   
    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;      // den= central positive charge Z
                                                 
    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[][]={{2666,-4617.6, 0}, {2666, 4617.6, 0}, 
    {0, 0, 5332}, {-5332, 0, 0}, 
    {0, 0, -5332}};

  public J2DPanel()
 {
  setBackground(Color.black);
  JPanel p=new JPanel();
  p.setLayout(new GridLayout(7,12));
  String vv,zww; int aaa=0; 
                             
                // hpr[0-4][0-2] = coordinate of each electron (0-4)  
  for (int el=0; el <=4; el++) {
  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 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("nucleus "));
  for (int pos=0; pos <=2; pos++) {
  p.add(mmpho[pos]);  
  }       
    p.add(new Label(" -- "));   
    p.add(impho);          // impho=textbox of total potential energy (tV)  

                        // charge = central charge text
    p.add(new Label(" Charge Z = "));    
    p.add(charge);  charge.addActionListener(this);

    p.add(new Label(" -- "));
    p.add(new Label(" nuc = "));
                      // imppo=textbox of nuc (distance)
    p.add(imppo);   
    imppo.addActionListener(this);
     
    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); 
                      // show distance between nuclei and electrons 
   elp[el][3].setText(Integer.toString(aaa)); 
    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));
   charge.setText(Double.toString(den));
  }     // public J2DPanel() end
 
  
  public void actionPerformed(ActionEvent e) {  // when textboxes change
    String ss;  ss=" ";
    double Rf1=0.0; mar=0; 
   

    if (e.getSource()==imppo ) {mar=1;        // when "nuc" changes
    ss=imppo.getText(); ina1=Double.parseDouble(ss);  
    if (ina1 > 12000.0) {ina1=12000.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] ) {

     ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss);
      
    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};  
  
               // --------------------- "nuc" = distance changes 

 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;
   }  
                                                                    
                
    ww=charge.getText();            // get charge value from text
    den=Double.parseDouble(ww);

    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.0*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 = each attractive potential energy
       ppot=-(elc*elc*den*6.241509e18)/(4.0*pai*epsi*kro*1.0e-14);
     toav=toav+ppot; 
     rhp[rv][3]=rhp[rv][3]+ppot; 

                 // ggx=force component between nucleus and electron
    for (int jou=0; jou <=2; jou++) {   
     ggx=(suh*den*(hpr[rv][jou]-nux[jou]))/(kro*kro*kro);
     rhp[rv][jou]=rhp[rv][jou]-ggx; 
      mmp[jou]=mmp[jou]+ggx; // mmp[0-2] = force acting on nucleus
     }}

   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));
     }
                              
             // show potential and kinetic energy of each electron
  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)); 

    rhp[rv][4] = -rhp[rv][3] * 0.5;
    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 = total 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]);
                            // gy=forces (N) 
   gy=(gz*elc*elc)/(4.0*pai*epsi*suh*1.0e-28);  

                      // gx=velocity (m/s) of each electron  
   gx=Math.sqrt((2.0*rhp[rv][4]*1.602177e-19)/me);  
   
   ggx=(me*gx*gx)/gy;     // ggx= rotation radius  from centrifugal force

  double debroglie = h/(me*gx);
   ggy=(2*pai*ggx)/debroglie;   // ggy=number of de Broglie's wave in one orbit

  ex=(int)(ggy*1000);  ggz=ex/1000.0; 
  elp[rv][10].setText("wn "+Double.toString(ggz)); 
    }
                       
                                    // ----------  show picture
   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.drawString("X - Y plane", 150,290);
   g.drawString("X - Z plane", 510,290);
   g.drawString("Y - Z plane", 870,290);

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