[updated 6.Jul.2002]
Librairie multmat > Fichier moliv.f |
SUBROUTINE MOLIV (KOLPR,KOLDR,PRPLM,DRPLM,LGCUM,IPLAGE
& ,TYPM,MCM,RSTM,CSTM,TYPV,MCV,RSTV,CSTV
& ,COEFF,IADPR,IADDR)
Auteur : D.Martin (Octobre 1990)
Derniere modification : D.Martin (17 octobre 1990)
Version 1.0.0
Produit scalaire partiel d'une ligne d'une matrice stockee 'MORSE ligne'
par un vecteur :
Somme(Kolpr,Koldr) Mij x Vj si i est le numero de ligne (implicite)
-- Arguments d'entree --
KOLPR No de 1ere colonne de la ligne pour laquelle a lieu la multiplication
KOLDR numero de derniere colonne de la ligne " " " "
PRPLM numero de 1ere plage de la ligne ou de la plage de la ligne contenant
la colonne KOLPR
DRPLM numero de derniere plage ou de la plage de la ligne contenant
la colonne KOLDR
LGCUM longueur cumulee des lignes precedant la ligne en cours
IPLAGE tableau des numeros de debut de plage et des longueurs cumulees
du compactage 'MORSE' ligne de la matrice
TYPM type (REEL,COMPLEXE) de la matrice
MCM adresse de la matrice dans le tableau reel RSTM ou complexe CSTM
RSTM tableau contenant la matrice (cas reel)
CSTM tableau contenant la matrice (cas complexe)
TYPV type (REEL,COMPLEXE) du vecteur
MCV adresse du vecteur dans le tableau reel RSTV ou complexe CSTV
RSTV tableau contenant le vecteur (cas reel)
CSTV tableau contenant le vecteur (cas complexe)
-- Argument de sortie --
COEFF resultat COMPLEXE du produit quel que soient les types de la matrice
et du vecteur
IADPR adresse relative de 1er coeff pour lequel a lieu la multiplication
IADPR adresse relative de dernier coeff pour lequel a lieu la multiplication
- Exemples d'utilisation --
MC VC : produit matrice 'Morse ligne' par un vecteur
Kolpr=1, Koldr=numero de derniere colonne
RS MOL : resolution d'un systeme triangulaire inferieur a diagonale unite
Kolpr=1 , Koldr=i-1
RS MOU : resolution d'un systeme triangulaire superieur
Kolpr=i+1, Koldr=numero de derniere colonne
CHARACTER*(*) TYPM,TYPV
INTEGER PRPLM,DRPLM,IPLAGE(2,*)
REAL RSTM(*),RSTV(*)
COMPLEX CSTM(*),CSTV(*),COEFF,DOTPRO
COEFF=0.
LGCUMU=LGCUM
IADPR=LGCUMU
IADDR=LGCUMU
Recherche de la plage de la ligne contenant la colonne KOLPR
DO 1 NUPL1=PRPLM,DRPLM
Adresse du premier coeff. de la plage NUPL1 de la matrice
longueur cumulee, numeros de debut et de fin de plage
KOLDEB=IPLAGE(1,NUPL1)
IADLIK=LGCUMU+1
LGCUMU=IPLAGE(2,NUPL1)
KOLFIN=KOLDEB+LGCUMU-IADLIK
IF (KOLFIN.GE.KOLPR) GOTO 2
1 CONTINUE
GOTO 99999
Multiplication pour les coeff. de la plage contenant la colonne KOLPR
2 KOL1=MAX (KOLDEB,KOLPR)
IADPR=IADLIK+KOL1-KOLDEB
KOL2=MIN (KOLFIN,KOLDR)
Inline de Tscalt
MCT2=MCV-1+KOL1
IF (TYPV(1:1).EQ.TYPM(1:1)) THEN
IF (TYPM(1:1).EQ.'R') THEN
DOTPRO=0.
DO 5 ICOEF=MCM-1+IADPR,MCM-1+IADPR+KOL2-KOL1
DOTPRO=DOTPRO+RSTM(ICOEF)*RSTV(MCT2)
5 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=MAX (IADPR,IADLIK+KOL2-KOLDEB)
Multiplic. pour les plages ne contenant pas
les colonnes KOLPR et KOLDR
DO 10 NUPLM=NUPL1+1,DRPLM
KOLDEB=IPLAGE(1,NUPLM)
IADLIK=LGCUMU+1
LGCUMU=IPLAGE(2,NUPLM)
KOLFIN=KOLDEB+LGCUMU-IADLIK
IF (KOLFIN.GE.KOLDR) GOTO 20
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 9 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLFIN-KOLDEB
DOTPRO=DOTPRO+RSTM(ICOEF)*RSTV(MCT2)
9 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLFIN-KOLDEB
10 CONTINUE
GOTO 99999
Multiplication pour les coeff. de la plage contenant
le colonne KOLDR
20 IF (KOLDR.GE.KOLDEB) THEN
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 11 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLDR-KOLDEB
DOTPRO=DOTPRO+RSTM(ICOEF)*RSTV(MCT2)
11 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLDR-KOLDEB
ENDIF
ELSEIF (TYPM(1:1).EQ.'C') THEN
DOTPRO=0.
DO 205 ICOEF=MCM-1+IADPR,MCM-1+IADPR+KOL2-KOL1
DOTPRO=DOTPRO+CSTM(ICOEF)*CSTV(MCT2)
205 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=MAX(IADPR,IADLIK+KOL2-KOLDEB)
DO 210 NUPLM=NUPL1+1,DRPLM
KOLDEB=IPLAGE(1,NUPLM)
IADLIK=LGCUMU+1
LGCUMU=IPLAGE(2,NUPLM)
KOLFIN=KOLDEB+LGCUMU-IADLIK
IF (KOLFIN.GE.KOLDR) GOTO 220
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 209 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLFIN-KOLDEB
DOTPRO=DOTPRO+CSTM(ICOEF)*CSTV(MCT2)
209 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLFIN-KOLDEB
210 CONTINUE
GOTO 99999
220 IF (KOLDR.GE.KOLDEB) THEN
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 211 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLDR-KOLDEB
DOTPRO=DOTPRO+CSTM(ICOEF)*CSTV(MCT2)
211 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLDR-KOLDEB
ENDIF
ENDIF
ELSEIF (TYPM(1:1).EQ.'C') THEN
DOTPRO=0.
DO 305 ICOEF=MCM-1+IADPR,MCM-1+IADPR+KOL2-KOL1
DOTPRO=DOTPRO+CSTM(ICOEF)*RSTV(MCT2)
305 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=MAX(IADPR,IADLIK+KOL2-KOLDEB)
DO 310 NUPLM=NUPL1+1,DRPLM
KOLDEB=IPLAGE(1,NUPLM)
IADLIK=LGCUMU+1
LGCUMU=IPLAGE(2,NUPLM)
KOLFIN=KOLDEB+LGCUMU-IADLIK
IF (KOLFIN.GE.KOLDR) GOTO 320
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 309 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLFIN-KOLDEB
DOTPRO=DOTPRO+CSTM(ICOEF)*RSTV(MCT2)
309 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLFIN-KOLDEB
310 CONTINUE
GOTO 99999
320 IF (KOLDR.GE.KOLDEB) THEN
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 311 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLDR-KOLDEB
DOTPRO=DOTPRO+CSTM(ICOEF)*RSTV(MCT2)
311 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLDR-KOLDEB
ENDIF
ELSEIF (TYPM(1:1).EQ.'R') THEN
DOTPRO=0.
DO 405 ICOEF=MCM-1+IADPR,MCM-1+IADPR+KOL2-KOL1
DOTPRO=DOTPRO+RSTM(ICOEF)*CSTV(MCT2)
405 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=MAX(IADPR,IADLIK+KOL2-KOLDEB)
DO 410 NUPLM=NUPL1+1,DRPLM
KOLDEB=IPLAGE(1,NUPLM)
IADLIK=LGCUMU+1
LGCUMU=IPLAGE(2,NUPLM)
KOLFIN=KOLDEB+LGCUMU-IADLIK
IF (KOLFIN.GE.KOLDR) GOTO 420
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 409 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLFIN-KOLDEB
DOTPRO=DOTPRO+RSTM(ICOEF)*CSTV(MCT2)
409 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLFIN-KOLDEB
410 CONTINUE
GOTO 99999
420 IF (KOLDR.GE.KOLDEB) THEN
MCT2=MCV-1+KOLDEB
DOTPRO=0.
DO 411 ICOEF=MCM-1+IADLIK,MCM-1+IADLIK+KOLDR-KOLDEB
DOTPRO=DOTPRO+RSTM(ICOEF)*CSTV(MCT2)
411 MCT2=MCT2+1
COEFF=COEFF+DOTPRO
IADDR=IADLIK+KOLDR-KOLDEB
ENDIF
ENDIF
99999 CONTINUE
END !MoLiV
moliv est appelé dans (4 procédures)