[updated 8.Sep.2008]
Librairie assembl > Fichier axterm.f |
SUBROUTINE AXTERM (NMTRM1,NVTRM1,NMDON1,NMTRM2,NVTRM2,NIVIMP)
Auteur : D.Martin (Octobre 1991)
Derniere modification : D.Martin (9 Juin 2000)
Version 1.0.1
Multiplication d'un terme par une constante et resultat dans un autre
La constante multiplicative est la constante associee au terme
(lorsque le nom de la donnee est ' ')
-- Arguments d'entree --
NMTRM1,NVTRM1 nom et niveau du 1er terme
NMDON1 nom de la donnee multiplicative (le cas echeant)
NMTRM2,NVTRM2 nom et niveau du 2nd terme
NIVIMP niveau d'impression du 2nd terme
Remarque : Si les termes different, les attributs du terme resultat sont
ceux du 1er terme de la liste
Le terme resultat n'a pas de constante associee.
INTEGER NVTRM1,NVTRM2,NIVIMP
CHARACTER*(*) NMTRM1,NMTRM2,NMDON1
INCLUDE 'CONTEX'
INCLUDE 'ALLOC'
INTEGER INDASS,INTTYP,INTDON,INTYKL,KLTERM,KELCHN
INTEGER MCMTRM,MCDTRM,LGETRM,NBTERM,INCTRM,NCHTRM
& ,MCMDON,MCDONN,LGEDON,NBDONN,INCDON,NCHDON
& ,ITYDO1,NIVDO1,ITYPD1,LNDON1
& ,NUTERM,IADTRM,NIVEAU,ITTRM1,ITYCA1,NUKAL1,NUDON1
& ,ITYSYM,NVDSMB,NUINCC,NVDUCR,NBNECR,NVNUCR,NUINCL
& ,NVDUCL,NBNECL,NVNULR,INDSTK,NVNUSR,NVCOOR,IATRDO
& ,NIVIMR,LGTRM1,MCTRM1,MCCSTE
& ,MCTRM2,ITTRM2,ITYCA2,NUKAL2
LOGICAL IDMTRM,CRETRM
CHARACTER*8 ERCODE*120,TYPINT,TYTRM1,TYTRM2,TYDON1
COMMON/FORMAH/ERCODE
EQUIVALENCE (ERCODE(113:113),TYTRM1),(ERCODE(105:105),TYTRM2)
& ,(ERCODE(97:97),TYDON1)
CALL PRFXMJ (1,'*AxTerm*')
IDMTRM=NMTRM1.EQ.NMTRM2.AND.NVTRM1.EQ.NVTRM2
CALL TBAR2 (ERCODE,'#OMTRM',1,MCMTRM,'$SDTRM',1,MCDTRM)
CALL SDEXDB (IST(MCDTRM),LGETRM,NBTERM,INCTRM,NCHTRM) !utilite
Recherche des caracteristiques du 1er vecteur
NUTERM=KLTERM (NMTRM1,NVTRM1,AST(MCMTRM),IST(MCDTRM)) !sdexplo
IF (NUTERM.LE.0) CALL ERTERM (1,NMTRM1,NVTRM1) !utilite
IADTRM=MCDTRM+LGETRM+INCTRM*(NUTERM-1)
CALL GETTRM (IST(IADTRM) ,NIVEAU,ITTRM1,ITYCA1,NUKAL1
& ,NUDON1,ITYSYM,NVDSMB,NUINCC,NVDUCR,NBNECR,NVNUCR
& ,NUINCL,NVDUCL,NBNECL,NVNULR,INDSTK,NVNUSR,NVCOOR
& ,IATRDO,NIVIMR) !sdexplo
TYTRM1=TYPINT (ITTRM1) !utilite
CALL TBRR1 (ERCODE,NMTRM1,NVTRM1,LGTRM1)
CALL TBAR2 (ERCODE,'#OMDON',1,MCMDON,'$DONNE',1,MCDONN)
CALL SDEXDB (IST(MCDONN),LGEDON,NBDONN,INCDON,NCHDON) !utilite
Recherche du numero et des caract. de la constante multiplicative
LNDON1=LEN (NMDON1)
ERCODE(1:LNDON1)=' '
IF (NMDON1.NE.ERCODE(1:LNDON1)) THEN
Le nom de la donnee 1 figure dans la liste des arguments,
elle est utilisee dans la multiplication
NUDON1=KELCHN (NMDON1,AST(MCMDON),NBDONN,NCHDON) !sdexplo
IF (NUDON1.LE.0) CALL ERDONN (1,NMDON1) !utilite
CALL SDEXCO (NUDON1,IST(MCDONN),ITYDO1,NIVDO1,ITYPD1) !utilite
La donnee de la liste d'entree DOIT ici etre une constante
IF (ITYDO1.NE.INTDON ('CONSTANTE')) CALL ERDONN (2,NMDON1) !utilite
ENDIF
TYDON1=' '
IF (NUDON1.GT.0) THEN
CALL SDEXCO (NUDON1,IST(MCDONN),ITYDO1,NIVDO1,ITYPD1) !utilite
Le terme peut avoir une donnee associee qui n'est pas une constante
auquel cas elle est ignoree (et remplacee par la constante 1)
IF (ITYDO1.EQ.INTDON ('CONSTANTE')) THEN
TYDON1=TYPINT (ITYPD1) !utilite
ELSE
Si on arrive ici, pas de donnee (donc la constante 1)
NUDON1=0
ENDIF
ENDIF
CALL SDEXCO (NUDON1,IST(MCDONN),ITYDO1,NIVDO1,ITYPD1) !utilite
IF (ITYDO1.NE.INTDON ('CONSTANTE')) CALL ERDONN (2,NMDON1) !utilite
TYTRM2=TYTRM1
IF (TYDON1(1:1).EQ.'C') TYTRM2=TYDON1
ITTRM2=INTTYP (TYTRM2) !utilite
Creation (si necessaire) du 2eme terme
CRETRM=.FALSE.
IF (.NOT.IDMTRM) THEN
ITYCA2=INTYKL ('ASSEMB') !utilite
NUKAL2=-INDASS(' ')
ELSE
ITYCA2=ITYCA1
NUKAL2=-ABS(NUKAL1)
ENDIF
CALL CRTERM (NMTRM2,NVTRM2,LGTRM1,ITTRM2,ITYCA2,NUKAL2
& ,NDFDON,ITYSYM,NVDSMB,NUINCC,NVDUCR,NBNECR,NVNUCR
& ,NUINCL,NVDUCL,NBNECL,NVNULR,INDSTK,NVNUSR
& ,NVCOOR,IATRDO,NIVIMP,IDMTRM,CRETRM) !sdexplo
Report du 1er terme multiplie par la constante dans le second
IF (TYDON1(1:1).EQ.'R') THEN
CALL TBAR2 (ERCODE,'$RCSTE',1,MCCSTE,NMTRM1,NVTRM1,MCTRM1)
ELSEIF (TYDON1(1:1).EQ.'C') THEN
CALL TBAR2 (ERCODE,'$CCSTE',1,MCCSTE,NMTRM1,NVTRM1,MCTRM1)
ELSEIF (TYDON1(1:1).EQ.'E') THEN
CALL TBAR2 (ERCODE,'$ECSTE',1,MCCSTE,NMTRM1,NVTRM1,MCTRM1)
ENDIF
MCTRM2=MCTRM1
IF (.NOT.IDMTRM) CALL TBAR1 (ERCODE,NMTRM2,NVTRM2,MCTRM2)
CALL TEQAT (LGTRM1,TYTRM1,MCTRM1,RST,CST
& ,TYDON1,MCCSTE+NIVDO1,IST,RST,CST
& ,TYTRM2,MCTRM2,RST,CST) !utilite
CALL TBSAVE (NMTRM1,NVTRM1)
IF (.NOT.IDMTRM) CALL TBSAVE (NMTRM2,NVTRM2)
CALL PRFXMJ (-1,'*AxTerm*')
END !AxTerm
axterm est appelé dans (6 procédures)