File : n_balls.adb
with Reps, Reps.Ops, Messages, Lin, Lin.IO.Vinci;
use Reps, Reps.Ops, Messages, Lin, Lin.IO.Vinci;
with Lass;
procedure N_Balls is -- computing volume of N independent balls, also writes .ine file
NumEqu: constant Integer := 12;
NumVar: constant Integer := 3;
NBalls: Integer;
V: Rep;
A: RMatPtr := new RMat(1 .. NumEqu, 0 .. NumVar);
begin
Verbose := 2;
SetZero(A.all);
A( 1,0) := Half; A( 1,1) :=-Half; A( 1,2) := S3/Two; A( 1,3) := Zero;
A( 2,0) := Half; A( 2,1) := Half; A( 2,2) := S3/Two; A( 2,3) := Zero;
A( 3,0) := Half; A( 3,1) := Zero; A( 3,2) := S3/Three; A( 3,3) := S6/Three;
A( 4,0) := Half; A( 4,1) := Zero; A( 4,2) := S3/Three; A( 4,3) :=-S6/Three;
A( 5,0) := Half; A( 5,1) :=-One; A( 5,2) := Zero; A( 5,3) := Zero;
A( 6,0) := Half; A( 6,1) := One; A( 6,2) := Zero; A( 6,3) := Zero;
A( 7,0) := Half; A( 7,1) :=-Half; A( 7,2) :=-S3/Six; A( 7,3) := S6/Three;
A( 8,0) := Half; A( 8,1) :=-Half; A( 8,2) :=-S3/Six; A( 8,3) :=-S6/Three;
A( 9,0) := Half; A( 9,1) := Half; A( 9,2) :=-S3/Six; A( 9,3) := S6/Three;
A(10,0) := Half; A(10,1) := Half; A(10,2) :=-S3/Six; A(10,3) :=-S6/Three;
A(11,0) := Half; A(11,1) :=-Half; A(11,2) :=-S3/Two; A(11,3) := Zero;
A(12,0) := Half; A(12,1) := Half; A(12,2) :=-S3/Two; A(12,3) := Zero;
NBalls := PromptInteger("Number of balls: ");
declare
NumEqu2: constant Integer := NBalls*NumEqu;
NumVar2: constant Integer := NBalls*NumVar;
package Lasserre is new Lass (NumEqu => NumEqu2, NumVar => NumVar2);
use Lasserre;
B: RMatPtr := new RMat(1 .. NumEqu2, 0 .. NumVar2);
begin
MinDoTrans := 5; -- min dimension for translations
MinVolSave := 4; -- min dimension for considering saved volume
MaxVolSave := 99; -- max dimension for using saved volume
MinVolConv := 4; -- min dimension for converting saved volume
SetZero(B.all);
for N in 0 .. NBalls-1 loop
for I in 1 .. NumEqu loop
B(N*NumEqu+I,0) := A(I,0);
for J in 1 .. NumVar loop
B(N*NumEqu+I,N*NumVar+J) := A(I,J);
end loop;
end loop;
end loop;
Free(A);
WriteVinci("n_balls.ine",B);
Vol(B,V);
Show("Volume of balls is ",V,17,4);
end;
end N_Balls;