[updated 3.Nov.2008]
Librairie syslin > Fichier gcprep.f |
SUBROUTINE GCPREP (NMMATR,NVMATR,NMSCMB,NVSCMB,NMPREC,NVPREC
& ,NMSOLU,NVSOLU,NBLIGN,TYMATR,ITYSYM,INSTOK
& ,NMSTOK,NVSTOK,TYSCMB,TYPREC,NUFACT
& ,INDSTP,NMSTOP,NVSTOP,TYSOLU,NM2MMB,NV2MMB
& ,NBVAUX,NBFACT,OKFACT,MCWORK,MCMATR
& ,MCSTOK,MCPREC,MCSTOP,MC2MMB,MCSOLU,NIVIMP)
Auteur : D.Martin (7 Juillet 1997)
Derniere modification : D.Martin (3 novembre 2008)
Version 3
Preparation d'un systeme lineaire pour resolution par une methode de
Gradient Conjugue avec ou sans Preconditionnement.
(sous-procedure de Gbct, Gcj, Gcs)
-- Arguments d'entree --
NMMATR,NVMATR nom,niveau de la matrice du systeme stockee Bimorse ou Morse
NMSCMB,NVSCMB nom,niveau du second membre
NMPREC,NVPREC nom,niveau de la matrice de precond. Bimorse,Morseou Profil
(NMPREC=' ' pour le cas sans preconditionnement)
NMSOLU,NVSOLU nom, niveau de la solution
NBLIGN rang du systeme lineaire
TYMATR type de la matrice
ITYSYM type de symetrie de la matrice du systeme
INSTOK type de stockage de la matrice du systeme
NMSTOK,NVSTOK nom,niveau du tableau de stockage de la matrice du systeme
TYSCMB type du second membre
TYPREC type de la matrice de preconditionnement
NUFACT numero de type de factorisation de la matrice de preconditionnement
INDSTP type de stockage de la matrice de preconditionnement
NMSTOP,NVSTOP nom,niveau du tableau de stockage de la matrice de precond.
TYSOLU type de la solution
NM2MMB,NV2MMB nom,niveau du second membre intermediaire
NBVAUX nombre de vecteurs auxiliaires
NBFACT nombre de type de factorisation autorise
OKFACT numeros de type de factorisation autorises
MCWORK adresse du tableau contenant les vecteurs auxiliaires
MCMATR adresse de la matrice du systeme
MCSTOK adresse du tableau de stockage de la matrice du systeme
MCPREC adresse de la matrice de preconditionnement
MCSTOP adresse du tableau de stockage de la matrice de preconditionnement
MC2MMB adresse du tableau contenant le second membre intermediaire
MCSOLU adresse du tableau contenant la solution
NIVIMP niveau d'impression
IMPLICIT NONE
CHARACTER*(*) NMMATR,NMSCMB,NMPREC,NMSOLU,TYMATR,NMSTOK,TYSCMB
& ,TYPREC,NMSTOP,TYSOLU,NM2MMB,OKFACT(*)
INTEGER NVMATR,NVSCMB,NVPREC,NVSOLU,NIVIMP,NBLIGN,ITYSYM
& ,INSTOK,NVSTOK,NUFACT,INDSTP,NVSTOP,NV2MMB,NBVAUX
& ,NBFACT,MCWORK,MCMATR,MCSTOK,MCPREC,MCSTOP,MC2MMB
& ,MCSOLU
INCLUDE 'ALLOC'
INCLUDE 'CONTEX'
INTEGER INDFAC,INDSTO,INTYKL,INTTYP
INTEGER MCDTRM,LGETRM,NBTERM,INCTRM,NCHTRM
& ,NVDSMA,NUINLM,NCPINL,NVDULA,NBNELM,NVNULM,NVCOMA,NVDSSC
& ,NVDUSC,NBNESC,NVNUSC,ITFACT,NBSCMB,ITSOLU,I
CHARACTER ERCODE*120,STODLN*6
COMMON/FORMAH/ERCODE
CALL PRFXMJ (1,'*GCprep*')
CALL TBAR1 (ERCODE,'$SDTRM',1,MCDTRM)
CALL SDEXDB (IST(MCDTRM),LGETRM,NBTERM,INCTRM,NCHTRM) !SDexplo
Caracteristiques du systeme et de la matrice de preconditionnement
CALL SYPREP (NMMATR,NVMATR,NMSCMB,NVSCMB,NMPREC,NVPREC,TYMATR
& ,ITYSYM,NVDSMA,NUINLM,NCPINL,NVDULA,NBNELM,NVNULM
& ,INSTOK,NVSTOK,NVCOMA,TYSCMB,NVDSSC,NVDUSC,NBNESC
& ,NVNUSC,TYPREC,ITFACT,NUFACT,INDSTP,NVSTOP,NBLIGN) !Syslin
NMSTOK = STODLN (INSTOK, NCPINL, NCPINL)
IF (NMSTOK(1:4).EQ.'&BMO') THEN
NBLIGN=NBNELM*NCPINL
IF (NVDSMA.NE.NDFDSM.AND.NUINLM.EQ.NDFINC) NBLIGN=NBNELM
ELSEIF (NMSTOK(1:4).EQ.'&PLA') THEN
NBLIGN=NBNELM*NCPINL
ELSE
CALL ERTERM (18,NMMATR,NVMATR) !Utilite
ENDIF
CALL TBRR2 (ERCODE,NMMATR,NVMATR,MCMATR,NMSTOK,NVSTOK,MCSTOK)
IF (NMPREC(1:1).NE.' ') THEN
IF (ITFACT.NE.INTYKL ('FACTOR'))
& CALL ERTERM (14,NMPREC,NVPREC) !Utilite
DO 10 I=1,NBFACT
IF (NUFACT.EQ.INDFAC (OKFACT(I))) GOTO 11
10 CONTINUE
CALL ERTERM (19,NMPREC,NVPREC) !Utilite
11 IF (INDSTP.EQ.INSTOK) THEN
NMSTOP = NMSTOK
ELSE
NMSTOP = STODLN (INDSTP, NCPINL, NCPINL) !utilite
ENDIF
CALL TBRR2 (ERCODE,NMPREC,NVPREC,MCPREC,NMSTOP,NVSTOP,MCSTOP)
ENDIF
Vecteur solution
TYSOLU=TYSCMB
IF (TYMATR(:1).EQ.'C'.OR.TYPREC(:1).EQ.'C') TYSOLU='COMPLEXE'
NBSCMB=1
CALL SOPREP (NMSCMB,NVSCMB,NBSCMB,TYSCMB,NVDSSC,NVDUSC,NBNESC
& ,NVNUSC,NMSOLU,NVSOLU,TYSOLU,NUINLM,NCPINL,NVDULA
& ,NBNELM,NVNULM,NVCOMA,NIVIMP,NVDSMA,NM2MMB,NV2MMB) !Syslin
ITSOLU=INTTYP (TYSOLU) !Utilite
Creation des vecteurs de travail pour les iterations de gradient
CALL TBCREE ('$WORK$',0,ITSOLU,NBVAUX*NBLIGN,'c')
MCPREC=0
MCSTOP=0
CALL TBAR5 (ERCODE,NMMATR,NVMATR,MCMATR,NMSOLU,NVSOLU,MCSOLU
& ,NMSTOK,NVSTOK,MCSTOK
& ,'$WORK$',0,MCWORK,NM2MMB(:NCHTRM),NV2MMB,MC2MMB)
IF (NMPREC(1:1).NE.' ')
& CALL TBAR2 (ERCODE,NMPREC,NVPREC,MCPREC,NMSTOP,NVSTOP,MCSTOP)
CALL TAZERO (NBVAUX*NBLIGN,TYSOLU,MCWORK,AST,IST,RST,CST) !Utilite
CALL PRFXMJ (-1,'*GCprep*')
-- File history
Version 3 : D.Martin (08 octobre/03 novembre 2008)
Changement de nom des structures en DL (appel de STODLN)
Version 2 : D.Martin (13 Octobre 1997)
END !GCprep
gcprep est appelé dans (3 procédures)