|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6912 (0x1b00)
Types: TextFile
Names: »algtdosc«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦7e928b248⟧ »algbib«
└─⟦this⟧
;gosav
lookup banddiag
if ok.no
(banddiag= set 8
permanent banddiag.15
banddiag=algol extbanddiag index.no)
tdosc=set 60
tdosc=algol list.no xref.no index.no
\f
TWODIMENSIONAL OSCILLATOR , 24-8-77. GOS
begin
comment
Program for calculating eigenvalues, eigenvectors and
expectation values for the Hamiltonian
1/2 P (G0 + G2 X**2 + G4 X**4 + G6 X**6) P
+ 1/2 G0 (Pz**2 - 1/4) / X**2
+ V2 X**2 + V4 X**4 + V6 X**6.
Input specifications:
1) Text string in < >.
2) Order of matrix in harmonic basis, N.
3) Energy spacing of basis, 1/cm.
4) G0, G2, G4 and G6.
5) V2, V4 and V6.
6) Option for units: 0 , if G- and V-constants in 1/cm,
1 , if G- and V-constants in terms of u, Å, rad and mdyn.
7) Two vibrational quantum numbers indicating range
of levels to be calculated.
8) The maximal change in vibrational quantum number, dv,
of calculated transitions (delta(l) = 0).
Energies are calculated in 1/cm. Expectation values in Å or rad,
momenta divided by h-bar, however;
zone res(128,1,stderror);
real lo,G,G2,G4,G6,A,B,C,E0,LS,h00,h01,h02,h03,h0l,h2l,h20,h21,h22,
h40,h41,h60,Q2,Q4,Q6,P2,P2Q2,P2Q4,P4,P4Q2,p,q,r,s,t,
sq1,sq2,sq3,sq4,cpu,time;
integer N,m1,m2,dv,nw,i,j,k,l,k1,k2,m,u,v,v1,v2,lines;
array head(1:12);
boolean even,sp,nl,closeres;
even:= true; sp:= false add 32; nl:= false add 10;
readhead(in,head,1); lo:= real <<-dddd.dddd000000>;
read(in,N,LS,G,G2,G4,G6,A,B,C,nw,v1,v2,dv); i:= 1;
closeres:= outmedium(res);
write(res,<:<12>:>,nl,2,string head(increase(i)),
nl,1,<:Matrix dimension:>,<< ddd>,N,
<: Energy Spacing : :>,<<ddddd>,LS,nl,1,
<:G0,G2,G4,G6: :>,string lo,G,G2,G4,G6,
nl,1,<:V2,V4,V6 : :>,A,B,C);
p:= G; G:= LS; LS:= p/LS*(if nw=0 then 1 else 33.71498443);
G2:= G2*LS/p; G4:= G4*LS*LS/p; G6:= G6*LS**3/p;
p:= (if nw=0 then 1 else 50344.44349)/G;
A:= A*LS*p; B:= B*LS**2*p; C:= C*LS**3*p;
h00:= (G2*3/4+B)/2; h01:= (1+G4*15/4+C*7)/2+A;
h02:= (G2+B*6)/4; h03:= (G4+C*10)/4;
h0l:= -(G2+B+B)/4; h2l:= -(G4+C*6)/8;
h20:= -1/2+G4*13/8+A+C*3;h21:= B+B;
h22:= (G4+C*30)/8; h40:= -G2/2+B;
h41:= -G4/2+C*3; h60:= G4/2-C;
m:= if G6<>0 then 4 else if h60<>0 then 3 else 2;
if dv>-1 then begin
nw:= 0; v:= v2-v1+2; v:= v//2*(v+1)//2;
end else v:= 1;
E0:= 0; lines:= 0;
cpu:= systime(1,0,time);
begin array w(1:v,1:10);
matrix:
v:= if even == v1 mod 2 = 0 then v1 else v1+1;
for l:=v step 2 until v2 do begin
m1:= if v1<l then 1 else (v1-l+2)//2;
m2:= (v2-l+2)//2;
begin
comment oprettelse af H-matrix.;
array H(1:N,0:m),ev(m1:m2),x(m1:m2,1:N);
sq1:= sq2:= sq3:= sq4:= 0; u:= l+1; p:= l*l;
for i:=1 step 1 until N do begin
H(i,0):= ((h03*u+h02)*u+h01)*u+h00+((u+u)*h2l+h0l)*p
+G6*((u*u*5-p*6+109)*u*u+(p-1)*(p-34))/16;
H(i,1):= -((h22*(u-1)+h21)*(u-1)+h20+h2l*p
+G6*((u-1)**2-p+33)*(u-1)/4)*sq1;
H(i,2):= (h41*(u-2)+h40-G6*((u-2)**2-25/4)/2)*sq2;
if m>2 then
H(i,3):= (h60+G6*(u-3))*sq3;
if m>3 then
H(i,4):= -G6/2*sq4;
u:= u+1; q:= sqrt(u*u-p)/2; u:= u+1;
sq4:= sq3*q; sq3:= sq2*q; sq2:= sq1*q; sq1:= q;
end i;
banddiag(N,m,m1,m2,ev,H,x);
if l=0 then E0:= if m1=1 and dv=0 then ev(1)*G else 0;
k1:= m1-4; v:= l+m1*2-4;
rep: lines:= lines+1; i:= 1;
if (lines-1) mod 5=0 and lines>1 then
write(res,<:<12>:>,nl,2,string head(increase(i)));
write(res,nl,2,sp,5);
k1:= k1+4; k2:= k1+3; if k2>m2 then k2:= m2;
for i:=k1 step 1 until k2 do
write(res,sp,4,<:v,l =:>,<<ddd>,v+i+i,l,sp,1);
write(res,nl,2,<:E :>);
for i:=k1 step 1 until k2 do
write(res,string lo,G*ev(i)-E0);
if dv=-1 then begin
for j:=1 step 1 until N do begin
write(res,nl,1,sp,5);
for i:=k1 step 1 until k2 do
write(res,string lo,x(i,j))
end;
end else begin
for i:= k1 step 1 until k2 do begin
u:= l+1; Q4:= P4:= 0.5; P2Q2:= 0.75; t:=l*l;
Q2:= Q6:= P2:= P2Q4:= P4Q2:= p:= q:= r:= sq1:= sq2:= sq3:= 0;
for j:=1 step 1 until N do begin
s:= r; r:= q; q:= p+p; p:= x(i,j);
Q2:= Q2+u*p*p-sq1*p*q;
P2:= P2+u*p*p+sq1*p*q;
Q4:= Q4+(u*u*3-t)/2*p*p-(u-1)*2*sq1*p*q+sq1*sq2*p*r;
P2Q2:= P2Q2+(u*u-t)/2*p*p-sq1*sq2*p*r;
P4:= P4+(u*u*3-t)/2*p*p+(u-1)*2*sq1*p*q+sq1*sq2*p*r;
Q6:= Q6+(u*u*5-3*t+7)*u/2*p*p-((u-2)*u*5-t+9)*0.75*sq1*p*q
+(u-2)*3*sq1*sq2*p*r-sq1*sq2*sq3*p*s;
P2Q4:= P2Q4+(u*u-t+7.5)*u/2*p*p-((u-2)*u-t+14)/4*sq1*p*q
-(u-2)*sq1*sq2*p*r+sq1*sq2*sq3*p*s;
P4Q2:= P4Q2+(u*u-t+3.5)*u/2*p*p+((u-2)*u-t+6)/4*sq1*p*q
-(u-2)*sq1*sq2*p*r-sq1*sq2*sq3*p*s;
u:= u+1; s:= (u*u-t)/4; u:= u+1;
sq3:= sq2; sq2:= sq1; sq1:= sqrt(s)
end;
for j:=1 step 1 until 10 do w(nw+i,j):= case j of
(G*ev(i),Q2*LS,Q4*LS*LS,Q6*LS**3,P2/LS,P2Q2,P2Q4*LS,
P4/(LS*LS),P4Q2/LS,0.0 shift 24 add (v+i+i) shift 24 add l);
end i;
for j:=2 step 1 until 4 do begin
write(res,nl,1,<:X:>,<<d>,j+j-2,sp,5);
for i:=k1 step 1 until k2 do
write(res,string lo,w(nw+i,j));
end;
for j:=5 step 1 until 7 do begin
write(res,nl,1,case j-4 of (<:P2 :>,<:P2X2:>,<:P2X4:>),sp,3);
for i:=k1 step 1 until k2 do
write(res,string lo,w(nw+i,j));
end;
for j:=8,9 do begin
write(res,nl,1,if j=8 then <:P4 :> else <:P4X2 :>);
for i:=k1 step 1 until k2 do
write(res,string lo,w(nw+i,j));
end end;
if k2<m2 then goto rep
end H; nw:= nw+m2-m1+1 end l;
if even then begin even:= false; goto matrix end;
cpu:= systime(1,time,time)-cpu;
if dv>0 then begin
array tr(1:4); i:= 1;
write(res,<:<12>:>,nl,2,string head(increase(i)),
nl,2,<:Transitions:>,nl,2);
for k:= 1 step 1 until dv do
for l:=v1 step 1 until v2-k do
for v:= l step 1 until v2-k do begin
m:= k mod 2;
r:= 0.0 shift 24 add v shift 24 add l;
rep: even:= true;
s:= 0.0 shift 24 add (v+k) shift 24 add (l+m);
for i:=1 step 1 until nw do begin
q:= w(i,10);
if q=r or q=s then begin
if even then begin
for j:=1 step 1 until 4 do tr(j):= w(i,j);
even:= false
end else begin
p:= if q=r then -1 else 1;
write(res,nl,1,<<dd>,r shift (-24) extract 24,r extract 24,
sp,2,s shift (-24) extract 24,s extract 24,
<< dddd.dddd>,(w(i,1)-tr(1))*p);
for j:=2 step 1 until 4 do
write(res,<< -d.ddddddd>, (w(i,j)-tr(j))*p);
i:= nw
end end end i;
if m=1 and l>v1 then begin
m:= -1; goto rep
end end v end tr end w;
write(res,nl,2,<<ddd.d>,<:cpu-time: :>,cpu,
<: real-time: :>,time,nl,2,<:<25>:>);
close(res,closeres) end
permanent tdosc.15
▶EOF◀