サンプル C 言語 プログラム( 炭素、酸素、ホウ素の原子半径 )。

トップページ
原子半径のページに戻る。

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

このサンプルプログラムでは、実行すると、最初に 原子の種類を選ぶ。
炭素様原子 (= C, Si ) を計算するときは 最初に "0" の数値を入力するように。
もし 酸素様原子 (= O, Si )、ホウ素様原子 (= B, Al ) を計算するときは それぞれ "1" もしくは "2" を入力するように。

次に 中心電荷 Z と すべての価電子の全イオン化エネルギーを入力する。
これらの値から このプログラムは 正四面体状の炭素のポテンシャルエネルギーと力を計算する。
ビリアル定理 ( E = -T = 1/2 V ) を用いて、このプログラムは 1軌道に含まれるドブロイ波を計算する。
画面上には このドブロイ波の数 (= 約 2.0 ) と、各価電子と中心の原子核間の距離 (MM) が表示される。


#include <stdio.h>
#include <math.h>

int main(void) 
 {
   int i;
   double fig,Z,E,ke,r,F,nuc,radius,debroglie,a,wave;
   double poten, kinetic,velo;
   double me=9.1093826e-31;
   double pai=3.141592653589793; 
   double epsi=8.85418781787346e-12;
   double h=6.62606896e-34; 
   double ele=1.60217653e-19;  
     
                             /* choose carbon-like = 0, oxygen-like = 1, boron like = 2 */
   
    printf(" First, input 0, 1, or 2 to choose atoms. \n");  
    printf("  Carbon, Si = 0, Oxygen, S = 1, Boron, Al = 2  ? ");  
    scanf("%lf",&fig);
 
                            /* input central positive charge Z  */ 
    printf(" central charge Z ?    ");  
    scanf("%lf",&Z);

                         /* input total ionization energy |E| eV  */
    printf(" total ionization energies |E| eV ? ");  
    scanf("%lf", &E);
    printf("                        \n");

     ke=(ele*ele)/(4.0*pai*epsi);
     poten = -2.0 * E * 1.602177e-19;

    /*  Carbon-like atoms ( C, Si )  */

                          /* length r from potenial V in tetrahedron  */
     r =(ke/poten) * (-(8.0*Z)/sqrt(6.0) + 3.0);
                
                   /* kinetic = total kinetic energy by Virial theorem */        
      kinetic=-0.5*poten;       
      velo=sqrt((kinetic)/(2.0*me));  /* velo = electron's velocity (m/s) */
 
                      /* F = force acting on each electron (N) */
       F = (ke/(r*r))*(Z*2.0/3.0 - sqrt(6.0)/4.0  );

                       /* nuc = distance between electron and nucleus */
       nuc=r*sqrt(6)/2.0;  

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


    /* oxygen-like atoms ( O, S )  */

   if ( fig == 1 ) {
                     /* a = distance between electron and nucleus  */
       a = (ke/poten)*(-6.0*Z + 12.0/sqrt(2)+1.5);

                          /* velo = veclocity of each  electron 0-5 */
     velo=sqrt(kinetic/(3.0*me));

                         /*  F = force acting on each electron (N) */
     F = (ke/(a*a))*(Z-2.0/sqrt(2)-0.25);

     radius=(me*velo*velo)/F; /* rotation radius from centrifugal force */
     debroglie = h/(me*velo);       /* de Broglie wavelength of electron */
     wave=(2.0*pai*radius)/debroglie;  /* wave's number in one orbit */
     nuc = a;
      }

    /* Boron -like atoms ( B, Al ) */ 

   if ( fig == 2 ) {
                             /* r = distance between electron and nucleus */
      r =(ke/poten) * (-(3.0*Z) + sqrt(3));  
                                
                           /* velo = velocity of each electron 0-2 */ 
      velo=sqrt((2.0*kinetic)/(3.0*me)); 
                           /*  F = force acting on each electron  */
    F = (ke/(r*r))*(Z - (1.0/sqrt(3)) );


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

      nuc = r;
      }
  
      nuc = nuc * 1.0e14;  /* change meter to MM */

      printf("de Broglie wave in one orbit : %.3f \n", wave);
      printf("distance between electron and nucleus: %.2f ", nuc);
      printf("                        \n");
                      
   
     return 0;
   }