|
|
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: 36096 (0x8d00)
Types: TextFile
Names: »algflinda«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦7e928b248⟧ »algbib«
└─⟦this⟧
;gosav time.180
lookup flinda
if ok.no
(lookup xbmatrix
if ok.no
(r=algol extxbmatrix index.no
rename r.xbmatrix
permanent xbmatrix.17)
flinda=set 180
permanent flinda.17
flinda=algol index.no list.no xref.no)
\f
F-LINDA. 2-1-1975. GOS.
begin
comment The input rules are:
1) A text string in <> (max 59 characters) to appear
in top of each output page.
2) The allowed computing time (min.), and a number m:
If m=1 all inputs are required,
if m=0 only input 17 are performed, and
if m=-1 valence force data (15-17) are performed.
3) The number of molecules, NM, and for each of these
the following inputs 4-12. The individual molecules
are numbered by letters: a, b, c . . .
4) The name of the molecule in <>.
5) A number m : If m=1 centrifugal distortion constants
can be included in the calculations.
If m = 10: Angular internal coordinates are defined in
Angstrom units by multiplication with a function depen-
ding on the equilibrium bondlengths (see VIBROT spec.).
6) The number of isotopic species, G.
7) The number of atoms in the molecule, N.
8) The number of symmetry species, BL.
9) For each of these the number of symmetry coordinates
including redundants.
10) The coordinates of the N atoms (see VIBROT spec.).
11) Specifications for the internal coordinates and the sym-
metry coordinates (see VIBROT spec.).
12) For each symmetry species:
a) The substitution in <> (max 17 characters),
b) N atomic masses ordered in accordance with the
B-matrix,
c) The total number of normal frequencies, NV. If only
centrifugal distortion data are available put NV=0.
d) NV observed frequencies ordered in symmetry species
and decreasing. Following every frequency is given
an uncertainty, dnu . If dnu = 0 the appropiate fre-
quency is neglected in the calculations.
if m=1 :
e) The number of observed centrifugal distortion const.
f) For each of these the nine coefficients defining
the observed constant in terms of the basic constants
tau-vxyz, ordered as the index sequence:
aaaa, bbbb, cccc, abab, bcbc, caca, aabb, bbcc, ccaa.
g) The observed values, each followed by an uncertainty.
13) The number of shifts (i.e. isotopic differences), and
for each of these:
Two integers indicating the two observetions to be
subtracted, followed by the uncertainty of the shift.
14) The number of the last performed iteration, IT.
15) A maximal change in F, Xmax.
16) The valence force data:
a) The number of force constants (NKT) including fixed.
b) For each of these:
The number of depending symmetry force constants
(Fij). If the force constant should be fixed
the negative number is given. Next the start
value is given and for each symmetry force
constant is specified:
c) symmetry species no. (delimiter mol no., see 3),
i , j , factor. ( i=<j ).
17) A text string in <> (may be empty), giving the name of
a jobfile to be submitted to TABASCO;
integer NM,IT,NO,NF,NK,NKF,NS,On,Ol,i,j,k,l,m,n,space,page;
real Xmax, s, so, h, starttime, stoptime, time;
boolean ha, hb, newinp, closeres, centrifugal;
array head(1:10);
zone res(128,1,stderror);
integer array tail(1:10);
integer procedure split;
begin split:= h shift (-36) extract 12; h:= h shift 12 end;
space:= 30-readhead(in,head,1); read(in,stoptime,m);
newinp:= m>0;
for i:=2 step 1 until 10 do tail(i):= 0;
s:= 0; i:= k:= 0; j:= 48;
for j:=j+8 while i<4 do begin
if j>48 then begin
k:= k+1; j:= 8; h:= head(k)
end;
n:= h shift (-48+j) extract 8;
if n<91 then n:= n+32;
if n<=122 and n>=97 then begin
i:= i+1; s:= s add n shift 8
end end;
if newinp then begin read(in,NM); page:= 0 end else begin
s:= s add 49 shift 8;
open(res,4,string s,0); monitor(42,res,0,tail);
setposition(res,0,tail(1)-1); inrec(res,128);
h:= res(128);
NM:= split; IT:= split; NO:= split; On:= split;
page:= NM extract 9; NM:= NM shift (-9);
h:= res(127); Xmax:= res(126); so:= res(125);
NF:= split; NK:= split; NKF:= split; NS:= split;
s:= s shift (-16) shift 8; close(res,true);
end;
begin
integer linecount,date,G,Na,N3,BL,NV,NC,NT,
NKT,ig,ibl,red,inm;
array mol(1:5), track(1:(NM+1)*4);
procedure cr;
begin linecount:= linecount+1; write(res,<:<10>:>) end;
procedure writepage;
begin integer i,j; real lo; boolean nl,sp;
nl:= false add 10; sp:= false add 32;
page:= page+1; linecount:= 3; i:= (date//100) mod 100; j:= 1;
lo:= if i<=9 then real(<<-d>) else real(<<-dd>);
write(res,nl,1,<:<12>:>,nl,3,string head(increase(j)),sp,space
+(if i<=9 then 1 else 0),<<dd>,date//10000,string lo,
-i,<<-dd>,-(date mod 100),sp,19,<<ddd>,page,nl,2)
end writepage;
procedure set(z,a,tail);
value a; real a; zone z; integer array tail;
begin
monitor(48,z,0,tail);
if monitor(40,z,0,tail)>0 then begin
write(out,<:
***:>,string a,<: not created.:>); goto stop
end;
monitor(50,z,17,tail);
end set;
systime(1,0,starttime);
date:= round systime(2,starttime,time); stoptime:= stoptime*60;
closeres:= outmedium(res);
for i:=1 step 1 until 4 do
track(i):= s add (48+i) shift 8;
h:= s shift (-16) shift 8;
for i:=1 step 1 until 4 do begin
n:= case i of(109,102,118,100);
for j:=1 step 1 until NM do
track(4*j+i):= h add (48+j) shift 8 add n shift 8
end;
if newinp then begin
zone z, Obs(128,1,stderror);
integer procedure Ostep;
begin On:= On+1;
if On=129 then begin
On:= 1; Ol:= Ol+1; outrec(Obs,128) end;
Ostep:= On
end;
procedure pack(n);
value n; integer n;
begin z(m):= z(m) shift 12 add n end;
open(Obs,4,string track(3),0);
tail(1):= 5; set(Obs,track(3),tail);
On:= 128; Ol:= NO:= 0;
for inm:=1 step 1 until NM do begin
comment Input 4-12 for each molecule inm;
readhead(in,mol,1);
read(in,m,G,Na,BL);
centrifugal:= m mod 10= 1; hb:= m//10= 1; N3:= abs Na*3;
if centrifugal then begin
ig:= G; ibl:= BL end else ig:= ibl:= 1;
begin
integer array S(1:BL,1:2), Vpl(1:BL,1:G), Dpl(1:ibl,1:ig);
array species(1:G*3);
procedure writespecies;
begin integer i,j;
i:= (ig-1)*3 + 1; j:= 1;
write(res,<: of :>,string species(increase(i)),
string mol(increase(j)))
end writespecies;
for ibl:=1 step 1 until BL do read(in,S(ibl,1)); writepage;
i:= 1; write(res,string mol(increase(i))); cr; cr;
if xbmatrix(Na,BL,S,hb,ha,res) <> 0 then goto stop;
NT:= if -,centrifugal then 1 else if ha then 4 else 6;
comment Disctracks are dimensioned for the
matrices F, V and D;
Vpl(1,1):= 0;
for ig:=1 step 1 until G do
for ibl:=1 step 1 until BL do begin
n:= S(ibl,1); m:= ((n+1)*n+254)//256;
if ibl<BL then Vpl(ibl+1,ig):= Vpl(ibl,ig) + m else
if ig<G then Vpl( 1,ig+1):= Vpl(BL,ig) + m
end;
tail(1):= Vpl(BL,G)+m;
for m:=2,3 do begin
h:= track(4*inm+m); open(z,4,string h,0);
set(z,h,tail); close(z,true);
end;
if centrifugal then begin
Dpl(1,1):= 0;
for ig:=1 step 1 until G do
for ibl:=1 step 1 until BL do begin
n:= S(ibl,1); m:= (n*NT+127)//128;
if ibl<BL then Dpl(ibl+1,ig):= Dpl(ibl,ig) + m else
if ig<G then Dpl( 1,ig+1):= Dpl(BL,ig) + m
end;
open(z,4,string track(4*inm+4),0); tail(1):= Dpl(BL,G)+m;
set(z,track(4*inm+4),tail); close(z,true);
NC:= N3
end else NC:= 1;
begin
array X(1:Na,1:3);
open(z,4,<:xtrack:>,0); inrec(z,128); k:= 0;
for i:=1 step 1 until Na do
for j:=1 step 1 until 3 do begin
k:= k+1; X(i,j):= z(k) end;
monitor(48,z,0,tail); close(z,true);
hb:= false; NV:= 0;
for ig:=1 step 1 until G do begin
real Ia, Ib, Ic;
array M(1:Na), UX(1:NC,1:3), U(1:3,1:3);
readhead(in,species,(ig-1)*3+1);
if atomic(M,Na) then goto stop;
write(res,false add 10,3,<:Atomic masses:>);
writespecies;
for i:=1 step 1 until Na do begin
if (i-1) mod 6 = 0 then cr;
write(res,<<dddd.dddddd>,M(i))
end;
read(in,n);
NV:= NV+n; Obs(Ostep):= n; n:= n+n;
for i:=1 step 1 until n do read(in,Obs(Ostep));
if centrifugal then begin
array IP(1:3);
read(in,n); Obs(Ostep):= n; hb:= n<>0;
if hb then begin
for i:=1 step 1 until n do
for j:=1 step 1 until 9 do read(in,Obs(Ostep));
NO:= NO+n; n:= n+n;
for i:=1 step 1 until n do read(in,Obs(Ostep));
comment This completes the input. The tensor of inertia is cal-
culated and a transformation to the principal axes system
is performed;
Ib:= 1/sum(M(i),i,1,Na);
for j:=1 step 1 until 3 do begin
Ia:= sum(X(i,j)*M(i),i,1,Na)*Ib;
for i:=1 step 1 until Na do X(i,j):= X(i,j)-Ia
end j, center of mass corr.;
Ia:= sum(M(i)*X(i,1)**2,i,1,Na);
Ib:= sum(M(i)*X(i,2)**2,i,1,Na);
Ic:= sum(M(i)*X(i,3)**2,i,1,Na);
U(1,1):= Ib+Ic; U(2,2):= Ic+Ia; U(3,3):= Ia+Ib;
U(2,1):= -sum(M(i)*X(i,1)*X(i,2),i,1,Na);
U(3,2):= -sum(M(i)*X(i,2)*X(i,3),i,1,Na);
U(3,1):= -sum(M(i)*X(i,3)*X(i,1),i,1,Na);
tridql(3,IP,U); s:= 6.0657791;
Ia:= s/IP(1); Ib:= s/IP(2); Ic:= s/IP(3);
for i:=1 step 1 until Na do
for j:=1 step 1 until 3 do UX(i,j):= sum(U(j,k)*X(i,k),k,1,3)
end hb end centrifugal;
for i:=1 step 1 until Na do M(i):= 1/M(i); NF:= 0;
for ibl:=1 step 1 until BL do begin
n:= S(ibl,1); l:= n*(n+1)//2; k:= (l+127)//128*128;
comment The matrix product G = B * M * Btr is calculated and
stored in the linear array V, representing a lower tri-
angular matrix;
begin
integer red,ri,rj,rk,rl; real W,VV;
array K(1:l), B(1:n,1:N3); zone V(k,1,stderror);
open(z,4,<:btrack:>,0); setposition(z,0,NF); k:= 128;
for i:=1 step 1 until n do
for j:=1 step 1 until N3 do begin
k:= k+1; if k=129 then begin
k:= 1; NF:= NF+1; inrec(z,128) end;
B(i,j):= z(k)
end;
if ig=G and ibl=BL then monitor(48,z,0,tail); close(z,true);
open(V,4,string track(4*inm+3),0); setposition(V,0,Vpl(ibl,ig));
outrec(V,l); ri:= 0;
for i:=1 step 1 until n do
for j:=1 step 1 until i do begin
ri:= ri+1;
V(ri):= sum(B(i,k)*B(j,k)*M((k+2)//3),k,1,N3) end;
comment Now the triangular matrix V ( V * Vtr = G ) is
calculated in V;
red:= rl:= 0; rk:= n*(n-1)//2;
for j:=1 step 1 until n do K(rk+j):= 1;
for j:=1 step 1 until n-red do begin l:= j+red; ri:= rl;
for i:=l step 1 until n do begin
W:= V(ri+l);
for k:=j-1 step -1 until 1 do
W:= W- V(rl+k)*V(ri+k);
if i=l then begin
if W<'-6 then begin red:= red+1; rl:= rl+l; l:= j+red; rk:= ri;
for k:=i step 1 until n do
begin K(rk+i):= 0; rk:= rk+k end end
else begin W:= V(ri+j):= sqrt(W);
VV:= K(ri+i):= 1/W end
end else V(ri+j):= W*VV;
ri:= ri+i
end i;
ri:= rl;
for i:=l-1 step -1 until j do begin ri:= ri-i; V(ri+j):= 0 end;
rl:= rl+l
end j;
comment red is the number of redundancies. The matrix V occupies
the first n-red columns of the array V;
if hb then begin
l:= red; rl:= n*(n-1)//2; rj:= rl+n;
for j:=n step -1 until 1 do if K(rl+j)<>0 then begin
VV:= K(rj); ri:= rj:= rj-j; k:= j-1+red-l;
for i:=j step 1 until k do begin K(ri+j):= 0; ri:= ri+i end;
if i<>j then K(ri+j):= VV; ri:= ri+i;
for i:=k+2 step 1 until n do begin
W:= 0; rk:= rj+j-l;
for k:=j+1 step 1 until i do begin
W:= W- K(ri+k)*V(rk+j); rk:= rk+k end;
K(ri+j):= W*VV; ri:= ri+i
end i
end else begin rj:= rj-j; l:=l-1 end;
comment The (left) inverse of V has been calculated in the last
n-red rows of the array K, and V is transferred to the
drum;
end hb;
close(V,true); red:= n-red;
if ig=1 then S(ibl,2):= red else if S(ibl,2)<>red then begin
write(res,<:
Error in determination of redundancies.
:>); goto stop
end;
comment If necessary the Jab,s matrices are calculated in D
and stored on the drum;
if hb then begin
array D(1:n,1:NT), BU(1:N3), I(1:if red<NT then NT else red);
open(z,4,string track(4*inm+4),0); setposition(z,0,Dpl(ibl,ig));
for j:=1 step 1 until NT do
I(j):= case j of (Ia*Ia, Ib*Ib, Ic*Ic, Ia*Ib, Ib*Ic, Ic*Ia);
for i:=1 step 1 until n do begin
for k:=N3-3 step -3 until 0 do
for j:=1 step 1 until 3 do
BU(k+j):= sum(B(i,k+l)*U(j,l),l,1,3);
for j:=1 step 1 until 3 do begin
rk:= j mod 3+ 1; rl:= rk mod 3+ 1; W:= 0; ri:= 0;
for k:=1 step 1 until Na do begin
W:= W + BU(ri+rk)*UX(k,rk) + BU(ri+rl)*UX(k,rl);
ri:= ri+3 end;
D(i,j):= W*I(j)
end j;
for j:=4 step 1 until NT do begin
rk:= (j-1) mod 3+ 1; rl:= rk mod 3+ 1; W:= 0; ri:= 0;
for k:=1 step 1 until Na do begin
W:= W- BU(ri+rk)*UX(k,rl); ri:= ri+3 end;
D(i,j):= W*I(j)
end j
end i;
rj:= n-red; rl:= rj*(rj+1)//2;
for j:=1 step 1 until NT do begin
l:= rj; ri:= rl;
for i:=1 step 1 until red do begin
l:= l+1; I(i):= sum(K(ri+k)*D(k,j),k,1,l); ri:= ri+l end;
for i:=1 step 1 until red do D(i,j):= I(i)
end j;
k:= 128;
for i:=1 step 1 until red do
for j:=1 step 1 until NT do begin
k:= k+1; if k=129 then begin
k:= (red-i)*NT+NT-j+1;
outrec(z,if k>128 then 128 else k); k:= 1 end;
z(k):= D(i,j)
end;
close(z,true)
end hb end K, B, V;
end ibl end ig end X;
n:= 0; for ibl:=1 step 1 until BL do n:= n+S(ibl,2);
if NV//n*n<>NV then begin
write(res,<:
Error in number of observed frequencies. inm, n, NV = :>,
<<-ddd>,inm, n,NV); goto stop
end;
NO:= NO+NV;
comment moldata are stored on disc;
open(z,4,string track(4*inm+1),0);
tail(1):= 1; set(z,track(4*inm+1),tail); outrec(z,128);
m:= 1; z(m):= 0; pack( G); pack(BL); pack(NT);
z(m):= z(m) shift 12;
for i:=1 step 1 until 5 do z(1+i):= mol(i);
for i:=G*3 step -1 until 1 do z(6+i):= species(i);
m:= 6+G*3; n:= 2;
for ibl:=1 step 1 until BL do begin
if n=2 then begin m:= m+1; n:= 0; z(m):= 0 end;
n:= n+1; pack(S(ibl,1)); pack(S(ibl,2))
end;
z(m):= z(m) shift ((2-n)*24); n:= 4;
for ibl:=1 step 1 until BL do
for ig:=1 step 1 until G do begin
if n=4 then begin m:= m+1; n:= 0; z(m):= 0 end;
n:= n+1; pack(Vpl(ibl,ig))
end;
z(m):= z(m) shift ((4-n)*12);
if centrifugal then begin n:= 4;
for ibl:=1 step 1 until BL do
for ig:=1 step 1 until G do begin
if n=4 then begin m:= m+1; n:= 0; z(m):= 0 end;
n:= n+1; pack(Dpl(ibl,ig))
end;
z(m):= z(m) shift ((4-n)*12) end;
close(z,true)
end S, Vpl, Dpl
end inm;
read(in,NS); Obs(Ostep):= NS;
for i:=1 step 1 until NS do begin
read(in,k,l,s);
Obs(Ostep):= 0.0 shift 14 add k shift 24 add l;
Obs(Ostep):= s
end;
NO:= NO+NS;
tail(1):= Ol; monitor(44,Obs,0,tail); close(Obs,true);
On:= (Ol-1)*128+On; so:= 0;
read(in,IT)
end else begin newinp:= m=-1; NKT:= NK+NKF end;
comment The precalculations have been completed by the transfer
of the V- and D-matrices to the drum, and the final
inputs (15-16) are performed;
if newinp then begin
read(in,Xmax,NKT);
begin
array fv(1:NKT*3);
zone f(128,1,stderror);
open(f,4,string track(1),0); tail(1):= 10; set(f,track(1),tail);
if m=-1 then writepage;
write(res,false add 10,3,<:
VALENCE FORCE DATA:
:>); k:= 127; NF:= NKF:= 0;
for n:=1 step 1 until NKT do begin
read(in,m); repeatchar(in); i:= 32;
for i:=i while i=32 do readchar(in,i);
repeatchar(in); j:= NKT+n*2-1;
if i=60 then begin
i:= readhead(in,fv,j);
s:= fv(j); so:= fv(j+1);
if i>11 then i:= 11
end else i:= 0;
if i<6 then s := s shift (8*i-48)
else so:= so shift (8*i-96);
for i:=i+1 step 1 until 6 do s := s shift 8 add 32;
for i:=i step 1 until 11 do so:= so shift 8 add 32;
fv(j):= s; fv(j+1):= so shift 8;
read(in,fv(n)); write(res,<:
Param.:>,<<dd>,n,<:: :>,string fv(increase(j)),
<<__-dd.dddddd>,fv(n));
hb:= m<0; m:= abs m; NF:= NF+m+m;
s:= 0.0 shift 12 add (if hb then 2048+m else m);
if hb then begin
write(res,<: (fixed):>); NKF:= NKF+1 end;
for l:=1 step 1 until m do begin
if l mod 3 = 1 then write(res,<:<10> :>);
k:= k+2; if k=129 then begin
k:= 1; outrec(f,128) end;
read(in,ibl);
if NM>1 then begin
repeatchar(in); readchar(in,inm)
end else inm:= 97;
read(in,i,j,f(k+1));
repeatchar(in); readchar(in,ig);
if ig=47 then begin
read(in,so); f(k+1):= f(k+1)/so;
repeatchar(in); readchar(in,ig)
end;
if ig=115 then f(k+1):= sign(f(k+1))*sqrt(abs f(k+1));
write(res,<<ddd>,ibl,false add inm,1,i,j,<< -d.dddd>,f(k+1));
inm:= inm-96; if inm<1 or inm>NM then goto stop;
f(k):= s shift 12 add j shift 12 add i shift 6
add inm shift 6 add ibl;
s:= 0
end end n;
NK:= NKT-NKF;
tail(1):= (NF+131)//128;
monitor(44,f,0,tail);
k:= 129; l:= NKT*3;
close(f,true); open(f,4,string track(2),0);
tail(1):= (l+NK+127)//128; set(f,track(2),tail);
for i:=1 step 1 until l do begin
if k=129 then begin k:= 1; outrec(f,128) end;
f(k):= fv(i); k:= k+1
end;
close(f,true) end end kdata;
begin
integer Oc, p, q;
real nu, dnu, H, DF;
array Obs(1:On), fv(1:NKT), B(1:NK), K(1:NF);
zone z(128,1,stderror);
integer procedure kstep;
begin k:= k+1; if k>128 then begin
k:= k mod 128; inrec(z,128) end;
kstep:= k
end kstep;
open(z,4,string track(1),0); k:= 128;
for i:=1 step 1 until NF do K(i):= z(kstep);
close(z,true);
open(z,4,string track(2),0); k:= 128;
for i:=1 step 1 until NKT do fv(i):= z(kstep);
if -, newinp then begin
k:= k+NKT+NKT;
for i:= 1 step 1 until NK do B(i):= z(kstep)
end else so:= 0;
close(z,true);
open(z,4,string track(3),0); k:= 128;
for i:=1 step 1 until On do Obs(i):= z(kstep);
close(z,true);
open(z,4,string track(4),0);
if newinp then begin
tail(1):= (NO-1)//(128//(NK+1))+1; set(z,track(4),tail)
end else monitor(42,z,0,tail);
close(z,true); open(z,4,<:atrack:>,0);
set(z,real<:atrack:>,tail); close(z,true);
systime(1,starttime,time); ha:= false;
Ol:= On-NS-NS;
igen:
if NS>0 then begin p:= NS; q:= NK+1 end else p:= q:= 1;
begin
array ashifts(1:p,1:q);
for i:=1 step 1 until p do
for j:=1 step 1 until q do ashifts(i,j):= 0;
writepage; s:= 0; NO:= Na:= On:= 0; IT:= IT+1;
for inm:=1 step 1 until NM do begin
open(z,4,string track(4*inm+1),0); inrec(z,128);
h:= z(1); G:= split; BL:= split; NT:= split;
for i:=1 step 1 until 5 do mol(i):= z(1+i);
centrifugal:= NT>1;
if centrifugal then begin
ig:= G; ibl:= BL end else ig:= ibl:= 1;
begin
integer array S(1:BL,1:2), Vpl(1:BL,1:G), Dpl(1:ibl,1:ig);
array species(1:G*3);
procedure writespecies;
begin integer i,j;
i:= (ig-1)*3 + 1; j:= 1;
write(res,<: of :>,string species(increase(i)),
string mol(increase(j)))
end writespecies;
for i:=G*3 step -1 until 1 do species(i):= z(6+i);
m:= 6+G*3; n:= 2;
for ibl:=1 step 1 until BL do begin
if n=2 then begin m:= m+1; n:= 0; h:= z(m) end;
n:= n+1; S(ibl,1):= split; S(ibl,2):= split
end;
n:= 4;
for ibl:=1 step 1 until BL do
for ig:=1 step 1 until G do begin
if n=4 then begin m:= m+1; n:= 0; h:= z(m) end;
n:= n+1; Vpl(ibl,ig):= split
end;
if centrifugal then begin n:= 4;
for ibl:=1 step 1 until BL do
for ig:=1 step 1 until G do begin
if n=4 then begin m:= m+1; n:= 0; h:= z(m) end;
n:= n+1; Dpl(ibl,ig):= split
end end;
close(z,true);
for ig:=1 step 1 until G do begin
On:= On+1; NV:= Obs(On);
if centrifugal then begin
Oc:= NV*2+On+1; NC:= Obs(Oc) end else NC:= 0;
hb:= NC<>0;
if linecount+NV+NC>55 then writepage else begin cr;cr;cr end;
if NV<>0 then begin
write(res,<: -1:>); cr;
write(res,<:Frequencies in cm :>);
if hb then write(res,<: and :>)
end;
if hb then begin
write(res,<:CD-constants in MHz:>);
l:= 9; m:= NK; n:= NC
end else l:= m:= n:= 1;
writespecies; cr; cr;
write(res,
<: Obs. Calc. Obs.-calc. delta:>);
begin
array C(1:n,1:l), t(1:l), acd(1:n,1:m);
if hb then begin
for i:=1 step 1 until NC do begin
for j:=1 step 1 until 9 do begin
Oc:= Oc+1; C(i,j):= Obs(Oc) end;
for j:=1 step 1 until NK do acd(i,j):= 0 end;
for j:=1 step 1 until 9 do t(j):= 0
end;
for ibl:=1 step 1 until BL do begin
n:= S(ibl,1); red:= S(ibl,2); l:= (n+1)*n//2;
k:= if -,hb then 1 else n;
begin
integer ri, rj, rk, rl, inmbl;
array V(1:l), L(1:n,1:red), f(1:red), D(1:k,1:NT);
open(z,4,string track(4*inm+3),0);
setposition(z,0,Vpl(ibl,ig)); k:= 128;
for i:=1 step 1 until l do begin
k:= k+1; if k=129 then begin
k:= l-i+1; inrec(z,if k>128 then 128 else k); k:= 1 end;
V(i):= z(k)
end; close(z,true);
comment The matrix V has been transferred from the drum, and
the matrix product Vtr * F * V is formed in L;
begin
real W; array F(1:l);
for i:=1 step 1 until l do F(i):= 0;
k:= 1; inmbl:= inm shift 6 add ibl;
for rl:=1 step 1 until NKT do begin
m:= ((K(k) shift (-36) extract 12) mod 2048)*2+k-2;
for k:= k step 2 until m do
if K(k) extract 12 = inmbl then begin
i:= K(k) shift (-12) extract 12;
j:= K(k) shift (-24) extract 12;
i:= ((i-1)*(n+n-i))//2+j;
F(i):= F(i)+fv(rl)*K(k+1)
end end l;
open(z,4,string track(4*inm+2),0);
setposition(z,0,Vpl(ibl,1)); k:= 128;
for i:=1 step 1 until l do begin
k:= k+1; if k=129 then begin
k:= l-i+1; outrec(z,if k>128 then 128 else k); k:= 1 end;
z(k):= F(i)
end; close(z,true);
ri:= 0;
for i:=1 step 1 until n do begin rj:= 0; l:= i-1;
for j:=1 step 1 until red do begin
W:= 0; rl:= n*(j-1)-rj+i; rj:= rk:= rj+j;
for k:=j step 1 until l do begin
W:= W+ F(rl)*V(rk); rk:= rk+k; rl:= rl+n-k end;
for k:=k step 1 until n do begin
W:= W+ F(ri+k)*V(rk); rk:= rk+k end;
L(i,j):= W
end j; ri:= ri+n-i
end i; ri:= 0;
for i:=1 step 1 until red do begin ri:= ri+i;
for j:=i step 1 until red do begin
W:= 0; rk:= ri;
for k:=i step 1 until n do begin
W:= W+ V(rk)*L(k,j); rk:= rk+k end;
L(i,j):= W
end j;
for j:=i-1 step -1 until 1 do L(i,j):= L(j,i)
end i end F;
if NV<>0 then begin
begin array U(1:red,1:red);
comment L is diagonalized by the transformation U * L * Utr
using Householder's method. The eigenvalues are pro-
duced in ascending order;
if red>1 then begin
for j:=1 step 1 until red do
for i:=1 step 1 until j do U(j,i):= L(i,j);
tridql(red,f,U)
end else begin
f(1):= L(1,1); U(1,1):= 1 end;
comment The matrix L = V * Utr is calculated;
ri:= 0;
for i:=1 step 1 until n do begin
for j:=1 step 1 until red do L(i,red+1-j):=
sum(V(ri+k)*U(j,k),k,1,if i<red then i else red);
ri:= ri+i
end i;
comment The matrices Jab,Q = U * Jab,s are calculated in
J, and the t-sums are formed. Further the matrix pro-
ducts L * (LAMBDA)&-1 * Jab,Q are formed in D;
if hb then begin array J(1:red,1:NT);
open(z,4,string track(4*inm+4),0); setposition(z,0,Dpl(ibl,ig));
k:= 128;
for i:=1 step 1 until red do
for j:=1 step 1 until NT do D(i,j):= z(kstep);
close(z,true);
for j:=1 step 1 until NT do
for i:=1 step 1 until red do
J(red+1-i,j):= sum(U(i,k)*D(k,j),k,1,red);
for i:=1 step 1 until red do begin
h:= 1/f(red+1-i);
for j:=1 step 1 until NT do begin
H:= D(i,j):= J(i,j); J(i,j):= H*h end
end;
for k:=1 step 1 until NT do
t(k):= t(k)-sum(D(i,k)*J(i,k),i,1,red);
t(7):= t(7) - sum(D(i,1)*J(i,2),i,1,red);
t(8):= t(8) - sum(D(i,2)*J(i,3),i,1,red);
t(9):= t(9) - sum(D(i,3)*J(i,1),i,1,red);
for j:=1 step 1 until NT do
for i:=1 step 1 until n do
D(i,j):= sum(L(i,k)*J(k,j),k,1,red)
end end U;
comment The frequencies are printed and the corresponding
contributions to the normal equation are calculated;
begin array avib(1:red,1:NK);
k:= 1; q:= 0;
for l:=1 step 1 until NKT do begin
m:= K(k) shift (-36) extract 12;
if m>2048 then k:= (m mod 2048)*2+k else begin
q:= q+1; m:= m+m+k-2;
for p:=1 step 1 until red do avib(p,q):= 0;
for k:=k step 2 until m do
if K(k) extract 12 = inmbl then begin
i:= K(k) shift (-12) extract 12;
j:= K(k) shift (-24) extract 12;
h:= K(k+1)*(if i=j then 1 else 2);
for p:=1 step 1 until red do
avib(p,q):= avib(p,q) + L(i,p)*L(j,p)*h
end end end l;
comment The elements d(lambda)/dK have been calculated in avib;
k:= 128//(NK+1); open(z,4,<:atrack:>,0);
setposition(z,0,Na//k); swoprec(z,(Na mod k)*(NK+1));
cr;
for m:=1 step 1 until red do begin
NO:= NO+1; On:= On+1; nu:= Obs(On); On:= On+1; dnu:= Obs(On);
h:= f(red+1-m)*1.697372'6;
if h<0 then begin write(res,<:
***negative lambda, inm, ig, ibl, red, n = :>,
<<dddd>,inm,ig,ibl,red,n); goto stop end;
h:= sqrt(h); cr;
write(res,<<________-dddd.d>, nu, h, nu-h, dnu);
H:= 0.848686'6/h; h:= nu-h;
for i:=1 step 1 until NK do avib(m,i):= avib(m,i)*H;
for j:=1 step 1 until NS do begin
H:= Obs(Ol+j+j-1);
p:= H extract 24; q:= H shift (-24) extract 24;
l:= if NO=p then 1 else if NO=q then -1 else 0;
if l<>0 then begin
ashifts(j,NK+1):= ashifts(j,NK+1) + h*l;
for i:=1 step 1 until NK do
ashifts(j,i):= ashifts(j,i) + avib(m,i)*l
end end j;
if dnu<>0 then begin
swoprec(z,NK+1); z(NK+1):= h:= h/dnu;
for i:=1 step 1 until NK do z(i):= avib(m,i)/dnu;
Na:= Na+1; s:= s + h*h
end end k;
close(z,true)
end avib end NV<>0
else begin
array J(1:red,1:NT);
open(z,4,string track(4*inm+4),0);
setposition(z,0,Dpl(ibl,ig)); k:= 128;
for i:=1 step 1 until red do
for j:=1 step 1 until NT do D(i,j):= z(kstep);
close(z,true);
comment Fs in L is inverted (by the method INVRS from CACM
66-P1-0. The t-sums are formed, and the matrix products
D = V * Fs&-1 * Jab,s are calculated;
m:= red-1;
for k:=0 step 1 until m do begin
H:= 1/L(1,1);
for i:=2 step 1 until red do f(i-1):= L(1,i);
for i:=1 step 1 until m do begin
L(i,red):= h:= -f(i)*H;
for j:=i step 1 until m do L(i,j):= L(i+1,j+1) + f(j)*h
end i;
L(red,red):= -H
end k;
for i:=1 step 1 until red do
for j:=i step 1 until red do L(i,j):= L(j,i):= -L(i,j);
for j:=1 step 1 until NT do
for i:=1 step 1 until red do J(i,j):= sum(L(i,k)*D(k,j),k,1,red);
for k:=1 step 1 until NT do
t(k):= t(k) - sum(D(i,k)*J(i,k),i,1,red);
t(7):= t(7) - sum(D(i,1)*J(i,2),i,1,red);
t(8):= t(8) - sum(D(i,2)*J(i,3),i,1,red);
t(9):= t(9) - sum(D(i,3)*J(i,1),i,1,red);
ri:= 0;
for i:=1 step 1 until n do begin
for j:=1 step 1 until NT do
D(i,j):= sum(V(ri+k)*J(k,j),k,1,if i<red then i else red);
ri:= ri+i end i;
end NV=0;
comment Now the derivatives of the CD-constants are calculated;
if hb then begin array ac(1:9);
k:= 1; q:= 0;
for l:=1 step 1 until NKT do begin
m:= K(k) shift (-36) extract 12;
if m>2048 then k:= (m mod 2048)*2+k else begin
q:= q+1; m:= m+m+k-2;
for i:=1 step 1 until 9 do ac(i):= 0;
for k:=k step 2 until m do
if K(k) extract 12 = inmbl then begin
i:= K(k) shift (-12) extract 12;
j:= K(k) shift (-24) extract 12;
h:= K(k+1)*(if i=j then 1 else 2);
for p:=1 step 1 until NT do ac(p):= ac(p)+h*D(i,p)*D(j,p);
h:= h*0.5;
ac(7):= ac(7) + (D(i,1)*D(j,2)+D(i,2)*D(j,1))*h;
ac(8):= ac(8) + (D(i,2)*D(j,3)+D(i,3)*D(j,2))*h;
ac(9):= ac(9) + (D(i,3)*D(j,1)+D(i,1)*D(j,3))*h
end k;
for p:=1 step 1 until NC do
acd(p,q):= acd(p,q) + sum(C(p,j)*ac(j),j,1,9)
end end l end NC<>0
end V, L, D, f
end bl step;
comment The centrifugal distortion constants are printed and
their contributions to the A-matrix are calculated;
if hb then begin cr;
k:= 128//(NK+1); open(z,4,<:atrack:>,0);
setposition(z,0,Na//k); swoprec(z,(Na mod k)*(NK+1));
for k:=1 step 1 until NC do begin
NO:= NO+1; Oc:= Oc+1; nu:= Obs(Oc); Oc:= Oc+1; dnu:= Obs(Oc);
h:= sum(C(k,i)*t(i),i,1,9); cr;
write(res,<<____-dd.dddd000>, nu, h, nu-h, dnu);
h:= nu-h;
for j:=1 step 1 until NS do begin
H:= Obs(Ol+j+j-1);
p:= H extract 24; q:= H shift (-24) extract 24;
l:= if NO=p then 1 else if NO=q then -1 else 0;
if l<>0 then begin
ashifts(j,NK+1):= ashifts(j,NK+1) + h*l;
for i:=1 step 1 until NK do
ashifts(j,i):= ashifts(j,i) + acd(k,i)*l
end end j;
if dnu<>0 then begin
swoprec(z,NK+1); z(NK+1):= h:= h/dnu;
for i:=1 step 1 until NK do z(i):= acd(k,i)/dnu;
Na:= Na+1; s:= s + h*h
end end k;
close(z,true); On:= Oc;
end NC<>0 else if centrifugal then On:= On+1
end C, t, acd end g step end S, Vpl, Dpl end inm;
On:= On+1;
if NS>0 then begin
if linecount+NS>55 then writepage else
begin cr; cr; cr end; write(res,<:Shifts::>); cr;
k:= 128//(NK+1); open(z,4,<:atrack:>,0);
setposition(z,0,Na//k); swoprec(z,(Na mod k)*(NK+1));
for i:=1 step 1 until NS do begin
On:= On+1; h:= Obs(On); On:= On+1; dnu:= Obs(On);
k:= h shift (-24) extract 24;
l:= h extract 24;
cr; write(res,<: Obs. no.::>,<<ddd>,l,
<: - Obs. no.::>,k,<<___-ddd.dd00000>,ashifts(i,NK+1),dnu);
if dnu<>0 then begin
swoprec(z,NK+1);
for j:=NK+1 step -1 until 1 do z(j):= ashifts(i,j)/dnu;
Na:= Na+1; s:= s + z(NK+1)**2
end end;
close(z,true);
end end ashifts;
s:= s/(if Na=NK then 1 else Na-NK);
hb:= s>=so and so<>0; NC:= NK+1; writepage;
if -, hb then begin
zone z2(128*2,2,stderror);
open(z2,4,<:atrack:>,0); open(z,4,string track(4),0);
for k:=1 step 1 until Na do begin
outrec(z,NC); inrec(z2,NC);
for i:=1 step 1 until NC do z(i):= z2(i)
end k;
close(z,true); close(z2,true);
end z2;
begin array amax, X, TD(1:NK);
begin
real p,q,length,gramdet,amin,df,dfu,dfl,h0,hu,hl;
integer dfsteps;
array T(1:NK,1:NK), a(1:Na,1:NC);
if hb then begin
h:= 0;
for i:=1 step 1 until NK do
if h<abs B(i) then h:= abs B(i);
if h<'-5 then goto packstop;
Xmax:= h*0.5
end else begin
for i:=1 step 1 until NK do B(i):= 0; so:= s;
end;
open(z,4,string track(4),0);
DF:= dfu:= dfl:= 0; dfsteps:= -1;
newDF:
setposition(z,0,0);
for i:=1 step 1 until Na do begin inrec(z,NC);
for j:=1 step 1 until NC do a(i,j):= z(j) end;
gramdet:= 1; dfsteps:= dfsteps+1;
if dfsteps=0 then begin
comment For calculation of significant digits the largest
a(i,j) in each column are determined;
for j:=1 step 1 until NK do begin
p:= 0;
for i:=1 step 1 until Na do begin
q:= abs a(i,j); if q>p then p:= q
end;
amax(j):= p
end end;
for j:=1 step 1 until NK do begin
length:= DF; for i:=1 step 1 until Na do
length:= length + a(i,j)**2;
if j=1 or amin>length then amin:= length;
l:= j-1;
for k:=1 step 1 until l do begin h:= T(k,k);
p:= 0; for i:=1 step 1 until Na do
p:= p + a(i,j)*a(i,k);
T(k,j):= p; q:= p*h;
for i:=1 step 1 until Na do a(i,j):= a(i,j)-a(i,k)*q
end k, orthogonalisation;
p:= 1;
for k:=l step -1 until 1 do begin
h:= T(k,k); q:= T(k,j);
for i:=k+1 step 1 until l do
q:= q + T(j,i)*T(k,i);
q:= -q*h; T(j,k):= q; p:= p+q*q
end;
p:= p*DF; q:= 0;
for i:=1 step 1 until Na do begin
p:= p + a(i,j)**2;
q:= q + a(i,j)*a(i,NC)
end i;
T(j,j):= 1/p; X(j):= q; gramdet:= gramdet*p/length
end j;
h:= 0;
for j:=NK step -1 until 1 do begin q:= T(j,j);
p:= X(j); for k:=j+1 step 1 until NK do
p:= p - T(j,k)*X(k);
H:= X(j):= q*p; h:= h + H*H
end solution;
h:= 0;
for i:=1 step 1 until NK do
if h<abs X(i) then h:= abs X(i);
if closeres then begin
write(out,<< d.dddddd'-d>,DF,h,<:<10>:>);
setposition(out,0,0) end;
if h>Xmax or (h*1.25<Xmax and DF>0) then begin
if DF=0 then H:= amin else
if dfu=0 or dfl=0 then
H:= DF*ln(hu/(hu-h))/ln(hu/(hu-Xmax*0.9))
else begin
if h>Xmax then begin h0:= hl; df:= dfl end
else begin h0:= hu; df:= dfu end;
p:= ln(df*h0/(DF*h))/(h-h0);
H:= if p>0 then DF*h*exp(p*h)/(Xmax*0.9*exp(Xmax*0.9*p))
else DF + (DF-df)*(Xmax*0.9-h)/(h-h0)
end;
if h>Xmax then begin hu:= h; dfu:= DF end
else begin hl:= h; dfl:= DF end;
DF:= H; goto newDF
end;
for i:=1 step 1 until NK do B(i):= X(i)-B(i);
close(z,true);
for i:=1 step 1 until NK do
for j:=i step 1 until NK do begin
q:= if i=j then 1 else T(j,i); q:= q*T(j,j);
for k:=j+1 step 1 until NK do
q:= q + T(k,i)*T(k,k)*T(k,j);
T(i,j):= q
end;
comment The variances and correlation matrix elements are printed;
k:= 1; l:= NK mod 6; s:= sqrt(s);
if closeres then begin
write(out,<:<10>Iteration no.:>,<<ddd>,IT,
<: sigma = :>,<<d.dd'-d>,s,
<: DFsteps: :>,<<ddd>,dfsteps,
<:<10>Gramdet.= :>,<<d.d'-dd>,gramdet,
<: Xmax = :>,<<d.ddd>,Xmax,
<: DF = :>,<<d.d'-d>,DF,<:<10><10>:>);
setposition(out,0,0) end;
write(res,<:Iteration no.:>,<<ddd>,IT,
<: sigma = :>,<<d.dd'-d>,s,
<: DFsteps: :>,<<ddd>,dfsteps); cr;
write(res,<:Gramdet.= :>,<<d.d'-dd>,gramdet,
<: Xmax = :>,<<d.ddd>,Xmax,
<: DF = :>,<<d.d'-d>,DF);
cr; cr; write(res,<:Correlation and variance::>); cr;
for i:=1 step 1 until NK do begin
p:= sqrt(T(i,i)); T(i,i):= p*s; TD(i):= 1/p end;
for i:=NK-1 step -1 until 1 do
for j:= i+1 step 1 until NK do T(i,j):= T(i,j)*TD(i)*TD(j);
for i:=1 step 1 until NK do TD(i):= T(i,i);
Cor:
if linecount+l>62 then writepage;
for i:=1 step 1 until l do begin cr;
for j:=k step 1 until i-1 do write(res,<: :>);
for j:=j step 1 until l do write(res,<<__-d.dd000>,T(i,j))
end i;
cr; k:= l+1; l:= l+6; if k<NK then goto Cor
end T,a;
comment The new fv matrix is calculated and printed;
begin array fn(1:NKT*2);
open(z,4,string track(2),0);
k:= 128+NKT; l:= NKT*2; if k>255 then setposition(z,0,k//128-1);
for i:=1 step 1 until l do fn(i):= z(kstep);
if linecount+NKT>57 then writepage else begin cr; cr; cr end;
write(res,
<:Parameter. f new sigma delta digits:>);
cr; cr; j:= 1; k:=1; l:= 0;
hb:= DF<>0; s:= NK/s; H:= ln(10);
for i:=1 step 1 until NKT do begin
write(res,<<ddd>,i,<: :>,string fn(increase(j)));
m:= K(k) shift (-36) extract 12;
if m>2048 then begin
write(res,<<__-dd.dddddd>,fv(i),<: (fixed):>);
m:= m mod 2048
end else begin
l:= l+1; fv(i):= fv(i)+B(l);
n:= entier(ln(s*amax(l)*abs fv(i))/H)+2;
hb:= hb or abs B(l)*amax(l)*s > 1;
write(res,<<__-dd.dddddd>,fv(i),TD(l),B(l),<<_____dd>,n)
end;
cr; k:= m+m+k;
end i;
for i:=1 step 1 until NK do B(i):= X(i);
end fn end TD,X;
close(z,true);
H:= time; systime(1,starttime,time);
if hb and 2*time-H<stoptime then goto igen;
packstop:
begin
comment Packing of input for a continued calculation;
procedure pack(n);
value n; integer n;
begin z(m):= z(m) shift 12 add n end;
open(z,4,string track(1),0); monitor(42,z,0,tail);
setposition(z,0,tail(1)-1); swoprec(z,128);
NM:= NM shift 9 add page;
m:= 128; z(m):= 0; pack(NM); pack(IT); pack(NO); pack(On);
m:= 127; z(m):= 0; pack(NF); pack(NK); pack(NKF); pack(NS);
z(126):= Xmax; z(125):= so;
close(z,true); open(z,4,string track(2),0); k:= 128;
for i:=1 step 1 until NKT do begin
k:= k+1;
if k=129 then begin k:= NKT-i+1;
swoprec(z,if k>128 then 128 else k); k:= 1 end;
z(k):= fv(i);
end;
setposition(z,0,(3*NKT)//128); k:= m:= 3*NKT mod 128;
for i:=1 step 1 until NK do begin
k:= k+1;
if k=129 then begin k:= m+NK-i+1;
swoprec(z,if k>128 then 128 else k); k:= 1 end;
z(k):= B(i);
end;
close(z,true) end
end Obs, fv, B, K;
readhead(in,mol,1);
if hb then begin
i:= 1; l:= 0; k:=psubmit(string mol(increase(i)),l);
i:= 1; write(out,string mol(increase(i)));
if k=0 then write(out,<: job nr. :>,<<dddd>,l) else
if k>0 then begin
i:= (k shift (-12)) -2;
write(out,case i of (<: no jobfile:>,<: que full:>,
<: submitting stopped:>,<: unknown:>,
<: area process error:>))
end else write(out,<: wait answer error:>);
end else begin
cr; cr; cr; write(out,<:Iterations completed:>) end;
stop:
write(res,<:<10><12><25>:>); close(res,closeres);
open(res,4,<:atrack:>,0); monitor(48,res,0,tail); close(res,true);
end end
▶EOF◀