|
|
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: 26880 (0x6900)
Types: TextFile
Names: »algrotfit0«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦7e928b248⟧ »algbib«
└─⟦this⟧
;gosav lines.10000
lookup rotfit
if ok.no
(rotfit=set 95
permanent rotfit.17
rotfit=algol list.no index.no xref.no)
\f
FITTING OF ROTATIONAL CONSTANTS. 3-3-1975. GOS.
begin
integer i,j,k,l,m,m1,N,N1,J1,J2,Q,Q1,linecount,page,space,version;
real s, so, starttime, stoptime, cpu, time;
boolean slut,aires,delres,iterer,oblat,
sp,closeres,quartic,sextic,hb,ID;
array Rot, dRot, Int, dInt(1:4), D, head(1:12);
zone res(128,1,stderror);
procedure writecr;
begin linecount:= linecount+1;
if linecount>60 then writepage;
write(res,<:<10>:>)
end writecr;
procedure writepage;
begin integer i;
page:= page+1; linecount:= 3; i:= 1;
write(res,<:<10><12>:>,false add 10,3,string head(increase(i)),
false add 32, space,<<dd>, page, false add 10, 2)
end writepage;
closeres:=outmedium(res); sp:= false add 32;
dataind:
cpu:= systime(1,0,starttime);
space:= 68 - readhead(in,head,1); read(in,m1,stoptime,Rot);
stoptime:= stoptime*60; N:= Rot(4);
slut:= m1>0; m1:= abs m1; m:= m1//1000;
delres:= m1 mod 1000 >= 100; version:= m1 mod 10;
aires := m1 mod 100 >= 10; iterer := N<>0;
ID:= version > 4;
page:= 0; writepage; write(res,<:
Calculation by ROTFIT of 3-3-1975
:>); if ID then begin
Rot(1):= Rot(1)/505376; version:= version-4;
write(res,<:with inertial defect as first parameter.:>);
writecr end;
case version of begin
begin Q1:= 8; Q:= 15;
linecount:= linecount+6; write(res,<:
D1 = Dj, D2 = Djk, D3 = Dk, D4 = dj, D5 = djk, (kHz)
D6 = Hj, D7 = Hjk, D8 = Hkj, D9 = Hk,
D10= hj, D11= hjk, D12= hk, (Hz).
:>) end;
begin Q1:= 8; Q:= 15;
linecount:= linecount+8; write(res,<:
D1 = tau-aaaa, D2 = tau-bbbb, D3 = tau-cccc,
D4 = tau-abab + tau-caca*(A-B)/(A-C),
D5 = tau-bcbc + tau-caca*(B-C)/(A-C),
D6 = Hj, D7 = Hjk, D8 = Hkj, D9 = Hk
D10= hj, D11= hjk, D12= hk, (Hz).
:>) end;
begin Q1:= 7; Q:= 8;
linecount:= linecount+7; write(res,<:
D1 = tau-abab + 2*tau-cccc,
D2 = tau-aaaa + tau-bbbb - 2*tau-abab - 8*tau-cccc,
D3 = tau-aaaa - tau-bbbb, D4 = tau-cccc (kHz).
D5 = Hjk (Hz).
:>) end;
begin Q1:= Q:= 8;
linecount:= linecount+5; write(res,<:
Version for analysis of transitions between K-doublet levels
(see J.Mol.Structure 8 (1971) 217). Constants in kHz.
:>) end;
end;
s:= if ID then 1/(1/Rot(3)-1/Rot(2)-Rot(1)) else Rot(1);
oblat:= 2*Rot(2)>(s+Rot(3));
N1:= if iterer then N else 1;
l:= Q-m;
begin
integer k11,k12,k21,k22,type1,type2,min,xx,yy,zz,xy,yz,zx;
array DR(3:Q), tr(1:N1), an(1:l,1:l+1),
col(1:Q,1:Q+1), AO,lo(1:Q);
integer array nf(0:m),qn(1:N1,1:3),MATRIX(1:8),lw,cif,exp(1:Q);
min:= 1;
for i:=4,i+1 while k<>10 do begin
if i>Q then begin write(res,<:
***delimiter error in C.D.constant input.:>); goto stop end;
read(in,DR(i)); repeatchar(in); readchar(in,k) end;
for j:=i step 1 until Q do DR(j):= 0;
for j:=1 step 1 until 12 do D(j) := 0;
for j:=1 step 1 until m do read(in,nf(j));
for i:=1 step 1 until Q do cif(i):= 0;
writecr;
if m=1 then write(res,<:Fixed Constant::>) else
if m>1 then write(res,<:Fixed Constants::>);
for i:=1 step 1 until m do begin
if i-1 = i//2*2 and i<>1 then begin writecr;
write(res,sp, 16) end;
l:= nf(i); AO(l):= 0; write(res,<: :>);
if l<4 then begin
so:= Rot(l);
if ID and l=1 then begin
so:= so*505376; write(res,<:ID = :>) end else
write(res, case l of (<:A = :>,<:B = :>,<:C = :>));
write(res,<<dd ddd.dddd>, so)
end else begin
so:= DR(l);
write(res,<:D:>,<<d>,l-3,<: = :>, if abs so=0 then <<d>
else <<-ddd.ddd0000>,so)
end
end;
if m<>0 then writecr;
if iterer then begin
integer q,max,my;
boolean b11,b12,b21,b22;
max:=1; writecr;writecr;write(res,<:Input transitions::>);writecr;
for k:=1 step 1 until N do begin
read(in, J1, k11, k12, J2, k21, k22, my, tr(k));
writecr; write(res,<<ddd>,J1,k11,k12,J2,k21,k22,my,
<<___ddd ddd.ddd>,tr(k));
repeatchar(in); for i:=readchar(in,l) while l<>10 and l<>9 do;
b11:=k11=k11//2*2; b12:=k12=k12//2*2;
b21:=k21=k21//2*2; b22:=k22=k22//2*2;
type1:=if b11 and b12 then 1 else
if b11 and-,b12 then 2 else
if -,b11 and b12 then 3 else 4;
type2:=if b21 and b22 then 1 else
if b21 and-,b22 then 2 else
if -,b21 and b22 then 3 else 4;
b11:= b11==b21; b22:= b12==b22;
if my<>(if b11 and-,b22 then 1 else
if b22 and-,b11 then 3 else 2)or abs(J1-J2)>1 then begin
N1:=N1-1; write(res,<: ***deleted:>);
if k=min then max:=min:=min+1;
goto linieslut end;
comment The reading of a transition have been performed, and
the quantum numbers have been controlled for correct tran-
sition type, my, and will be packed in the array qn. To
obtain print out arranged in order of increasing J, a number
giving the index of the line to follow is stored in qn(k,3);
qn(k,1):= J1 shift 7 add J2 shift 7 add k11 shift 3 add type1;
qn(k,2):= k12 shift 7 add k21 shift 7 add k22 shift 3 add type2;
qn(k,3):= min; q:=max;
for i:=min,qn(i,3) while i<>min do
if qn(i,1)<=qn(k,1) then q:=i else i:= max;
if q=max then begin
if qn(k,1)>=qn(max,1) then max:=k else
if qn(k,1)<qn(min,1) then min:=k end;
qn(k,3):= qn(q,3); qn(q,3):= k;
linieslut: end k;
writecr; writecr; write(res,<:Total number: :>,<<ddd>,N1);
writecr
end reading and control of transitions;
if oblat then begin
for i:=1 step 1 until 8 do
MATRIX(i):= case i of (1,4,2,3,2,3,1,4) end
else begin
for i:=1 step 1 until 8 do
MATRIX(i):= case i of (1,2,3,4,2,1,4,3) end;
systime(1,starttime,time);
l:= Q-m; nf(0):= 0; s:= 0; so:= 2**64;
if oblat then begin
xx:= 1; yy:= 2; zz:= 3; xy:= 4; yz:= 5; zx:= 6
end else begin
zz:= 1; xx:= 2; yy:= 3; zx:= 4; xy:= 5; yz:= 6 end;
igen:
m1:= if -,iterer then 0 else if N1=l then 1 else N1-l;
quartic:= sextic:= false;
for i:= 4 step 1 until Q1 do quartic:= quartic or DR(i)<>0;
for i:= Q1+1 step 1 until Q do sextic:= sextic or DR(i)<>0;
begin
real p,qd,y,a,b,c,a2,b2,c2,X,Y,Z,r1,r2,r3,r4,r5,r6,r7,r8,r9,DW;
integer j0,k0,K2;
boolean ha;
array ai(1:Q+1);
b:= Rot(2); c:= Rot(3); Int(2):= 1/b; Int(3):= 1/c;
if ID then begin
Int(4):= Rot(1); Int(1):= Int(3)-Int(4)-Int(2);
a:= Rot(1):= 1/Int(1);
a2:= a*a; b2:= a2/(b*b); c2:= a2/(c*c)
end else begin
a:= Rot(1); Int(1):= 1/a;
Int(4):= Int(3)-Int(1)-Int(2)
end;
p:= 1/(a-c); Rot(4):= (b+b-a-c)*p;
ha:= s=so; hb:= false;
X:= Rot(xx); Y:= Rot(yy); Z:= Rot(zz);
if ha then begin
ai(1):= -(1+Rot(4))*p; ai(2):= p+p;
ai(3):= -(1-Rot(4))*p; p:= 0;
if ID then begin
ai(3):= ai(3)+ai(1)*c2;
ai(2):= ai(2)-ai(1)*b2; ai(1):= ai(1)*a2 end;
for i:=1 step 1 until 3 do begin
dRot(i):= y:= sqrt(col(i,i)*s); dInt(i):= y/(Rot(i)**2);
for j:=i step 1 until 3 do p:= p + col(i,j)*ai(i)*ai(j)
end;
dRot(4):= sqrt(p*s); p:= 0;
if ID then begin
ai(1):= a2; ai(2):= -b2; ai(3):= c2
end else begin
ai(1):= 1/a**2; ai(2):= 1/b**2; ai(3):= -1/c**2 end;
for i:=1 step 1 until 3 do
for j:=i step 1 until 3 do p:= p + col(i,j)*ai(i)*ai(j);
p:= sqrt(p*s);
if ID then begin
dInt(4):= dRot(1); dRot(1):= p; dInt(1):= p/a2
end else dInt(4):= p
end ha else if iterer then writepage;
case version of begin
begin
for i:=1 step 1 until 5 do D(i):= DR(i+3)*'-3;
for i:=6 step 1 until 12 do D(i):= DR(i+3)*'-6;
end vers1;
begin
comment The standard constants are calculated in ai (in kHz)
using the Dowling relations and assuming tau-caca=0;
r4:= a*Int(2); r8:= b*Int(3); r3:= c*Int(1);
r4:= -r4*r4; r8:= r8*r8; r3:= r3*r3;
r1:= 1/r4; r5:= 1/r8; r9:= 1/r3;
r2:= r1*r3; r6:= r4*r5; r7:= r8*r9;
for j:=1 step 1 until 3 do ai(j):= DR(j+3)*'3;
ai(4):= (DR(4)*r1 + DR(5)*r4 + DR(6)*r7)*0.5 + DR(7)*2;
ai(5):= (DR(4)*r2 + DR(5)*r5 + DR(6)*r8)*0.5 + DR(8)*2;
ai(6):= (DR(4)*r3 + DR(5)*r6 + DR(6)*r9)*0.5;
for j:=4 step 1 until 6 do ai(j):= ai(j)*'3;
for j:=6 step 1 until 12 do D(j):= DR(j+3)*'-6;
hb:= true end vers2;
begin
comment As in version 2 the standard constants are calcu-
lated, but in this case it is assumed that both constants
tau-bcbc = 0 and tau-caca = 0;
r4:= a*Int(2); r8:= b*Int(3); r3:= c*Int(1);
r4:= -r4*r4; r8:= r8*r8; r3:= r3*r3;
r1:= 1/r4; r5:= 1/r8; r9:= 1/r3;
r2:= r1*r3; r6:= r4*r5; r7:= r8*r9;
p:= r1; r1:= (p+r4)*0.5; r4:= (p-r4)*0.25; r7:= 2*r1+r7*0.5-4;
p:= r2; r2:= (p+r5)*0.5; r5:= (p-r5)*0.25; r8:= 2*r2+r8*0.5;
p:= r3; r3:= (p+r6)*0.5; r6:= (p-r6)*0.25; r9:= 2*r3+r9*0.5;
ai(1):= DR(4) + (DR(5)+DR(6))*0.5 + DR(7)*2;
ai(2):= DR(4) + (DR(5)-DR(6))*0.5 + DR(7)*2;
ai(3):= DR(7);
ai(4):= (DR(4)+DR(5)*0.5)*r1 + DR(6)*r4 + DR(7)*r7 + DR(4)*2;
ai(5):= (DR(4)+DR(5)*0.5)*r2 + DR(6)*r5 + DR(7)*r8;
ai(6):= (DR(4)+DR(5)*0.5)*r3 + DR(6)*r6 + DR(7)*r9;
D(7):= DR(8)*'-6;
hb:= true end vers3;
begin
c:= 1/(X-Y); a:= (Y-Z)*c; b:= (Z-X)*c;
r1:= (X-Y)/(Z+Z-X-Y);
a:= DR(4)+DR(6)*r1*r1*2;
b:= DR(5)-DR(7)*r1;
ai(xx):= (a+b+DR(8))*4; ai(yz):= (-b-DR(7))*2+DR(8)*4;
ai(yy):= (a-b+DR(8))*4; ai(zx):= ( b-DR(7))*2+DR(8)*4;
ai(zz):= (DR(6)-DR(7)+DR(8))*4; ai(xy):= (-a+DR(8))*4;
hb:= true
end vers4;
end;
if hb then begin
comment Calculation of D-constants from standard constants,
and correction of rotational constants;
c:= -1/16000;
D(1):= ((ai(xx)+ai(yy))*1.5+ai(xy))*c;
D(2):= -D(1)*2 + (ai(yz)+ai(zx))*4*c;
D(3):= -D(1)-D(2)+ai(zz)*4*c;
D(4):= (ai(xx)-ai(yy))*c;
D(5):= -D(4)-(ai(yz)-ai(zx))*2*c;
DW := (ai(xx)+ai(yy)-ai(xy)*2)*c;
X:= X+DW; Y:= Y+DW; Z:= Z-DW*1.5; DW:= DW/4
end else begin
comment Calculation of standard constants from D-constants
assuming tau-xxxx + tau-yyyy - 2*tau'-xxyy = 0;
p:= -4000; DW:= 0;
ai(xx):= (D(1) + D(4)*2)*p;
ai(yy):= (D(1) - D(4)*2)*p;
ai(zz):= (D(1) + D(2) + D(3))*p;
ai(xy):= D(1)*p;
ai(yz):= (D(1) + D(2)*0.5 - D(4) - D(5))*p;
ai(zx):= (D(1) + D(2)*0.5 + D(4) + D(5))*p
end;
j:= 6; p:= 505376;
for i:=1 step 1 until Q do
lw(i):= if i>3 then 14 else 16;
exp(1):= k0:= if ID and ha then
entier(ln(abs Rot(1))/ln10)-entier(ln(dRot(1)/2)/ln10)+1
else cif(1);
for i:=2,3 do exp(i):= cif(i);
exp(4):= if ha then
entier(ln(abs Rot(4))/ln10)-entier(ln(dRot(4)/2)/ln10)+1
else 7;
write(res,<:
Rotational constants (MHz) and kappa:
:>); for i:=1 step 1 until 4 do begin y:= Rot(i);
write(res,string format(lw(i),exp(i),y,lo(i)),y) end;
if ha then begin write(res,<:
+-:>); for i:=1 step 1 until 4 do begin y:= dRot(i);
if y=0 then write(res,sp,lw(i)-5,<:fixed:>)
else write(res,string lo(i),y) end end;
exp(1):= k0;
exp(4):= if ID then cif(1) else if ha then
entier(ln(abs Int(4))/ln10)-entier(ln(dInt(4)/2)/ln10)+1
else 4;
for i:=2,3 do exp(i):= cif(i);
write(res,<:
Inertial constants and defect (uÅ**2):
:>); for i:=1 step 1 until 4 do begin y:= Int(i)*p;
write(res,string format(lw(i),exp(i),y,lo(i)),y) end;
if ha then begin write(res,<:
+-:>); for i:=1 step 1 until 4 do begin y:= dInt(i)*p;
if y=0 then write(res,sp,lw(i)-5,<:fixed:>)
else write(res,string lo(i),y) end end;
for i:=4 step 1 until Q do exp(i):= cif(i);
if quartic then begin write(res,<:
Quartic distortion constants:
:>); for i:=4 step 1 until Q1 do begin y:= DR(i);
write(res,string format(lw(i),exp(i),y,lo(i)),y) end;
j:= j+5;
if ha then begin write(res,<:
+-:>); for i:=4 step 1 until Q1 do begin y:= sqrt(col(i,i)*s);
if y=0 then write(res,sp,lw(i)-5,<:fixed:>)
else write(res,string lo(i),y) end end;
write(res,<:
Standard distortion constants (kHz):
:>); for i:=1 step 1 until 6 do
write(res,<<-dddd.ddd000>,ai(i)) end;
if sextic then begin write(res,<:
Sextic distortion constants:
:>); k0:= if Q>Q1+4 then Q1+4 else Q;
for i:=Q1+1 step 1 until k0 do begin y:= DR(i);
write(res,string format(lw(i),exp(i),y,lo(i)),y) end; j:= j+3;
if ha then begin write(res,<:
+-:>); for i:=Q1+1 step 1 until k0 do begin y:= sqrt(col(i,i)*s);
if y=0 then write(res,sp,lw(i)-5,<:fixed:>)
else write(res,string lo(i),y) end end;
ha:= false; for i:=k0+1 step 1 until Q do ha:= ha or DR(i)<>0;
if ha then begin writecr; writecr;
write(res,<: :>); ha:= s=so;
for i:=k0+1 step 1 until Q do begin y:= DR(i);
write(res,string format(lw(i),exp(i),y,lo(i)),y) end;
if ha then begin writecr; write(res,<:+-:>);
for i:=k0+1 step 1 until Q do begin y:= sqrt(col(i,i)*s);
if y=0 then write(res,sp,lw(i)-5,<:fixed:>)
else write(res,string lo(i),y) end
end end else ha:= s=so end;
if ha then j:= j//3 + j;
linecount:= linecount+j+4;
if ha and -,iterer then begin
writecr; writecr; writecr;
write(res,<:Significant Digits and Correlation Matrix::>);
writecr; linecount:=linecount - 4;
for i:=1 step 1 until l do begin p:= an(i,i);
AO(i):= if p>0 then 1/sqrt(p) else 0 end;
N:= (l-1) mod 6 + 1; j0:= 0; k:= 1;
Cor: for i:=1 step 1 until N do begin writecr;
for j:=k step 1 until i-1 do write(res,sp,8);
if j=i then begin j:= j+1;
for j0:=j0+1 while cif(j0)= 0 do;
write(res,<<__dd>,cif(j0),<: :>) end;
for j:=j step 1 until N do
write(res,<<__-d.ddd>,an(i,j)*AO(i)*AO(j))
end i;
writecr; k:= N+1; N:= N+6; if k<l then goto Cor;
linecount:= linecount+4 end;
write(res,false add 10,3);
if iterer then begin
write(res,<: Transition obs. frequency obs.- t:>);
if quartic then write(res,<: distortion corrections:>);
write(res,<:<10>:>,sp,33,<:calc. :>)
end else begin
read(in,N1); if N1<0 then goto stop;
if linecount > 50 then writepage;
write(res,<: Transition calc. frequency sigma inten-:>);
if quartic then write(res,<: distortion corrections:>);
write(res,<:<10>:>,sp,38,<: sitet:>)
end;
if quartic then begin
write(res,<: total:>);
if sextic then write(res,<: sextic:>);
if m>0 then write(res,<: fixed:>)
end; writecr;
p:= Y; Y:= (X-p)*0.25; X:= (X+p)*0.5; Z:= Z-X;
if iterer then s:= 0; Q:= Q+1;
begin
integer line, lc, matr, nr, type, JJ, it;
real norm,lambda,Li,dE,F,G,G1,G2,H,H1,H2,
Pxy,Pz,Pzxy,Pxyxy,Pzzd,Pz4,Pz6;
array atot(1:if iterer then N1 else 1,1:l+1), imp(1:2,1:5);
lc:= 0;
for line:= min, qn(line,3) while line<>min do begin
if iterer then begin
N:= qn(line,1); lc:= lc+1;
J1 := N shift (-17) extract 7;
J2 := N shift (-10) extract 7;
k11:= N shift (-3) extract 7;
type1:= N extract 3;
N:= qn(line,2);
k12:= N shift (-17) extract 7;
k21:= N shift (-10) extract 7;
k22:= N shift (-3) extract 7;
type2:= N extract 3;
Li:= tr(line)
end else begin
boolean b11,b12,b21,b22;
nylinie: J1:= N1;
if J1<0 then goto stop;
read(in, k11, k12, J2, k21, k22, j, Li);
repeatchar(in);
for N:= readchar(in,k) while k<>10 and k<>9 do;
read(in,N1); qn(line,3):= 1; min:= 0;
b11:=k11=k11//2*2; b12:=k12=k12//2*2;
b21:=k21=k21//2*2; b22:=k22=k22//2*2;
type1:=if b11 and b12 then 1 else
if b11 and-,b12 then 2 else
if -,b11 and b12 then 3 else 4;
type2:=if b21 and b22 then 1 else
if b21 and-,b22 then 2 else
if -,b21 and b22 then 3 else 4;
b11:= b11==b21; b22:= b12==b22;
if j<>(if b11 and-,b22 then 1 else
if b22 and-,b11 then 3 else 2)
or abs(J1-J2)>1 then goto nylinie
end;
for j:=1,2 do imp(j,4):= 0;
for j:=1 step 1 until Q do ai(j):= 0;
for j:= 1,2,3 do imp(1,j):= imp(2,j):= 0;
dE:= 0;
for k:=-1,1 do begin
if k=-1 then begin
j0:= J1; type:= type1; nr:= (J1-k11)//2+1
end else begin
j0:= J2; type:= type2; nr:= (J2-k21)//2+1
end;
JJ:= j0*(j0+1);
matr:= MATRIX(if j0=j0//2*2 then type else (type+4));
k0:= if matr=1 then -2 else if matr=2 then 0 else -1;
N:= (j0-k0)//2; p:= if matr=1 then 2 else 1;
F:= (X - (D(1) - D(6)*JJ)*JJ)*JJ;
G:= Z - (D(2) - D(7)*JJ)*JJ;
G1:= -D(3) + D(8)*JJ; G2:= D(9);
H:= Y - (D(4) - D(10)*JJ)*JJ;
H1:= (-D(5) + D(11)*JJ)*0.5; H2:= D(12)*0.5;
if j0<>0 then begin
array alfa, beta, gamm, S, Pdif(1:N), PG(1:15), PS(1:6);
comment The matrix elements are calculated. Diagonal elements
in alfa and off diagonal elements in beta and gamm(a).
Pdif contains
Pdif(j) = <j-1 , Px**2 - Py**2 , j> * 2 ,
however Pdif(1) = < 1 , Px**2 - Py**2 , 1>. ;
beta(1):= Pdif(1):= gamm(1):= 0;
k0:= k0+2; K2:= k0*k0; Pz4:= K2*K2;
for j:=1 step 1 until N do begin
alfa(j):= F + (G + (G1 + G2*K2)*K2)*K2;
if j<>N then begin
p:= p*(j0-k0)*(j0-k0-1)*(j0+k0+1)*(j0+k0+2);
y:= H2*Pz4+H1*K2+H;
k0:= k0+2; K2:= k0*k0; Pz4:= K2; Pz4:= Pz4*K2;
beta(j+1):= (H2*Pz4+H1*K2+y)**2*p;
Pdif(j+1):= -sqrt(p);
gamm(j+1):= -DW*Pdif(j)*Pdif(j+1); p:= 1
end end j;
if matr>=3 then begin
j:= if matr=3 then -1 else 1;
alfa(1):= alfa(1) + (H+(H1+H2)*2)*j*JJ;
if N>1 then begin
p:= -DW*Pdif(2)*JJ*j; qd:= beta(2);
beta(2):= qd + p*p - sqrt(qd)*p*2
end;
Pdif(1):= j*JJ//2
end else if matr=2 then alfa(1):= alfa(1)+DW*(JJ-2)*JJ
else if N>1 then alfa(2):= alfa(2)-DW*(JJ-2)*JJ;
comment Eigenvalue and eigenvector are evaluated;
j:= if oblat then nr else N+1-nr;
H:= (if j>1 then sqrt(beta(j)) else 0) +
(if j<N then sqrt(beta(j+1)) else 0);
if j=1 or j=N then H:= H*3;
G:= alfa(j) + H; H:= alfa(j) - H;
for lambda:= (G+H)*0.5 while G<>lambda do begin
p:= 0; qd:= 1; it:= 0;
for i:=1 step 1 until N do begin
y:= (alfa(i)-lambda)*qd - beta(i)*p;
p:= qd; qd:= y;
if p>=0 == qd>=0 then it:=it+1;
if it=nr then i:= N
end sturm;
if it=nr then H:= lambda else G:= lambda
end bisection;
begin
real a1,a2,b1,c1,c2,s1,s2,ab1,ac2;
array a, b(1:N), d(-2:1);
for i:= 2 step 1 until N do beta(i):= - sqrt(beta(i));
d(-2):= gamm(j); d(-1):= beta(j); G:= alfa(j);
for i:= j+1 step 1 until N do begin
alfa(i-1):= alfa(i); beta(i-1):= beta(i); gamm(i-1):= gamm(i)
end;
alfa(N):= beta(N):= gamm(N):= 0;
d(0):= beta(j); beta(j):= gamm(j); gamm(j):= 0;
if j<N then begin d(1):= gamm(j+1); gamm(j+1):= 0 end
else d(1):= 0;
it:= 0; N:= N-1; F:= lambda;
repeat:
for i:=1 step 1 until N do S(i):= 0;
for i:=-2 step 1 until 1 do if d(i)<>0 then S(i+j):= -d(i);
a1:= a2:= b1:= c1:= c2:= s1:= s2:= ab1:= ac2:= 0;
for i:=N step -1 until 1 do begin
a(i):= 1/(alfa(i)-lambda-b1*ab1-c2*ac2);
b(i):= beta(i)-c1*ab1;
if i<=j+1 then S(i):= S(i)-s1*ab1-s2*ac2;
s2:= s1; s1:= S(i); a2:= a1; a1:= a(i); b1:= b(i);
c2:= c1; c1:= gamm(i); ab1:= a1*b1; ac2:= a2*c2
end;
s1:= s2:= 0; norm:= 1;
for i:=1 step 1 until N do begin
S(i):= (S(i)-s1*b(i)-s2*gamm(i))*a(i);
s2:= s1; s1:= S(i); norm:= norm + s1*s1
end;
norm:= 1/norm;
if N>1 and DW<>0 then begin
H:= G-lambda;
for i:=-2 step 1 until 1 do
if d(i)<>0 then H:= H + d(i)*S(j+i);
H:= H*norm;
if it<2 or (abs H<abs F and lambda+H<>lambda) then begin
lambda:= lambda+H; it:= it+1; F:= H; goto repeat
end end end;
for i:=N step -1 until j do S(i+1):= S(i);
S(j):= 1; N:= N+1;
Pz:= Pz4:= Pz6:= Pxy:= Pzxy:= Pxyxy:= Pzzd:=
G:= F:= H:= H1:= 0; j:= 0;
for i:=N step -1 until 1 do begin
G:= S(i); H:= H*G+H1; H1:= F; F:= F*G; G2:= G*G*K2;
Pz := Pz + G2; G2:= G2*K2;
Pz4 := Pz4 + G2; G2:= G2*K2;
Pz6 := Pz6 + G2;
Pxy := Pxy + F;
Pzxy:= Pzxy + (j+K2)*F;
Pzzd:= Pzzd + F*j*j + F*K2*K2;
Pxyxy:= Pxyxy + H*H;
H:= Pdif(i); F:= H*G; k0:= k0-2; j:= K2; K2:= k0*k0
end;
H:= F+H1/2; F:= F*G;
Pxy := (Pxy + F)*norm;
Pzxy:= (Pzxy + F + F)*norm;
Pzzd:= (Pzzd + F + F)*norm;
Pxyxy:= (Pxyxy/4+H*H)*norm;
PG(zz):= Pz:= Pz*norm; F:= JJ-Pz;
PG(xx):= (F+Pxy)*0.5;
PG(yy):= (F-Pxy)*0.5;
Pz4:= Pz4*norm;
for i:=1,2,3 do imp((3+k)//2,i):= PG(i);
imp(1,4):= imp(1,4) + Pz4;
imp(2,4):= imp(2,4) + Pz4*k;
imp((3+k)//2,5):= lambda;
if hb then begin
G:= (JJ-Pz-Pz)*JJ+Pz4; F:= (JJ+JJ)*Pxy-Pzxy;
PS(xx):= (G+F+Pxyxy)/16;
PS(yy):= (G-F+Pxyxy)/16;
PS(zz):= Pz4/4;
PS(xy):= (G-Pxyxy)/8; G:= JJ*Pz-Pz4;
PS(yz):= (G+G-Pzxy)/8;
PS(zx):= (G+G+Pzxy)/8;
end calculation of standard angular momenta;
case version of begin
begin p:= 0.001;
PG(4):= -p*JJ*JJ; PG(5):= -JJ*Pz*p;
PG(6):= -Pz4*p; PG(7):= -JJ*Pxy*(p+p);
PG(8):= -Pzxy*p; PG(12):= Pz6*norm*'-6;
PG(15):= Pzzd*'-6;
for i:=7,8 do PG(i+6):= -PG(i)*JJ*p;
for i:=4,5,6 do PG(i+5):= -PG(i)*JJ*p
end vers1;
begin p:= 0.000001;
PG(4):= PS(1)+(PS(4)*r1+PS(5)*r2+PS(6)*r3)*0.5;
PG(5):= PS(2)+(PS(4)*r4+PS(5)*r5+PS(6)*r6)*0.5;
PG(6):= PS(3)+(PS(4)*r7+PS(5)*r8+PS(6)*r9)*0.5;
PG(7):= PS(4)*2; PG(8):= PS(5)*2;
PG(9):= p*JJ*JJ*JJ; PG(10):= p*JJ*JJ*Pz;
PG(11):= JJ*Pz4*p; PG(12):= Pz6*norm*p;
PG(13):= Pxy*JJ*JJ*(p+p); PG(14):= Pzxy*JJ*p;
PG(15):= Pzzd*p
end vers2;
begin p:= 0.001; F:= PS(1)+PS(2);
G:= F+PS(4)*r1+PS(5)*r2+PS(6)*r3;
PG(4):= (G + PS(4)*2)*p; PG(5):= G*0.5*p;
PG(6):= ((PS(1)-PS(2))*0.5+PS(4)*r4+PS(5)*r5+PS(6)*r6)*p;
PG(7):= (F+F+PS(3)+PS(4)*r7+PS(5)*r8+PS(6)*r9)*p;
PG(8):= p*p*JJ*JJ*Pz
end vers3;
begin
PG(4):= Pxyxy;
PG(5):= Pxy*JJ;
PG(6):= Pz4 + Pxyxy*r1*r1*2;
PG(7):= -(Pz + Pxy*r1)*JJ;
PG(8):= JJ*JJ;
for i:=4 step 1 until 8 do PG(i):= PG(i)*0.001
end vers4;
end;
dE:= dE + k*lambda;
if ID then begin
PG(3):= PG(3)+PG(1)*c2;
PG(2):= PG(2)-PG(1)*b2;
PG(1):= PG(1)*a2
end;
for j:=Q-1 step -1 until 1 do ai(j):= ai(j) + PG(j)*k
end matrix element block end k;
if iterer then begin
dE:= ai(Q):= Li - dE; it:= 0; s:= s + dE*dE
end else begin
it:= Li; Li:= dE; dE:= 0 end;
if ha then begin H:= 0;
for j:=Q-1 step -1 until 1 do
for k:=Q-1 step -1 until j do H:= H + ai(j)*ai(k)*col(j,k);
if iterer then H:= if 1-H<=0 or m1=1 then 9.9
else dE/sqrt(so*(1-H)) else dE:= sqrt(H*s)
end;
F:= G:= 0;
if quartic then
for j:=4 step 1 until Q1 do F:= F + ai(j)*DR(j);
if sextic then
for j:=Q1+1 step 1 until Q-1 do G:= G + ai(j)*DR(j);
writecr; write(res,<<ddd>,J1,k11,k12,<: :>,J2,k21,k22,<: :>,
<<dddddd.ddd>,Li,<<-ddd.ddd>,dE);
if -,ha then write(res,<: :>) else
if iterer and m1>1 then begin if abs H<10 or dE*dE<so*100
then write(res,<< -d.d>,H) else begin
for j:=l+1 step -1 until 1 do atot(lc,j):= 0;
write(res,<< -ddd>,H,<: ***excluded:>);
m1:= m1-1; s:= s-dE*dE; goto endline
end end else
if it<'5 and it>0 then write(res,<<_ddddd>,it)
else write(res,<: :>);
if F+G<>0 then begin
write(res,<<-ddddd.ddd>,F+G);
if delres then begin
J1:= -1; k:= if sextic then Q-1 else Q1;
flere: J1:= J1+5; J2:= J1+4; if J2>k then J2:= k;
writecr; write(res,sp,25);
for j:=J1 step 1 until J2 do begin
p:= ai(j)*DR(j);
if p=0 then write(res,<: 0 :>)
else write(res,<<-dddd.ddd>,p) end;
if J2<>k then goto flere;
writecr
end else begin
if G<>0 then begin
if abs(G)<'-2 then write(res,<<__-d.d'-d>,G)
else write(res,<<-ddd.ddd>,G,<: :>) end;
p:= 0;
for j:=1 step 1 until m do begin
k:= nf(j); if k>3 then p:= p+ai(k)*DR(k) end;
if p<>0 then begin
if abs(p)<'-2 then write(res,<<__-d.d'-d>,p)
else write(res,<<-ddd.ddd>,p,<: :>) end end
end ;
if aires then begin writecr;
writecr; write(res,<:dE:dA l.::>);
for j:= 1,2,3 do
write(res,<< -d.ddd ddd'-d>,imp(1,j));
writecr; write(res,<:dE:dA u.::>);
for j:= 1,2,3 do
write(res,<< -d.ddd ddd'-d>,imp(2,j));
writecr; write(res,<: u. - l. ::>);
for j:= 1,2,3 do
write(res,<< -d.ddd ddd'-d>,imp(2,j)-imp(1,j));
writecr; write(res,<: u. + l. ::>);
for j:= 1,2,3 do
write(res,<< -d.ddd ddd'-d>,imp(2,j)+imp(1,j));
writecr; write(res,<:Pz4, u. + l. , u. - l. : :>,
<< -d.ddd ddd'-d>,imp(1,4),imp(2,4));
writecr; write(res,<:Energies: :>,
<< d.dddddddd'-dd>,imp(1,5),imp(2,5));
writecr end;
if iterer then begin
for j:=1 step 1 until m do
for k:=nf(j)+1-j step 1 until Q-j do ai(k):= ai(k+1);
for j:=1 step 1 until l+1 do atot(lc,j):= ai(j)
end;
endline: end step over observed transitions, line;
if ID then Rot(1):= Int(4);
if -,ha then begin
for i:=1 step 1 until N1 do begin
p:= atot(i,l+1)**2;
if m1>1 and (s-p)/m1 < p*'-4 then begin
for j:=l+1 step -1 until 1 do atot(i,j):= 0;
s:= s-p; m1:= m1-1
end end end;
s:= s/m1; hb:= so = 2**64; Q:= Q-1;
if so>=s then begin for j:=1 step 1 until l do begin
p:= 0;
for i:=1 step 1 until N1 do begin
qd:= abs atot(i,j); if qd>p then p:= qd
end;
lo(j):= p
end end;
Z:= ortho(atot,an,N1,l)
end atot;
comment The proceduren ortho solves the equation a x = b,
where the rectangular matrix a as well as b is stored in
atot. an is a l*(l+1) array containing by return the solu-
tion x (in column no. l+1) and the covariance matrix;
ha:= so<s; write(res,<:<10>:>);
if ha then begin
write(res,<:<10>Stop on divergency:>);
for i:=1 step 1 until 3 do Rot(i):= Rot(i)-AO(i);
for i:=4 step 1 until Q do DR(i):= DR(i)-AO(i)
end else begin
k:= Q; p:= l/(if N1=l then 0.1 else sqrt(s));
for i:=1 step 1 until l do lo(i):= lo(i)*p;
for j:=m step -1 until 0 do begin
for i:=nf(j)+1 step 1 until k do begin
p:= AO(i):= an(i-j,l+1);
hb:= hb or lo(i-j)*abs p > 1;
cif(i):= -entier(-ln(lo(i-j)*2)/ln10)+1;
if i<=3 then begin
Rot(i):= AO(i)+Rot(i);
cif(i):= entier(ln(abs Rot(i))/ln10)+cif(i)
end else begin
DR(i):= AO(i)+DR(i);
cif(i):= entier(ln(abs DR(i))/ln10)+cif(i)
end end;
k:= nf(j)-1
end;
j0:= Q;
for k0:=m step -1 until 0 do begin
for i:=nf(k0)+1 step 1 until j0 do begin
J2:= Q;
for K2:=m step -1 until k0 do begin
k:= if i>nf(K2) then i else nf(K2)+1;
for j:=k step 1 until J2 do
col(i,j):= an(i-k0,j-K2)*(if i=j then 1 else 2);
J2:= nf(K2)-1
end K2 end i;
i:= nf(k0); for j:=i step -1 until 1 do col(j,i):= 0;
if i<>0 then begin cif(i):= 0;
for j:=i+1 step 1 until Q do col(i,j):= 0
end; j0:= i-1
end k0 end;
y:= systime(1,starttime,p); qd:= p-time; time:= p;
iterer:= (hb or so>s+s) and p+qd<stoptime;
if -,iterer and N1=l then s:= 1; so:= s;
write(res,<:<10>rms deviation: :>,<<dd.dddd>,sqrt(s),
<: time, cpu: :>,(y-cpu)/60,<: , real: :>,p/60);
if -,ha then write(res,<:
Gramdet.: :>,<<d.d'-dd>,Z);
if closeres then begin
write(out,<:rms::>,<<__dd.dddd>,sqrt(s),<: tid::>,
time/60,<:<10>:>); forceout(out)
end;
writepage end;
goto igen;
stop:
if -,slut then goto dataind end;
write(res,<:<10><12><25>:>); close(res,closeres) end
▶EOF◀