This example works on FinSim 10_04_22 and subsequent versions.
This example inverts a simple sparse matrice of 4 million x 4 million
elements of type real, uses two norm system functions to measure it and displays all non-zero values on one line and one column.
On a single 32 bit Pentium 1.8GHz processor this example run in 225 seconds.
module top;
parameter integer size = 4000000;
real MReal1 [size-1 : 0][size-1 : 0];
real MRInv [size-1 : 0][size-1 : 0];
integer found, lin, col, idx;
integer i;
real r, max, sum;
initial begin
/* declaring sparse matrices */
$ToSparse(MReal1);
$ToSparse(MRInv);
/* initializing matrice to be inverted*/
for (i = 0; i < size/2; i++)
begin
MReal1[2*i][i] = 7.0;
end
for (i = 0; i < size; i++)
begin
MReal1[i][i] = 1.0;
end
/*inverting matrix */
MRInv = MReal1 **(-1);
lin = 4*size/10;
$display("displaying all non-zero values on line %d\n", lin);
idx = -1;
found = $SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
while (found) begin
$display("MRInv[%d][%d]=%e\n", lin, col, r);
found = $SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
end
col = 2*size/10;
$display("displaying all non-zero values on column %d\n", col);
lin = -1;
found = $SpReadNextNzElemInCol(MRInv, lin, col, r);
while (found) begin
$display("MRInv[%d][%d]=%e\n", lin, col, r);
found = $SpReadNextNzElemInCol(MRInv, lin, col, r);
end
$display("********displaying norms and distances*********\n");
max = $VpNormAbsMax(MRInv);
sum = $VpNormAbsSum(MRInv);
$display("max=%e, sum=%e\n", max, sum);
end
endmodule // top