[updated 16.Jun.2009]
Librairie multmat > Fichier matmpc.f |
SUBROUTINE MATMPC (NBLIGN,NBCOLO,NMSTOK,MCSTOK,ITYSYM,TYMATR
& ,MCMATR,NBCOPL,TYMAPL,MCMAPL,TYRESU,MCRESU
& ,IST,RST,CST)
Auteurs : D.Martin (Fevrier 1997)
Derniere modification : D.Martin (14 decembre 2006)
Version 2
Calcul du produit R = A * P d'une matrice A par une matrice pleine P
(operande a droite)
La matrice (operande a gauche) peut etre stockee sous forme
'MORSE-Ligne', 'MORSE-Colonne', 'BIMORSE', 'PROFIL',
'PLEIN-L' ou 'PLEIN-C'.
et dans les cas 'BIMORSE' et 'PROFIL', elle peut etre
'SYMETRIQUE', 'AUTOADJOINTE', 'ANTISYMETRIQUE' ou 'ANTIADJOINTE'.
La matrice pleine, operande a droite, et la matrice pleine resultat
sont rangees a la fortran (PLEIN-C : colonne apres colonne).
On suppose que la matrice R est adressee dans le super-tableau du bon type.
-- Arguments d'entree --
NBLIGN nombre de lignes de la matrice A et de la matrice resultat R
NBCOLO nombre de colonnes de la matrice A et de lignes de la matrice pleine P
NMSTOK nom du type de stockage de la matrice A
MCSTOK adresse du tableau de stockage de la matrice A (le cas echeant).
ITYSYM indicateur de symetrie de la matrice A
TYMATR type (reel ou complexe) de la matrice A
MCMATR adresse de la diagonale de la matrice A dans le super-tableau ad hoc
NBCOPL nombre de colonnes de la matrice pleine P et de colonnes du resultat R
TYMAPL type (reel ou complexe) de la matrice pleine P (operande a droite)
MCMAPL adresse de la matrice pleine P (operande a droite)
TYRESU type (reel ou complexe) de la matrice resultat R
MCRESU adresse de la matrice resultat R
IST,RST,CST super-tableau considere entier, reel ou complexe
-- Procedures appelees -- (autres que sdexplo & Utiliter)
BMVC /multmat multiplication matrice (stockage Bimorse) x vecteur
MOVC /multmat multiplication matrice (stockage Morse-L) x vecteur
MOTVC /multmat multiplication matrice (stockage Morse-C) x vecteur
PRVC /multmat multiplication matrice (stockage Profil) x vecteur
PLXPL /multmat multiplication matrice pleine x matrice pleine
IMPLICIT NONE
CHARACTER*(*) NMSTOK,TYMATR,TYMAPL,TYRESU
INTEGER NBLIGN,NBCOLO,MCSTOK,ITYSYM,MCMATR,NBCOPL,MCMAPL
INTEGER MCRESU,IST(*)
REAL RST(*)
COMPLEX CST(*)
CHARACTER AST
INTEGER INDSTO
INTEGER ITMATR,ITMAPL,MCMAP1,MCRES1,MCPLAL,MCPLIL,MCPLAU,MCPLIU
& ,MCLENV,MCUENV,LGL,LGU,NBC,NBL,MCL,NBP,NBPLAL,NBPLAU,I
CALL PRFXMJ (1,'*MatMPc*')
Initialisation du resultat
CALL TAZERO (NBLIGN*NBCOPL,TYRESU,MCRESU,AST,IST,RST,CST) !utilite
MCMAP1=MCMAPL
MCRES1=MCRESU
IF (NMSTOK(1:4).EQ.'&BMO') THEN
CALL EXBMOR (MCSTOK,IST(MCSTOK),NBL,NBPLAL,MCPLAL,MCPLIL,LGL
& ,NBC,NBPLAU,MCPLAU,MCPLIU,LGU) !sdexplo
MCL=MCMATR+MIN(NBL,NBC)
Matrice a gauche stockee BiMorse
MCMAP1=MCMAPL
DO 10 I=1,NBCOPL
CALL BMVC (NBLIGN,IST(MCPLAL),IST(MCPLIL)
& ,NBCOLO,IST(MCPLAU),IST(MCPLIU)
& ,ITYSYM,TYMATR,MCMATR,MCL,MCL+LGL
& ,TYMAPL,MCMAP1,TYRESU,MCRES1,RST,CST) !multmat
MCMAP1=MCMAP1+NBCOLO
MCRES1=MCRES1+NBLIGN
10 CONTINUE
ELSEIF (NMSTOK(1:4).EQ.'&PLA') THEN
CALL EXMORS (MCSTOK,IST(MCSTOK),NBL,NBC,NBP,MCPLAL,MCPLIL,LGL) !sdexplo
Matrice a gauche stockee Morse-L : par ligne
MCMAP1=MCMAPL
DO 20 I=1,NBCOPL
CALL MOVC (NBLIGN,NBCOLO,IST(MCPLAL),IST(MCPLIL)
& ,TYMATR,MCMATR,TYMAPL,MCMAP1,TYRESU,MCRES1
& ,RST,CST) !multmat
MCMAP1=MCMAP1+NBCOLO
MCRES1=MCRES1+NBLIGN
20 CONTINUE
ELSEIF (NMSTOK(1:4).EQ.'&EGA') THEN
CALL EXMORS (MCSTOK,IST(MCSTOK),NBC,NBL,NBP,MCPLAL,MCPLIL,LGL) !sdexplo
Matrice a gauche stockee Morse-C : par colonne
MCMAP1=MCMAPL
DO 30 I=1,NBCOPL
CALL MOTVC (NBCOLO,NBLIGN,IST(MCPLAL),IST(MCPLIL)
& ,TYMATR,MCMATR,TYMAPL,MCMAP1,TYRESU,MCRES1
& ,RST,CST) !multmat
MCMAP1=MCMAP1+NBCOLO
MCRES1=MCRES1+NBLIGN
30 CONTINUE
ELSEIF (NMSTOK(1:4).EQ.'&PRO') THEN
CALL EXPROF (MCSTOK,IST(MCSTOK),NBL,MCLENV,LGL,NBC,MCUENV,LGU) !sdexplo
MCL=MCMATR+MIN(NBL,NBC)
Matrice a gauche stockee Profil
MCMAP1=MCMAPL
DO 40 I=1,NBCOPL
CALL PRVC (NBLIGN,IST(MCLENV),NBCOLO,IST(MCUENV)
& ,ITYSYM,TYMATR,MCMATR,MCL,MCL+LGL
& ,TYMAPL,MCMAP1,TYRESU,MCRES1,RST,CST) !multmat
MCMAP1=MCMAP1+NBCOLO
MCRES1=MCRES1+NBLIGN
40 CONTINUE
ELSEIF (NMSTOK(1:6).EQ.'PLEINL') THEN
Matrice a gauche Pleine, rangement par ligne
CALL PLXPL (TYMATR,NBLIGN,NBCOLO,'PLEIN-L',MCMATR
& ,TYMAPL,NBCOPL,'PLEIN-C',MCMAPL,'PLEIN-C',MCRESU
& ,RST,CST) !multmat
ELSEIF (NMSTOK(1:6).EQ.'PLEINC') THEN
Matrice a gauche Pleine, rangement par colonne 'a la fortran'
CALL PLXPL (TYMATR,NBLIGN,NBCOLO,'PLEIN-C',MCMATR
& ,TYMAPL,NBCOPL,'PLEIN-C',MCMAPL,'PLEIN-C',MCRESU
& ,RST,CST) !multmat
ENDIF
CALL PRFXMJ (-1,'*MatMPc*')
-- File history
Version 2 : D.Martin (14 decembre 2006)
- utilise la routine PLXPL
Version 1 : D.Martin (3 Juillet 1997)
END !MatMPc
matmpc est appelé dans (4 procédures)