______________________________________________________________

Aufgabe 11.1
___________
Quelltext:

MODULE Matrix;
IMPORT IO, Thread;

(*-------------------------------------------------------------------*)
(* Prozedur Init, uebernimmt Matrix: a, keine Rueckgabewerte, erzeugt*)
(* symmetrische Matrix, Elemente erhalten jew. Summe aus Zeilen- und *)
(* Spaltenindex.                                                     *)
(*-------------------------------------------------------------------*)

PROCEDURE Init(VAR a : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   a[i,j]:= i+j;

  END;

 END;

END Init;

(*-------------------------------------------------------------------*)
(* Prozedur Put, liest Matrix: a, keine Rueckgabewerte, gibt Elemente*)
(* durch Tabulatoren getrennt aus.                                   *)
(*-------------------------------------------------------------------*)

PROCEDURE Put(READONLY a : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   IO.PutInt(a[i,j]);
   IO.Put("\t");

  END;

   IO.Put("\n");

 END;
END Put;

(*-------------------------------------------------------------------*)
(* Prozedur Add, liest Matritzen: a,b als Werte, uebernimmt Matrix c,*)
(* keine Rueckgabewerte, formt um: c in Summe von a und b.           *)
(*-------------------------------------------------------------------*)

PROCEDURE Add(READONLY a,b : T; VAR c : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   c[i,j]:= a[i,j]+b[i,j];

  END;

 END;
END Add;

(*-------------------------------------------------------------------*)
(* Prozedur ScalarProd, liest Matrix: a als Wert, liest Argument: b, *)
(* uebernimmt Matrix c, keine Rueckgabewerte, formt um: c in Produkt *)
(* der Elemente aus a multipliziert b                                *)
(*-------------------------------------------------------------------*)

PROCEDURE ScalarProd(READONLY a: T;READONLY b : INTEGER; VAR c : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   c[i,j]:= a[i,j]*b;

  END;

 END;

END ScalarProd;

(*-------------------------------------------------------------------*)
(* Prozedur MultPar, liest Matrizen x,y, liefert MatProd in c        *)
(* zurueck. Unterteilt dazu in 4 Untermatrizen und ruft damit Mult   *)
(* in 3 zusaetzlichen Kontrollfaeden auf.                            *)
(*-------------------------------------------------------------------*)

PROCEDURE MultPar(READONLY x,y : T; VAR c : T) =

VAR teins, tzwei, tdrei : Thread.T;
VAR ceins := NEW(Closure);
VAR czwei := NEW(Closure);
VAR cdrei := NEW(Closure);
VAR cvier := NEW(Closure);

BEGIN

(*X,Y [1,1]*)
FOR j:= 1 TO n DIV 2 DO
 FOR i:=1 TO n DIV 2 DO
  ceins.xa[i,j]:=x[i,j];
  ceins.ya[i,j]:=y[i,j];
  czwei.xa[i,j]:=x[i,j];
  cdrei.ya[i,j]:=y[i,j];
 END;
END;

(*X,Y [2,1]*)
FOR j:= 1 TO n DIV 2 DO
 FOR i:= n DIV 2 +1 TO n DO
  ceins.yb[i,j]:=y[i,j];
  cdrei.xa[i,j]:=x[i,j];
  cdrei.yb[i,j]:=y[i,j];
  cvier.xa[i,j]:=x[i,j];
 END;
END;

(*X,Y [1,2]*)
FOR j:= n DIV 2 +1 TO n DO
 FOR i:= 1 TO n DIV 2 DO
  ceins.xb[i,j]:=x[i,j];
  czwei.xb[i,j]:=x[i,j];
  czwei.ya[i,j]:=y[i,j];
  cvier.ya[i,j]:=y[i,j];
 END;
END;

(*X,Y [2,2]*)
FOR j:= n DIV 2 +1 TO n DO
 FOR i:=n DIV 2 +1 TO n DO
  czwei.yb[i,j]:=y[i,j];
  cdrei.xb[i,j]:=x[i,j];
  cvier.xb[i,j]:=x[i,j];
  cvier.yb[i,j]:=y[i,j];
 END;
END;

teins:= Thread.Fork(ceins);
tzwei:= Thread.Fork(czwei);
tdrei:= Thread.Fork(cdrei);
EVAL Mult(cvier);
EVAL Thread.Join(teins);
EVAL Thread.Join(tzwei);
EVAL Thread.Join(tdrei);

(*Z [1,1]*)
FOR j:= 1 TO n DIV 2 DO
 FOR i:=1 TO n DIV 2 DO
  c[i,j]:=ceins.zb[i,j];
 END;
END;

(*Z [2,1]*)
FOR j:= 1 TO n DIV 2 DO
 FOR i:=n DIV 2+1 TO n DO
  c[i,j]:=cdrei.zb[i,j];
 END;
END;

(*Z [1,2]*)
FOR j:= n DIV 2 +1 TO n DO
 FOR i:=1 TO n DIV 2 DO
  c[i,j]:=czwei.zb[i,j];
 END;
END;

(*Z [2,2]*)
FOR j:= n DIV 2+1 TO n DO
 FOR i:=n DIV 2+1 TO n DO
  c[i,j]:=cvier.zb[i,j];
 END;
END;

END MultPar;

(*-------------------------------------------------------------------*)
(* Prozedur Mult, liest Matrizen aus Closure, berechnet MatProd aus  *)
(* Za:= Xa*Ya und Zb:= Xb*Yb, sowie MatAdd aus Z:= Za+Zb .           *)
(*-------------------------------------------------------------------*)

PROCEDURE Mult(close : Closure) : REFANY =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

    FOR k:=1 TO n DO

      IF k=1 THEN close.za[i,j]:=0 END;

      INC(close.za[i,j],close.xa[i,k]*close.ya[k,j]);

    END;

  END;

 END;

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

    FOR k:=1 TO n DO

      IF k=1 THEN close.zb[i,j]:=0 END;

      INC(close.zb[i,j],close.xb[i,k]*close.yb[k,j]);

    END;

  END;

 END;

Add(close.za,close.zb,close.zb);

RETURN NIL

END Mult;

BEGIN

END Matrix.

Testlauf:

n:= 6

Testausgabe 1:

139     166     193     220     247     274
166     199     232     265     298     331
193     232     271     310     349     388
220     265     310     355     400     445
247     298     349     400     451     502
274     331     388     445     502     559
Ist die obere Ausgabe auch ordentlich formatiert?

Testausgabe 2:

0       0       0       0       0       0
0       0       0       0       0       0
0       0       0       0       0       0
0       0       0       0       0       0
0       0       0       0       0       0
0       0       0       0       0       0

n:= 10

Testausgabe 1:

505     570     635     700     765     830     895     960     1025    1090
570     645     720     795     870     945     1020    1095    1170    1245
635     720     805     890     975     1060    1145    1230    1315    1400
700     795     890     985     1080    1175    1270    1365    1460    1555
765     870     975     1080    1185    1290    1395    1500    1605    1710
830     945     1060    1175    1290    1405    1520    1635    1750    1865
895     1020    1145    1270    1395    1520    1645    1770    1895    2020
960     1095    1230    1365    1500    1635    1770    1905    2040    2175
1025    1170    1315    1460    1605    1750    1895    2040    2185    2330
1090    1245    1400    1555    1710    1865    2020    2175    2330    2485
Ist die obere Ausgabe auch ordentlich formatiert?

Testausgabe 2:

0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0

n:= 20

Testausgabe 1:

3310    3540    3770    4000    4230    4460    4690    4920    5150    5380
5610    5840    6070    6300    6530    6760    6997    220     7450    7680
3540    3790    4040    4290    4540    4790    5040    5290    5540    5790
6040    6290    6540    6790    7040    7290    7547    790     8040    8290
3770    4040    4310    4580    4850    5120    5390    5660    5930    6200
6470    6740    7010    7280    7550    7820    8098    360     8630    8900
4000    4290    4580    4870    5160    5450    5740    6030    6320    6610
6900    7190    7480    7770    8060    8350    8648    930     9220    9510
4230    4540    4850    5160    5470    5780    6090    6400    6710    7020
7330    7640    7950    8260    8570    8880    9199    500     9810    10120
4460    4790    5120    5450    5780    6110    6440    6770    7100    7430
7760    8090    8420    8750    9080    9410    9741    0070    10400   10730
4690    5040    5390    5740    6090    6440    6790    7140    7490    7840
8190    8540    8890    9240    9590    9940    1029    10640   10990   11340
4920    5290    5660    6030    6400    6770    7140    7510    7880    8250
8620    8990    9360    9730    10100   10470   10840   11210   11580   11950
5150    5540    5930    6320    6710    7100    7490    7880    8270    8660
9050    9440    9830    10220   10610   11000   11390   11780   12170   12560
5380    5790    6200    6610    7020    7430    7840    8250    8660    9070
9480    9890    10300   10710   11120   11530   11940   12350   12760   13170
5610    6040    6470    6900    7330    7760    8190    8620    9050    9480
9910    10340   10770   11200   11630   12060   12490   12920   13350   13780
5840    6290    6740    7190    7640    8090    8540    8990    9440    9890
10340   10790   11240   11690   12140   12590   13040   13490   13940   14390
6070    6540    7010    7480    7950    8420    8890    9360    9830    10300
10770   11240   11710   12180   12650   13120   13590   14060   14530   15000
6300    6790    7280    7770    8260    8750    9240    9730    10220   10710
11200   11690   12180   12670   13160   13650   14140   14630   15120   15610
6530    7040    7550    8060    8570    9080    9590    10100   10610   11120
11630   12140   12650   13160   13670   14180   14690   15200   15710   16220
6760    7290    7820    8350    8880    9410    9940    10470   11000   11530
12060   12590   13120   13650   14180   14710   15240   15770   16300   16830
6990    7540    8090    8640    9190    9740    10290   10840   11390   11940
12490   13040   13590   14140   14690   15240   15790   16340   16890   17440
7220    7790    8360    8930    9500    10070   10640   11210   11780   12350
12920   13490   14060   14630   15200   15770   16340   16910   17480   18050
7450    8040    8630    9220    9810    10400   10990   11580   12170   12760
13350   13940   14530   15120   15710   16300   16890   17480   18070   18660
7680    8290    8900    9510    10120   10730   11340   11950   12560   13170
13780   14390   15000   15610   16220   16830   17440   18050   18660   19270
Ist die obere Ausgabe auch ordentlich formatiert?

Testausgabe 2:

0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0
0       0       0       0       0       0       0       0       0       0    0

Testlaufende.