[updated 8.Sep.2008]
Librairie syslin > Fichier gbct.f |
SUBROUTINE GBCT (NMMATR,NVMATR,NMSCMB,NVSCMB,NMPREC,NVPREC
& ,EPSIL,MXITER,NMSOLU,NVSOLU,NIVIMP,*)
Auteur : D.Martin (Juillet 1990)
Derniere modification : D.Martin (24 Janvier 2001)
Version 1.0.1
Resolution d'un systeme lineaire reel ou complexe par la methode du
Gradient BiConjugue avec ou sans Preconditionnement.
-- Arguments d'entree --
NMMATR nom du tableau contenant la matrice stockee Bimorse ou Morse
NVMATR son niveau
NMSCMB nom du tableau contenant le second membre
NVSCMB son niveau
NMPREC nom de la matrice de preconditionnement stockee Bimorse,Morse
ou Profil (Poser NMPREC=' ' pour le cas sans preconditionnement)
NVPREC son niveau
EPSIL seuil de d'arret des iterations de gradient
MXITER nombre maximum d'iterations de gradient
Si nul on choisit 30% du nombre de lignes de la matrice
NMSOLU nom du tableau contenant la solution
NVSOLU son niveau
NIVIMP niveau d'impression pour la solution
(*) etiquette de retour en cas de non-convergence
IMPLICIT NONE
CHARACTER*(*) NMMATR,NMPREC,NMSCMB,NMSOLU
INTEGER NVMATR,NVSCMB,NVPREC,MXITER,NVSOLU,NIVIMP
REAL EPSIL
INCLUDE 'ALLOC'
INCLUDE 'CONTEX'
INTEGER INDFAC
CHARACTER FACIND*3
INTEGER NBVAUX,NBFACT,NBITER,NBLIGN,ITYSYM,INDSTK,NUFACT
& ,INDSTP,NV2MMB,MCMATR,MCSTOK,MCPREC,MCSTOP,MC2MMB
& ,MCSOLU,MCWORK,IRETUR,NVSTOK,NVSTOP,MAXITE
REAL RESIDU
CHARACTER ERCODE*120,FACTOK
CHARACTER*3 OKFACT
CHARACTER*8 TYMATR,TYSCMB,TYPREC,TYSOLU,NM2MMB
CHARACTER*6 NMSTOK,NMSTOP
COMMON/FORMAH/ERCODE
EQUIVALENCE (ERCODE(49:49),OKFACT),(ERCODE(57:57),NMSTOP)
& ,(ERCODE(65:65),NMSTOK),(ERCODE(73:73),TYPREC)
& ,(ERCODE(81:81),TYMATR),(ERCODE(89:89),TYSCMB)
& ,(ERCODE(97:97),TYSOLU),(ERCODE(105:105),NM2MMB)
CALL PRFXMJ (1,'*GbCt *')
FACTOK='N'
NBVAUX = 5
NBFACT = 1
OKFACT = 'L.U'
CALL GCPREP (NMMATR,NVMATR,NMSCMB,NVSCMB,NMPREC,NVPREC
& ,NMSOLU,NVSOLU,NBLIGN
& ,TYMATR,ITYSYM,INDSTK,NMSTOK,NVSTOK
& ,TYSCMB,TYPREC,NUFACT,INDSTP,NMSTOP,NVSTOP
& ,TYSOLU,NM2MMB,NV2MMB,NBVAUX,NBFACT,OKFACT,MCWORK
& ,MCMATR,MCSTOK,MCPREC,MCSTOP,MC2MMB,MCSOLU,NIVIMP) !syslin
IF (NUFACT.EQ.INDFAC (OKFACT))
& FACTOK='Y'
MAXITE=MXITER
IF (MAXITE.LE.0) THEN
MAXITE=MAX(10,40*NBLIGN/100)
IF (NBLIGN.LE.200) MAXITE=NBLIGN
ENDIF
IF (NMSTOK(1:4).EQ.'&BMO') THEN
IF (NMPREC(1:1).NE.' ') THEN
IF (FACTOK.EQ.'Y') THEN
IF (INDSTP.EQ.INDSTK) THEN
Matrice BiMorse - Precond. L.U incomplet BiMorse
CALL GBTBB1 (MAXITE,EPSIL,ITYSYM
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,IST(MCSTOP),TYPREC,MCPREC,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ELSEIF (NMSTOP(1:4).EQ.'&PRO') THEN
Matrice BiMorse - Precond. L.U Profil
CALL GBTBP1 (MAXITE,EPSIL,ITYSYM
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,IST(MCSTOP),TYPREC,MCPREC,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ENDIF
ENDIF
ELSE
Matrice BiMorse - Sans Preconditionnement
CALL GBTB (MAXITE,EPSIL,ITYSYM
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ENDIF
ELSEIF (NMSTOK.EQ.'&PLAGE') THEN
IF (NMPREC(1:1).NE.' ') THEN
IF (FACTOK.EQ.'Y') THEN
IF (INDSTP.EQ.INDSTK) THEN
Matrice Morse-L - Precond. L.U incomplet Morse-L
CALL GBTMM1 (MAXITE,EPSIL
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,IST(MCSTOP),TYPREC,MCPREC,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ELSEIF (NMSTOP.EQ.'&BMORS') THEN
Matrice Morse-L - Precond. L.U incomplet BiMorse
CALL GBTMB1 (MAXITE,EPSIL
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,IST(MCSTOP),TYPREC,MCPREC,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ELSEIF (NMSTOP(1:4).EQ.'&PRO') THEN
Matrice Morse-L - Precond. L.U Profil
CALL GBTMP1 (MAXITE,EPSIL
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,IST(MCSTOP),TYPREC,MCPREC,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ENDIF
ENDIF
ELSE
Matrice Morse-L - Sans Preconditionnement
CALL GBTM (MAXITE,EPSIL
& ,IST(MCSTOK),TYMATR,MCMATR,TYSCMB,MC2MMB
& ,TYSOLU,MCSOLU
& ,MCWORK,MCWORK+NBLIGN,MCWORK+2*NBLIGN
& ,MCWORK+3*NBLIGN,MCWORK+4*NBLIGN
& ,RST,CST,NBITER,RESIDU
& ,NIVIMP,IMPSDR) !syslin
ENDIF
ELSE
CALL ERTERM (18,NMMATR,NVMATR) !utilite
ENDIF
IRETUR=0
OKFACT=' '
IF (NMPREC.NE.' ') OKFACT=FACIND(NUFACT)
CALL GCFINA (NMMATR,NVMATR,NMSCMB,NVSCMB,NMPREC,NVPREC
& ,NMSOLU,NVSOLU,NBLIGN
& ,'Gradient Biconjugue',OKFACT
& ,NMSTOK,NVSTOK,NMSTOP,NVSTOP,NM2MMB,NV2MMB
& ,NBITER,MAXITE,RESIDU,NIVIMP,IMPPAL,IMPSDR,IRETUR) !syslin
CALL PRFXMJ (-1,'*GbCt *')
IF (IRETUR.EQ.1) RETURN 1
RETURN
END !GbCt
gbct est appelé dans