1
C/MEMBR ADD NAME=WDMPMU,SSI=0
3
subroutine wdmpmu(mp1r,mp1i,d1,nl1,mp2r,d2,nl2,
6
c ce sous programme effectue le calcul du produit de matrices
7
c de polynomes a coefficients complexes
13
c pm1 : tableau contenant les coefficients des polynomes,
14
c le coefficient de degre k du polynome pm1(i,j) est range
15
c dans pm1( d1(i + (j-1)*nl1 + k) )
16
c pm1 doit etre de taille au moins d1(nl1*n+1)-d1(1)
17
c d1 : tableau entier de taille nl1*n+1, si k=i+(j-1)*nl1 alors
18
c d1(k)) contient l'adresse dans pm1 du coeff de degre 0
19
c du polynome pm1(i,j). Le degre du polynome pm1(i,j) vaut:
21
c nl1 : entier definissant le rangement dans d1
23
c pm2,d2,nl2 : definitions similaires a celles de pm1,d1,nl1
24
c pm3,d3 : definitions similaires a celles de pm1 et d1, nl3 est
26
c l : nombre de lignes de pm1
27
c m : nombre de ligne des matrices pm
28
c n : nombre de colonnes des matrices pm
29
c avec les conventions suivantes:
31
c -si l = 0 signifie que mp1 est un polynome, et que la
32
c multiplication s'entend alors au sens de la multiplication
33
c de tous les coefficients de mp2 par mp1.
35
c -si n = 0 signifie que mp2 est un polynome, et que la
36
c multiplication s'entend au sens de la multiplication de tous
37
c les coefficients de mp1 par mp2.
39
c -si m = 0 la multiplication s'entend element par element,
40
c il est alors suppose que mp1 et mp2, donc mp3 sont de dimension
44
c auteur: c. klimann, inria
45
c date: 25 fevrier 1985.
48
c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
51
double precision mp1r(*),mp1i(*),mp2r(*),mp3r(*),mp3i(*)
52
integer d1(*), d2(*), d3(*)
55
integer i, j, k, k1, k2, k3
60
if (l .eq. 0 .or. m .eq. 0 .or. n .eq. 0) goto 500
68
mp3r(d3(p3+i)) = 0.0d+0
69
mp3i(d3(p3+i)) = 0.0d+0
74
k2 = d2(p2+k+1) - d2(p2+k) - 1
75
k1 = d1(p1 + 1) - d1(p1) - 1
77
call dpmul(mp1r(d1(p1)),k1,mp2r(d2(p2+k)),k2,
79
call dpmul(mp1i(d1(p1)),k1,mp2r(d2(p2+k)),k2,
82
d3(p3 + i + 1) = d3(p3 + i) + k3 + 1
86
500 if (l .eq. 0) goto 600
87
if (m .eq. 0) goto 700
90
k2 = d2(2) - d2(1) - 1
96
k1 = d1(p1 + i + 1) - d1(p1 + i) - 1
97
mp3r(d3(p3 + i)) = 0.0d+0
99
call dpmul(mp1r(d1(p1+i)),k1,mp2r(1),k2,mp3r(d3(p3+i)),kk)
100
mp3i(d3(p3 + i)) = 0.0d+0
101
call dpmul(mp1i(d1(p1+i)),k1,mp2r(1),k2,mp3i(d3(p3+i)),k3)
102
d3(p3 + i + 1) = d3(p3 + i) + k3 + 1
105
600 k1 = d1(2) - d1(1) - 1
113
k2 = d2(p2 + i + 1) - d2(p2 + i) - 1
114
mp3r(d3(p3+i)) = 0.0d+0
116
call dpmul(mp1r(1),k1,mp2r(d2(p2+i)),k2,mp3r(d3(p3+i)),kk)
117
mp3i(d3(p3+i)) = 0.0d+0
118
call dpmul(mp1i(1),k1,mp2r(d2(p2+i)),k2,mp3i(d3(p3+i)),k3)
119
d3(p3 + i + 1) = d3(p3 + i) + k3 + 1
130
k1 = d1(p1 + i + 1) - d1(p1 + i) - 1
131
k2 = d2(p2 + i + 1) - d2(p2 + i) - 1
132
mp3r(d3(p3+i)) = 0.0d+0
134
call dpmul(mp1r(d1(p1+i)),k1,mp2r(d2(p2+i)),k2,
136
mp3i(d3(p3+i)) = 0.0d+0
138
call dpmul(mp1i(d1(p1+i)),k1,mp2r(d2(p2+i)),k2,
140
d3(p3 + i + 1) = d3(p3 + i) + k3 + 1