[updated 10.Nov.2009]

Librairie assembl > Fichier t2term.f

Qui appelle t2term ?

line
      SUBROUTINE T2TERM (NMTRM1,NVTRM1,TRANS,NMTRM2,NVTRM2
     &                  ,NMTRM3,NVTRM3,NIVIMP)
line
  Auteur : D.Martin (Decembre 1998)
  Derniere modification : D.Martin (30 octobre 2006)
  Version 2
 
  Creation d'un terme a partir de deux autres termes
 
 -- Arguments d'entree --
  NMTRM1 nom du 1er terme source
  NVTRM1 niveau du 1er terme source
  TRANS  definition de l'operation
  NMTRM2 nom du 2nd terme source
  NVTRM2 niveau du 2nd terme source
  NMTRM3 nom du terme resultat
  NVTRM3 niveau du terme resultat
  NIVIMP niveau d'impression du terme resultat
 
 -- Operations prevues --
  TRANS : operation
 -- pour des termes matriciels ou vectoriels
  '+'     addition des termes
  '-'     soustraction du second terme au premier
  'CL'    combinaison lineaire
          (avec comme coefficients les constantes associees aux termes)
 
 -- de plus et seulement pour des termes vectoriels
  '[PRODUIT] TENSORIEL' produit tensoriel des 2 termes :
                        T_{i,j} = T_{1,i}*T_{2,j}
  '.*' ou 
  '[PRODUIT] COMPOSANTE [A COMPOSANTE]' produit composante a composante :
                        T_{i} = T_{1,i}*T_{2,i}
  './' ou
  'DIVISION COMPOSANTE [A COMPOSANTE]' produit composante a composante :
                        T_{i} = T_{1,i}/T_{2,i}
  '[PRODUIT] SCALAIRE   produit scalaire par noeud pour des termes vectoriels
                        a inconnue vectorielle :
                        T_{i} = Sum_{i1} T_{1,i,i1}*T_{2,i,i1}
  '[PRODUIT] VECTORIEL  produit vectoriel par noeud pour des termes vectoriels
                        a inconnue vectorielle :
  '[PRODUIT] NOEUD [A NOEUD]' produit noeud a noeud :
                        T_{i,i1} = T_{1,i,i1}*T_{2,i,1}, i1=1, nb valeurs/noeuds
  'DIFFERENCE RELATIVE' difference relative (e.g. calcul d'erreur) :
                        T_{i} = 2* | T_{1,i}-T_{2,i} | / | T_{1,i}+T_{2,i} |
 
  Remarques:
  -- Le terme resultat ne peut coincider avec l'un des termes operandes que si
     l'operation ne modifie pas le type (REEL ou COMPLEXE) ou la structure 
     du terme coincidant
  -- Le terme resultat n'aura pas de constante associee, sauf s'il coincide
     avec un des termes operandes
  -- Si les trois termes different deux a deux, les attributs du terme resultat
     sont ceux du plus petit des deux premiers et du 1er en cas d'egalite
  -- Si les longueurs des termes 1 et 2 different, la combinaison porte sur la
     longueur minimum et un Warning est emis
  -- Si les inconnues des termes 1 et 2 ou leur type  de stockage different,
     un Warning est emis
 
  Modifications anterieures
  D.Martin, C. Chambeyron (21/10/2002) ajout 'Division' coeff. a coeff.
  D.Martin (5/04/2002)
line
      IMPLICIT NONE
      CHARACTER*(*) NMTRM1,NMTRM2,NMTRM3,TRANS
      INTEGER       NVTRM1,NVTRM2,NVTRM3,NIVIMP
 
      INCLUDE 'CONTEX'
      INCLUDE 'ALLOC'
 
      INTEGER INDASS,INDSTO,INTDON,INTTYP,INTYKL,KLTERM
      INTEGER ITYPT1,ITYCA1,NUKAL1,NUDON1,NVALN1,NVDSM1,NUINC1,NVDUC1
     &       ,NBNEC1,NVNUC1,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTO1,NVSTO1
     &       ,NVCOO1,IATRD1,NUTER1,ITYDO1,NIVDO1,ITYPD1,MCCST1,LGTRM1
     &       ,NCATR1,MCTRM1
     &       ,ITYPT2,ITYCA2,NUKAL2,NUDON2,NVALN2,NVDSM2,NUINC2,NVDUC2
     &       ,NBNEC2,NVNUC2,NUINL2,NVDUL2,NBNEL2,NVNUL2,INSTO2,NVSTO2
     &       ,NVCOO2,IATRD2,NUTER2,ITYDO2,NIVDO2,ITYPD2,MCCST2,LGTRM2
     &       ,MCTRM2,NCATR2
     &       ,MCMTRM,MCDTRM,LGETRM,NBTERM,INCTRM,NCHTRM,LENTRA,INTCOM
     &       ,MCDONN,ADTERM,NCATR0,INSTOK,NIVIMR,NIVEAU
     &       ,ITYPTR,ITYCAL,NUKALE,NVALN3,LGTRM3,MCTRM3,NUMERR  
      REAL    SEUIL,SOMME,VALMX1,VALMX2,EPSIL
      COMPLEX CVAL
      LOGICAL CRETRM,IDMTR1,IDMTR2,COMLIN
      CHARACTER     TYPINT*8,UPPERC*32,WTRANS*32,OPERA*2
      CHARACTER*8   TYTRM1,TYTRM2,TYTRM3,TYDON1,TYDON2
      CHARACTER     ERCODE*120
      COMMON/FORMAH/ERCODE
line
      CALL PRFXMJ (1,'*T2Term*')
      LENTRA=LEN (TRANS)
      WTRANS=UPPERC (TRANS)
      INTCOM=INTTYP ('COMPLEXE')
      CRETRM=.FALSE.
 
      IF (NIVIMP.GE.0.AND.IMPSDR.GT.0) THEN
         CALL PRNTRM (NMTRM3,NVTRM3,ERCODE,NCATR1)
         WRITE (IMPSDR,10000) ERCODE(1:NCATR1)
      ENDIF
 
      CALL TBAR2  (ERCODE,'#OMTRM',1,MCMTRM,'$SDTRM',1,MCDTRM)
      CALL SDEXDB (IST(MCDTRM),LGETRM,NBTERM,INCTRM,NCHTRM)             !utilite
 
      Caracteristiques des termes source
 
      NUTER1=KLTERM (NMTRM1,NVTRM1,AST(MCMTRM),IST(MCDTRM))             !sdexplo
      IF (NUTER1.LE.0) CALL ERTERM (1,NMTRM1,NVTRM1)                    !utilite
      ADTERM=MCDTRM+LGETRM+INCTRM*(NUTER1-1)
      CALL GETTRM (IST(ADTERM)  ,NIVEAU,ITYPT1,ITYCA1,NUKAL1,NUDON1
     &            ,NVALN1,NVDSM1,NUINC1,NVDUC1,NBNEC1,NVNUC1,NUINL1
     &            ,NVDUL1,NBNEL1,NVNUL1,INSTO1,NVSTO1,NVCOO1,IATRD1
     &            ,NIVIMR)                                              !sdexplo
      TYTRM1=TYPINT (ITYPT1)
 
      NUTER2=KLTERM (NMTRM2,NVTRM2,AST(MCMTRM),IST(MCDTRM))             !sdexplo
      IF (NUTER2.LE.0) CALL ERTERM (1,NMTRM2,NVTRM2)                    !utilite
      ADTERM=MCDTRM+LGETRM+INCTRM*(NUTER2-1)
      CALL GETTRM (IST(ADTERM)  ,NIVEAU,ITYPT2,ITYCA2,NUKAL2,NUDON2
     &            ,NVALN2,NVDSM2,NUINC2,NVDUC2,NBNEC2,NVNUC2,NUINL2
     &            ,NVDUL2,NBNEL2,NVNUL2,INSTO2,NVSTO2,NVCOO2,IATRD2
     &            ,NIVIMR)                                              !sdexplo
      TYTRM2=TYPINT (ITYPT2)
 
      CALL TBRR2  (ERCODE,NMTRM1,NVTRM1,LGTRM1,NMTRM2,NVTRM2,LGTRM2)
 
      IDMTR1=NMTRM1.EQ.NMTRM3.AND.NVTRM1.EQ.NVTRM3
      IDMTR2=NMTRM2.EQ.NMTRM3.AND.NVTRM2.EQ.NVTRM3
      ITYCAL= INTYKL ('ASSEMB')                                         !utilite
      NUKALE=-INDASS (' ')                                              !utilite
      INSTOK=0
      TYTRM3=TYTRM1
      IF (TYTRM2(1:2).EQ.'CO') TYTRM3=TYTRM2
 
      TYDON1=' '
      TYDON2=' '
 
      OPERA=' '
      COMLIN=.FALSE.
      IF (LENTRA.EQ.6.AND.WTRANS(1:LENTRA).EQ.'SOMME') THEN
         WTRANS='+'
      ELSEIF (LENTRA.EQ.10.AND.WTRANS(1:LENTRA).EQ.'DIFFERENCE') THEN
         WTRANS='-'
      ELSEIF (INDEX(WTRANS,'COMPOSANTE').GT.0) THEN
         OPERA='.*'
         IF (INDEX(WTRANS,'DIVISION').GT.0) OPERA='./'
         WTRANS='COMPOSANTE'
      ELSEIF (WTRANS.EQ.'.*'.OR.WTRANS.EQ.'./') THEN
         OPERA=WTRANS
         WTRANS='COMPOSANTE'
      ENDIF
 
      IF (WTRANS(1:1).EQ.'+'.OR.WTRANS(1:1).EQ.'-') THEN
 
         CALL WATERS (NMTRM1,NVTRM1,NUINC1,NUINL1,NVALN1,INSTO1,LGTRM1
     &               ,NMTRM2,NVTRM2,NUINC2,NUINL2,NVALN2,INSTO2,LGTRM2)
         COMLIN=.TRUE.
 
      ELSEIF (WTRANS(1:2).EQ.'CL'.OR.INDEX(WTRANS,'LINEAIRE').GT.0) THEN
 
         WTRANS='CL'
         Compatibilite des attributs des termes combines
         (meme(s) inconnue(s), meme type de stockage, meme longueur) ?
         CALL WATERS (NMTRM1,NVTRM1,NUINC1,NUINL1,NVALN1,INSTO1,LGTRM1
     &               ,NMTRM2,NVTRM2,NUINC2,NUINL2,NVALN2,INSTO2,LGTRM2)
         CALL TBAR1  (ERCODE,'$DONNE',1,MCDONN)
         IF (NUDON1.GT.0) THEN
            CALL SDEXCO (NUDON1,IST(MCDONN),ITYDO1,NIVDO1,ITYPD1)       !utilite
            IF (ITYDO1.EQ.INTDON ('CONSTANTE')) TYDON1=TYPINT (ITYPD1)  !utilite
            IF (TYDON1(1:2).EQ.'CO') TYTRM3=TYDON1
         ENDIF
         IF (NUDON2.GT.0) THEN
            CALL SDEXCO (NUDON2,IST(MCDONN),ITYDO2,NIVDO2,ITYPD2)       !utilite
            IF (ITYDO2.EQ.INTDON ('CONSTANTE')) TYDON2=TYPINT (ITYPD2)  !utilite
            IF (TYDON2(1:2).EQ.'CO') TYTRM3=TYDON2
         ENDIF
         IF (TYDON1(1:1).EQ.' '.AND.TYDON2(1:1).EQ.' ') WTRANS='+'
         COMLIN=.TRUE.
 
      ELSEIF (WTRANS(1:19).EQ.'DIFFERENCE RELATIVE') THEN
 
         NUMERR=6
         IF (TYTRM1.NE.TYTRM2) GOTO 99990
         CALL WATERS (NMTRM1,NVTRM1,NUINC1,NUINL1,NVALN1,INSTO1,LGTRM1
     &               ,NMTRM2,NVTRM2,NUINC2,NUINL2,NVALN2,INSTO2,LGTRM2) !utilite
         TYTRM3='REEL'
         COMLIN=.TRUE.
 
      ELSEIF (INDEX(WTRANS,'COMPOSANTE').GT.0) THEN
         NUMERR=9
         IF (IDMTR1.OR.IDMTR2) GOTO 99990
         CALL WATERS (NMTRM1,NVTRM1,NUINC1,NUINL1,NVALN1,INSTO1,LGTRM1
     &               ,NMTRM2,NVTRM2,NUINC2,NUINL2,NVALN2,INSTO2,LGTRM2)
         NUMERR=7
         IF (LGTRM1.NE.LGTRM2.AND.INSTO1.NE.INSTO2) GOTO 99990
         IF (NUINC1.NE.NDFINC) THEN
            NUINL1=NUINC1
            NVDUL1=NVDUC1
            NBNEL1=NBNEC1
            NVNUL1=NVNUC1
         ENDIF
 
      ELSEIF (INDEX(WTRANS,'NOEUD').GT.0) THEN
 
         WTRANS='NOEUD'
         NUMERR=9
         IF (IDMTR1.OR.IDMTR2) GOTO 99990
         IF (NVALN1.EQ.NVALN2) THEN
           WTRANS='COMPOSANTE'
           OPERA='.*'   
           CALL WATERS (NMTRM1,NVTRM1,NUINL1,NUINC1,NVALN1,INSTO1,LGTRM1
     &                ,NMTRM2,NVTRM2,NUINL2,NUINC2,NVALN2,INSTO2,LGTRM2)!utilite
           NUMERR=7
           IF (LGTRM1.NE.LGTRM2.AND.INSTO1.NE.INSTO2) GOTO 99990
         ELSE
           CALL WATERS (NMTRM1,NVTRM1,NUINL1,NUINC1,NVALN1,INSTO1,LGTRM1
     &                ,NMTRM2,NVTRM2,NUINL2,NUINC2,NVALN1,INSTO2,LGTRM1)!utilite
         ENDIF
         IF (NUINC1.NE.NDFINC) THEN
            NUINL1=NUINC1
            NVDUL1=NVDUC1
            NBNEL1=NBNEC1
            NVNUL1=NVNUC1
         ENDIF
         IF (NUINC2.NE.NDFINC) THEN
            NUINL2=NUINC2
            NVDUL2=NVDUC2
            NBNEL2=NBNEC2
            NVNUL2=NVNUC2
         ENDIF
 
      ELSEIF (INDEX(WTRANS,'SCALAIRE').GT.0) THEN
 
         WTRANS='SCALAIRE'
         NUMERR=9
         IF (IDMTR1.OR.IDMTR2) GOTO 99990
         IF (NVALN1.LE.1) CALL ERTERM (31,NMTRM1,NVTRM1)
         IF (NVALN2.LE.1) CALL ERTERM (31,NMTRM2,NVTRM2)
         NUMERR=8
         IF (NVALN1.NE.NVALN2) GOTO 99990
         CALL WATERS (NMTRM1,NVTRM1,NUINL1,NUINL1,NVALN1,INSTO1,LGTRM1
     &               ,NMTRM2,NVTRM2,NUINC2,NUINC2,NVALN2,INSTO2,LGTRM2)
         Les termes sont a priori des vecteurs colonne, mais ...
         IF (NUINC1.NE.NDFINC) THEN
            NUINL1=NUINC1
            NVDUL1=NVDUC1
            NBNEL1=NBNEC1
            NVNUL1=NVNUC1
         ENDIF
         IF (NUINC2.NE.NDFINC) THEN
            NUINL2=NUINC2
            NVDUL2=NVDUC2
            NBNEL2=NBNEC2
            NVNUL2=NVNUC2
         ENDIF
         NUMERR=4
         IF (LGTRM1.NE.LGTRM2.AND.INSTO1.NE.INSTO2) GOTO 99990
 
      ELSEIF (INDEX(WTRANS,'TENSORIEL').GT.0) THEN
 
         WTRANS='TENSORIEL'
         NUMERR=9
         IF (IDMTR1.OR.IDMTR2) GOTO 99990
         Le 1er est a priori un vecteur colonne, mais ...
         IF (NUINC1.NE.NDFINC) THEN
            NUINL1=NUINC1
            NVDUL1=NVDUC1
            NBNEL1=NBNEC1
            NVNUL1=NVNUC1
         ENDIF
         Le 2nd est a priori un vecteur ligne, mais ...
         IF (NUINL2.NE.NDFINC) THEN
            NUINC2=NUINL2
            NVDUC2=NVDUL2
            NBNEC2=NBNEL2
            NVNUC2=NVNUL2
         ENDIF
         INSTOK=INDSTO ('PLEIN-L')
 
      ELSEIF (INDEX(WTRANS,'VECTORIEL').GT.0) THEN
 
         WTRANS='VECTORIEL'
         NUMERR=9
         IF (IDMTR1.OR.IDMTR2) GOTO 99990
         NVALN3=0
         IF (NVALN1.EQ.3.OR.NVALN2.EQ.3) THEN
            NVALN3=3
         ELSEIF (NVALN1.EQ.2.AND.NVALN2.EQ.2) THEN
            NVALN3=1
         ELSE
            CALL BAISE ('Produit vectoriel : cas non prevu')
         ENDIF
         Les termes sont a priori des vecteurs colonne, mais ...
         IF (NUINC1.NE.NDFINC) THEN
            NUINL1=NUINC1
            NVDUL1=NVDUC1
            NBNEL1=NBNEC1
            NVNUL1=NVNUC1
         ENDIF
         IF (NUINC2.NE.NDFINC) THEN
            NUINL2=NUINC2
            NVDUL2=NVDUC2
            NBNEL2=NBNEC2
            NVNUL2=NVNUC2
         ENDIF
 
      ELSE
 
         GOTO 99991
 
      ENDIF
 
      Type du terme resultat
 
      ITYPTR= INTTYP (TYTRM3)                                           !utilite
      CRETRM=.FALSE.
      IF (COMLIN) THEN
 
         Cas d'une combinaison lineaire
 
         IF (.NOT.(IDMTR2)) THEN
            IF (.NOT.(IDMTR1)) THEN
            Creation (si necessaire) du vecteur resultat
               IF (LGTRM1.LE.LGTRM2) THEN
                 LGTRM3=LGTRM1
                 CALL CRTERM (NMTRM3,NVTRM3,LGTRM1,ITYPTR,ITYCAL
     &                       ,NUKALE,NDFDON,NVALN1,NVDSM1
     &                       ,NUINC1,NVDUC1,NBNEC1,NVNUC1
     &                       ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTO1
     &                       ,NVSTO1,NVCOO1,IATRD1,NIVIMP,IDMTR1,CRETRM)!sdexplo
               ELSE
                 LGTRM3=LGTRM2
                 CALL CRTERM (NMTRM3,NVTRM3,LGTRM2,ITYPTR,ITYCAL
     &                       ,NUKALE,NDFDON,NVALN2,NVDSM2
     &                       ,NUINC2,NVDUC2,NBNEC2,NVNUC2
     &                       ,NUINL2,NVDUL2,NBNEL2,NVNUL2,INSTO2
     &                       ,NVSTO2,NVCOO2,IATRD2,NIVIMP,IDMTR2,CRETRM)!sdexplo
               ENDIF
            ELSE
               Le Terme resultat coincide avec le premier terme
               LGTRM3=LGTRM1
               IF (ITYPT1.NE.ITYPTR) CALL ERTERM (3,NMTRM1,NVTRM1)      !utilite
               CALL TBAR1  (ERCODE,'$SDTRM',1,MCDTRM)
               ADTERM=MCDTRM+LGETRM+INCTRM*(NUTER1-1)
               CALL PUTTRM (IST(ADTERM),NVTRM3,ITYPTR,ITYCAL
     &                     ,NUKALE,NUDON1,NVALN1,NVDSM1
     &                     ,NUINC1,NVDUC1,NBNEC1,NVNUC1
     &                     ,NUINL1,NVDUL1,NBNEL1,NVNUL1
     &                     ,INSTO1,NVSTO1,NVCOO1,IATRD1,NIVIMP)         !sdexplo
            ENDIF
         ELSE
            LGTRM3=LGTRM2
            Le Terme resultat coincide avec le second
            IF (ITYPT2.NE.ITYPTR) CALL ERTERM (3,NMTRM1,NVTRM1)         !utilite
            CALL TBAR1  (ERCODE,'$SDTRM',1,MCDTRM)
            ADTERM=MCDTRM+LGETRM+INCTRM*(NUTER2-1)
            CALL PUTTRM (IST(ADTERM),NVTRM3,ITYPTR,ITYCAL
     &                  ,NUKALE,NUDON2,NVALN2,NVDSM2
     &                  ,NUINC2,NVDUC2,NBNEC2,NVNUC2
     &                  ,NUINL2,NVDUL2,NBNEL2,NVNUL2
     &                  ,INSTO2,NVSTO2,NVCOO2,IATRD2,NIVIMP)            !sdexplo
         ENDIF
      ELSE
         IF (WTRANS(1:9).EQ.'TENSORIEL') THEN
            CALL CRTERM (NMTRM3,NVTRM3,LGTRM1*LGTRM2,ITYPTR,ITYCAL
     &                  ,NUKALE,NDFDON,NDFSYM,NDFDSM
     &                  ,NUINC2,NVDUC2,NBNEC2,NVNUC2
     &                  ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTOK,NDFSTO
     &                  ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)           !sdexplo
         ELSEIF (WTRANS(1:10).EQ.'COMPOSANTE') THEN
            CALL CRTERM (NMTRM3,NVTRM3,LGTRM1,ITYPTR,ITYCAL
     &                  ,NUKALE,NDFDON,NVALN1,NDFDSM
     &                  ,NDFINC,NDFDUM,1     ,NDFNUM
     &                  ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTOK,NDFSTO
     &                  ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)           !sdexplo
         ELSEIF (WTRANS(1:5).EQ.'NOEUD') THEN
            IF (NVALN2.LT.NVALN1) THEN
               CALL CRTERM (NMTRM3,NVTRM3,LGTRM1,ITYPTR,ITYCAL
     &                     ,NUKALE,NDFDON,NVALN1,NDFDSM
     &                     ,NDFINC,NDFDUM,1     ,NDFNUM
     &                     ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTOK,NDFSTO
     &                     ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)        !sdexplo
            ELSE
               CALL CRTERM (NMTRM3,NVTRM3,LGTRM2,ITYPTR,ITYCAL
     &                     ,NUKALE,NDFDON,NVALN2,NDFDSM
     &                     ,NDFINC,NDFDUM,1     ,NDFNUM
     &                     ,NUINL2,NVDUL2,NBNEL2,NVNUL2,INSTOK,NDFSTO
     &                     ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)        !sdexplo
            ENDIF
         ELSEIF (WTRANS(1:8).EQ.'SCALAIRE') THEN
            CALL CRTERM (NMTRM3,NVTRM3,NBNEL1,ITYPTR,ITYCAL
     &                  ,NUKALE,NDFDON,1     ,NDFDSM
     &                  ,NDFINC,NDFDUM,1     ,NDFNUM
     &                  ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTOK,NDFSTO
     &                  ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)           !sdexplo
         ELSEIF (WTRANS(1:9).EQ.'VECTORIEL') THEN
            CALL CRTERM (NMTRM3,NVTRM3,NBNEL1*NVALN3,ITYPTR,ITYCAL
     &                  ,NUKALE,NDFDON,NVALN3,NDFDSM
     &                  ,NDFINC,NDFDUM,1     ,NDFNUM
     &                  ,NUINL1,NVDUL1,NBNEL1,NVNUL1,INSTOK,NDFSTO
     &                  ,NDFCOR,0     ,NIVIMP,.FALSE.,CRETRM)           !sdexplo
         ENDIF
      ENDIF
 
      Adresses des operandes de l'operation
 
      CALL TBAR2  (ERCODE,NMTRM1,NVTRM1,MCTRM1,NMTRM2,NVTRM2,MCTRM2)
      MCTRM3=MCTRM1
      IF (IDMTR2) MCTRM3=MCTRM2
      IF (.NOT.(IDMTR1.OR.IDMTR2))
     &   CALL TBAR1  (ERCODE,NMTRM3,NVTRM3,MCTRM3)
 
      Operation proprement dite
 
      IF (WTRANS(1:1).EQ.'+') THEN
 +
         ERCODE='somme'
         NCATR0=5
         CALL TPLUST (LGTRM3,TYTRM1,MCTRM1,RST,CST
     &               ,TYTRM2,MCTRM2,RST,CST,TYTRM3,MCTRM3,RST,CST)      !utilite
 
      ELSEIF (WTRANS(1:1).EQ.'-') THEN
 -
         ERCODE='difference'
         NCATR0=10
         CALL TMOINT (LGTRM3,TYTRM1,MCTRM1,RST,CST
     &               ,TYTRM2,MCTRM2,RST,CST,TYTRM3,MCTRM3,RST,CST)      !utilite
 
      ELSEIF (WTRANS(1:2).EQ.'CL') THEN
 cl
         ERCODE='combinaison lineaire'
         NCATR0=20
         MCCST1=0
         IF (TYDON1(1:1).EQ.'R') THEN
            CALL TBAR1  (ERCODE,'$RCSTE',1,MCCST1)
         ELSEIF (TYDON1(1:1).EQ.'C') THEN
            CALL TBAR1  (ERCODE,'$CCSTE',1,MCCST1)
         ELSEIF (TYDON1(1:1).EQ.'E') THEN
            CALL TBAR1  (ERCODE,'$ECSTE',1,MCCST1)
         ENDIF
         MCCST2=MCCST1
         IF (TYDON2(1:1).NE.TYDON1(1:1)) THEN
            IF (TYDON2(1:1).EQ.'R') THEN
               CALL TBAR1  (ERCODE,'$RCSTE',1,MCCST2)
            ELSEIF (TYDON2(1:1).EQ.'C') THEN
               CALL TBAR1  (ERCODE,'$CCSTE',1,MCCST2)
            ELSEIF (TYDON2(1:1).EQ.'E') THEN
               CALL TBAR1  (ERCODE,'$ECSTE',1,MCCST2)
            ENDIF
         ENDIF
         IF (IDMTR2) THEN
            t2 = a2.t2 (si a2 existe)
            IF (NUDON2.GT.0)
     &      CALL TEQAT  (LGTRM3,TYTRM2,MCTRM2,RST,CST,TYDON2
     &                  ,MCCST2+NIVDO2,IST,RST,CST
     &                  ,TYTRM2,MCTRM2,RST,CST)                         !utilite
            IF (NUDON1.GT.0) THEN
               t2 = (a2.)t2 + a1.t1
               CALL TPLUAT (LGTRM3,TYTRM2,MCTRM2,RST,CST
     &                     ,TYDON1,MCCST1+NIVDO1,IST,RST,CST
     &                     ,TYTRM1,MCTRM1,RST,CST
     &                     ,TYTRM2,MCTRM2,RST,CST)                      !utilite
            ELSE
               t2 = (a2.)t2 + t1
               CALL TPLUST (LGTRM3,TYTRM2,MCTRM2,RST,CST
     &                     ,TYTRM1,MCTRM1,RST,CST
     &                     ,TYTRM2,MCTRM2,RST,CST)                      !utilite
            ENDIF
         ELSE
            IF (NUDON1.GT.0) THEN
               t3 = a1.t1
               CALL TEQAT  (LGTRM3,TYTRM1,MCTRM1,RST,CST
     &                     ,TYDON1,MCCST1+NIVDO1,IST,RST,CST
     &                     ,TYTRM3,MCTRM3,RST,CST)                      !utilite
            ELSEIF (.NOT.IDMTR1) THEN
               t3 = t1
               CALL TDANST (LGTRM3,TYTRM1,MCTRM1,IST,RST,CST
     &                     ,TYTRM3,MCTRM3,IST,RST,CST)                  !utilite
            ENDIF
            IF (NUDON2.GT.0) THEN
               t3 = (a1.)t1 + a2.t2
               CALL TPLUAT (LGTRM3,TYTRM3,MCTRM3,RST,CST
     &                     ,TYDON2,MCCST2+NIVDO2,IST,RST,CST
     &                     ,TYTRM2,MCTRM2,RST,CST
     &                     ,TYTRM3,MCTRM3,RST,CST)                      !utilite
            ELSE
               t3 = (a1.)t1 + t2
               CALL TPLUST (LGTRM3,TYTRM3,MCTRM3,RST,CST
     &                     ,TYTRM2,MCTRM2,RST,CST
     &                     ,TYTRM3,MCTRM3,RST,CST)                      !utilite
            ENDIF
         ENDIF
 
      ELSEIF (WTRANS(1:19).EQ.'DIFFERENCE RELATIVE') THEN
 
         ERCODE='difference relative'
         NCATR0=19
         EPSIL=5.E-2
 
         Module maximum dans les tableaux
         CALL TNORMX (LGTRM3,TYTRM1,MCTRM1,IST,RST,CST,VALMX1)          !utilite
         CALL TNORMX (LGTRM3,TYTRM2,MCTRM2,IST,RST,CST,VALMX2)          !utilite
         IF (VALMX2.GT.VALMX1) VALMX1=VALMX2
         SEUIL=EPSIL*VALMX1
 
         IF (TYTRM1(1:4).EQ.'REEL') THEN
           DO 112 ADTERM=MCTRM3,MCTRM3+LGTRM3-1
              SOMME=ABS(RST(MCTRM1)+RST(MCTRM2))
              RST(ADTERM)=ABS(RST(MCTRM1)-RST(MCTRM2))
              IF (SOMME.GT.SEUIL) RST(ADTERM)=2.*RST(ADTERM)/SOMME
              MCTRM1=MCTRM1+1
              MCTRM2=MCTRM2+1
112        CONTINUE
         ELSEIF (TYTRM1(1:4).EQ.'COMP') THEN
           DO 114 ADTERM=MCTRM3,MCTRM3+LGTRM3-1
              SOMME=ABS(CST(MCTRM1)+CST(MCTRM2))
              RST(ADTERM)=ABS(CST(MCTRM1)-CST(MCTRM2))
              IF (SOMME.GT.SEUIL) RST(ADTERM)=2.*RST(ADTERM)/SOMME
              MCTRM1=MCTRM1+1
              MCTRM2=MCTRM2+1
114        CONTINUE
         ENDIF
 
      ELSEIF (WTRANS(1:10).EQ.'COMPOSANTE') THEN
 
         IF (OPERA(1:2).EQ.'.*') THEN
            (Pour des raisons sans doute historiques, la procedure TCOCOT
            cumule le resultat du produit dans le tableau cible (3)
            d'ou la necessite de la mise a zero prealable ...)
 
            CALL TAZERO (LGTRM1,TYTRM3,MCTRM3,AST,IST,RST,CST)          !utilite
            NCATR0=34
            ERCODE='.* produit composante a composante'
            CALL TCOCOT (LGTRM1,TYTRM1,MCTRM1,RST,CST
     &                         ,TYTRM2,MCTRM2,RST,CST
     &                         ,TYTRM3,MCTRM3,RST,CST)                  !utilite
         ELSEIF (OPERA(1:2).EQ.'./') THEN
            NCATR0=35
            ERCODE='./ division composante a composante'
            CALL TCOCOD (LGTRM1,TYTRM1,MCTRM1,RST,CST
     &                         ,TYTRM2,MCTRM2,RST,CST
     &                         ,TYTRM3,MCTRM3,RST,CST)                  !utilite
         ENDIF
 
      ELSEIF (WTRANS(1:5).EQ.'NOEUD') THEN
 
         ERCODE='produit noeud a noeud'
         NCATR0=2
         (Pour des raisons sans doute historiques, la procedure TNENET
          cumule le resultat du produit dans le tableau cible (3)
          d'ou la necessite de la mise a zero prealable ...)
         IF (NVALN2.LT.NVALN1) THEN
            CALL TAZERO (LGTRM1,TYTRM3,MCTRM3,AST,IST,RST,CST)          !utilite
            CALL TNENET (NBNEL1,NVALN1,TYTRM1,MCTRM1,RST,CST
     &                         ,NVALN2,TYTRM2,MCTRM2,RST,CST
     &                         ,TYTRM3,MCTRM3,RST,CST)                  !utilite
         ELSE
            CALL TAZERO (LGTRM2,TYTRM3,MCTRM3,AST,IST,RST,CST)          !utilite
            CALL TNENET (NBNEL2,NVALN2,TYTRM2,MCTRM2,RST,CST
     &                         ,NVALN1,TYTRM1,MCTRM1,RST,CST
     &                         ,TYTRM3,MCTRM3,RST,CST)                  !utilite
         ENDIF
 
      ELSEIF (WTRANS(1:9).EQ.'TENSORIEL') THEN
 
         ERCODE='produit tensoriel'
         NCATR0=17
         CALL TTENST (LGTRM1,TYTRM1,MCTRM1,RST,CST
     &               ,LGTRM2,TYTRM2,MCTRM2,RST,CST
     &                      ,TYTRM3,MCTRM3,RST,CST)                     !utilite
 
      ELSEIF (WTRANS(1:8).EQ.'SCALAIRE') THEN
 
         ERCODE='produit scalaire par noeud'
         NCATR0=26
         IF (TYTRM3.EQ.'REEL') THEN
            DO 222 ADTERM=MCTRM3,MCTRM3+NBNEL1-1
               CALL TSCALT (NVALN1,TYTRM1,MCTRM1,RST,CST
     &                            ,TYTRM2,MCTRM2,RST,CST,CVAL)
               RST(ADTERM)=REAL(CVAL)
               MCTRM1=MCTRM1+NVALN1
               MCTRM2=MCTRM2+NVALN1
222         CONTINUE
         ELSE
            DO 224 ADTERM=MCTRM3,MCTRM3+NBNEL1-1
               CALL TSCALT (NVALN1,TYTRM1,MCTRM1,RST,CST
     &                            ,TYTRM2,MCTRM2,RST,CST,CST(ADTERM))
               MCTRM1=MCTRM1+NVALN1
               MCTRM2=MCTRM2+NVALN2
224         CONTINUE
         ENDIF
 
      ELSEIF (WTRANS(1:9).EQ.'VECTORIEL') THEN
 
         ERCODE='produit vectoriel par noeud'
         NCATR0=27
         DO 234 ADTERM=MCTRM3,MCTRM3+NBNEL1*NVALN3-1,NVALN3
            CALL TVECTT (NVALN1,TYTRM1,MCTRM1,RST,CST
     &                  ,NVALN2,TYTRM2,MCTRM2,RST,CST
     &                         ,TYTRM3,ADTERM,RST,CST)
            MCTRM1=MCTRM1+NVALN1
            MCTRM2=MCTRM2+NVALN2
234      CONTINUE
 
      ENDIF
 
      IF (NIVIMP.GE.0.AND.IMPSDR.GT.0) THEN
         CALL PRNTRM (NMTRM1,NVTRM1,ERCODE(NCATR0+1:),NCATR1)
         CALL PRNTRM (NMTRM2,NVTRM2,ERCODE(NCATR0+NCATR1+1:),NCATR2)
         WRITE (IMPSDR,10010) ERCODE(1:NCATR0)
     &                       ,ERCODE(NCATR0+1:NCATR0+NCATR1)
     &                    ,ERCODE(NCATR0+NCATR1+1:NCATR0+NCATR1+NCATR2)
      ENDIF
 
      CALL TBSAVE (NMTRM1,NVTRM1)
      CALL TBSAVE (NMTRM2,NVTRM2)
      CALL TBSAVE (NMTRM3,NVTRM3)
      CALL PRFXMJ (-1,'*T2Term*')
      RETURN
line
10000 FORMAT(/T2,'*T2Term* Terme ',A)
10010 FORMAT(T11,A,' du terme ',A,' et du terme ',A)
line
99990 CALL PRNTRM (NMTRM1,NVTRM1,ERCODE,NCATR1)
      CALL PRNTRM (NMTRM2,NVTRM2,ERCODE(NCATR1+1:),NCATR2)
      WRITE (*,*) 'Operation ',ERCODE(1:NCATR1),', ',TRANS
     &,', ',ERCODE(NCATR1+1:NCATR1+NCATR2)
      CALL ERTERS (NUMERR,NMTRM1,NVTRM1,NMTRM2,NVTRM2)
99991 ERCODE=TRANS
      CALL PRNTRM (NMTRM1,NVTRM1,ERCODE(LENTRA+1:),NCATR1)
      CALL PRNTRM (NMTRM2,NVTRM2,ERCODE(LENTRA+NCATR1+1:),NCATR2)
      CALL BAISE ('Operation non prevue : '
     &//ERCODE (LENTRA+1:LENTRA+NCATR1)//','//ERCODE(1:LENTRA)//','
     &//ERCODE (LENTRA+NCATR1+1:LENTRA+NCATR1+NCATR2)//'.')
line
 -- File history
  Version 2 : D.Martin (30 octobre 2006)
  - oublie d'un CALL BAISE pour le cas du PRODUIT VECTORIEL
  - correction de syntaxe : le mot PRODUIT est a nouveau optionnel dans 
    [PRODUIT] COMPOSANTE [A COMPOSANTE] comme indique en commentaire!
  Version 1.0.8 : D.Martin (12 novembre 2002)
line
                                                                    END !T2Term
line
top

t2term est appelé dans (11 procédures)

clterm.f (assembl) gettrm-calls.txt lap_neu_gc.f (A_1lap_neuman)
lap_neu_mult.f (A_1lap_neuman) lap_neu_penal.f (A_1lap_neuman) ppcdperio.f (A_cond_period)
ppgalbrun.f (A_galbrun) pphelmz3_s.f (E_4helmz3d) pplap2d.f (A_laplace2d)
pplap3_s.f (E_2laplace3d) t1term.f (assembl)  

top