[updated 23.Mar.2010]

Librairie assembl > Fichier matmat.f

line
      SUBROUTINE MATMAT (NMMATG,NVMATG,NMMATD,NVMATD
     &                  ,NMPROD,NVPROD,NIVIMP)
line
  Auteur : D.Martin (Juin 2008)
  Derniere modification : D.Martin (8 decembre 2009)
  Version 1
 
  Multiplication MG * ML : Matrice quelconque x Matrice quelconque
 
  N.B. Tous les types de stockage ne sont pas encore;>) envisages;
       actuellement l'une au moins des matrices est supposée stockee pleine
 
 -- Arguments d'entree --
  NMMATG nom du terme matriciel operande à gauche MG
  NVMATG son niveau 
  NMMATD nom du terme matriciel operande à droite ML
  NVMATD son niveau
  NMPROD nom du terme matriciel resultat du produit MG * ML
  NVPROD niveau du terme resultat
  NIVIMP niveau d'impression du terme resultat
line
      IMPLICIT NONE
      CHARACTER*(*) NMMATG,NMMATD,NMPROD
      INTEGER       NVMATG,NVMATD,NVPROD,NIVIMP
 
      INCLUDE 'CONTEX'
      INCLUDE 'ALLOC'
 
      INTEGER INDASS,INDSTO,INTYKL,INTTYP,KLTERM
      INTEGER MCMTRM,MCDTRM,LGETRM,NBTERM,INCTRM,NCHTRM,NUTERM,ADTERM
     &       ,ITYPMG,ITYCAL,NUKALE,NUDONN,ITYSMG,NVDSMG,NUICMG,NVDCMG
     &       ,NBCOLG,NVNCMG,NUILMG,NVDLMG,NBLIGG,NVNLMG,INDSTG,NVSTOG
     &       ,IATRDG,LGMATG,MCMATG,MCSTOG,NVCOOR
     &       ,ITYPTD,ITYCAD,NUKALD,NUDOND,ITYSMD,NVDSMD,NUICMD,NVDCMD
     &       ,NBCOLD,NVNCMD,NUILMD,NVDLMD,NBLIGD,NVNLMD,INDSTD,NVSTOD
     &       ,IATRDD,LGMATD,MCMATD,MCSTOD
     &       ,ITYPTR,LGPROD,MCPROD,INSTOK,NVSTOK,MCSTOK
     &       ,NIVIMR,NIVEAU,NCATR1,NCATR2,NCATR3
      LOGICAL IDMTRM, CRETRM 
      CHARACTER   PRFXAS*8,TYPINT*8
      CHARACTER*6 STOCHN,NMSTOG,NMSTOD,NMSTOK
      CHARACTER*8 TYMATG,TYMATD,TYPROD
      CHARACTER   MULTIG,MULTID,ERCODE*120
      COMMON/FORMAH/ERCODE
line
      CALL PRFXMJ (1,'*MatMat*')
      CRETRM=.TRUE.
      IDMTRM=.FALSE.
 
      IF (NIVIMP.GE.0.AND.IMPSDR.GT.0) THEN
         CALL PRNTRM (NMPROD,NVPROD,ERCODE,NCATR1)
         CALL PRNTRM (NMMATG,NVMATG,ERCODE(NCATR1+1:),NCATR2)
         CALL PRNTRM (NMMATD,NVMATD,ERCODE(NCATR1+NCATR2+1:),NCATR3)
         WRITE (IMPSDR,10000) PRFXAS (0),ERCODE(1:NCATR1)
     &         ,ERCODE(NCATR1+1:NCATR1+NCATR2)
     &         ,ERCODE(NCATR1+NCATR2+1:NCATR1+NCATR2+NCATR3)
      ENDIF
 
      CALL TBAR2  (ERCODE,'#OMTRM',1,MCMTRM,'$SDTRM',1,MCDTRM)
      CALL SDEXDB (IST(MCDTRM),LGETRM,NBTERM,INCTRM,NCHTRM)             !utilite
 
      Caracteristiques de la matrice operande a gauche
 
      NUTERM=KLTERM (NMMATG,NVMATG,AST(MCMTRM),IST(MCDTRM))             !sdexplo
      IF (NUTERM.LE.0) CALL ERTERM (1,NMMATG,NVMATG)                    !utilite
      ADTERM=MCDTRM+LGETRM+INCTRM*(NUTERM-1)
      CALL GETTRM (IST(ADTERM)  ,NIVEAU,ITYPMG,ITYCAL,NUKALE,NUDONN
     &            ,ITYSMG,NVDSMG,NUICMG,NVDCMG,NBCOLG,NVNCMG,NUILMG
     &            ,NVDLMG,NBLIGG,NVNLMG,INDSTG,NVSTOG,NVCOOR,IATRDG
     &            ,NIVIMR)                                              !sdexplo
      TYMATG=TYPINT (ITYPMG)
      MULTIG='N'
      IF (NVDSMG.NE.NDFDSM.AND.NUICMG.EQ.NDFINC.AND.NUILMG.EQ.NDFINC) 
     &   MULTIG='Y'
      NMSTOG=STOCHN (INDSTG)
 
      Caracteristiques de vecteur (matrice diagonale, operande a droite)
 
      NUTERM=KLTERM (NMMATD,NVMATD,AST(MCMTRM),IST(MCDTRM))             !sdexplo
      IF (NUTERM.LE.0) CALL ERTERM (1,NMMATD,NVMATD)                    !utilite
      ADTERM=MCDTRM+LGETRM+INCTRM*(NUTERM-1)
      CALL GETTRM (IST(ADTERM)  ,NIVEAU,ITYPTD,ITYCAL,NUKALD,NUDOND
     &            ,ITYSMD,NVDSMD,NUICMD,NVDCMD,NBCOLD,NVNCMD,NUILMD
     &            ,NVDLMD,NBLIGD,NVNLMD,INDSTD,NVSTOD,NVCOOR,IATRDD
     &            ,NIVIMR)                                              !sdexpl
      TYMATD=TYPINT (ITYPTD)
      MULTID='N'
      IF (NVDSMD.NE.NDFDSM.AND.NUICMD.EQ.NDFINC.AND.NUILMD.EQ.NDFINC) 
     &   MULTID='Y'
      NMSTOD=STOCHN (INDSTD)

      IF (MULTIG.EQ.'Y'.OR.MULTID.EQ.'Y') GOTO 99991
      IF (NBCOLG.NE.NBLIGD) CALL ERTERS (7,NMMATG,NVMATG,NMMATD,NVMATD) !utilite
 
      Type, longueur de la matrice resultat
 
      TYPROD=TYMATG
      IF (TYMATD(1:2).EQ.'CO') TYPROD=TYMATD
      ITYPTR= INTTYP (TYPROD)                                           !utilite
 
      Si l'une des matrices operandes est PLEINE
      la matrice resultat est stockee PLEIN-C
 
      INSTOK=INDSTO('PLEIN-C')
      NMSTOK='PLEINC'
      IF (NMSTOD.EQ.'PLEINL') THEN
         Matrice à droite PLEINE
         NVSTOK=NDFSTO
         LGPROD=NBLIGG*NBCOLD
      ELSEIF (NMSTOG.EQ.'PLEINL') THEN
         Matrice à gauche PLEINE
         NVSTOK=NDFSTO
         LGPROD=NBLIGG*NBCOLD
      ELSE
         GOTO 99992
      ENDIF
 
      CALL TBRR2  (ERCODE,NMMATD,NVMATD,LGMATD,NMMATG,NVMATG,LGMATG)
      IF (NMSTOG(1:2).NE.'PL') CALL TBRR1 (ERCODE,NMSTOG,NVSTOG,MCSTOK)      
      IF (NMSTOD(1:2).NE.'PL') CALL TBRR1 (ERCODE,NMSTOD,NVSTOG,MCSTOK)      
      ITYCAL= INTYKL ('ASSEMB')                                         !utilite
      NUKALE=-INDASS (' ')                                              !utilite
      MCSTOG=0
      IF (NMSTOG(1:2).NE.'PL') CALL TBAR1 (ERCODE,NMSTOG,NVSTOG,MCSTOG)
      MCSTOD=0
      IF (NMSTOD(1:2).NE.'PL') CALL TBAR1 (ERCODE,NMSTOD,NVSTOD,MCSTOD)
 
      CALL CRTERM (NMPROD,NVPROD,LGPROD,ITYPTR,ITYCAL,NUKALE,NDFDON
     &            ,NDFSYM,NVDSMD
     &            ,NUICMD,NVDCMD,NBCOLD,NVNCMD
     &            ,NUILMG,NVDLMG,NBLIGG,NVNLMG,INSTOK,NDFSTO,NDFCOR
     &            ,IATRDG,NIVIMP,IDMTRM,CRETRM)                         !sdexplo
 
 --   Adresse des operandes et du tableau de pointeurs de la matrice
 
      CALL TBAR3  (ERCODE,NMMATD,NVMATD,MCMATD,NMMATG,NVMATG,MCMATG
     &                   ,NMPROD,NVPROD,MCPROD)
 
      IF (NMSTOD.EQ.'PLEINL') THEN
 
         Matrice a gauche quelconque, Matrice a droite stockee PLEIN_L
 
         CALL MATMPC(NBLIGG,NBCOLG
     &              ,NMSTOG,MCSTOG,ITYSMG,TYMATG,MCMATG
     &              ,NBCOLD,TYMATD,MCMATD
     &              ,TYPROD,MCPROD,IST,RST,CST)
      ELSE IF (NMSTOG.EQ.'PLEINL') THEN
      
         Matrice a gauche stockee PLEIN_L, Matrice a droite quelconque
 
         On pourrait calculer le produit des transposées, puis transposer
         le resultat obtenu
 
         GOTO 99992
      ENDIF
      
      IF (NIVIMP.GT.0) CALL PRTERM (NMPROD,NVPROD,NIVIMP,IMPSDR)        !prsd
 
      CALL TBSAVE (NMMATG,NVMATG)
      CALL TBSAVE (NMMATD,NVMATD)
      CALL TBSAVE (NMPROD,NVPROD)
      CALL PRFXMJ (-1,'*MatMat*')
      RETURN
line
10000 FORMAT(/T2,A8,' Produit matrice x matrice ',A:
     &/T11,'matrice ',A,' * matrice ',A)
line
99991 NCATR1=0
      CALL PRNTRM (NMMATG,NVMATG,ERCODE(NCATR1+1:),NCATR2)
      CALL PRNTRM (NMMATD,NVMATD,ERCODE(NCATR1+NCATR2+1:),NCATR3)
      CALL BAISE  (' Multiplication matrice x matrice non prevue'
     &//' pour des matrices non-uni-inconnue : '
     &//ERCODE(NCATR1+1:NCATR1+NCATR2)//' et '
     &//ERCODE(NCATR1+NCATR2+1:NCATR1+NCATR2+NCATR3))
99992 NCATR1=0
      CALL PRNTRM (NMMATG,NVMATG,ERCODE(NCATR1+1:),NCATR2)
      CALL PRNTRM (NMMATD,NVMATD,ERCODE(NCATR1+NCATR2+1:),NCATR3)
      CALL BAISE  (' Multiplication matrice x matrice non prevue'
     &//' pour le stockage '//NMSTOG(1:6)//' de la  matrice '
     &//ERCODE(NCATR1+1:NCATR1+NCATR2)
     &//' ou le stockage '//NMSTOD(1:6)//' de la matrice '
     &//ERCODE(NCATR1+NCATR2+1:NCATR1+NCATR2+NCATR3))
line
 -- File history
  Version 1 : D.Martin (8 decembre 2009)
  oups ! nombre de lignes et colonnes intervertis dans CRTERM
  Version 0 : D.Martin (16 juin 2009)
line
                                                                    END !MatMat
line
top