|
|
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: 9984 (0x2700)
Types: TextFile
Names: »algqrotfit«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦7e928b248⟧ »algbib«
└─⟦this⟧
;kemlab5 1
t=algol index.no
begin
comment INPUTREGLER:
1) En overskrift i < >.
2) Maximal regnetid i min.
3) ID, B og C (ID<>0).
4) Antal overgange.
5) Antal frekvenser.
7) Startnummer for kombinering af frekvenserne.
Første gang 1, ellers skriver programmet
startnummer for fortsat beregning.
8) Maximal rms for udskrift af rotationskonst.
9) Frekvenserne.
10) Overgangene (ingen dipol-kontrol).
For hver overgang angives Kvantetal, samt
antallet af frekvenser, der kan tænkes
tilordnet overgangen.
De mulige frekvenser specificeres efter
inputrækkefølgen;
integer i,m,N1,ncr,xx,yy,zz,k,prod1;
real smax,starttime,stoptime;
boolean oblat;
array ROT(1:3),head(1:12);
systime(1,0,starttime);
readhead(in,head,1); read(in,stoptime,ROT,N1,m,ncr,smax);
stoptime:=stoptime*60;
oblat:=2*ROT(2)>(1/(1/ROT(3)-1/ROT(2)-ROT(1)/505376)+ROT(3));
i:=1; write(out,<:<12><10><10><10>:>,string head(increase(i)),
<:<10><10>Calculation by Q-ROTFIT of 10-12-1975<10>:>);
begin
integer array qn1,qn2,ntr,qntr(1:N1),itr(1:40);
array tr(1:m);
begin
integer J1,k11,k12,J2,k21,k22,m1,type1,type2;
integer array MATRIX(1:8);
boolean b11,b12,b21,b22;
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);
xx:=1; yy:=2; zz:=3
end else begin
for i:=1 step 1 until 8 do
MATRIX(i):= case i of (1,2,3,4,2,1,4,3);
zz:=1; xx:=2; yy:=3
end;
write(out,<:<10><10>Input frequencies:<10>:>);
for i:=1 step 1 until m do begin
read(in,tr(i));
write(out,<:<10>:>,<< dd>,i,<< dd ddd.ddd>,tr(i));
end;
m1:=0; write(out,<:<10><10>Input transitions:<10>:>);
for k:=1 step 1 until N1 do begin
read(in,J1,k11,k12,J2,k21,k22,m);
write(out,<:<10>:>,<<ddd>,J1,k11,k12,J2,k21,k22);
for i:=1 step 1 until m do begin
read(in,itr(m1+i));
write(out,<:<10>:>,false add 32,18,<<ddd>,itr(m1+i));
end i;
m1:=m1+m;
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;
qn1(k):=J1 shift 7 add ((J1-k11)//2+1) shift 7 add
MATRIX(if J1=J1//2*2 then type1 else (type1+4));
qn2(k):=J2 shift 7 add ((J2-k21)//2+1) shift 7 add
MATRIX(if J2=J2//2*2 then type2 else (type2+4));
qntr(k):=m;
end k;
end reading of transitions;
begin
integer line,matr,nr,JJ,it,j0,k0,K2,N,j,prod,
M,M0,cn,pr;
real norm,lambda,Li,dE,F,G,H,Pxy,Pz,y,s,so,p,qd,
X,Y,Z,time,a,b,c,an12;
array atot(1:N1,1:3),ai(1:2),rot(1:3),an(1:2),PG(1:3);
prod:=1; M:=if N1=2 then 1 else N1-2;
for i:=1 step 1 until N1-1 do prod:=prod*qntr(i);
systime(1,starttime,time); prod1:=prod*qntr(N1)+1;
write(out,<:<10><10>Start values:<10><10>ID=:>,<<-d.dddd>,
ROT(1),<:<10> B=:>,<< dd ddd.dddd>,ROT(2),<:<10> C=:>,ROT(3),
<:<10><10>Rotational Constants are printed when rms < :>,
<<dd.dd>,smax,<:<10>First combination::>,<< d>,ncr);
ROT(1):=ROT(1)/505376;
nycomb:
cn:=ncr-1; pr:=prod;
for i:=N1 step -1 until 2 do begin
k:=cn//pr; ntr(i):=k+1; cn:=cn-k*pr; pr:=pr/qntr(i-1)
end;
ntr(1):=cn+1; j:=0;
for i:=1 step 1 until N1 do begin
ntr(i):=itr(ntr(i)+j); j:=j+qntr(i)
end;
for i:=1 step 1 until N1 do begin
cn:=ntr(i);
for pr:=i+1 step 1 until N1 do
if cn=ntr(pr) and tr(cn)<>0 then begin
ncr:=ncr+1; goto nycomb
end;
end;
for i:=2,3 do rot(i):=ROT(i); ncr:=ncr+1;
if ncr>prod1 then goto stop; so:=1'612;
igen:
a:=rot(1):=1/(1/rot(3)-1/rot(2)-ROT(1));
b:=rot(2); c:=rot(3); b:=a*a/(b*b); c:=a*a/(c*c);
s:=0; X:=rot(xx); Y:=rot(yy); Z:=rot(zz);
y:=Y; Y:=(X-y)*0.25; X:=(X+y)*0.5; Z:=Z-X; M0:=M;
for line:=1 step 1 until N1 do begin
dE:= 0; Li:=tr(ntr(line));
if Li>0 then begin
for i:=1,2 do ai(i):=0;
for k:=-1,1 do begin
if k=-1 then begin
N:=qn1(line); j0:=N shift (-14) extract 7;
nr:=N shift (-7) extract 7; matr:=N extract 7
end else begin
N:=qn2(line); j0:=N shift (-14) extract 7;
nr:=N shift (-7) extract 7; matr:=N extract 7;
end;
JJ:= j0*(j0+1); G:=X*JJ;
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;
if j0<>0 then begin
array alfa,beta,S,Pdif(1:N);
beta(1):= Pdif(1):= 0;
k0:= k0+2; K2:= k0*k0;
for j:=1 step 1 until N do begin
alfa(j):= G + Z*K2;
if j<>N then begin
p:= p*(j0-k0)*(j0-k0-1)*(j0+k0+1)*(j0+k0+2);
k0:= k0+2; K2:= k0*k0;
beta(j+1):=Y**2*p;
Pdif(j+1):= -sqrt(p);
p:=1;
end j<>N;
end j;
if matr>=3 then begin
j:= if matr=3 then -1 else 1;
alfa(1):= alfa(1) + Y*j*JJ;
Pdif(1):= j*JJ//2
end;
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+H;
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;
for i:=1 step 1 until N do
alfa(i):=alfa(i)-lambda;
for i:=2 step 1 until N do
beta(i-1):=-sqrt(beta(i));
S(1):=S(N):=1;
if j>1 then S(2):=-alfa(1)/beta(1);
i:=1; for i:=i+1 while i<j do S(i+1):=
-(S(i)*alfa(i)+S(i-1)*beta(i-1))/beta(i);
y:=1/S(j);
for i:=j-1 step -1 until 1 do S(i):=S(i)*y;
if j<N then S(N-1):=-alfa(N)/beta(N-1);
i:=N; for i:=i-1 while i>j do S(i-1):=
-(S(i)*alfa(i)+S(i+1)*beta(i))/beta(i-1);
y:=1/S(j); S(j):=1;
for i:=j+1 step 1 until N do S(i):=S(i)*y;
norm:=Pz:=G:=F:=Pxy:=0;
for i:=N step -1 until 1 do begin
G:=S(i); H:=G*G; F:=F*G;
norm:=norm+H; H:=H*K2;
Pz:=Pz+H; Pxy:=Pxy+F; F:=Pdif(i)*G;
k0:=k0-2; K2:=k0*k0;
end i;
F:=F*G; norm:=1/norm; Pxy:=(Pxy+F)*norm;
PG(zz):=Pz:=Pz*norm; F:=JJ-Pz;
PG(xx):=(F+Pxy)*0.5; PG(yy):=(F-Pxy)*0.5;
dE:= dE + k*lambda;
PG(3):=PG(3)+PG(1)*c; PG(2):=PG(2)-PG(1)*b;
for i:=1,2 do ai(i):=ai(i)+PG(i+1)*k;
end j0<>0;
end k;
dE:=Li-dE; s:=s+dE*dE;
for i:=1,2 do atot(line,i):=ai(i); atot(line,3):=dE;
end else begin
M0:=M0-1;
for i:=1,2,3 do atot(line,i):=0;
end Li=0;
end line;
if M0<1 then goto nycomb;
for j:=1,2 do begin
if j=2 then begin
qd:= an(1);
p:= 0;
for i:=1 step 1 until N1 do
p:= p + atot(i,2)*atot(i,1);
an12:= p; p:= qd*p;
for i:=1 step 1 until N1 do
atot(i,2):= atot(i,2)-atot(i,1)*p
end j=2;
p:= qd:= 0;
for i:=1 step 1 until N1 do begin
p:= p + atot(i,j)**2;
qd:= qd + atot(i,j)*atot(i,3)
end i;
an(j):= 1/p; ai(j):= qd;
end j;
ai(2):=an(2)*ai(2);
ai(1):=an(1)*(ai(1)-ai(2)*an12);
y:=systime(1,starttime,p); qd:=p-time; time:=p;
if p+qd>stoptime then goto stop;
s:=sqrt(s/M0);
if so-s<1'-2 then begin
if so<smax then begin
write(out,<:<10>:>);
for i:=1 step 1 until N1 do write(out,<< dd>,ntr(i));
write(out,<:<10><10>:>,<<___dd.dd>,so);
for i:=1,2,3 do write(out,<< ddd ddd.ddd>,rot(i));
so:=(rot(2)*2-rot(1)-rot(3))/(rot(1)-rot(3));
write(out,<: kappa =:>,<< -d.ddd>,so,<:<10>:>);
end;
goto nycomb;
end else begin
for i:=2,3 do rot(i):=rot(i)+ai(i-1);
end;
so:=s;
goto igen;
end;
stop:
if ncr<prod1 then write(out,<:<10><10>Start new calculation:>,
<: with combination no.:>,<<ddd>,ncr) else
write(out,<:<10><10>Calculation complete.:>);
end;
end;
rename t.qrotfit
permanent qrotfit.17
▶EOF◀