|
a/LibDBlasM2.mod |
|
b/LibDBlasM2.mod |
|
... |
|
... |
9 |
(* Letzte Bearbeitung *)
|
9 |
(* Letzte Bearbeitung *)
|
10 |
(* *)
|
10 |
(* *)
|
11 |
(* 23.11.93, MRi: Erstellen der 1. Version *)
|
11 |
(* 23.11.93, MRi: Erstellen der 1. Version *)
|
12 |
(* Aug. 95, MRi: Erweiterung *)
|
12 |
(* Aug. 95, MRi: Erweiterung *)
|
13 |
(* 03.11.95, MRi: Durchsicht *)
|
13 |
(* 03.11.95, MRi: Durchsicht *)
|
14 |
(* 13.10.15, MRi: Ersetzen von FLOAT(#) durch VAL(FLOAT,#) *)
|
14 |
(* 13.10.15, MRi: Ersetzen von REAL8(#) durch VAL(REAL8,#) *)
|
15 |
(* 30.11.15, MRi: Erstelle der Routinen dscal,daxpy,idmax aus Linpack *)
|
15 |
(* 30.11.15, MRi: Erstelle der Routinen dscal,daxpy,idmax aus Linpack *)
|
16 |
(* Benchmark aus Beispielen von Stony Brook M2 *)
|
16 |
(* Benchmark aus Beispielen von Stony Brook M2 *)
|
17 |
(* 01.12.15, MRi: Umbenennen von BlasLib auf LibDBlas, einfuegen von *)
|
17 |
(* 01.12.15, MRi: Umbenennen von BlasLib auf LibDBlas, einfuegen von *)
|
18 |
(* dnrm2 (aus dnrm2.f) *)
|
18 |
(* dnrm2 (aus dnrm2.f) *)
|
19 |
(* 28.01.16, MRi: Umstellen von dgemv und dgemm auf "Open Array". *)
|
19 |
(* 28.01.16, MRi: Umstellen von dgemv und dgemm auf "Open Array". *)
|
|
... |
|
... |
26 |
(* 21.10.16, MRi: idamin eingefuegt *)
|
26 |
(* 21.10.16, MRi: idamin eingefuegt *)
|
27 |
(* 28.10.17, MRi: zgemm eingefuegt *)
|
27 |
(* 28.10.17, MRi: zgemm eingefuegt *)
|
28 |
(* 29.10.17, MRi: Rolle von M,N in dgemm und dgemv an zgemm angepasst *)
|
28 |
(* 29.10.17, MRi: Rolle von M,N in dgemm und dgemv an zgemm angepasst *)
|
29 |
(* 11.09.18, MRi: zgemv eingefuegt *)
|
29 |
(* 11.09.18, MRi: zgemv eingefuegt *)
|
30 |
(* 12.09.18, MRi: zswap,zcopy,zdotc,dznrm2,zscal,zaxpy,zdrot eingefuegt *)
|
30 |
(* 12.09.18, MRi: zswap,zcopy,zdotc,dznrm2,zscal,zaxpy,zdrot eingefuegt *)
|
|
|
31 |
(* 01.02.19, MRi: Abfragen in idamx,idamin korrigiert *)
|
31 |
(*------------------------------------------------------------------------*)
|
32 |
(*------------------------------------------------------------------------*)
|
32 |
(* Testroutinen *)
|
33 |
(* Testroutinen *)
|
33 |
(* *)
|
34 |
(* *)
|
34 |
(* - dgemv in TstDGEMV *)
|
35 |
(* - dgemv in TstDGEMV *)
|
35 |
(* - zgemv in TstZGEMV *)
|
36 |
(* - zgemv in TstZGEMV *)
|
|
... |
|
... |
45 |
(*------------------------------------------------------------------------*)
|
46 |
(*------------------------------------------------------------------------*)
|
46 |
|
47 |
|
47 |
(* $Id: LibDBlasM2.mod,v 1.11 2018/09/12 13:20:49 mriedl Exp mriedl $ *)
|
48 |
(* $Id: LibDBlasM2.mod,v 1.11 2018/09/12 13:20:49 mriedl Exp mriedl $ *)
|
48 |
|
49 |
|
49 |
IMPORT SYSTEM;
|
50 |
IMPORT SYSTEM;
|
50 |
FROM Deklera IMPORT FLOAT,CFLOAT; (* REAL/COMPLEX Type *)
|
|
|
51 |
FROM LongMath IMPORT sqrt;
|
51 |
FROM LongMath IMPORT sqrt;
|
52 |
FROM LongComplexMath IMPORT zero,one,conj,scalarMult;
|
52 |
FROM LongComplexMath IMPORT zero,one,conj,scalarMult;
|
53 |
IMPORT Errors;
|
53 |
IMPORT Errors;
|
54 |
FROM F77func IMPORT MAX0;
|
54 |
FROM F77func IMPORT REAL8,COMPLEX16,MAX0;
|
55 |
|
55 |
|
56 |
|
56 |
|
57 |
PROCEDURE IMax(a,b : INTEGER) : INTEGER;
|
57 |
PROCEDURE IMax(a,b : INTEGER) : INTEGER;
|
58 |
|
58 |
|
59 |
BEGIN
|
59 |
BEGIN
|
60 |
IF (a > b) THEN RETURN a; ELSE RETURN b; END;
|
60 |
IF (a > b) THEN RETURN a; ELSE RETURN b; END;
|
61 |
END IMax;
|
61 |
END IMax;
|
62 |
|
62 |
|
63 |
PROCEDURE SumVek(VAR X : ARRAY OF FLOAT;
|
63 |
PROCEDURE SumVek(VAR X : ARRAY OF REAL8;
|
64 |
a,e : CARDINAL) : FLOAT;
|
64 |
a,e : CARDINAL) : REAL8;
|
65 |
|
65 |
|
66 |
VAR i : CARDINAL;
|
66 |
VAR i : CARDINAL;
|
67 |
s,c,y,t : FLOAT;
|
67 |
s,c,y,t : REAL8;
|
68 |
BEGIN
|
68 |
BEGIN
|
69 |
s := X[a-1];
|
69 |
s := X[a-1];
|
70 |
c := 0.0;
|
70 |
c := 0.0;
|
71 |
FOR i:=a TO e-1 DO
|
71 |
FOR i:=a TO e-1 DO
|
72 |
y := X[i] - c;
|
72 |
y := X[i] - c;
|
|
... |
|
... |
75 |
s := t;
|
75 |
s := t;
|
76 |
END;
|
76 |
END;
|
77 |
RETURN s;
|
77 |
RETURN s;
|
78 |
END SumVek;
|
78 |
END SumVek;
|
79 |
|
79 |
|
80 |
PROCEDURE AbsSumVek(VAR X : ARRAY OF FLOAT;
|
80 |
PROCEDURE AbsSumVek(VAR X : ARRAY OF REAL8;
|
81 |
a,e : CARDINAL) : FLOAT;
|
81 |
a,e : CARDINAL) : REAL8;
|
82 |
|
82 |
|
83 |
VAR i : CARDINAL;
|
83 |
VAR i : CARDINAL;
|
84 |
s,c,y,t : FLOAT;
|
84 |
s,c,y,t : REAL8;
|
85 |
|
85 |
|
86 |
BEGIN
|
86 |
BEGIN
|
87 |
s := ABS(X[a-1]);
|
87 |
s := ABS(X[a-1]);
|
88 |
c := 0.0;
|
88 |
c := 0.0;
|
89 |
FOR i:=a TO e-1 DO
|
89 |
FOR i:=a TO e-1 DO
|
|
... |
|
... |
93 |
s := t;
|
93 |
s := t;
|
94 |
END;
|
94 |
END;
|
95 |
RETURN s;
|
95 |
RETURN s;
|
96 |
END AbsSumVek;
|
96 |
END AbsSumVek;
|
97 |
|
97 |
|
98 |
PROCEDURE ENorm(VAR X : ARRAY OF FLOAT;
|
98 |
PROCEDURE ENorm(VAR X : ARRAY OF REAL8;
|
99 |
a,e : CARDINAL) : FLOAT;
|
99 |
a,e : CARDINAL) : REAL8;
|
100 |
|
100 |
|
101 |
(*---------------------------------------------------------------*)
|
101 |
(*---------------------------------------------------------------*)
|
102 |
(* Argonne national laboratory. MINPACK project. March 1980. *)
|
102 |
(* Argonne national laboratory. MINPACK project. March 1980. *)
|
103 |
(* Burton S. Garbow, Kenneth E. Hillstrom, Jorge J. More *)
|
103 |
(* Burton S. Garbow, Kenneth E. Hillstrom, Jorge J. More *)
|
104 |
(* *)
|
104 |
(* *)
|
|
... |
|
... |
107 |
|
107 |
|
108 |
CONST MinLR = 3.834E-20;
|
108 |
CONST MinLR = 3.834E-20;
|
109 |
MaxLR = 1.304E+19;
|
109 |
MaxLR = 1.304E+19;
|
110 |
|
110 |
|
111 |
VAR i : CARDINAL;
|
111 |
VAR i : CARDINAL;
|
112 |
S1,S2,S3,zw : FLOAT;
|
112 |
S1,S2,S3,zw : REAL8;
|
113 |
Giant,AbsX,Max1,Max3 : FLOAT;
|
113 |
Giant,AbsX,Max1,Max3 : REAL8;
|
114 |
Norm : FLOAT;
|
114 |
Norm : REAL8;
|
115 |
BEGIN
|
115 |
BEGIN
|
116 |
S1:=0.0; S2:=0.0; S3:=0.0;
|
116 |
S1:=0.0; S2:=0.0; S3:=0.0;
|
117 |
Max1:=0.0; Max3:=0.0;
|
117 |
Max1:=0.0; Max3:=0.0;
|
118 |
Giant := MaxLR / VAL(FLOAT,e-a+1);
|
118 |
Giant := MaxLR / VAL(REAL8,e-a+1);
|
119 |
FOR i:=a-1 TO e-1 DO
|
119 |
FOR i:=a-1 TO e-1 DO
|
120 |
AbsX := ABS(X[i]);
|
120 |
AbsX := ABS(X[i]);
|
121 |
IF (AbsX < MinLR) THEN (* Summiere kleine Elemente. *)
|
121 |
IF (AbsX < MinLR) THEN (* Summiere kleine Elemente. *)
|
122 |
IF (AbsX > Max3) THEN
|
122 |
IF (AbsX > Max3) THEN
|
123 |
zw := Max3 / AbsX;
|
123 |
zw := Max3 / AbsX;
|
|
... |
|
... |
161 |
(*========================================================================*)
|
161 |
(*========================================================================*)
|
162 |
(* Pure BLAS based routines *)
|
162 |
(* Pure BLAS based routines *)
|
163 |
(*========================================================================*)
|
163 |
(*========================================================================*)
|
164 |
|
164 |
|
165 |
PROCEDURE dnrm2( n : INTEGER;
|
165 |
PROCEDURE dnrm2( n : INTEGER;
|
166 |
VAR X : ARRAY OF FLOAT;
|
166 |
VAR X : ARRAY OF REAL8;
|
167 |
IncX : INTEGER): FLOAT;
|
167 |
IncX : INTEGER): REAL8;
|
168 |
|
168 |
|
169 |
(*-----------------------------------------------------------------*)
|
169 |
(*-----------------------------------------------------------------*)
|
170 |
(* This version written on 25-October-1982. *)
|
170 |
(* This version written on 25-October-1982. *)
|
171 |
(* Modified on 14-October-1993 to inline the call to DLASSQ. *)
|
171 |
(* Modified on 14-October-1993 to inline the call to DLASSQ. *)
|
172 |
(* Sven Hammarling, Nag Ltd. *)
|
172 |
(* Sven Hammarling, Nag Ltd. *)
|
173 |
(* Adapted to Modula-2 01.12.2015, M.Riedl *)
|
173 |
(* Adapted to Modula-2 01.12.2015, M.Riedl *)
|
174 |
(*-----------------------------------------------------------------*)
|
174 |
(*-----------------------------------------------------------------*)
|
175 |
|
175 |
|
176 |
VAR i,ix : INTEGER;
|
176 |
VAR i,ix : INTEGER;
|
177 |
absxi,norm,scale,ssq : FLOAT;
|
177 |
absxi,norm,scale,ssq : REAL8;
|
178 |
zw : FLOAT;
|
178 |
zw : REAL8;
|
179 |
BEGIN
|
179 |
BEGIN
|
180 |
IF (n < 1) OR (IncX < 1) THEN
|
180 |
IF (n < 1) OR (IncX < 1) THEN
|
181 |
norm := 0.0
|
181 |
norm := 0.0
|
182 |
ELSIF (n = 1) THEN
|
182 |
ELSIF (n = 1) THEN
|
183 |
norm := ABS(X[0]);
|
183 |
norm := ABS(X[0]);
|
|
... |
|
... |
203 |
END;
|
203 |
END;
|
204 |
RETURN norm;
|
204 |
RETURN norm;
|
205 |
END dnrm2;
|
205 |
END dnrm2;
|
206 |
|
206 |
|
207 |
PROCEDURE dswap( N : CARDINAL;
|
207 |
PROCEDURE dswap( N : CARDINAL;
|
208 |
VAR X : ARRAY OF FLOAT;
|
208 |
VAR X : ARRAY OF REAL8;
|
209 |
incX : INTEGER;
|
209 |
incX : INTEGER;
|
210 |
VAR Y : ARRAY OF FLOAT;
|
210 |
VAR Y : ARRAY OF REAL8;
|
211 |
incY : INTEGER);
|
211 |
incY : INTEGER);
|
212 |
|
212 |
|
213 |
(*----------------------------------------------------------------*)
|
213 |
(*----------------------------------------------------------------*)
|
214 |
(* Adopted to Modula-2, MRi, 30.03.2016 *)
|
214 |
(* Adopted to Modula-2, MRi, 30.03.2016 *)
|
215 |
(*----------------------------------------------------------------*)
|
215 |
(*----------------------------------------------------------------*)
|
216 |
|
216 |
|
217 |
CONST level = 4;
|
217 |
CONST level = 4;
|
218 |
|
218 |
|
219 |
VAR Xi : FLOAT;
|
219 |
VAR Xi : REAL8;
|
220 |
Xtmp : ARRAY [0..level-1] OF FLOAT;
|
220 |
Xtmp : ARRAY [0..level-1] OF REAL8;
|
221 |
ix,iy : INTEGER;
|
221 |
ix,iy : INTEGER;
|
222 |
i,m : CARDINAL;
|
222 |
i,m : CARDINAL;
|
223 |
BEGIN
|
223 |
BEGIN
|
224 |
IF (N = 0) THEN RETURN; END;
|
224 |
IF (N = 0) THEN RETURN; END;
|
225 |
|
225 |
|
|
... |
|
... |
246 |
END;
|
246 |
END;
|
247 |
END;
|
247 |
END;
|
248 |
END dswap;
|
248 |
END dswap;
|
249 |
|
249 |
|
250 |
PROCEDURE dcopy( N : INTEGER;
|
250 |
PROCEDURE dcopy( N : INTEGER;
|
251 |
VAR X : ARRAY OF FLOAT;
|
251 |
VAR X : ARRAY OF REAL8;
|
252 |
IncX : INTEGER;
|
252 |
IncX : INTEGER;
|
253 |
VAR Y : ARRAY OF FLOAT;
|
253 |
VAR Y : ARRAY OF REAL8;
|
254 |
IncY : INTEGER);
|
254 |
IncY : INTEGER);
|
255 |
|
255 |
|
256 |
(*----------------------------------------------------------------*)
|
256 |
(*----------------------------------------------------------------*)
|
257 |
(* Adopted to Modula-2, MRi, 04.04.2016 *)
|
257 |
(* Adopted to Modula-2, MRi, 04.04.2016 *)
|
258 |
(*----------------------------------------------------------------*)
|
258 |
(*----------------------------------------------------------------*)
|
|
... |
|
... |
284 |
END;
|
284 |
END;
|
285 |
END;
|
285 |
END;
|
286 |
END dcopy;
|
286 |
END dcopy;
|
287 |
|
287 |
|
288 |
PROCEDURE drot( N : INTEGER;
|
288 |
PROCEDURE drot( N : INTEGER;
|
289 |
VAR X : ARRAY OF FLOAT;
|
289 |
VAR X : ARRAY OF REAL8;
|
290 |
incX : INTEGER;
|
290 |
incX : INTEGER;
|
291 |
VAR Y : ARRAY OF FLOAT;
|
291 |
VAR Y : ARRAY OF REAL8;
|
292 |
incY : INTEGER;
|
292 |
incY : INTEGER;
|
293 |
c,s : FLOAT);
|
293 |
c,s : REAL8);
|
294 |
|
294 |
|
295 |
(*----------------------------------------------------------------*)
|
295 |
(*----------------------------------------------------------------*)
|
296 |
(* Adopted to Modula-2, MRi, 31.03.2016 *)
|
296 |
(* Adopted to Modula-2, MRi, 31.03.2016 *)
|
297 |
(*----------------------------------------------------------------*)
|
297 |
(*----------------------------------------------------------------*)
|
298 |
|
298 |
|
299 |
VAR i,ix,iy : INTEGER;
|
299 |
VAR i,ix,iy : INTEGER;
|
300 |
x1,y1 : FLOAT;
|
300 |
x1,y1 : REAL8;
|
301 |
BEGIN
|
301 |
BEGIN
|
302 |
IF (incX = 1) AND (incY = 1) THEN
|
302 |
IF (incX = 1) AND (incY = 1) THEN
|
303 |
FOR i:=0 TO N-1 DO
|
303 |
FOR i:=0 TO N-1 DO
|
304 |
x1 := X[i];
|
304 |
x1 := X[i];
|
305 |
y1 := Y[i];
|
305 |
y1 := Y[i];
|
|
... |
|
... |
318 |
iy := iy + incY;
|
318 |
iy := iy + incY;
|
319 |
END;
|
319 |
END;
|
320 |
END;
|
320 |
END;
|
321 |
END drot;
|
321 |
END drot;
|
322 |
|
322 |
|
323 |
PROCEDURE drotg(VAR da : FLOAT;
|
323 |
PROCEDURE drotg(VAR da : REAL8;
|
324 |
VAR db : FLOAT;
|
324 |
VAR db : REAL8;
|
325 |
VAR c : FLOAT;
|
325 |
VAR c : REAL8;
|
326 |
VAR s : FLOAT);
|
326 |
VAR s : REAL8);
|
327 |
|
327 |
|
328 |
(*----------------------------------------------------------------*)
|
328 |
(*----------------------------------------------------------------*)
|
329 |
(* Adopted to Modula-2, MRi, 31.03.2016 *)
|
329 |
(* Adopted to Modula-2, MRi, 31.03.2016 *)
|
330 |
(*----------------------------------------------------------------*)
|
330 |
(*----------------------------------------------------------------*)
|
331 |
|
331 |
|
332 |
VAR r,z,roe,daos,dbos,scale : FLOAT;
|
332 |
VAR r,z,roe,daos,dbos,scale : REAL8;
|
333 |
BEGIN
|
333 |
BEGIN
|
334 |
IF (ABS(da) > ABS(db)) THEN roe := da; ELSE roe := db; END;
|
334 |
IF (ABS(da) > ABS(db)) THEN roe := da; ELSE roe := db; END;
|
335 |
scale := ABS(da) + ABS(db);
|
335 |
scale := ABS(da) + ABS(db);
|
336 |
IF (scale # 0.0) THEN
|
336 |
IF (scale # 0.0) THEN
|
337 |
daos := da / scale;
|
337 |
daos := da / scale;
|
|
... |
|
... |
356 |
END;
|
356 |
END;
|
357 |
da := r; db := z;
|
357 |
da := r; db := z;
|
358 |
END drotg;
|
358 |
END drotg;
|
359 |
|
359 |
|
360 |
PROCEDURE dscal( n : INTEGER;
|
360 |
PROCEDURE dscal( n : INTEGER;
|
361 |
da : FLOAT;
|
361 |
da : REAL8;
|
362 |
VAR dx : ARRAY OF FLOAT;
|
362 |
VAR dx : ARRAY OF REAL8;
|
363 |
incx : INTEGER);
|
363 |
incx : INTEGER);
|
364 |
|
364 |
|
365 |
(*----------------------------------------------------------------*)
|
365 |
(*----------------------------------------------------------------*)
|
366 |
(* Scales a vector by a constant (UNROLLED version) *)
|
366 |
(* Scales a vector by a constant (UNROLLED version) *)
|
367 |
(*----------------------------------------------------------------*)
|
367 |
(*----------------------------------------------------------------*)
|
|
... |
|
... |
392 |
END;
|
392 |
END;
|
393 |
END;
|
393 |
END;
|
394 |
END dscal;
|
394 |
END dscal;
|
395 |
|
395 |
|
396 |
PROCEDURE daxpy( n : INTEGER;
|
396 |
PROCEDURE daxpy( n : INTEGER;
|
397 |
da : FLOAT;
|
397 |
da : REAL8;
|
398 |
VAR dx : ARRAY OF FLOAT;
|
398 |
VAR dx : ARRAY OF REAL8;
|
399 |
incx : INTEGER;
|
399 |
incx : INTEGER;
|
400 |
VAR dy : ARRAY OF FLOAT;
|
400 |
VAR dy : ARRAY OF REAL8;
|
401 |
incy : INTEGER);
|
401 |
incy : INTEGER);
|
402 |
|
402 |
|
403 |
(*----------------------------------------------------------------*)
|
403 |
(*----------------------------------------------------------------*)
|
404 |
(* constant times a vector plus a vector *)
|
404 |
(* constant times a vector plus a vector *)
|
405 |
(*----------------------------------------------------------------*)
|
405 |
(*----------------------------------------------------------------*)
|
|
... |
|
... |
436 |
END;
|
436 |
END;
|
437 |
END;
|
437 |
END;
|
438 |
END daxpy;
|
438 |
END daxpy;
|
439 |
|
439 |
|
440 |
PROCEDURE ddot( N : INTEGER;
|
440 |
PROCEDURE ddot( N : INTEGER;
|
441 |
VAR X : ARRAY OF FLOAT;
|
441 |
VAR X : ARRAY OF REAL8;
|
442 |
IncX : INTEGER;
|
442 |
IncX : INTEGER;
|
443 |
VAR Y : ARRAY OF FLOAT;
|
443 |
VAR Y : ARRAY OF REAL8;
|
444 |
IncY : INTEGER) : FLOAT;
|
444 |
IncY : INTEGER) : REAL8;
|
445 |
|
445 |
|
446 |
(*----------------------------------------------------------------*)
|
446 |
(*----------------------------------------------------------------*)
|
447 |
(* Forms the dot product of two vectors. Uses unrolled loops for *)
|
447 |
(* Forms the dot product of two vectors. Uses unrolled loops for *)
|
448 |
(* increments equal to one. *)
|
448 |
(* increments equal to one. *)
|
449 |
(* Adopted to Modula-2, MRi, 06.09.2015 *)
|
449 |
(* Adopted to Modula-2, MRi, 06.09.2015 *)
|
450 |
(*----------------------------------------------------------------*)
|
450 |
(*----------------------------------------------------------------*)
|
451 |
|
451 |
|
452 |
CONST veclen = 8;
|
452 |
CONST veclen = 8;
|
453 |
|
453 |
|
454 |
VAR dtemp : FLOAT;
|
454 |
VAR dtemp : REAL8;
|
455 |
i,ix,iy,m : INTEGER;
|
455 |
i,ix,iy,m : INTEGER;
|
456 |
BEGIN
|
456 |
BEGIN
|
457 |
IF (N <= 0) THEN RETURN 0.0; END;
|
457 |
IF (N <= 0) THEN RETURN 0.0; END;
|
458 |
dtemp := 0.0;
|
458 |
dtemp := 0.0;
|
459 |
IF (IncX = 1) AND (IncY = 1) THEN
|
459 |
IF (IncX = 1) AND (IncY = 1) THEN
|
|
... |
|
... |
483 |
END;
|
483 |
END;
|
484 |
RETURN dtemp;
|
484 |
RETURN dtemp;
|
485 |
END ddot;
|
485 |
END ddot;
|
486 |
|
486 |
|
487 |
PROCEDURE idamax( n : INTEGER;
|
487 |
PROCEDURE idamax( n : INTEGER;
|
488 |
VAR dx : ARRAY OF FLOAT;
|
488 |
VAR dx : ARRAY OF REAL8;
|
489 |
incx : INTEGER) : INTEGER;
|
489 |
incx : INTEGER) : INTEGER;
|
490 |
|
490 |
|
491 |
(*----------------------------------------------------------------*)
|
491 |
(*----------------------------------------------------------------*)
|
492 |
(* Finds the index of element having max. absolute value. *)
|
492 |
(* Finds the index of element having max. absolute value. *)
|
493 |
(*----------------------------------------------------------------*)
|
493 |
(*----------------------------------------------------------------*)
|
494 |
|
494 |
|
495 |
VAR dmax : FLOAT;
|
495 |
VAR dmax : REAL8;
|
496 |
i,ix,itemp : INTEGER;
|
496 |
i,ix,itemp : INTEGER;
|
497 |
|
497 |
|
498 |
BEGIN
|
498 |
BEGIN
|
499 |
IF (n < 1) THEN RETURN -1; END;
|
499 |
IF (n < 1) THEN RETURN 0; END;
|
500 |
IF (n = 1) THEN RETURN 0; END;
|
500 |
IF (n = 1) THEN RETURN 1; END;
|
501 |
itemp:=0;
|
501 |
itemp:=0;
|
502 |
IF (incx <> 1) THEN (* code for increment not equal to 1 *)
|
502 |
IF (incx <> 1) THEN (* code for increment not equal to 1 *)
|
503 |
dmax := ABS(dx[0]);
|
503 |
dmax := ABS(dx[0]);
|
504 |
ix := 1 + incx;
|
504 |
ix := 1 + incx;
|
505 |
FOR i:=1 TO n-1 DO
|
505 |
FOR i:=1 TO n-1 DO
|
|
... |
|
... |
520 |
END;
|
520 |
END;
|
521 |
RETURN itemp;
|
521 |
RETURN itemp;
|
522 |
END idamax;
|
522 |
END idamax;
|
523 |
|
523 |
|
524 |
PROCEDURE idamin( n : INTEGER;
|
524 |
PROCEDURE idamin( n : INTEGER;
|
525 |
VAR X : ARRAY OF FLOAT;
|
525 |
VAR X : ARRAY OF REAL8;
|
526 |
IncX : INTEGER) : INTEGER;
|
526 |
IncX : INTEGER) : INTEGER;
|
527 |
|
527 |
|
528 |
(*----------------------------------------------------------------*)
|
528 |
(*----------------------------------------------------------------*)
|
529 |
(* Finds the index of element having min. absolute value. *)
|
529 |
(* Finds the index of element having min. absolute value. *)
|
530 |
(*----------------------------------------------------------------*)
|
530 |
(*----------------------------------------------------------------*)
|
531 |
|
531 |
|
532 |
VAR dmin : FLOAT;
|
532 |
VAR dmin : REAL8;
|
533 |
i,ix,itemp : INTEGER;
|
533 |
i,ix,itemp : INTEGER;
|
534 |
BEGIN
|
534 |
BEGIN
|
535 |
IF (n < 1) THEN RETURN -1; END;
|
535 |
IF (n < 1) THEN RETURN 0; END;
|
536 |
IF (n = 1) THEN RETURN 0; END;
|
536 |
IF (n = 1) THEN RETURN 1; END;
|
537 |
|
537 |
|
538 |
itemp:=0;
|
538 |
itemp:=0;
|
539 |
IF (IncX <> 1) THEN (* code for Increment not equal to 1 *)
|
539 |
IF (IncX <> 1) THEN (* code for Increment not equal to 1 *)
|
540 |
dmin := ABS(X[0]);
|
540 |
dmin := ABS(X[0]);
|
541 |
ix := 1 + IncX;
|
541 |
ix := 1 + IncX;
|
|
... |
|
... |
557 |
END;
|
557 |
END;
|
558 |
RETURN itemp + 1;
|
558 |
RETURN itemp + 1;
|
559 |
END idamin;
|
559 |
END idamin;
|
560 |
|
560 |
|
561 |
PROCEDURE dasum( dim : CARDINAL;
|
561 |
PROCEDURE dasum( dim : CARDINAL;
|
562 |
VAR X : ARRAY OF FLOAT;
|
562 |
VAR X : ARRAY OF REAL8;
|
563 |
Inc : CARDINAL; (* Inkrementwert >= 1*)
|
563 |
Inc : CARDINAL; (* Inkrementwert >= 1*)
|
564 |
Unrolled : BOOLEAN) : FLOAT;
|
564 |
Unrolled : BOOLEAN) : REAL8;
|
565 |
|
565 |
|
566 |
CONST max = 6; (* 8 *)
|
566 |
CONST max = 6; (* 8 *)
|
567 |
|
567 |
|
568 |
VAR i,m : CARDINAL;
|
568 |
VAR i,m : CARDINAL;
|
569 |
Sum : FLOAT;
|
569 |
Sum : REAL8;
|
570 |
BEGIN
|
570 |
BEGIN
|
571 |
IF (dim = 0) THEN RETURN 0.0; END;
|
571 |
IF (dim = 0) THEN RETURN 0.0; END;
|
572 |
IF (Inc < 1) THEN
|
572 |
IF (Inc < 1) THEN
|
573 |
Errors.FatalError("Inkrement kleiner 1 (LibDBlas.dasum) !");
|
573 |
Errors.FatalError("Inkrement kleiner 1 (LibDBlas.dasum) !");
|
574 |
END;
|
574 |
END;
|
|
... |
|
... |
600 |
RETURN Sum;
|
600 |
RETURN Sum;
|
601 |
END dasum;
|
601 |
END dasum;
|
602 |
|
602 |
|
603 |
PROCEDURE dgemv ( Trans : CHAR;
|
603 |
PROCEDURE dgemv ( Trans : CHAR;
|
604 |
M,N : INTEGER;
|
604 |
M,N : INTEGER;
|
605 |
Alpha : FLOAT;
|
605 |
Alpha : REAL8;
|
606 |
VAR A : ARRAY OF ARRAY OF FLOAT; (* [1..LDA][1..*] *)
|
606 |
VAR A : ARRAY OF ARRAY OF REAL8; (* [1..LDA][1..*] *)
|
607 |
LDA : INTEGER;
|
607 |
LDA : INTEGER;
|
608 |
VAR X : ARRAY OF FLOAT; (* [1..*] *)
|
608 |
VAR X : ARRAY OF REAL8; (* [1..*] *)
|
609 |
IncX : INTEGER;
|
609 |
IncX : INTEGER;
|
610 |
Beta : FLOAT;
|
610 |
Beta : REAL8;
|
611 |
VAR Y : ARRAY OF FLOAT; (* [1..*] *)
|
611 |
VAR Y : ARRAY OF REAL8; (* [1..*] *)
|
612 |
IncY : INTEGER);
|
612 |
IncY : INTEGER);
|
613 |
|
613 |
|
614 |
VAR Temp : FLOAT;
|
614 |
VAR Temp : REAL8;
|
615 |
i,j,iy,jx,jy,kx,ky,Info,LenX,LenY : INTEGER;
|
615 |
i,j,iy,jx,jy,kx,ky,Info,LenX,LenY : INTEGER;
|
616 |
BEGIN (* Testen *)
|
616 |
BEGIN (* Testen *)
|
617 |
(* Test the input parameters. *)
|
617 |
(* Test the input parameters. *)
|
618 |
|
618 |
|
619 |
IF (NOT (CAP(Trans) = 'N')) AND (NOT (CAP(Trans) = 'T')) THEN
|
619 |
IF (NOT (CAP(Trans) = 'N')) AND (NOT (CAP(Trans) = 'T')) THEN
|
|
... |
|
... |
740 |
END; (* IF Trans *)
|
740 |
END; (* IF Trans *)
|
741 |
END dgemv;
|
741 |
END dgemv;
|
742 |
|
742 |
|
743 |
PROCEDURE dgemm( TransA,TransB : CHAR;
|
743 |
PROCEDURE dgemm( TransA,TransB : CHAR;
|
744 |
M,N,K : INTEGER;
|
744 |
M,N,K : INTEGER;
|
745 |
Alpha : FLOAT;
|
745 |
Alpha : REAL8;
|
746 |
VAR A : ARRAY OF ARRAY OF FLOAT; (* [1..LDA][1..*] *)
|
746 |
VAR A : ARRAY OF ARRAY OF REAL8; (* [1..LDA][1..*] *)
|
747 |
LDA : INTEGER;
|
747 |
LDA : INTEGER;
|
748 |
VAR B : ARRAY OF ARRAY OF FLOAT; (* [1..LDB][1..*] *)
|
748 |
VAR B : ARRAY OF ARRAY OF REAL8; (* [1..LDB][1..*] *)
|
749 |
LDB : INTEGER;
|
749 |
LDB : INTEGER;
|
750 |
Beta : FLOAT;
|
750 |
Beta : REAL8;
|
751 |
VAR C : ARRAY OF ARRAY OF FLOAT; (* [1..LDC][1..*] *)
|
751 |
VAR C : ARRAY OF ARRAY OF REAL8; (* [1..LDC][1..*] *)
|
752 |
LDC : INTEGER);
|
752 |
LDC : INTEGER);
|
753 |
|
753 |
|
754 |
VAR NotA,NotB : BOOLEAN;
|
754 |
VAR NotA,NotB : BOOLEAN;
|
755 |
i,j,k,Info,NRowA,NRowB : INTEGER;
|
755 |
i,j,k,Info,NRowA,NRowB : INTEGER;
|
756 |
Temp,Aki,Aik : FLOAT;
|
756 |
Temp,Aki,Aik : REAL8;
|
757 |
Nm1,Mm1,Km1 : INTEGER;
|
757 |
Nm1,Mm1,Km1 : INTEGER;
|
758 |
BEGIN
|
758 |
BEGIN
|
759 |
(* Set NotA and NotB as true if A and B respectively are not *)
|
759 |
(* Set NotA and NotB as true if A and B respectively are not *)
|
760 |
(* transposed and set NRowA, NColA and NRowB as the number of rows *)
|
760 |
(* transposed and set NRowA, NColA and NRowB as the number of rows *)
|
761 |
(* and columns of A and the number of rows of B respectively. *)
|
761 |
(* and columns of A and the number of rows of B respectively. *)
|
|
... |
|
... |
897 |
|
897 |
|
898 |
END; (* IF NotB *)
|
898 |
END; (* IF NotB *)
|
899 |
END dgemm;
|
899 |
END dgemm;
|
900 |
|
900 |
|
901 |
PROCEDURE dger( m,n : CARDINAL;
|
901 |
PROCEDURE dger( m,n : CARDINAL;
|
902 |
Alpha : FLOAT;
|
902 |
Alpha : REAL8;
|
903 |
VAR X : ARRAY OF FLOAT;
|
903 |
VAR X : ARRAY OF REAL8;
|
904 |
IncX : CARDINAL;
|
904 |
IncX : CARDINAL;
|
905 |
VAR Y : ARRAY OF FLOAT;
|
905 |
VAR Y : ARRAY OF REAL8;
|
906 |
IncY : CARDINAL;
|
906 |
IncY : CARDINAL;
|
907 |
VAR A : ARRAY OF ARRAY OF FLOAT;
|
907 |
VAR A : ARRAY OF ARRAY OF REAL8;
|
908 |
lda : CARDINAL);
|
908 |
lda : CARDINAL);
|
909 |
|
909 |
|
910 |
VAR i,j,ix,jy : CARDINAL;
|
910 |
VAR i,j,ix,jy : CARDINAL;
|
911 |
AlphaX : FLOAT;
|
911 |
AlphaX : REAL8;
|
912 |
BEGIN
|
912 |
BEGIN
|
913 |
IF (lda-1 > HIGH(A)) THEN
|
913 |
IF (lda-1 > HIGH(A)) THEN
|
914 |
Errors.Fehlerflag:="lda-1 > HIGH(A) (LibDBlas.dger) !";
|
914 |
Errors.Fehlerflag:="lda-1 > HIGH(A) (LibDBlas.dger) !";
|
915 |
Errors.Fehler:=TRUE;
|
915 |
Errors.Fehler:=TRUE;
|
916 |
RETURN;
|
916 |
RETURN;
|
|
... |
|
... |
943 |
END dger;
|
943 |
END dger;
|
944 |
|
944 |
|
945 |
(*=========================== Complex valued routines =====================*)
|
945 |
(*=========================== Complex valued routines =====================*)
|
946 |
|
946 |
|
947 |
PROCEDURE zswap( N : CARDINAL;
|
947 |
PROCEDURE zswap( N : CARDINAL;
|
948 |
VAR X : ARRAY OF CFLOAT;
|
948 |
VAR X : ARRAY OF COMPLEX16;
|
949 |
IncX : INTEGER;
|
949 |
IncX : INTEGER;
|
950 |
VAR Y : ARRAY OF CFLOAT;
|
950 |
VAR Y : ARRAY OF COMPLEX16;
|
951 |
IncY : INTEGER);
|
951 |
IncY : INTEGER);
|
952 |
|
952 |
|
953 |
CONST veclen = 4;
|
953 |
CONST veclen = 4;
|
954 |
|
954 |
|
955 |
VAR Xi : CFLOAT;
|
955 |
VAR Xi : COMPLEX16;
|
956 |
Xtmp : ARRAY [0..veclen-1] OF CFLOAT;
|
956 |
Xtmp : ARRAY [0..veclen-1] OF COMPLEX16;
|
957 |
ix,iy : INTEGER;
|
957 |
ix,iy : INTEGER;
|
958 |
i,m : CARDINAL;
|
958 |
i,m : CARDINAL;
|
959 |
BEGIN
|
959 |
BEGIN
|
960 |
IF (N = 0) THEN RETURN; END;
|
960 |
IF (N = 0) THEN RETURN; END;
|
961 |
|
961 |
|
|
... |
|
... |
984 |
END;
|
984 |
END;
|
985 |
END;
|
985 |
END;
|
986 |
END zswap;
|
986 |
END zswap;
|
987 |
|
987 |
|
988 |
PROCEDURE zcopy( N : INTEGER;
|
988 |
PROCEDURE zcopy( N : INTEGER;
|
989 |
VAR X : ARRAY OF CFLOAT;
|
989 |
VAR X : ARRAY OF COMPLEX16;
|
990 |
IncX : INTEGER;
|
990 |
IncX : INTEGER;
|
991 |
VAR Y : ARRAY OF CFLOAT;
|
991 |
VAR Y : ARRAY OF COMPLEX16;
|
992 |
IncY : INTEGER);
|
992 |
IncY : INTEGER);
|
993 |
|
993 |
|
994 |
(*----------------------------------------------------------------*)
|
994 |
(*----------------------------------------------------------------*)
|
995 |
(* Adopted to Modula-2, MRi, 04.04.2016, complex version 09.08.18 *)
|
995 |
(* Adopted to Modula-2, MRi, 04.04.2016, complex version 09.08.18 *)
|
996 |
(*----------------------------------------------------------------*)
|
996 |
(*----------------------------------------------------------------*)
|
|
... |
|
... |
1022 |
END;
|
1022 |
END;
|
1023 |
END;
|
1023 |
END;
|
1024 |
END zcopy;
|
1024 |
END zcopy;
|
1025 |
|
1025 |
|
1026 |
PROCEDURE zdotc( N : INTEGER;
|
1026 |
PROCEDURE zdotc( N : INTEGER;
|
1027 |
VAR X : ARRAY OF CFLOAT;
|
1027 |
VAR X : ARRAY OF COMPLEX16;
|
1028 |
IncX : INTEGER;
|
1028 |
IncX : INTEGER;
|
1029 |
VAR Y : ARRAY OF CFLOAT;
|
1029 |
VAR Y : ARRAY OF COMPLEX16;
|
1030 |
IncY : INTEGER) : CFLOAT;
|
1030 |
IncY : INTEGER) : COMPLEX16;
|
1031 |
|
1031 |
|
1032 |
CONST veclen = 4;
|
1032 |
CONST veclen = 4;
|
1033 |
|
1033 |
|
1034 |
VAR dtemp : CFLOAT;
|
1034 |
VAR dtemp : COMPLEX16;
|
1035 |
i,ix,iy,m : INTEGER;
|
1035 |
i,ix,iy,m : INTEGER;
|
1036 |
BEGIN
|
1036 |
BEGIN
|
1037 |
IF (N <= 0) THEN RETURN zero; END;
|
1037 |
IF (N <= 0) THEN RETURN zero; END;
|
1038 |
|
1038 |
|
1039 |
dtemp := zero;
|
1039 |
dtemp := zero;
|
|
... |
|
... |
1042 |
m := N MOD veclen;
|
1042 |
m := N MOD veclen;
|
1043 |
IF (m # 0) THEN
|
1043 |
IF (m # 0) THEN
|
1044 |
FOR i:=0 TO m-1 DO (* clean-up loop *)
|
1044 |
FOR i:=0 TO m-1 DO (* clean-up loop *)
|
1045 |
dtemp:=dtemp + conj(X[i])*Y[i];
|
1045 |
dtemp:=dtemp + conj(X[i])*Y[i];
|
1046 |
END;
|
1046 |
END;
|
|
|
1047 |
(****
|
1047 |
IF (N < veclen) THEN RETURN dtemp; END;
|
1048 |
IF (N < veclen) THEN RETURN dtemp; END;
|
|
|
1049 |
***)
|
|
|
1050 |
|
1048 |
END;
|
1051 |
END;
|
1049 |
(* i := m - veclen; *)
|
1052 |
(* i := m - veclen; *)
|
1050 |
FOR i:=m TO N-1 BY veclen DO
|
1053 |
FOR i:=m TO N-1 BY veclen DO
|
1051 |
dtemp:=dtemp + conj(X[i+0])*Y[i+0] + conj(X[i+1])*Y[i+1] +
|
1054 |
dtemp:=dtemp + conj(X[i+0])*Y[i+0] + conj(X[i+1])*Y[i+1] +
|
1052 |
conj(X[i+2])*Y[i+2] + conj(X[i+3])*Y[i+3];
|
1055 |
conj(X[i+2])*Y[i+2] + conj(X[i+3])*Y[i+3];
|
|
... |
|
... |
1062 |
END;
|
1065 |
END;
|
1063 |
RETURN dtemp;
|
1066 |
RETURN dtemp;
|
1064 |
END zdotc;
|
1067 |
END zdotc;
|
1065 |
|
1068 |
|
1066 |
PROCEDURE dznrm2( N : INTEGER;
|
1069 |
PROCEDURE dznrm2( N : INTEGER;
|
1067 |
VAR X : ARRAY OF CFLOAT;
|
1070 |
VAR X : ARRAY OF COMPLEX16;
|
1068 |
IncX : INTEGER) : FLOAT;
|
1071 |
IncX : INTEGER) : REAL8;
|
1069 |
|
1072 |
|
1070 |
VAR norm,scale,ssq,tmp : FLOAT;
|
1073 |
VAR norm,scale,ssq,tmp : REAL8;
|
1071 |
i,ix : INTEGER;
|
1074 |
i,ix : INTEGER;
|
1072 |
zw : FLOAT;
|
1075 |
zw : REAL8;
|
1073 |
BEGIN
|
1076 |
BEGIN
|
1074 |
IF (N < 1) OR (IncX < 1) THEN
|
1077 |
IF (N < 1) OR (IncX < 1) THEN
|
1075 |
norm := 0.0;
|
1078 |
norm := 0.0;
|
1076 |
ELSE
|
1079 |
ELSE
|
1077 |
scale := 0.0;
|
1080 |
scale := 0.0;
|
|
... |
|
... |
1106 |
END; (* IF *)
|
1109 |
END; (* IF *)
|
1107 |
RETURN norm;
|
1110 |
RETURN norm;
|
1108 |
END dznrm2;
|
1111 |
END dznrm2;
|
1109 |
|
1112 |
|
1110 |
PROCEDURE zscal( n : INTEGER;
|
1113 |
PROCEDURE zscal( n : INTEGER;
|
1111 |
da : CFLOAT;
|
1114 |
da : COMPLEX16;
|
1112 |
VAR X : ARRAY OF CFLOAT;
|
1115 |
VAR X : ARRAY OF COMPLEX16;
|
1113 |
IncX : INTEGER);
|
1116 |
IncX : INTEGER);
|
1114 |
|
1117 |
|
1115 |
CONST veclen = 4;
|
1118 |
CONST veclen = 4;
|
1116 |
|
1119 |
|
1117 |
VAR i,m : INTEGER;
|
1120 |
VAR i,m : INTEGER;
|
|
... |
|
... |
1138 |
END;
|
1141 |
END;
|
1139 |
END;
|
1142 |
END;
|
1140 |
END zscal;
|
1143 |
END zscal;
|
1141 |
|
1144 |
|
1142 |
PROCEDURE zaxpy( n : INTEGER;
|
1145 |
PROCEDURE zaxpy( n : INTEGER;
|
1143 |
da : CFLOAT;
|
1146 |
da : COMPLEX16;
|
1144 |
VAR X : ARRAY OF CFLOAT;
|
1147 |
VAR X : ARRAY OF COMPLEX16;
|
1145 |
IncX : INTEGER;
|
1148 |
IncX : INTEGER;
|
1146 |
VAR Y : ARRAY OF CFLOAT;
|
1149 |
VAR Y : ARRAY OF COMPLEX16;
|
1147 |
IncY : INTEGER);
|
1150 |
IncY : INTEGER);
|
1148 |
|
1151 |
|
1149 |
CONST veclen = 4;
|
1152 |
CONST veclen = 4;
|
1150 |
|
1153 |
|
1151 |
VAR i,ix,iy,m : INTEGER;
|
1154 |
VAR i,ix,iy,m : INTEGER;
|
|
... |
|
... |
1180 |
END;
|
1183 |
END;
|
1181 |
END;
|
1184 |
END;
|
1182 |
END zaxpy;
|
1185 |
END zaxpy;
|
1183 |
|
1186 |
|
1184 |
PROCEDURE zdrot( N : INTEGER;
|
1187 |
PROCEDURE zdrot( N : INTEGER;
|
1185 |
VAR X : ARRAY OF CFLOAT;
|
1188 |
VAR X : ARRAY OF COMPLEX16;
|
1186 |
IncX : INTEGER;
|
1189 |
IncX : INTEGER;
|
1187 |
VAR Y : ARRAY OF CFLOAT;
|
1190 |
VAR Y : ARRAY OF COMPLEX16;
|
1188 |
IncY : INTEGER;
|
1191 |
IncY : INTEGER;
|
1189 |
c,s : FLOAT);
|
1192 |
c,s : REAL8);
|
1190 |
|
1193 |
|
1191 |
VAR i,ix,iy : INTEGER;
|
1194 |
VAR i,ix,iy : INTEGER;
|
1192 |
tmp : CFLOAT;
|
1195 |
tmp : COMPLEX16;
|
1193 |
BEGIN
|
1196 |
BEGIN
|
1194 |
IF (IncX = 1) AND (IncY = 1) THEN
|
1197 |
IF (IncX = 1) AND (IncY = 1) THEN
|
1195 |
FOR i:=0 TO N-1 DO
|
1198 |
FOR i:=0 TO N-1 DO
|
1196 |
tmp := scalarMult( c,X[i]) + scalarMult(s,Y[i]);
|
1199 |
tmp := scalarMult( c,X[i]) + scalarMult(s,Y[i]);
|
1197 |
Y[i] := scalarMult(-s,X[i]) + scalarMult(c,Y[i]);
|
1200 |
Y[i] := scalarMult(-s,X[i]) + scalarMult(c,Y[i]);
|
|
... |
|
... |
1210 |
END;
|
1213 |
END;
|
1211 |
END zdrot;
|
1214 |
END zdrot;
|
1212 |
|
1215 |
|
1213 |
PROCEDURE zgemv( Trans : CHAR;
|
1216 |
PROCEDURE zgemv( Trans : CHAR;
|
1214 |
M,N : INTEGER;
|
1217 |
M,N : INTEGER;
|
1215 |
Alpha : CFLOAT;
|
1218 |
Alpha : COMPLEX16;
|
1216 |
VAR A : ARRAY OF ARRAY OF CFLOAT;
|
1219 |
VAR A : ARRAY OF ARRAY OF COMPLEX16;
|
1217 |
lda : INTEGER;
|
1220 |
lda : INTEGER;
|
1218 |
VAR X : ARRAY OF CFLOAT;
|
1221 |
VAR X : ARRAY OF COMPLEX16;
|
1219 |
IncX : INTEGER;
|
1222 |
IncX : INTEGER;
|
1220 |
Beta : CFLOAT;
|
1223 |
Beta : COMPLEX16;
|
1221 |
VAR Y : ARRAY OF CFLOAT;
|
1224 |
VAR Y : ARRAY OF COMPLEX16;
|
1222 |
IncY : INTEGER);
|
1225 |
IncY : INTEGER);
|
1223 |
|
1226 |
|
1224 |
VAR i,j,iy,jx,kx,ky : INTEGER;
|
1227 |
VAR i,j,iy,jx,kx,ky : INTEGER;
|
1225 |
lenx,leny,info : INTEGER;
|
1228 |
lenx,leny,info : INTEGER;
|
1226 |
s : CFLOAT;
|
1229 |
s : COMPLEX16;
|
1227 |
noconj : BOOLEAN;
|
1230 |
noconj : BOOLEAN;
|
1228 |
BEGIN
|
1231 |
BEGIN
|
1229 |
(* test the input parameters *)
|
1232 |
(* test the input parameters *)
|
1230 |
|
1233 |
|
1231 |
info := 0;
|
1234 |
info := 0;
|
|
... |
|
... |
1375 |
END; (* IF Trans *)
|
1378 |
END; (* IF Trans *)
|
1376 |
END zgemv;
|
1379 |
END zgemv;
|
1377 |
|
1380 |
|
1378 |
PROCEDURE zgemm( TransA,TransB : CHAR;
|
1381 |
PROCEDURE zgemm( TransA,TransB : CHAR;
|
1379 |
M,N,K : INTEGER;
|
1382 |
M,N,K : INTEGER;
|
1380 |
Alpha : CFLOAT;
|
1383 |
Alpha : COMPLEX16;
|
1381 |
VAR A : ARRAY OF ARRAY OF CFLOAT;
|
1384 |
VAR A : ARRAY OF ARRAY OF COMPLEX16;
|
1382 |
LDA : INTEGER;
|
1385 |
LDA : INTEGER;
|
1383 |
VAR B : ARRAY OF ARRAY OF CFLOAT;
|
1386 |
VAR B : ARRAY OF ARRAY OF COMPLEX16;
|
1384 |
LDB : INTEGER;
|
1387 |
LDB : INTEGER;
|
1385 |
Beta : CFLOAT;
|
1388 |
Beta : COMPLEX16;
|
1386 |
VAR C : ARRAY OF ARRAY OF CFLOAT;
|
1389 |
VAR C : ARRAY OF ARRAY OF COMPLEX16;
|
1387 |
LDC : INTEGER);
|
1390 |
LDC : INTEGER);
|
1388 |
|
1391 |
|
1389 |
CONST zero = CMPLX(0.0,0.0);
|
1392 |
CONST zero = CMPLX(0.0,0.0);
|
1390 |
one = CMPLX(1.0,0.0);
|
1393 |
one = CMPLX(1.0,0.0);
|
1391 |
|
1394 |
|
1392 |
VAR NotA,NotB,ConjA,ConjB : BOOLEAN;
|
1395 |
VAR NotA,NotB,ConjA,ConjB : BOOLEAN;
|
1393 |
i,j,k,Info,NRowA,NRowB : INTEGER;
|
1396 |
i,j,k,Info,NRowA,NRowB : INTEGER;
|
1394 |
Temp,Aki,Aik : CFLOAT;
|
1397 |
Temp,Aki,Aik : COMPLEX16;
|
1395 |
Nm1,Mm1,Km1 : INTEGER;
|
1398 |
Nm1,Mm1,Km1 : INTEGER;
|
1396 |
BEGIN
|
1399 |
BEGIN
|
1397 |
(* Set NotA and NotB as true if A and B respectively are not *)
|
1400 |
(* Set NotA and NotB as true if A and B respectively are not *)
|
1398 |
(* transposed and set NRowA, NColA and NRowB as the number of rows *)
|
1401 |
(* transposed and set NRowA, NColA and NRowB as the number of rows *)
|
1399 |
(* and columns of A and the number of rows of B respectively. *)
|
1402 |
(* and columns of A and the number of rows of B respectively. *)
|