化学結合のページに戻る
トップページ(2電子原子も含む新ボーア模型)
このプログラムは少し長いので、下に示すソースプログラムをコピーして、テキストエディタ(メモ帳など)にそのまま貼り付けて、コンパイルすれば簡単に実行できる。
このプログラムの class file name は hydd なので、このデキストエディタを "hydd.java" のファイル名で保存してコンパイルしてほしい。
このプログラムでは、水素原子核は灰色の円で示してある。
ここでは、新しい単位として ( 1 MM = 10-14 meter) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Z (MM)) は、これらの原子核からの”相対的な”位置座標を示している。
(ele 0 は水素原子核 0 (H0), ele1 は H1 からの座標である。)
"nuc (MM)" はこれらの核と電子の距離である。
V (eV) と T (eV) は各電子の位置エネルギーと運動エネルギーを示している。
tV (eV) は全位置エネルギーである。
(FX, FZ) は各粒子(電子や核)に作用する力の成分を意味する。
Waves (wn) は1軌道に含まれるド。ブロイ波の数を示している。
電子の座標 (+X, +Z) は自由に変更できる。
(テキストボックス内に数値を入力して、Enter キーを押せばいい。)
また、"H-H" の横のテキストボックスに、数値 (MM) を入力して、 Enter キーを押すと、核間距離が変わる。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class hydd extends JPanel // virial theorem of hydrogen molecule
{
public static void main(String arg[])
{
JFrame frame = new JFrame("H2 (hydrogen)"); // set frame
J2DPanel j2dpanel = new J2DPanel();
frame.getContentPane().add(j2dpanel); frame.setSize(900,500);
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
// textboxes: elp=electrons, mmpho=nuclei, impho=tV, imppo=internuclear distance
JTextField elp[][]=new JTextField[2][8]; JTextField impho=new JTextField(7);
JTextField mmpho[][]=new JTextField[2][2]; JTextField imppo=new JTextField(7);
int mar=0; // mar=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[2][8]; // hpr[0,1][]=electron's parameters
double nleng=7414.0; // nleng=internuclear distance
// nux=each nuclear coordinates
double nux[][]={{8793.0, 12500.00},{8793.0+nleng, 12500.0}};
double ina[]={890.0, 4665.0}; // ina=initial coordinate of electron
public J2DPanel()
{
setBackground(Color.black);
JPanel p=new JPanel();
p.setLayout(new GridLayout(4,9));
String vv; int aaa=0;
String sihy[]={"eNo.", "+X (MM)", "+Z (MM)", "nuc (MM)",
"V (eV)", "T (eV)", "FX ", "FZ ", "Waves "};
for (int el=0; el <=8; el++) { p.add(new Label(sihy[el])); }
for (int el=0; el <=1; el++) { // elp[][0-1], hpr[][0-1] = electron's coordiate
for (int pos=0; pos <=1; pos++) {
elp[el][pos]=new JTextField(7); elp[el][pos].addActionListener(this);
hpr[el][pos]=0.0;
}}
for (int el=0; el <=1; el++) { // electron's other parameters
for (int pos=2; pos <=7; pos++) {
elp[el][pos]=new JTextField(7);
hpr[el][pos]=0.0;
}}
for (int el=0; el <=1; el++) {
for (int pos=0; pos <=1; pos++) {
mmpho[el][pos]=new JTextField(7);
}}
// layout
for (int el=0; el <=1; el++) {
p.add(new Label("ele "+el+" "));
for (int pos=0; pos <=7; pos++) {
p.add(elp[el][pos]);
}}
p.add(new Label("H0nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[0][pos]);
}
p.add(new Label("H1nuc "));
for (int pos=0; pos <=1; pos++) {
p.add(mmpho[1][pos]);
}
p.add(impho); p.add(new Label("H-H")); p.add(imppo);
imppo.addActionListener(this);
imppo.setText(Integer.toString((int)nleng));
add(p,"South");
double nnuc=Math.sqrt(ina[0]*ina[0]+ina[1]*ina[1]);
aaa=(int)(nnuc); // nnuc=distance between nucleus and electron
for (int el=0; el <=1; el++) {
elp[el][2].setText(Integer.toString(aaa));
double sig=1.0; if (el==1) {sig=-1.0;}
for (int jou=0; jou <=1; jou++) { // set and show initial coordinates
hpr[el][jou]=nux[el][jou]+ina[jou]*sig;
elp[el][jou].setText(Integer.toString((int)(ina[jou]*sig)));
}}
} // public J2DPanel() end
public void actionPerformed(ActionEvent e) {
String ss;
double Rf1,Rf2; mar=0; int teis=0;
for (int ett=0; ett <=1; ett++) { // when electron's position changes
for (int sws=0; sws <=1; sws++) {
if (e.getSource()==elp[ett][sws] ) { mar=1;
ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss);
Rf2=0.0;
Rf2=Rf1+nux[ett][sws]; // change relative coordinate to absolute coordinate
if (sws==0) { // upper and lower limits of coordinates
if (Rf1 >=nleng*0.5 && ett==0) {Rf1=nleng*0.5-1.0; Rf2=Rf1+nux[ett][sws]; teis=1;}
if (Rf1 <=-nleng*0.5 && ett==1) {Rf1=-nleng*0.5+1.0; Rf2=Rf1+nux[ett][sws]; teis=1;}
}
if (Rf2 < 1.0) {Rf2=1.0; Rf1=Rf2-nux[ett][sws]; teis=1;}
if (Rf2 > 24999.0) {Rf2=24999.0; Rf1=Rf2-nux[ett][sws]; teis=1;}
hpr[ett][sws]=Rf2;
if (teis==1) {elp[ett][sws].setText(Integer.toString((int)Rf1));}
hpr[ett*-1+1][sws]=nux[ett*-1+1][sws]-Rf1;
elp[ett*-1+1][sws].setText(Integer.toString((int)(-Rf1)));
}
}}
if (e.getSource()==imppo) {mar=2; } // mar=2 when internuclear distance changes
repaint();
}
public void update(Graphics g)
{
paint(g);
}
public void paintComponent(Graphics g)
{
double kro,gx,gy,gz,ggx,ggy,ggz,ttav,toav,ppot; kro=0.0;
int ex,ey,ez; String ww;
double rhp[][]= {{0,0,0,0},{0,0,0,0}};
double mmp[][]={{0,0},{0,0}};
if (mar==2) { // when internuclear distance changes
ww=imppo.getText(); ggz=Double.parseDouble(ww);
if (ggz < 0) {ggz=ggz*-1.0; imppo.setText(Integer.toString((int)ggz));}
ww=elp[1][0].getText(); ggx=Double.parseDouble(ww);
if (nux[0][0]+ggz+ggx > 24999.0) {ggz = 24999-ggx-nux[0][0];
imppo.setText(Integer.toString((int)ggz));}
if (ggz+ggx < ggz*0.5) {ggz =-ggx*2.0+1.0;
imppo.setText(Integer.toString((int)ggz));}
nux[1][0]=nux[0][0]+ggz; nleng=ggz;
hpr[1][0]=ggx+nux[1][0];
}
toav=0.0; // toav=total potential energy
// interaction between two electrons
kro=Math.sqrt((hpr[0][0]-hpr[1][0])*(hpr[0][0]-hpr[1][0])+
(hpr[0][1]-hpr[1][1])*(hpr[0][1]-hpr[1][1]));
if (kro==0) {kro=5000.0;}
ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
toav=toav+ppot;
//rhp[][2]=electron's potential energy (eV)
rhp[0][2]=rhp[0][2]+ppot/2.0; rhp[1][2]=rhp[1][2]+ppot/2.0;
for (int jou=0; jou <=2; jou++) { // calculate force between electrons=rhp[][0-1]
ggx=(suh*(hpr[0][jou]-hpr[1][jou]))/(kro*kro*kro);
rhp[0][jou]=rhp[0][jou]+ggx; rhp[1][jou]=rhp[1][jou]-ggx;
}
for (int el=0; el <=1; el++) { // interaction between electron and nucleus
for (int rv=0; rv <=1; rv++) {
kro=Math.sqrt((hpr[el][0]-nux[rv][0])*(hpr[el][0]-nux[rv][0])+
(hpr[el][1]-nux[rv][1])*(hpr[el][1]-nux[rv][1]));
if (kro == 0) {kro=5000.0;}
// elp[][2]=show distance between electron and nucleus
if (el==rv) {elp[el][2].setText(Integer.toString((int)kro));}
ppot= -(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
rhp[el][2]=rhp[el][2]+ppot; toav=toav+ppot;
for (int kj=0; kj <=1; kj++) { // mmp[][0-1]=force compoment acting on nuclei
ggx=(suh*(hpr[el][kj]-nux[rv][kj]))/(kro*kro*kro);
mmp[rv][kj]=mmp[rv][kj]+ggx; rhp[el][kj]=rhp[el][kj]-ggx;
}
}}
// interaction between two nuclei
kro=Math.sqrt((nux[0][0]-nux[1][0])*(nux[0][0]-nux[1][0])+
(nux[0][1]-nux[1][1])*(nux[0][1]-nux[1][1]));
ppot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
toav=toav+ppot;
rhp[0][2]=rhp[0][2]+ppot/2.0; rhp[1][2]=rhp[1][2]+ppot/2.0;
for (int jou=0; jou <=1; jou++) {
ggx=(suh*(nux[0][jou]-nux[1][jou]))/(kro*kro*kro);
mmp[0][jou]=mmp[0][jou]+ggx; mmp[1][jou]=mmp[1][jou]-ggx;
}
ex=(int)(100*toav); ggx=ex/100.0;
impho.setText("tV "+Double.toString(ggx)); // show total V
for (int el=0; el <=1; el++) { // show each electron's V and T (eV)
ex=(int)(100*rhp[el][2]); ggx=ex/100.0;
elp[el][3].setText("V "+Double.toString(ggx));
ex=(int)(100*rhp[el][2]*-0.5); ggx=ex/100.0;
elp[el][4].setText("T "+Double.toString(ggx));
}
for (int el=0; el <=1; el++) {
for (int jou=0; jou <=1; jou++) { // show force component acting on each electron
ex=(int)(1000*rhp[el][jou]);
elp[el][jou+5].setText(Integer.toString(ex));
}
}
for (int rv=0; rv <=1; rv++) { // show force component acting on each nuclei
for (int jou=0; jou <=1; jou++) {
ex=(int)(1000*mmp[rv][jou]); ww=" ";
if (jou==0) {ww="FX=";}
if (jou==1) {ww="FZ=";}
mmpho[rv][jou].setText(ww+Integer.toString(ex));
}}
for (int el=0; el <=1; el++) { // show de Broglie wave
gz=Math.sqrt(rhp[el][0]*rhp[el][0]+rhp[el][1]*rhp[el][1]);
gy=(gz*elc*elc)/(4*pai*epsi*suh*1.0e-28); // gy=force (N)
gx=Math.sqrt((-rhp[el][2]*1.602177e-19)/me); // gx=velocity (m/s)
ggx=(me*gx*gx)/gy; // ggx="temporary" radius
ggy=(2*pai*ggx*me*gx)/h; // ggy=number of de Broglie's waves
ex=(int)(ggy*1000); ggy=ex/1000.0;
elp[el][7].setText("wn "+Double.toString(ggy)); }
// --------------------- show picture
int nmx[][]=new int[2][2]; int hpk[][]=new int[2][2];
for (int yp=0; yp <=1; yp++) {
for (int kj=0; kj <=1; kj++) { // change MM to pixel in nuclei
nmx[yp][kj]=(int)(nux[yp][kj]/71.428);
}}
for (int yp=0; yp <=1; yp++) {
for (int kj=0; kj <=1; kj++) { // change MM to pixel in electrons
hpk[yp][kj]=(int)(hpr[yp][kj]/71.428);
}}
g.clearRect(9,100,800,780);
g.setColor(Color.cyan);
g.drawLine(nmx[0][0]+275,285, nmx[1][0]+275,285);
g.setColor(Color.lightGray); // show two nuclei
g.fillOval(nmx[0][0]+265,450-nmx[0][1],20,20);
g.fillOval(nmx[1][0]+265,450-nmx[1][1],20,20);
g.setColor(Color.red); // show electron 0
g.fillOval(hpk[0][0]+268,453-hpk[0][1],14,14);
// show electron 1
g.setColor(Color.green);
g.fillOval(hpk[1][0]+268,453-hpk[1][1],14,14);
for (int rw=0; rw <=1; rw++) { // show particle's number
g.setColor(Color.white);
g.drawString("H"+Integer.toString(rw),nmx[rw][0]+268,464-nmx[rw][1]);
g.setColor(Color.blue);
g.drawString(Integer.toString(rw),hpk[rw][0]+272,465-hpk[rw][1]);
}
}}