[updated 23.Jan.2001]
Librairie syslin > Fichier rsbml1.f |
SUBROUTINE RSBML1 (RANG,NULAPL,IPLAGE,TYPM,MCT,TYPB,MCB
& ,TYPX,MCX,RST,CST)
Auteur : D.Martin (Novembre 91)
Derniere modification : D.Martin (15 Novembre 1991)
Version 1.0.0
Resolution du systeme L1xX=B ou L1 est une matrice triangulaire inferieure
a diagonale unite stockee BiMorse.
-- Arguments d'entree --
RANG nombre de lignes de la matrice
NULAPL tableau des numeros de derniere ligne des plages
IPLAGE numeros de debut de plage et longueurs cumulees des plages
TYPM type ('REEL' ou 'COMPLEXE') de L1
MCT adresse (dans le s-t du bon type) de la matrice triang. inferieure L1
TYPB type ('REEL' ou 'COMPLEXE') de B
MCB adresse (dans le s-t du bon type) du second membre B
TYPX type ('REEL' ou 'COMPLEXE') de X
MCX adresse (dans le s-t du bon type) de la solution X
MCX peut etre egal a MCB (auquel cas on doit avoir TYPX = TYPB)
RST tableau (cas reel) contenant la matrice L1 a l'adresse MCT,
le 2nd membre a l'adresse MCB et le vecteur solution a l'adresse MCX
CST idem mais dans le cas complexe
IMPLICIT NONE
CHARACTER*(*) TYPM,TYPB,TYPX
INTEGER RANG,NULAPL(*),IPLAGE(2,*),MCT,MCB,MCX
REAL RST(*)
COMPLEX CST(*)
INTEGER NUPRPL,NUDRPL,NUMPL,LGCUMU,LGCUAV,KOLDEB,KOLFIN
& ,MCCOEF,LIGNM1,LIGNE,MCX1,MCXX,IST
REAL RCOEFF
COMPLEX CCOEFF
EQUIVALENCE (CCOEFF,RCOEFF)
IF (MCX.NE.MCB.OR.TYPX(1:1).NE.TYPB(1:1))
& CALL TDANST (RANG,TYPB,MCB,IST,RST,CST,TYPX,MCX,IST,RST,CST)
NUDRPL=0
LGCUAV=1
LIGNM1=1
MCX1=MCX+1
MCCOEF=MCT
IF (TYPX(1:1).EQ.TYPM(1:1)) THEN
IF (TYPX(1:1).EQ.'C') THEN
DO 44 LIGNE=2,RANG
CCOEFF=0.
NUPRPL=NUDRPL
NUDRPL=NULAPL(LIGNM1)
DO 43 NUMPL=NUPRPL+1,NUDRPL
LGCUMU=IPLAGE(2,NUMPL)
KOLDEB=IPLAGE(1,NUMPL)
KOLFIN=KOLDEB+LGCUMU-LGCUAV
LGCUAV=LGCUMU+1
DO 43 MCXX=MCX-1+KOLDEB,MCX-1+KOLFIN
CCOEFF=CCOEFF+CST(MCCOEF)*CST(MCXX)
MCCOEF=MCCOEF+1
43 CONTINUE
CST(MCX1)=CST(MCX1)-CCOEFF
MCX1=MCX1+1
LIGNM1=LIGNE
44 CONTINUE
ELSE
DO 22 LIGNE=2,RANG
RCOEFF=0.
NUPRPL=NUDRPL
NUDRPL=NULAPL(LIGNM1)
DO 21 NUMPL=NUPRPL+1,NUDRPL
LGCUMU=IPLAGE(2,NUMPL)
KOLDEB=IPLAGE(1,NUMPL)
KOLFIN=KOLDEB+LGCUMU-LGCUAV
LGCUAV=LGCUMU+1
DO 21 MCXX=MCX-1+KOLDEB,MCX-1+KOLFIN
RCOEFF=RCOEFF+RST(MCCOEF)*RST(MCXX)
MCCOEF=MCCOEF+1
21 CONTINUE
RST(MCX1)=RST(MCX1)-RCOEFF
MCX1=MCX1+1
LIGNM1=LIGNE
22 CONTINUE
ENDIF
ELSEIF (TYPX(1:1).EQ.'C') THEN
DO 24 LIGNE=2,RANG
CCOEFF=0.
NUPRPL=NUDRPL
NUDRPL=NULAPL(LIGNM1)
DO 23 NUMPL=NUPRPL+1,NUDRPL
LGCUMU=IPLAGE(2,NUMPL)
KOLDEB=IPLAGE(1,NUMPL)
KOLFIN=KOLDEB+LGCUMU-LGCUAV
LGCUAV=LGCUMU+1
DO 23 MCXX=MCX-1+KOLDEB,MCX-1+KOLFIN
CCOEFF=CCOEFF+RST(MCCOEF)*CST(MCXX)
MCCOEF=MCCOEF+1
23 CONTINUE
CST(MCX1)=CST(MCX1)-CCOEFF
MCX1=MCX1+1
LIGNM1=LIGNE
24 CONTINUE
ELSE
CALL BAISE ('*RsBmL1* Incompatibilite entre le type COMPLEXE'
& //' de la matrice et le type REEL de la solution')
ENDIF
END *RsBmL1
rsbml1 est appelé dans (7 procédures)