psdilu
C PSDILU SOURCE CHAT 05/01/13 02:37:23 5004 $ DINV, $ Z,R) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : PSDILU C DESCRIPTION : C PSDILU solves the linear system Mz = r C M is a preconditionning matrix written as : C M=(D+LA)D-1(D+UA) C It is the D-ILU incomplete factorization of matrix A C (computed in medilu.eso) C LA and UA correspond to the strictly lower and strictly C upper part of the matrix A. C Ax=b is a system we wish to solve by an iterative method. C C A is stored in Compressed Row Storage (CRS, i.e. Morse) C In DINV, the INVERSE of the diagonal elements D C of the D-ILU factorisation are stored. C They are calculated in subroutine mdilus (A symmetric) C or subroutine mdilun (A non-symm.) C C No tests are made C C Currently, this subroutine is called by : cgdilu, bcgsdi C C C LANGAGE : FORTRAN 77 + chouhia ESOPE (pour les E/S) C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) C mél : gounand@semt2.smts.cea.fr C REFERENCE (bibtex-like) : C @BOOK{templates, C AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato, C J.Dongarra, V.Eijkhout, R.Pozo, C.Romine, C H. Van der Vorst}, C TITLE={Templates for the Solution of Linear Systems : C Building Blocks for Iterative Methods}, C PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} } C -> URL : http://www.netlib.org/templates/Templates.html C*********************************************************************** C APPELES : - C*********************************************************************** C ENTREES : N, NNZ, ROWPTR, COLIND, VAL, C DINV, R C ENTREES/SORTIES : Z C SORTIES : - C CODE RETOUR (IRET) : - C N : nombre de degrés de liberté C NNZ : nombre de valeurs non nulles de la matrice Morse C ROWPTR, COLIND, VAL : pointeur de ligne, index de colonne C et valeurs de la matrice Morse A C DINV : vecteur contenant les inverses des pivots C de la factorisation D-ILU de A C R : vecteur second membre du système à résoudre. C Z : vecteur des inconnues du système à résoudre. C initialisé dans la subroutine appelante. C*********************************************************************** C VERSION : v1, 01/04/98, version initiale C HISTORIQUE : v1, 01/04/98, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** * * .. Scalar Arguments .. INTEGER N,NNZ * .. * .. Array Arguments .. * .. Matrices stockées en Morse INTEGER ROWPTR(N+1) INTEGER COLIND(NNZ) REAL*8 VAL(NNZ) * .. Vecteurs REAL*8 DINV(N) REAL*8 Z(N),R(N) * * * .. Variables locales * .. Parameters * .. INTEGER IN,JN REAL*8 TMP * .. Executable Statements .. * * C On effectue une montée-descente classique C C Montée : C Zi=(1/Dii)(Ri- Somme(j<i) [LijZj]) C C Une optimisation effectuée : sortie de la boucle sitot C qu'on atteint un indice j supérieur ou égal à i C (on suppose qu'ils sont ordonnés dans l'ordre croissant C dans COLIND) C Z(1)=DINV(1)*R(1) DO 100 IN=2,N TMP=ZERO IR=ROWPTR(IN) IRFIN=ROWPTR(IN+1)-1 101 CONTINUE JN=COLIND(IR) IF (JN.LT.IN) THEN TMP=TMP+(VAL(IR)*Z(JN)) IR=IR+1 IF (IR.LE.IRFIN) GOTO 101 ENDIF Z(IN)=DINV(IN)*(R(IN)-TMP) 100 CONTINUE C C Descente : C Zi=Zi-(1/Dii)(Somme(j>i) [UijZj]) C C Meme optimisation que ci-dessus C DO 200 IN=N-1,1,-1 TMP=ZERO IR=ROWPTR(IN+1)-1 IRFIN=ROWPTR(IN) 201 CONTINUE JN=COLIND(IR) IF (JN.GT.IN) THEN TMP=TMP+(VAL(IR)*Z(JN)) IR=IR-1 IF (IR.GE.IRFIN) GOTO 201 ENDIF Z(IN)=Z(IN)-DINV(IN)*TMP 200 CONTINUE * * Normal termination * RETURN * * End of PSDILU. * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales