|
|
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: 27648 (0x6c00)
Types: TextFile
Names: »algrotfrekv«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦7e928b248⟧ »algbib«
└─⟦this⟧
;gosav
lookup rotfrekvens
if ok.no
(rotfrekvens=set 85
permanent rotfrekvens.17
rotfrekvens=algol index.no list.no xref.no)
\f
CALCULATION OF MICROWAVE FREQUENCIES,
RELATIVE INTENSITIES (or STARK-COEFFICIENTS)
AND QUADRUPOLE SPLITTINGS. 1-2-1980, GOS.
begin
comment Quadrupole splittings can be calculated only for a
single nucleus with I=1. As input is given:
1) A heading in one line with delimiters < >.
The line will appear on top of every output
page and must not exceed 72 characters.
2) An integer m with up to four digits for options
according to the following rules:
m=1000 causes a centrifugal distortion correction
of the frequencies to be made.
m= 100 results in a calculation of Stark coefficients.
Is m<>100 relative intensities are calculated.
m= 10 causes - provided m<>100 - that quadrupole
splittings are calculated.
m= 1 or 2 causes at the end a sorting of the
lines according to increasing frequency.
If m=2 the sorted frequency list is transformed
into an input list for precalcultion by ROTFIT.
The list is stored on disc (key 15) with the
name <:savelist:>.
m= 3 or 4 have the same effects as 1 or 2, but
output of unsorted transitions is suppressed.
A combination of these options may be obtained
by an appropriate sum of the integers.
3) The maximal computation time in minutes.
If time<0 then the temperature can be specified.
4) Three rotational constants (MHz.) in arbitrary order.
5) If m=1000 : Six centrifugal distortion constants (kHz).
6) Smallest J-value for the calculations.
7) Largest J-value for calculation of Q-lines (< 80).
8) Largest J-value for calculation of P- or R-lines.
9) The frequency limits, two numbers in arbitrary order.
10) The smallest rel. intensity (or Stark coef.*J**2)
of lines included in the output.
11) An integer between 1 and Jmax giving the maximal
change, dKmax, of K-quantum numbers referring
to the nearest symmetric top limit.
12) The three dipole moment components along the prin-
cipal axes in the order a,b,c.
13) If m=10 : Quadrupole coupling constants of the axes
in the order aa, bb, cc (MHz).
14) If m<>100 : With only a single nonvanishing dipole
moment component the molecule is regarded to
possess a symmetry axis. Two numbers are then
reqired for the statistical weights of symmetric
and antisymmetric levels respectively;
integer i,j,k,l,m,n,p,q,J,Jmin,space,side,overgange;
real temp, starttime, stoptime, time, cpu, Qr, Qrj, Qra;
zone L(128*2, 2, stderror), res(128,1,stderror);
integer array Ltail, Wtail(1:10);
boolean ha,hb,centrifugal,quadrupol,intensitet,sorter,
savesort,output,closeres,nl;
array hoved(1:12);
procedure nylinie;
begin
l:= l+1; write(res,<:<10>:>);
if l>58 then begin
integer i;
side:= side+1; i:= 1; write(res,<:<12>:>,nl, 3,
string hoved(increase(i)), false add 32, space,
<<dd>,side, nl,2); l:= 3
end end nylinie;
procedure overskrift;
begin
write(res,<:
transition frequency :>);
if intensitet then write(res,<:inten-:>)
else write(res,<:Stark-coefficients:>);
if quadrupol then write(res,<: 3 strongest eqQ-comp.:>);
write(res,<:
:>);
if intensitet then write(res,<:sity :>)
else write(res,<: A B:>);
if quadrupol then write(res,<: F=J-1 F=J F=J+1:>);
write(res,<:
------------------------------------:>);
if intensitet then write(res,<:------:>)
else write(res,<:-----------------------:>);
if quadrupol then write(res,<:--------------------------:>);
l:= l+3
end overskrift;
for i:=1 step 1 until 10 do Wtail(i):= Ltail(i):= 0;
closeres:= outmedium(res);
comment Her begynder selve programmet. Det første der sker,
er indlæsningen og ordning af inputparametrene;
space:= 39 - readhead(in,hoved,1); read(in,m);
centrifugal:= m//1000=1; m:= m mod 1000;
intensitet:= m//100<>1; m:= m mod 100;
quadrupol:= m//10=1; m:= if intensitet then m mod 10 else 0;
sorter:= m>0; output:= m<3; savesort:= m=2 or m=4;
k:= if centrifugal then 6 else 1; nl:= false add 10;
begin
real Fmin, Fmax, Lmin, Lscale, spor, A, C;
integer JJ, JQmax, JPRmax, dKmax, symx;
boolean Jlige, oblat, Qlinier, PRlinier;
array Rot, ki, my(1:3), D(1:k), vægt(1:2);
integer array KATALOG(1:3,1:8), MATRIX, TAU(1:8);
procedure P(x,y); real x,y;
begin real u, v; boolean b;
b:=x<y; u:=if b then y else x; v:=if b then x else y;
x:=u; y:=v
end P;
cpu:= systime(1,0,starttime);
read(in,stoptime);
if stoptime<0 then read(in,temp) else temp:= 300;
stoptime:= abs stoptime;
read(in,Rot); if centrifugal then read(in,D);
read(in,Jmin, JQmax, JPRmax, Fmin, Fmax, Lmin, dKmax, my);
Qra:= 1; for i:= 1,2,3 do Qra:= Qra*Rot(i);
Qra:= sqrt(pi/Qra*(temp*20836.48)**3);
stoptime:= stoptime*60;
if quadrupol then read(in,ki);
quadrupol:= quadrupol and intensitet;
if JQmax>80 then JQmax:= 80; if JPRmax>80 then JPRmax:= 80;
P(Rot(1),Rot(2)); P(Rot(1),Rot(3)); P(Rot(2),Rot(3));
P(Fmax,Fmin);
Qlinier:= JQmax>=Jmin and JQmax>0;
PRlinier:= JPRmax>0 and Jmin=0;
comment Indlæsning og ordning af inputparametrene er nu
delvis tilendebragt. De størrelser, som programmet
herefter regner med, trykkes;
if -, intensitet then space:= space+18;
if quadrupol then space:= space+27;
if space < 6 then space:= 6; side:= 0; l:= 70; nylinie;
write(res,<:Calculation with FREQUENCY PROGRAM of 11-5-1977.
Rotational Constants in MHz::>);
write(res,<<-ddd ddd.ddd>,Rot(1),Rot(2),Rot(3));
if centrifugal then begin
procedure output(a); value a; real a;
begin k:= entier abs a;
spor:= real(if k< 10 then <<-d.ddddd0> else
if k<1000 then <<-ddd.ddd0> else <<-ddddd.d0>);
write(res,<: = :>, string spor , a ,<: :>) end;
write(res,<:
Centrifugal Distortion Constants in kHz::>);
for i:=1 step 1 until 3 do begin write(res,<:
tau-:>, case i of (<:aaaa:>,<:bbbb:>,<:cccc:>));
output(D(i));
write(res, case i of (<:tau-aabb + 2*tau-abab:>,
<:tau-bbcc + 2*tau-bcbc:>,<:tau-ccaa + 2*tau-caca:>));
output(D(i+3))
end; l:= l+4 end;
write(res,<:
Limits for J : Jmin = :>,<<dd>,Jmin,
<: JQmax = :>,JQmax,<: JPRmax = :>,JPRmax,<:
Limits for F : Fmin =:>,<<-ddd ddd>,
Fmin,<: Fmax =:>, Fmax);
if intensitet then begin
write(res,<:
Dipol Components ::>); j:= 0;
for i:=1,2,3 do begin
write(res, case i of (<: myA =:>,<: myB =:>,<: myC =:>),
<<ddd.dd>,my(i));
if my(i)<>0 then begin j:= j+1; symx:= i+1 end
end;
if j=1 then begin read(in,vægt);
if vægt(1)<>vægt(2) then begin write(res,<:
Statistical Weights: Sym. level: :>,<<ddd>,vægt(1),
<:, Antisym. level: :>,vægt(2));
spor:= vægt(1)+vægt(2);
vægt(1):= vægt(1)/spor; vægt(2):= 1-vægt(1);
l:= l+1
end end else vægt(1):=vægt(2):=1;
write(res,<:
Smallest Rel. Intensity (T=:>,
if temp<10 then <<d.d> else <<ddd>,temp,<: K)::>,<<dddd>,Lmin);
end else begin
write(res,<:
Transition Types: :>);
if my(1)>0 then write(res,<:myA:>);
if my(2)>0 then begin
if my(1)>0 then write(res,<:,:>);
write(res,<:myB:>) end;
if my(3)>0 then begin
if my(1)>0 or my(2)>0 then write(res,<:,:>);
write(res,<:myC:>) end;
write(res,<:
Smallest Stark-coefficient*J*J ::>,<<_d'-dd>,Lmin);
end;
write(res,<: Largest delta-K : :>,<<dd>,dKmax);
if quadrupol then begin
write(res,<:
Quadrupol Couplings Constants in MHz::>,
<<-ddd.ddd>,ki(1),ki(2),ki(3));
l:= l+1 end;
A:= C:= 0;
for i:=1,2,3 do begin
A:= A+Rot(i); my(i):= my(i)**2; if my(i)>C then C:= my(i)
end;
Lscale:= exp(-6+A*4.7993'-5/temp)*temp/C;
nylinie; nylinie; overskrift;
l:= l+6; comment l er en linietæller.
Nu opbygges et katalog over de tilladte overgange.
Dette bygger paa følgende:
Tromlen er delt i to afsnit svarende til J lige og J ulige.
Paa hvert afsnit lagres reducerede energiniveauer samt matrix-
elementer for de fire muligheder ee, eo, oe og oo i den nævnte
rækkefølge.
I ferritlageret oprettes et array (MATRIX) med 8 elementer,
som for de 8 mulige tilfælde (type 1 til 4 for J lige og type 5
til 8 for J ulige) angiver matrixtypen E+, E-, O+ og O- numme-
reret 1 til 4 i den nævnte rækkefølge. Indholdet af MATRIX
bliver derfor:
for kappa>0: 1 4 2 3 2 3 1 4 (IIIr representation)
for kappa<0: 1 2 3 4 2 1 4 3 ( Ir - - )
Kataloget over de tilladte overgange har 3 rækker og 8 søjler
og indeholder information om udvalgsreglerne svarende til de 3
dipolretninger myA, myB og myC. Disse udvalgsregler kan opstil-
les ifølgende skema:
myA ee=>eo oe=>oo eo=>ee oo=>oe
myB ee=>oo oe=>eo oo=>ee eo=>oe
myC ee=>oe eo=>oo oe=>ee oo=>eo
De 8 søjler i kataloget parres sammen to og to, og informationen
om de tilladte overgange gives da i form af heltal, idet ee=1,
eo=2, oe=3 og oo=4. Katalogmatricen bliver da:
1 2 3 4 2 1 4 3
1 4 3 2 4 1 2 3
1 3 2 4 3 1 4 2
Disse tal kan bruges til valg af de til overgangene svarende
tromlesegmenter;
oblat:= Rot(2)*2>(Rot(1)+Rot(3));
if centrifugal then begin
integer x,y,z; real a,b,c; array T(1:6);
if oblat then begin
x:= 1; y:= 2; z:= 3;
for i:=1 step 1 until 6 do T(i):= D(i) end
else begin
x:= 2; y:= 3; z:= 1;
for i:=1,2 do begin T(i):= D(i+1); T(i+3):= D(i+4) end;
T(3):= D(1); T(6):= D(4) end;
c:= 1/(Rot(x)-Rot(y));
a:= (Rot(y)-Rot(z))*c;
b:= (Rot(z)-Rot(x))*c;
c:= (T(1)+T(2)-2*T(4))/4000;
Rot(x):= Rot(x) + a*c;
Rot(y):= Rot(y) + b*c;
Rot(z):= Rot(z) + c; c:= -1/8000;
D(1):= (T(1)+T(2))*c;
D(2):= (T(4)+T(5)+T(6))*(c+c) - D(1)*3;
D(3):= (T(1)+T(2)+T(3)-T(4)-T(5)-T(6))*(c+c);
D(4):= (T(1)-T(2))*c*0.5;
D(5):= (T(1)*b-T(2)*a+T(4)*(a-b)-T(5)+T(6))*c
end;
C:= Rot(3); A:= Rot(1);
for i:=1 step 1 until 8 do TAU(i):= case i of (4,3,1,2,1,2,4,3);
if oblat then begin
Rot(3):= (A-Rot(2))*0.25;
Rot(2):= (A+Rot(2))*0.5;
Rot(1):= C-Rot(2);
for i:=1 step 1 until 8 do
MATRIX(i):= case i of (1,4,2,3,2,3,1,4)
end else begin
Rot(3):= (Rot(2)-C)*0.25;
Rot(2):= (Rot(2)+C)*0.5;
Rot(1):= A-Rot(2);
for i:=1 step 1 until 8 do
MATRIX(i):= case i of (1,2,3,4,2,1,4,3)
end;
for i:=1 step 1 until 8 do begin
KATALOG(1,i):= case i of (1,2,3,4,2,1,4,3);
KATALOG(2,i):= case i of (1,4,3,2,4,1,2,3);
KATALOG(3,i):= case i of (1,3,2,4,3,1,4,2) end;
overgange:= 0; Qr:= 1;
J:= Jmin;
Jlige:= J=J//2*2;
begin zone dummy(128,1,stderror);
open(dummy,4,<:rotmat:>,0); Wtail(1):= 8;
monitor(40,dummy,0,Wtail); monitor(50,dummy,15,Wtail);
if J=0 then begin outrec(dummy,128);
for i:=1,43,85 do dummy(i):= 0;
close(dummy,true); J:= 1; Jlige:= false
end end;
if sorter then begin
open(L,4,<:rotline:>,0); Ltail(1):= 50;
monitor(40,L,0,Ltail); outrec(L,128) end;
if -,intensitet then begin
open(L,4,<:starkmat:>,0); Ltail(1):= 100;
if monitor(40,L,0,Ltail)>0 then begin nylinie;
write(res,<:
***starkmat reserved:>);
goto stop end else outrec(L,128)
end;
monitor(50,L,15,Ltail);
comment De indledende beregninger er nu tilendebragt, og de
egentlige frekvens- eller energiberegninger kan påbegyndes.
Disse beregninger foregaar i to faser. I fase 1 beregnes
først elementerne i de 4 E-matricer svarende til ee, eo, oe
og oo. Energierne beregnes som egenværdier i disse matricer og
lagres i et W-array. Dette transporteres til slut til plade-
lageret. Naar alle fire matricer er behandlet, beregnes fejlen
paa hamiltonmatricens spor;
systime(1,starttime,time);
FASE1:
begin
real F, G, G1, H, H1, p;
integer type,K,K2,N,s,matrix;
zone alfa(128*2,2,stderror);
array a,b(0:42);
Qrj:= spor:= 0; JJ:= J*(J+1);
F:= Rot(2)*JJ; G:= Rot(1); H:= Rot(3);
open(alfa,4,<:rotmat:>,0);
if -,Jlige then setposition(alfa,0,4);
if centrifugal then begin
F:= F - D(1)*JJ*JJ; G1:= -D(3);
G:= G - D(2)*JJ; H1:= -D(5);
H:= H - D(4)*JJ + H1 + H1
end else G1:= H1:= 0;
for type:=1 step 1 until 4 do begin
s:= if Jlige then type else (type+4);
matrix:= MATRIX(s);
K:= if matrix=1 then -2 else if matrix=2 then 0 else -1;
p:= if matrix=1 then 2 else 1; N:= (J-K)//2;
outrec(alfa,128);
if N>0 then begin
comment Nu beregnes matrixelementerne;
for j:=1 step 1 until N do begin
K:= K+2; K2:= K*K;
a(j):= alfa(j):= F+ (G+G1*K2)*K2;
if j<>N then b(j):= alfa(42+j):=
-(H+ H1*(K2+K+K))*sqrt(p*(J-K)*(J-K-1)*(J+K+1)*(J+K+2));
p:= 1
end j;
if matrix>2 then
alfa(1):= a(1):= a(1)+(if matrix=3 then -1 else 1)*(H-H1)*JJ;
alfa(42+N):= b(N):= 0;
comment Den aktuelle E-matrix er nu beregnet, idet diagonal-
elementerne står i a og sidediagonalelementerne i de første n-1
pladser af b. Egenværdierne beregnes ved QL transformation,
og ordnes efter aftagende størrelse;
begin
real f,g,h,bt,c,s,q;
bt:= f:= 0;
for k:= 1 step 1 until N do begin
h:= 3'-11*(abs a(k) + abs b(k));
if bt<h then bt:= h;
if abs b(k)<=bt then goto root;
comment form shift;
nextit:
p:= (a(k+1)-a(k))/(2*b(k)); q:= sqrt(p*p+1);
h:= a(k)-b(k)/(if p<0 then p-q else p+q);
for i:=k step 1 until N do a(i):= a(i)-h;
f:= f+h;
comment QL transformation;
p:= a(N); c:= 1; s:= 0;
for i:=N-1 step -1 until k do begin
g:= c*b(i); h:= c*p;
if abs p>=abs b(i) then begin
c:= b(i)/p; q:= sqrt(c*c+1);
b(i+1):= s*p*q; s:= c/q; c:= 1/q
end else begin
c:= p/b(i); q:= sqrt(c*c+1);
b(i+1):= s*b(i)*q; s:= 1/q; c:= c/q
end;
p:= c*a(i)-s*g;
a(i+1):= h+s*(c*g+s*a(i));
end i;
b(k):= s*p; a(k):= c*p;
if abs b(k)>bt then goto nextit;
root:
p:= a(k)+f; spor:= spor+p; i:= k;
for i:= i-1 while i>0 and p>a(i) do a(i+1):= a(i);
a(i+1):= p
end k end;
p:= vægt(if type=1 or type=symx then 1 else 2)*(J+J+1);
for i:=1 step 1 until N do begin
Qrj:= Qrj+exp(-a(i)*4.7993'-5/temp)*p; alfa(84+i):= a(i)
end end end tælling paa de fire typer.
Alle energier svarende til den aktuelle J-værdi er nu
beregnet og deres sum staar i spor. Fejlen paa denne sum
(hidrørende fra afrundingsfejl ved egenværdiberegningen) kan
nu beregnes;
Qr:= Qr+Qrj; close(alfa,true);
spor:= abs(spor - (J+J+1)*(F+JJ*(G/3+(3*JJ-1)*G1/15)))
end FASE1;
comment I fase 2 foretages beregning og trykning af de over-
gange, der opfylder de af inputparametrene givne betingelser;
FASE2:
begin
integer type1,type2,d1,d2,q1,q2,matr1,matr2,
tau1,tau2,k1,k2,J1,J2,N,N1,N2,K;
boolean Q, ingen;
zone W1, W2(128,1,stderror);
open(W1,4,<:rotmat:>,0); open(W2,4,<:rotmat:>,0); J2:= J*J;
for j:=1,2,3 do
if my(j)>0 then begin
if output then begin
if l>=58 then begin write(res,nl,2); l:= l+2 end;
nylinie; if l<>3 then nylinie;
write(res,case j of (<:myA:>,<:myB:>,<:myC:>),<:-lines:>);
end;
comment Størrelsen j tæller de tre forskellige typer myA, myB
og myC. Hver gang j skifter værdi, trykkes som en slags over-
skrift hvilken type de følgende linier tilhører. For hver type
trykkes først PR-overgange, og derefter - med ekstra linieaf-
stand - Q-overgange. Saafremt der ikke findes linier, der op-
fylder de krav,der er stillet gennem inputparametrene, trykkes
ordet ingen efter den lige omtalte overskrift. Naar alle lini-
er hørende til den aktuelle værdi af J er trykt, trykkes fejlen
på summen af egenværdierne for denne J-værdi;
ingen:= true;
Q:= -,PRlinier and Qlinier;
if Jlige then begin d1:= 0; d2:= 4 end
else begin d1:= 4; d2:= 0 end;
QLINIER:
if Q and-,ingen and output then nylinie;
if Q or PRlinier then
for k:=1,3,5,7 do begin
J1:= if Q then J else J-1;
type1:= KATALOG(j,k); q1:= type1+ (if Q then d1 else d2);
type2:= KATALOG(j,k+1); q2:= type2+ d1;
matr1:= MATRIX(q1); matr2:= MATRIX(q2);
tau1 := TAU(q1)+J1; tau2 := TAU(q2)+J;
k1:= if matr1=1 then -2 else if matr1=2 then 0 else -1;
k2:= if matr2=1 then -2 else if matr2=2 then 0 else -1;
N1:= (J1-k1)//2; N2:= (J-k2)//2;
if N1>=0 and N2>=0 then begin
real f,g,LJM;
setposition(W1,0,q1-1); setposition(W2,0,q2-1);
inrec(W1,128); inrec(W2,128);
comment Energierne svarende til en af de tre typer bestemt
ved j og en af de tilladte overgange bestemt ved k befin-
der sig nu iferritlageret i hhv. W2 og W1.
Alle kombinationer af differenser (f) af energiniveauer
dannes, og de der opfylder inputspecifikationerne, trykkes.
Først beregnes dog den K-uafhængige liniestyrkefaktor (LJM);
LJM:= if Q then (J+J+1)/(4*JJ) else 1/(4*J);
for q1:=1 step 1 until N1 do
for q2:=1 step 1 until N2 do begin
n:= if oblat then q1-q2 else N1-q1-N2+q2;
if abs(n+n+k1-k2)<=dKmax then begin
f:= W2(q2+84) - W1(q1+84); g:= abs f;
if g>=Fmin and g<=Fmax then begin
real norm1, norm2, A, B;
array S1(1:N1), S2(1:N2);
procedure egenvektor(E,N,W,S,norm);
value E,N;
real E,norm; integer N; array S; zone W;
begin
integer i,j; real x,y; array a,b(1:N);
j:= 1;
for i:=1 step 1 until N do begin
a(i):= W(i)-E; b(i):= W(42+i);
if abs(a(i))<abs(a(j)) then j:=i end;
if b(1)<>0 then begin
S(1):= S(N):= norm:= 1;
if 1<j then S(2):= -a(1)/b(1);
i:= 1;
for i:=i+1 while i<j do
S(i+1):= -(S(i)*a(i)+S(i-1)*b(i-1))/b(i);
y:= 1/S(j);
for i:=j-1 step -1 until 1 do begin
S(i):= x:= S(i)*y; norm:= norm+x*x end;
if j<N then S(N-1):= -a(N)/b(N-1);
i:= N;
for i:=i-1 while i>j do
S(i-1):= -(S(i)*a(i)+S(i+1)*b(i))/b(i-1);
y:= 1/S(j);
for i:=j+1 step 1 until N do begin
S(i):= x:= S(i)*y; norm:= norm+x*x end;
S(j):= 1; norm:= 1/norm
end else begin
for i:=1 step 1 until N do S(i):= 0;
S(j):= norm:= 1
end end egenvektor;
egenvektor(W1(q1+84),N1,W1,S1,norm1);
egenvektor(W2(q2+84),N2,W2,S2,norm2);
comment De aktuelle egenvektorer er nu tilstede, og linie-
styrken kan beregnes. Den K-afhængige liniestyrkefaktor (A)
beregnes først for my-z overgange;
A:= 0;
if (-,oblat and j=1)or(oblat and j=3) then begin
if Q then begin
m:= if matr1=1 then 1 else 0;
n:= if matr2=1 then 1 else 0;
N:= N1-m;
K:= if m=1 or n=1 then 0 else -1;
for i:=1 step 1 until N do begin
K:= K+2; A:= A+ S1(i+m)*S2(i+n)*K
end end Q-linie
else begin
N:= if N1>N2 then N2 else N1; K:= k1;
for i:=1 step 1 until N do begin
K:= K+2; A:= A+ S1(i)*S2(i)*sqrt(J2-K*K)
end end R-linie;
A:= A+A
end my-z overgang
Nu beregnes liniestyrkefaktoren for my-x overgang(m= -1)
eller my-y overgang(m= 1).
else begin
m:= if (-,oblat and j=3)or(oblat and j=2) then 1 else -1;
hb:= matr1=1 or matr2=2; q:= if Q then 1 else -1;
K:= k1; p:= if K=-2 then 2 else 1; n:= if hb then 0 else 1;
N:= N2-n; if N>N1 then N:= N1;
for i:=1 step 1 until N do begin
K:= K+2; A:= A+ S1(i)*S2(i+n)*sqrt(p*(J-q*K)*(J+K+1)); p:= 1
end første sum;
K:= k2+1; p:= if K=-1 then 2 else 1; n:= if hb then 1 else 0;
N:= N1-n; if N>N2 then N:= N2; B:= 0;
for i:=1 step 1 until N do begin
K:= K+2; B:= B+ S1(i+n)*S2(i)*sqrt(p*(J+q*K)*(J-K+1)); p:= 1
end anden sum;
A:= A+ q*m*B
end my-y og my-x overgang;
A:= A*A*norm1*norm2;
comment Liniestyrken er A*LJM, og den relative intensitet eller
Stark-koefficienterne kan beregnes. Er intensiteten eller en af
Starkkoefficienterne større end den i input givne Lmin, udskri-
ves frekvensen og den eventuelle quadrupolsplitning beregnes.
Skal der til slut foretages en liniesortering , tromlelagres
de beregnede størrelser;
hb:=false;
if intensitet then begin
if f>0 then begin
B:= W1(q1+84); p:= type1 end
else begin
B:= W2(q2+84); p:= type2 end;
m:= if j=1 and p=2 or j=2 and p=4
or j=3 and p=3 or p=1 then 1 else 2;
A:= A*LJM*exp(-B*4.7993'-5/temp)*my(j)*vægt(m)*g
*(1-exp(-g*4.7993'-5/temp))*Lscale; hb:= A>Lmin
end beregning af rel. intensitet(A) ved 25 Celciusgr.
else begin
hb:= A*100>g*JJ; if hb or A>g*JJ*Lmin then begin
A:= if Q then A/(JJ*JJ) else A/(J2*(J+J+1)*(J+J-1));
B:= 0; m:= tau1 - 4*q1; n:= tau2 - 4*q2;
B:= B add J1 shift 8 add ((J1+1+m)//2) shift 8
add ((J1+1-m)//2) shift 8 add J shift 8
add ((J +1+n)//2) shift 8 add ((J +1-n)//2);
p:= overgange mod 42 * 3;
L(p+1):= B; L(p+2):= f; L(p+3):= A; B:= 0;
if p+3=126 then outrec(L,128);
overgange:= overgange+1;
if -,hb then begin A:= B:= A/(4*g); hb:= true end
end end beregning af Stark-koefficienter(A,B);
N:= if quadrupol then 4 else 3;
if hb then begin array M(1:N);
ingen:= false; if output then nylinie; hb:= f<0; M(2):= 0;
if hb then goto anden;
første: n:= tau1-4*q1;
if output then write(res,<<ddd>,J1,(J1+1+n)//2,(J1+1-n)//2,<: :>);
M(2):= M(2) shift 12 add J1 shift 12 add (n extract 12);
if hb then goto frekv;
anden: n:= tau2-4*q2;
if output then write(res,<<ddd>, J, (J+1+n)//2, (J+1-n)//2,<: :>);
M(2):= M(2) shift 12 add J shift 12 add (n extract 12);
if hb then goto første;
frekv:
if output then write(res,<<_ddd ddd.dd>,g);
if intensitet then begin
if output then write(res,<<__dd ddd>,A) end
else begin
if B<>0 then write(res,<: :>);
write(res,<<___d.ddd ddd'-d>,A)
end;
if quadrupol then begin
real eqQ1, eqQ2, a,b,c;
procedure EQQ(J,matrix,k,N,S,norm,eqQ);
value J,matrix,k,N,norm;
real norm,eqQ; integer J,matrix,k,N; array S;
begin
integer JJ,K,i; real PA,PB,PC,s,p;
K:= k; p:= if K=-2 then 2 else 1;
PA:= PB:= 0; JJ:= J*(J+1); PC:= JJ//2*S(1);
PC:= if matrix=3 then -PC else if matrix=4 then PC else 0;
for i:=1 step 1 until N do begin
K:= K+2; s:= S(i);
PA:= PA+K*K*s*s; PB:= PB+PC*s;
if i<>N then PC:= -sqrt(p*(J-K)*(J-K-1)*(J+K+1)*(J+K+2))*s;
p:= 1 end i;
PA:= PA*norm; s:= PB*norm;
PB:= (JJ-PA+s)*0.5; PC:= (JJ-PA-s)*0.5;
if oblat then begin s:= PA; PA:= PB; PB:= PC; PC:= s end;
eqQ:= (PA*ki(1)+PB*ki(2)+PC*ki(3))*0.5;
end EQQ;
EQQ(J1,matr1,k1,N1,S1,norm1,eqQ1);
EQQ(J,matr2,k2,N2,S2,norm2,eqQ2);
if hb then begin eqQ1:= -eqQ1; eqQ2:= -eqQ2 end;
a:= (if J1=0 then 0 else -eqQ1/(J1*(2*J1-1))) + eqQ2/(J*(2*J-1));
b:= (if J1=0 then 0 else eqQ1/(J1*(J1+1))) - eqQ2/JJ;
c:= -eqQ1/((J1+1)*(2*J1+3)) + eqQ2/((J+1)*(2*J+3));
if output then begin
write(res,<: :>); write(res,<<-ddd.ddd>,a,b,c) end;
if sorter then begin i:= 65536;
n:= round(a*1000); if n<0 then n:= n+i;
p:= round(b*1000); if p<0 then p:= p+i;
q:= round(c*1000); if q<0 then q:= q+i;
M(4):= 0.0 shift 6 add n shift 16 add p shift 16 add q
end end quadrupol;
if sorter then begin
M(1):= g; M(3):= 4.1623125'-19*A/Lscale;
q:= 128//N; p:= overgange mod q; hb:= p+1 = q; p:= p*N;
for i:=1 step 1 until N do L(i+p):= M(i);
if hb then outrec(L,128)
end;
if intensitet then overgange:= overgange + 1
end end udskrift af linie
end end tælling af alle kombinationer(q1,q2)
end W1-W2 blok;
if k=7 then begin
Q:= Qlinier;
PRlinier:= false;
goto QLINIER
end;
if Q and k=3 then goto LINIESLUT
end tælling paa overgangstyper(k);
LINIESLUT:
PRlinier:= J<=JPRmax and J>Jmin;
if ingen and output then write(res,<:: none:>)
end tælling af my-typer(j);
if output then begin
l:= l+3;
write(res,nl,2,<:Qr, dQr and Trace error for J = :>,<<dd>,J,<: : :>,
<< d.ddd'd>,Qr,Qrj,<<ddd.ddd>,spor,nl,1,<: Time, cpu: :>,
(systime(1,starttime,A)-cpu)/60,<: real::>,A/60);
end;
comment Trykningen svarende til den aktuelle værdi af J er nu
forbi. Fase 2 afsluttes med en fremtælling af J og et hop forfra,
hvis beregningerne ønskes udført ogsaa for den nye J-værdi;
J:= J+1; Jlige:= -,Jlige;
hb:= 2*spor-time < stoptime and Qrj>Qr*'-4; time:= spor;
Qlinier:= J<=JQmax;
PRlinier:= J<=JPRmax;
if hb and (Qlinier or PRlinier) then goto FASE1;
end FASE2;
if -,intensitet then
L(overgange mod 42*3 + 1):= 0.0 add J shift 16;
if output then
write(res,nl,2,<:Total number of transitions:>,
<<dddd>, overgange)
end BEREGNINGSBLOK;
begin zone dummy(128,1,stderror);
open(dummy,4,<:rotmat:>,0); monitor(48,dummy,0,Wtail) end;
comment Til slut sorteres linierne efter voksende frekvens;
m:= if quadrupol then 4 else 3;
if overgange=0 then
write(res,nl,2,<:No lines between J = :>,<<dd>,
Jmin,<: and J = :>,J-1)
else if sorter then begin
integer min, max, tau, k1, k2, dk1, dk2; real Q,R,S,Smax;
integer array N(1:overgange); array F(1:overgange);
zone save(if savesort then 128 else 1,1,stderror);
if savesort then begin
open(save,4,<:savelist:>,0); Wtail(1):= overgange*27//768+1;
monitor(40,save,0,Wtail); monitor(50,save,15,Wtail)
end;
q:= 128//m; n:= (overgange-1)//q;
if n>=0 then begin
setposition(L,0,0); p:= q end else p:= 0;
min:= max:= N(1):= 1; Smax:= 0;
Q:= if Qr>Qra then Qr else Qra;
for k:=1 step 1 until overgange do begin
if p=q then begin inrec(L,128); p:= 0 end;
F(k):= R:= L(p*m+1); S:= L(p*m+3)/Q;
if S>Smax then Smax:= S; p:= p+1; j:= max;
for i:= min,N(i) while i<>min do
if F(i)<=R then j:= i else i:= max;
if j=max then begin
if R>=F(max) then max:= k else
if R< F(min) then min:= k end;
N(k):= N(j); N(j):= k
end k;
Smax:= 10**entier(ln(Smax)/ln10);
if output then begin
write(res,<:<10>Time after sorting, cpu: :>,<<dd.ddd>,
(systime(1,starttime,time)-cpu)/60,<: real: :>,time/60);
side:= 0; l:= 70; nylinie; overskrift
end; nylinie;
for i:=min,N(i) while i<>min do begin
p:= (i-1)//q; if n<>p then begin
n:= p; setposition(L,0,n); inrec(L,128) end;
p:= (i-1) mod q * m; nylinie;
R:= L(p+2);
for j:=-24,0 do begin
J := R shift (j-12) extract 12;
tau:= R shift j extract 12;
if tau>=2048 then tau:= tau-4096;
if j=0 then begin dk1:=k1; dk2:= k2 end;
k1:= (J+1+tau)//2; k2:= (J+1-tau)//2;
write(res,<<ddd>,J,k1,k2,<: :>);
if savesort then write(save,<<ddd>,J,k1,k2)
end;
R:= L(p+3)/(Q*Smax);
write(res,<<_ddd ddd.dd>, L(p+1),<<__d.dddd>,R);
if savesort then begin
dk1:= abs(dk1-k1); dk2:= abs(dk2-k2);
dk1:= if dk1//2*2=dk1 then 0 else 1;
dk2:= if dk2//2*2=dk2 then 0 else 1;
j:= if dk1=0 and dk2=1 then 1 else
if dk1=1 and dk2=0 then 3 else 2;
write(save,<<dd>,j,<<_ddddd>,R*'4,<:<10>:>)
end;
if quadrupol then begin
R:= L(p+4); max:= 32768; write(res,<: :>);
for j:=-32 step 16 until 0 do begin
k:= R shift j extract 16;
write(res,<<-ddd.ddd>,
(if k<max then k else k-max-max)*0.001)
end
end quadrupol
end i;
write(res,nl,2,<:Partition func., sum and approx.::>,
<< d.ddd'd>,Qr,Qra,nl,1,<:Intensity * :>,<<d'-dd>,Smax,
<: = Integrated Int.(cm**2 MHz) per molecule.
NB: The greater of the two estimates of Q used.:>);
if savesort then begin
write(save,<:-1<10><25>:>); close(save,true)
end end sorter;
write(res,nl,2,<:Total time, cpu:>,<<dd.ddd>,
(systime(1,starttime,time)-cpu)/60,<: real: :>,time/60);
if sorter then monitor(48,L,0,Ltail) else begin
getposition(L,i,j); Ltail(1):= j+1;
monitor(44,L,0,Ltail); close(L,true) end;
stop:
write(res,<:<10>:>,<:<12>:>,<:<25>:>); close(res,closeres)
end
▶EOF◀