DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦16a8d601d⟧ TextFile

    Length: 27648 (0x6c00)
    Types: TextFile
    Names: »algrotfrekv«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦7e928b248⟧ »algbib« 
            └─⟦this⟧ 

TextFile

;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◀