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

トップページ
分子結合のページに戻る。

下のソースプログラムをそのままテキストエディタ(メモ帳など)にコピー and ペースト すれば、簡単にコンパイルと実行できる。
(この class file name は avera2 なので、このテキストエディタを "avera2.java" とセーブしてコンパイルしてほしい。)
ここでは 1 MM = 1 × 10-14 meter という新しい単位を使用している。

このサンプルプログラムでは、実行すると、最初に H2 の核間距離 ( MM ) を入力する。
その後、電子1の y座標 "r" ( MM )、x 座標 "a" ( MM ) を 入力する。
これら入力値から、このプログラムは H2 の結合エネルギー (eV)、原子核 1 に作用する トータルの力 (= nucforce )、電子1に作用する力の x, y 成分 (= elefx, elefy ) を出力する。
これらの力は 水素原子の基底状態の電子と原子核間の力との比で表されている。

電子に作用する力と その速度から 1軌道に含まれるドブロイ波を計算する。
( ここでは ビリアル定理 E = -T = 1/2 V を使用している。)
"another x" は 電子1が 力の方向へ移動した先の もう1つの x 座標である。
それから x が another x の座標のときの 上記の計算を行う。
"avebinding" は x 座標が "a" と "another x" のときの 平均の結合エネルギーであり、"avewave" は x 座標が "a" と "another x" のときの平均のドブロイ波である。
"after-elefx" は 力の方向に移動した後の 電子1に作用する力の x 成分である。
最初の x 座標は +100 まで自動的に計算ごとに増加していく。


import java.util.Scanner;
class calcu 
  {

    double me=9.1093826e-31; 
    double pai=3.141592653589793; 
    double epsi=8.85418781787346e-12;
    double h=6.62606896e-34; 
    double ele=1.60217653e-19; 
    double boh=5292.0*5292.0*1.0e-28;  // boh = ( Bohr radius )^2 
    double a,r,nuc,rra,binding,elefx,elefy,wave,nucforce, anotherx;

   void disp( ) {

   double ke=(ele*ele)/(4.0*pai*epsi);
   double rra=Math.sqrt(a*a+r*r);       // rra =distance between electron 1 and n1
   double rrb=Math.sqrt(r*r+(nuc-a)*(nuc-a));  // rrb=  between electron 1 and n2
   double rrc=Math.sqrt(4.0*r*r+(nuc-2*a)*(nuc-2*a)); // between two electrons
 
   double poten=ke*(-2.0/rra-2.0/rrb+1.0/nuc+1.0/rrc);  // poten=potential energy (J)
   double ppot=poten*6.241509e18;       // ppot = potential energy (eV) 
                                  
   double kinetic=-0.5*poten;       // kinetic = total kinetic energy of two electrons (J)
   double velo=Math.sqrt(kinetic/me);  // velo = electron's velocity (m/s) 
   binding=-ppot*0.5-13.606*2;          // binding energy (eV) of H2

                            // foeces acting on electron 1 ( x, -y directions )
   elefx= -a/(rra*rra*rra) + (nuc-a)/(rrb*rrb*rrb) - (nuc-2.0*a)/(rrc*rrc*rrc);
   elefy= r/(rra*rra*rra) + r/(rrb*rrb*rrb) - (2.0*r)/(rrc*rrc*rrc);
   double eleforce = ke*Math.sqrt(elefx*elefx + elefy*elefy);  // total force

   double radius=(me*velo*velo)/eleforce; // rotation radius from centrifugal force
   double debroglie = h/(me*velo);       // de Broglie wavelength of electron
   wave=(2*pai*radius)/debroglie;  // wave's number in one orbit

   nucforce= a/(rra*rra*rra)-1.0/(nuc*nuc)+(nuc-a)/(rrb*rrb*rrb);
   nucforce=nucforce * boh;            // total force acting on nucleus 1

   anotherx=a+(2.0*r*elefx)/elefy; 
   anotherx = anotherx * 1.0e14;       // another x coordinate of electron 1

    elefx=elefx * boh; elefy = elefy * boh;

    }}

 class avera2
  {
    public static void main(String[] args) {
 
    Scanner stdIn=new Scanner(System.in);   
    System.out.println(" Internuclear distance (MM) of H2 molecule ?  ");  
    double nnuc=stdIn.nextDouble(); 

    System.out.println(" r (MM)? = y coodinate of electron 1 ");  
    double rr=stdIn.nextDouble();

    System.out.println(" a (MM) ? = x coodinate of electron 1 ");  
    double aa=stdIn.nextDouble(); 
 
    calcu c;
    c = new calcu();

    c.r=rr*1.0e-14; c.nuc=nnuc*1.0e-14;    // change MM to meter
    

   for (int i=1;i < 10;i++){            // repeat calculation from a to a + 10*10 (MM)
   
   
     c.a=aa*1.0e-14;
     c.disp();                   // to void disp calculation

  
   System.out.printf("a:%.1f ", aa);
   System.out.printf(" binding: %.4f ", c.binding); 
   System.out.printf(" elefx: %.3f ", c.elefx);
   System.out.printf(" elefy: %.3f ", c.elefy);
   System.out.printf("nucforce: %.3f \n", c.nucforce);
   System.out.printf(" another x : %.2f ", c.anotherx);
   

   double wwave = c.wave; 
   double bbind = c.binding;      
   c.a=c.anotherx*1.0e-14;        // repeat calculation above when a = another x
   c.disp();
   
                              // average binding energy and waves ( "a" and "another x" )
   bbind = ( c.binding + bbind )/2.0; wwave = (c.wave+wwave)/2.0;
   System.out.printf(" after-elefx: %.3f ", c.elefx); // elefx at another x
   System.out.printf(" avebinding: %.4f ", bbind); 
   System.out.printf(" avewave: %.4f \n", wwave);   // average bond energy
   System.out.printf("                        \n");  // average de Broglie wave

  aa=aa+10;}}}