窒素原子のページに戻る
トップページ(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] );
}
}
}