|
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: »extxbmatrix«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦58ca399f1⟧ »extbib« └─⟦this⟧
\f external real procedure xbmatrix(Na,BL,S,Rnorm,plan,res); value BL,Rnorm; integer Na,BL; boolean Rnorm,plan; integer array S; zone res; begin integer i, j, k, l, m, n, type, p, q, N3, ibl; boolean sp, nl; real tdef; integer array tail(1:10), A(1:50); array H(1:1); zone X((abs Na*3+127)//128*128,1,stderror), B(128*2,2,stderror); real procedure vector(e,i,j); value i,j; integer i,j; array e; begin real l,r; integer k,Ni,Nj; r:= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; for k:=1 step 1 until 3 do begin e(k):= l:= X(Nj+k)-X(Ni+k); r:= r+ l*l end; r:= vector:= 1/sqrt(r); for k:= 1 step 1 until 3 do e(k):= e(k)*r end vector; real procedure dot(a,b); array a,b; begin real d; integer k; d:= 0; for k:=1 step 1 until 3 do d:= d+ a(k)*b(k); dot:= d end dot; real procedure cross(a,b,c); array a,b,c; begin real r; integer k; c(1):= a(2)*b(3) - a(3)*b(2); c(2):= a(3)*b(1) - a(1)*b(3); c(3):= a(1)*b(2) - a(2)*b(1); r:= 0; for k:=1 step 1 until 3 do r:= r+ c(k)**2; cross:= r end cross; comment the cartesian coordinates of the atoms are read in; N3:= abs Na*3; plan:= true; sp:= false add 32; nl:= false add 10; open(X,4,<:xtrack:>,0); tail(1):= (N3+127)//128*2; monitor(40,X,0,tail); l:= 0; outrec(X,N3); for i:=1 step 1 until Na do begin for j:=1 step 1 until 3 do begin read(in,X(l+j)); repeatchar(in); readchar(in,k); if k=10 and j<3 then begin for j:=j+1 step 1 until 3 do X(l+j):= 0 end end; plan:= plan and X(l+3) = 0; l:= l+3 end i; if Na<0 then begin array Xa(1:N3); Na:= -Na; write(res,<: STRUCTURAL PARAMETERS::>,nl,1); if readstruct(res,Xa,Na) then begin tdef:= -1; close(X,true); goto alarm end; for i:=1 step 1 until N3 do begin X(i):= Xa(i); if i mod 3 = 0 then plan:= plan and X(i)=0 end; write(res,nl,2) end Na<0; write(res,<: CARTESIAN COORDINATES: Atom no. x y:>); if -,plan then write(res,<: z:>); write(res,nl,1); l:= 0; n:= if plan then 2 else 3; for i:=1 step 1 until Na do begin write(res,nl,1,<<dddd>,i,<: :>); for j:=1 step 1 until n do write(res,<<-ddd.dddddd>,X(l+j)); l:= l+3 end i; open(B,4,<:btrack:>,0); k:= 0; for ibl:=1 step 1 until BL do k:= k + (S(ibl,1)*N3+127)//128; tail(1):= k; monitor(40,B,0,tail); close(B,true); write(res,nl,3,<: INTERNAL COORDINATES: type no. type subno. specifications :>); open(B,4,<:bitrack:>,0); tail(1):= N3*2; monitor(40,B,0,tail); type:= 0; A(1):= 1; read(in,p); comment the types of internal coordinates are read in and the B-matrix elements are calculated; newtype: readstring(in,H,1); tdef:= H(1); type:= type+1; A(type+1):= A(type)+p; if tdef = real <:comb:> then begin outrec(B,128); for j:=1,j+1 while k<>41 do begin read(in,B(j)); repread: repeatchar(in); readchar(in,k); if k=47 then begin read(in,tdef); B(j):= B(j)/tdef; goto repread end; if k=115 then begin B(j):= sign(B(j))*sqrt(abs B(j)); goto repread end end; setposition(B,0,A(type+1)-1); A(type):= -A(type); tdef:= 0 end; if tdef = real <:str:> then begin array e(1:3); integer Ni,Nj; real r; write(res,nl,1,<<dddd>,type,<: str:>); for m:=1 step 1 until p do begin read(in,i,j); outrec(B,128); write(res,sp,if m=1 then 4 else 20, <<dddd>,m,<: :>,i,j,nl,1); for q:=1 step 1 until N3 do B(q):= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; r:= vector(e,i,j); for q:=1 step 1 until 3 do begin if Rnorm then e(q):= e(q)*r; B(Ni+q):= -e(q); B(Nj+q):= e(q) end end; tdef:= 0 end; if tdef = real <:bend:> then begin integer Ni,Nj,Nk; real cos,ri,rk,a,b; array ei,ek(1:3); write(res,nl,1,<<dddd>,type,<: bend:>); for m:=1 step 1 until p do begin read(in,i,j,k); outrec(B,128); write(res,sp,if m=1 then 4 else 20, <<dddd>,m,<: :>,i,j,k,nl,1); for q:=1 step 1 until N3 do B(q):= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; Nk:= (k-1)*3; ri:= vector(ei,j,i); rk:= vector(ek,j,k); cos:= dot(ei,ek); a:= 1/sqrt(1-cos*cos); ri:= ri*a; rk:= rk*a; for q:=1 step 1 until 3 do begin B(Ni+q):= a:= (ei(q)*cos- ek(q))*ri; B(Nk+q):= b:= (ek(q)*cos- ei(q))*rk; B(Nj+q):= -a-b end end; tdef:= 0 end; if tdef = real <:outo:> then begin integer Ni,Nj,Nk,Nl; real ri,rj,rl,sin,csc,cot,a,b,c; array ei,ej,el,cij,cjl,cli(1:3); write(res,nl,1,<<dddd>,type,<: outo:>); for m:=1 step 1 until p do begin read(in,i,j,k,l); outrec(B,128); write(res,sp,if m=1 then 4 else 20, <<dddd>,m,<: :>,i,j,k,l,nl,1); for q:=1 step 1 until N3 do B(q):= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; Nk:= (k-1)*3; Nl:= (l-1)*3; ri:= vector(ei,k,i); rj:= vector(ej,k,j); rl:= vector(el,k,l); csc:= 1/sqrt(cross(ei,ej,cij)); cross(ej,el,cjl); cross(el,ei,cli); cot:= dot(ei,ej)*csc; sin:= dot(cij,el)*csc; a:= 1/sqrt(1-sin*sin); ri:= ri*a*csc; rj:= rj*a*csc; rl:= rl*a; for q:=1 step 1 until 3 do begin B(Ni+q):= a:= (cjl(q)-(ei(q)*csc-ej(q)*cot)*sin)*ri; B(Nj+q):= b:= (cli(q)-(ej(q)*csc-ei(q)*cot)*sin)*rj; B(Nl+q):= c:= (cij(q)*csc-el(q)*sin)*rl; B(Nk+q):= -a-b-c end end; tdef:= 0 end; if tdef = real <:lin:> then begin integer Ni,Nj,Nk; real ri,rk,a,b; array ei,v(1:3); write(res,nl,1,<<dddd>,type,<: lin:>); for m:=1 step 1 until p do begin read(in,i,j,k,v); outrec(B,128); write(res,sp,if m=1 then 4 else 20, <<dddd>,m,<: :>,i,j,k); for q:= 1 step 1 until 3 do write(res,<<-dd.dd>,v(q)); write(res,nl,1); for q:=1 step 1 until N3 do B(q):= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; Nk:= (k-1)*3; rk:= vector(ei,j,k); ri:= vector(ei,j,i); for q:=1 step 1 until 3 do v(q):= v(q)-X(Nj+q); a:= dot(v,ei); for q:=1 step 1 until 3 do v(q):= v(q)-ei(q)*a; a:= 1/sqrt(dot(v,v)); ri:= ri*a; rk:= rk*a; for q:=1 step 1 until 3 do begin B(Ni+q):= a:= v(q)*ri; B(Nk+q):= b:= v(q)*rk; B(Nj+q):= -a-b end end; tdef:= 0 end; if tdef = real <:tors:> then begin integer Ni,Nj,Nk,Nl; real r,ri,rl,cscj,csck,cosj,cosk; array ei,el,ejk,cj,ck(1:3); write(res,nl,1,<<dddd>,type,<: tors:>); for m:=1 step 1 until p do begin read(in,i,j,k,l); outrec(B,128); write(res,sp,if m=1 then 4 else 20, <<dddd>,m,<: :>,i,j,k,l,nl,1); for q:=1 step 1 until N3 do B(q):= 0; Ni:= (i-1)*3; Nj:= (j-1)*3; Nk:= (k-1)*3; Nl:= (l-1)*3; ri:= vector(ei,j,i); rl:= vector(el,k,l); r:= vector(ejk,j,k); cscj:= 1/cross(ei,ejk,cj); csck:= 1/cross(ejk,el,ck); cosj:= dot(ei,ejk)*r*cscj; cosk:= -dot(el,ejk)*r*csck; cscj:= cscj*ri; csck:= csck*rl; for q:=1 step 1 until 3 do begin B(Ni+q):= r:= cj(q)*cscj; B(Nj+q):= -r+cj(q)*cosj-ck(q)*cosk; B(Nl+q):= r:= ck(q)*csck; B(Nk+q):= -r+ck(q)*cosk-cj(q)*cosj end end; tdef:= 0 end; comment additional types can be included here; if tdef<>0 then begin write(res,<:<10>***type :>,string tdef,<: undefined.:>); setposition(B,0,0); monitor(48,B,0,tail); close(B,true); goto alarm end; read(in,p); if p>0 then goto newtype; close(X,true); comment search for combinations starts here; for q:=1 step 1 until type do begin p:= A(q); if p<0 then begin integer t,p1; A(q):= p:= abs p; setposition(B,0,p-1); inrec(B,128); t:= B(1); write(res,nl,1,<<dddd>,q,<: comb. of type:>,t,nl,1); p1:= abs A(t+1) - A(t); p:= abs A(q+1) - p; begin array BB(1:p1,1:N3), comb(1:p*p1); for i:=p*p1 step -1 until 1 do comb(i):= B(i+1); l:= 0; setposition(B,0,A(t)-1); for i:=1 step 1 until p do begin write(res,sp,20,<<dddd>,i,sp,4); for j:=1 step 1 until p1 do begin l:= l+1; write(res,<<-ddd.dd>,comb(l)) end; write(res,nl,1) end; for i:=1 step 1 until p1 do begin inrec(B,128); for j:=1 step 1 until N3 do BB(i,j):= B(j) end; setposition(B,0,A(q)-1); l:= 0; for k:=1 step 1 until p do begin outrec(B,128); for j:=1 step 1 until N3 do begin B(j):= 0; m:= l; for i:=1 step 1 until p1 do begin m:= m+1; B(j):= B(j) + comb(m)*BB(i,j) end end j; l:= l+p1 end k end end end q; if Rnorm then write(res,<: Stretchings defined relative to bondlength.:>,nl,1); comment the U-matrix defining the symmetrycoordinates is read in, and the BS-matrix is calculated and stored on disc; m:= 0; write(res,nl,2,<: SYMMETRY COORDINATES (defined by S = U * I): Species no. type coefficients:>,nl,1); for ibl:=1 step 1 until BL do begin zone BS((S(ibl,1)*N3+127)//128*128,1,stderror); write(res,nl,1,<<dddd>,ibl); k:= 0; n:= S(ibl,1); open(BS,4,<:btrack:>,0); setposition(BS,0,m); outrec(BS,n*N3); m:= m+(n*N3+127)//128; for l:=1 step 1 until n do begin read(in,type); q:= A(type); p:= A(type+1)-q; write(res,sp,if l=1 then 7 else 11,<<dd>,l,sp,5,type,sp,3); begin real f, g; array U(1:p), BI(1:p,1:N3); setposition(B,0,q-1); g:= 0; for i:=1 step 1 until p do begin read(in,f); U(i):= f; g:= g + f*f; inrec(B,128); write(res,<< -d.d>,f); for j:=1 step 1 until N3 do BI(i,j):= B(j) end; g:= 1/sqrt(g); for i:=1 step 1 until p do U(i):= U(i)*g; for j:=1 step 1 until N3 do BS(k+j):= sum(U(i)*BI(i,j),i,1,p); k:= k+N3; write(res,nl,1) end end l; close(BS,true) end ibl; setposition(B,0,0); monitor(48,B,0,tail); close(B,true); alarm: xbmatrix:= tdef; end; end ▶EOF◀