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

⟦04cb84faa⟧ TextFile

    Length: 12288 (0x3000)
    Types: TextFile
    Names: »chstdemotx«

Derivation

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

TextFile

chem=set 200
scope day chem
chem=algol list.no 
program for demonstration of chemical kinetics 
Calahans method for stiff differential equations
version.5
fp: nmol.20 npl.30 blistx.false blistf.false bplot.true
    test1.false test2.false testx.false testh.false testfj.false
     plotter.<:tek4006c:>
26 01 83 11 00 00
begin
     integer ntext,nmol,npl,ns,s;
     boolean blistx,blistf,bplot,test1,test2,testx,testh,testfj;
     real array PLOTTER(1:2);
     readifp(<:ntext:>,ntext,100);
     readifp(<:nmol:>,nmol,20);
     readifp(<:npl:>,npl,30);
     readbfp(<:blistx:>,blistx,false);
     readbfp(<:blistf:>,blistf,false);
     readbfp(<:bplot:>,bplot,true);
     readbfp(<:testx:>,testx,false);
     readbfp(<:testh:>,testh,false);
     readbfp(<:test1:>,test1,false);
     readbfp(<:test2:>,test2,false);
     readbfp(<:testfj:>,testfj,false);
     readsfp(<:plotter:>,PLOTTER,<:tek4006c:>);
     s:= 1;
     setplotname(string PLOTTER(increase(s)),0);
begin
     integer mi,mn,ri,rn,vki,n,r;
     integer array V,K(1:ntext),MOL,REA(1:nmol);

procedure writevkmr;
begin
     integer i;
     write(out,<:<10>    V   ,   K:>);
     for i:= 1 step 1 until vki do
     write(out,<:<10>:>,<< ddddddd>,V(i),<<  d>,K(i));
     write(out,<:<10>MOL:>);
     for i:= 1 step 1 until mn do
     write(out,<< d>,MOL(i));
     write(out,<:<10>REA:>);
     for i:= 1 step 1 until rn do
     write(out,<< d>,REA(i));
end;

procedure syntaxerror;
begin write(out,<:<10>syntax error:>);
     if test1 then write(out,
        <:<10>vki = :>,vki,<: mn = :>,mn,<: rn = :>,rn);
     if test1 then writevkmr;
     alarm(<:<10>error:>,0);
end;

integer procedure searchmol(a);
integer a;
begin integer i,mi;
     boolean found,comp;
     found:= false; searchmol:= 0;
     mi:= 0;
     for mi:= mi+1 while MOL(mi)>0 and -,found do
     begin
        comp:= true;
        for i:= 0,i+1 while K(a+i)=6 and K(MOL(mi)+i)=6 do
        if V(a+i)<>V(MOL(mi)+i) then comp:= false;
        if comp then
        begin found:= true; searchmol:= mi end;
     end
end;

begin
     integer i;
     integer array alfabet(0:255);
     for i:= 0 step 1 until 9, 11 step 1 until 24,
        26 step 1 until 42, 44, 46, 47, 58, 59, 60, 61,
        63, 64, 94, 95, 96, 126 step 1 until 255 do
        alfabet(i):= i;
     for i:= 48 step 1 until 57 do alfabet(i):= 2 shift 12+i;
     for i:= 65 step 1 until 93, 97 step 1 until 125 do
        alfabet(i):= 6 shift 12 + i;
     for i:= 10, 43, 45, 62 do alfabet(i):= 7 shift 12 + i;
     alfabet(25):= 8 shift 12 + 25;
     intable(alfabet);
     write(out,<:reactions<10>:>); setposition(out,0,0);
     i:= readall(in,V,K,1);
     if i<0 then alarm(<:textbuf size:>,i);
     unstackcuri;
     intable(0);
end;
     mn:= rn:= 1; vki:= 1;
     cleararray(MOL); cleararray(REA);
     REA(1):= 1;
     if -,(V(1)=10 or K(1)=2 or K(1)=6 or V(1)=45) then
     syntaxerror;
     for vki:= vki while -,K(vki)=8 do
     if K(vki)=2 and K(vki+1)=6 then
     vki:= vki+1 else
     if K(vki)=6 then
     begin
        if searchmol(vki)=0 then
        begin MOL(mn):= vki; mn:= mn+1 end;
        for vki:= vki+1 while K(vki)=6 do;
        if V(vki)=62 and K(vki)<>7 and K(vki)<>8 then
        syntaxerror;
     end else
     if V(vki)=10 and V(vki+1)=10 then vki:= vki+1 else
     if V(vki)=10 and
        (K(vki+1)=2 or K(vki+1)=6 or K(vki+1)=8 or V(vki+1)=45) then
     begin vki:= vki+1; REA(rn):= vki end else
     if V(vki)=43 and (K(vki+1)=2 or K(vki+1)=6) then
        vki:= vki+1 else
     if V(vki)=45 and V(vki+1)=62 and
        (K(vki+2)=2 or K(vki+2)=6 
        or V(vki+2)=10 or K(vki+2)=8) then
     begin rn:= rn+1; vki:= vki+2; REA(rn):= vki end else
     syntaxerror;
     n:= mn:= mn-1; r:= rn:= rn-1;

begin
     integer i,rho,ny,ny1,ny2,ni,nm,jpl,mfac;
     real xm,g,tt,hh,cpu,time;
     boolean bfirst,reactants;
     integer array N,R(1:n,1:r),LIST(1:n);
     real array G,RK(1:r),XX,C(1:n),H(1:r,1:n),J(1:n,1:n),
                PLT(0:npl),PLX(1:n,0:npl);
     real array field f;

procedure writern;
begin write(out,<:<10><10>R:>);
     for mi:= 1 step 1 until mn do
     begin write(out,<:<10>:>);
        for ri:= 1 step 1 until rn do
        write(out,<< d>,R(mi,ri)) end;
     write(out,<:<10><10>N:>);
     for mi:= 1 step 1 until mn do
     begin write(out,<:<10>:>);
        for ri:= 1 step 1 until rn do
        write(out,<< d>,N(mi,ri)) end;
end;

procedure outpl;
begin integer i,j;
     if bplot then
     begin
     for i:= 1 step 1 until n do
     begin plotmove(PLT(0),PLX(i,0)); pendown;
        for j:= 1 step 1 until jpl-1 do
        plotmove(PLT(j),PLX(i,j));
        penup;
     end;
     plotend;
     PLT(0):= PLT(npl);
     for i:= 1 step 1 until n do
     PLX(i,0):= PLX(i,npl);
     end bplot;
     jpl:= 1;
end;

procedure xin(X,tb,dt,te,h,epsr,epsa);
real tb,dt,te,h,epsr,epsa;
real array X;
begin

procedure plotnew;
begin
     xm:= readr(<:maximal concentration in plot:>);
     plotform(0,15,10);
     scalexcoor(0,te,2,15-0.5);
     scaleycoor(0,xm,1,10-2.5);
     plotframe(0.0,0.0);
     plotend;
end;

procedure parameters;
begin
     dt:= readr(<:time interval:>);
     te:= readr(<:maximal time:>);
     epsr:= readr(<:relative accuracy:>);
     epsa:= readr(<:absolute accuracy:>);
end;

procedure listing;
begin write(out,<:<10>listing af species<10><10>:>);
     for mi:= 1 step 1 until mn do
     begin f:= 2*MOL(mi)-2; mfac:= 1;
        write(out,string V.f(increase(mfac)),<: = :>);
        setposition(out,0,0); read(in,LIST(mi)); end;
end;

procedure concentrations;
begin write(out,<:<10>start concentrations<10><10>:>);
      for mi:= 1 step 1 until mn do
         begin f:= 2*MOL(mi)-2; mfac:= 1;
     write(out,string V.f(increase(mfac)),<: = :>);
     setposition(out,0,0); read(in,C(mi));
     if C(mi)<0 then goto lb; end;
end;

procedure rateconstants;
begin write(out,<:<10>rateconstants<10><10>:>);
     for ri:= 1 step 1 until rn do
     begin
        write(out,<<dd>,ri,<::  :>);
        setposition(out,0,0); read(in,RK(ri));
        if RK(ri)<0 then goto lb; end;
end;
     if bfirst then
     begin rateconstants; concentrations;
        bfirst:= false;
        if blistx then listing; parameters;
        for ny:= 1 step 1 until n do X(ny):= C(ny);
        PLT(0):= tb:= 0; jpl:= 1;
        for ny:= 1 step 1 until n do PLX(ny,0):= X(ny);
        h:= dt/2;
        if bplot then plotnew; end
     else begin
        if readb(<:continue:>) then
        begin tb:= tt; h:= hh;
           for ny:= 1 step 1 until n do X(ny):= XX(ny)
        end
        else begin if readb(<:new start concentrations:>) then
                 concentrations;
           for ny:= 1 step 1 until n do X(ny):= C(ny);
           PLT(0):= tb:= 0; jpl:= 1;
           for ny:= 1 step 1 until n do PLX(ny,0):= X(ny);
        end continue;
        if readb(<:new rateconstants:>) then rateconstants;
        if blistx then
        begin if readb(<:new listing of species:>) then listing end;
        parameters;
        if bplot then begin if readb(<:new plot:>) then plotnew end;
        h:= dt/2;
     end bfirst;
     cpu:= systime(1,0,time);
end xin;

procedure xout(X,t,h,s);
integer s;
real t,h;
real array X;
begin

procedure listf;
begin
     integer i,j;
     boolean bf;
     real array F(1:n),J(1:1);
     fjac(false,X,t,F,J);
     bf:= true; j:= 0;
     for i:= 1 step 1 until n do
     if (LIST(i)=1 and s=0) or (LIST(i)=2 and abs(s)=i) then
     begin if bf then write(out,"nl",1,<:F =:>,"sp",8);
        if j=5 or j=10 then write(out,"nl",1,"sp",11);
        j:= j+1; bf:= false; write(out,<<  -d.dddd'-dd>,F(i));
     end;
     if j>0 then setposition(out,0,0);
end;

procedure writefjac(bjac);
boolean bjac;
begin real array F(1:n),J(1:n,1:n);
     fjac(bjac,X,t,F,J);
     write(out,<:<10>F<10>:>);
     for ny:= 1 step 1 until n do
     begin write(out,<<  -d.dddd'-dd>,F(ny));
        if ny=5 or ny=10 then write(out,"nl",1);
     end;
     if bjac then
     begin write(out,<:<10>J<10>:>);
        for ny1:= 1 step 1 until n do
        begin
           for ny2:= 1 step 1 until n do
           begin write(out,<<  -d.dddd'-dd>,J(ny1,ny2));
              if ny2=5 or ny2=10 then write(out,"nl",1);
           end;
           write(out,"nl",2);
        end
     end
end writefjac;

procedure listx;
begin integer i,j;
     boolean btime;
     btime:= true; j:= 0;
     for i:= 1 step 1 until n do
     if (LIST(i)=1 and s=0) or (LIST(i)=2 and abs(s)=i) then
     begin if btime then write(out,"nl",1,<<d.ddd'-dd>,t,"sp",2);
        if j=5 or j=10 then write(out,"nl",1,"sp",11);
        j:= j+1; btime:= false; write(out,<<  -d.dddd'-dd>,X(i));
     end;
     if j>0 then setposition(out,0,0);
end listx;

procedure writex;
begin integer i;
     write(out,<:<10>:>,<<-d>,s,"sp",1,<<d.ddd'-dd>,t,"sp",2);
     for i:= 1 step 1 until n do
     begin if i=5 or i=9 then write(out,"nl",1,"sp",14);
     write(out,<<   d.dddd'-dd>,X(i));
     end; setposition(out,0,0);
end;

     PLT(jpl):= tt:= t; hh:= h;
     for ny:= 1 step 1 until n do PLX(ny,jpl):= XX(ny):= X(ny);
     jpl:= jpl+1;
     if jpl>npl then outpl;
     if blistx then listx;
     if blistf then listf;
     if testx then writex;
     if testh then
     begin write(out,<:<10>h = :>,<<d.d'-dd>,hh); setposition(out,0,0) end;
     if testfj and s=0 then writefjac(true);
     if opkey then goto le;
end xout;

procedure fjac(bjac,X,t,F,J);
boolean bjac;
real t;
real array X,F,J;
begin
     for rho:= 1 step 1 until r do
     begin G(rho):= RK(rho);
        for ny:= 1 step 1 until n do
        if R(ny,rho)=0 then else
        if R(ny,rho)=1 then G(rho):= G(rho)*X(ny) else
        if R(ny,rho)=2 then G(rho):= G(rho)*X(ny)*X(ny) else
        G(rho):= G(rho)*X(ny)**R(ny,rho);
        if bjac then
        for ny2:= 1 step 1 until n do
        if R(ny2,rho)=0 then H(rho,ny2):= 0
        else if X(ny2)<>0 then
           H(rho,ny2):= G(rho)*R(ny2,rho)/X(ny2)
        else if R(ny2,rho)>1 then H(rho,ny2):= 0
        else begin g:= RK(rho);
           for ny:= 1 step 1 until ny2-1,
                ny2+1 step 1 until n do
           if R(ny,rho)=0 then
           else if R(ny,rho)=1 then g:= g*X(ny)
           else if R(ny,rho)=2 then g:= g*X(ny)*X(ny)
           else g:= g*X(ny)**R(ny,rho);
           H(rho,ny2):= g;
        end
     end;
     for ny:= 1 step 1 until n do
     begin F(ny):= 0;
        for rho:= 1 step 1 until r do
        F(ny):= F(ny)+N(ny,rho)*G(rho) end;
     if bjac then
     for ny1:= 1 step 1 until n do
     for ny2:= 1 step 1 until n do
     begin J(ny1,ny2):= 0;
        for rho:= 1 step 1 until r do
        J(ny1,ny2):= J(ny1,ny2)+N(ny1,rho)*H(rho,ny2);
     end;
end;


     cleararray(N); cleararray(R);
     for ri:= 1 step 1 until rn do
     begin vki:= REA(ri); mfac:= 1; reactants:= true;
        for vki:= vki while -,(K(vki)=8 or V(vki)=10
           or(V(vki)=45 and -,reactants)) do
        if K(vki)=2 then
        begin mfac:= V(vki); vki:= vki+1 end else
        if K(vki)=6 then
        begin mi:= searchmol(vki);
           if reactants then R(mi,ri):= R(mi,ri)+mfac else
                             N(mi,ri):= N(mi,ri)+mfac;
           mfac:= 1; for vki:= vki+1 while K(vki)=6 do;
        end else
        if V(vki)=43 then vki:= vki+1 else
        if V(vki)=45 then
        begin reactants:= false; vki:= vki+2 end else
        begin write(out,<:<10>programerror:>);
           writern; alarm(<:<10>error:>,0); end;
     end;
     if test1 then begin writevkmr; writern end;
     for mi:= 1 step 1 until mn do
     for ri:= 1 step 1 until rn do
     N(mi,ri):= N(mi,ri)-R(mi,ri);

     bfirst:= true;
     if test2 then writern;
  lb:chstiffpp(n,fjac,xin,xout);
  le:cpu:= systime(1,time,time)-cpu;
     write(out,<<dddd.dd>,<:<10><10>cpu = :>,cpu,<:  time = :>,time);
     if bplot then begin outpl; plotend end;
     if -,readb(<:end:>) then goto lb;
lend:if bplot then plotclose;
end;
end;
end
▶EOF◀