C PRILU0 SOURCE PV 20/09/26 21:19:28 10724 SUBROUTINE PRILU0(KMORS,KISA,MATRIK,IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : PRILU0 C DESCRIPTION : C Calcul du préconditionneur ILU(0) d'une matrice Morse. C ILU(0) : Incomplete LU factorization of level 0 C appelée aussi Choleski ou Crout incomplet C C Le préconditionneur est une matrice stockée C au format MSR (Modified Sparse Row, stockage de l'inverse de la C diagonale) de meme profil que la matrice Morse (format CSR) qu'il C préconditionne. C Le profil et les valeurs du préconditionneur sont C stockés dans KIDMAT(6 et 7) (réutilisation de l'existant). C C Ce sous-programme est en fait une interface à : C meilu0 C qui est en Fortran presque pur (pour raison de rapidité) C et effectue la construction proprement dite du C préconditionneur. C C ATTENTION : pour une matrice A quelconque, la factorisation C --------- ILU(0) peut ne pas exister (pivot nul) ou avoir C des pivots négatifs MEME SI la factorisation C complète de A existe et n'a que des pivots C positifs. C C C LANGAGE : ESOPE 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 Sparskit : a basic tool kit for sparse matrix computations C Version 2 (Youcef Saad) C -> URL : http://www.cs.umn.edu/Research/arpa/SPARSKIT/sparskit.html C*********************************************************************** C APPELES : MEILU0 C APPELES (E/S) : ECMORS C APPELE PAR : KRES2 C*********************************************************************** C ENTREES : MATRIK, IMPR C ENTREES/SORTIES : - C SORTIES : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET C CODE RETOUR (IRET) : 0 si ok C <0 si problème C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK C on pioche dedans les informations nécessaires C (différents pointeurs, nb. de ddl...) C IMPR : niveau d'impression C ILUM : pointeur sur segment PMORS de l'include SMMATRIK C profil morse du préconditionneur ILU(0) C =KIDMAT(6)=KMORS=KIDMAT(4) dans MATRIK C ILUI : pointeur sur segment IZA de l'include SMMATRIK C valeur du préconditionneur ILU(0) C =KIDMAT(7) dans MATRIK C*********************************************************************** C VERSION : v1, 01/04/98, version initiale C HISTORIQUE : v1, 01/04/98, création C HISTORIQUE : 09/02/99, on ne construit pas le préconditionneur s'il C existe déjà. C HISTORIQUE : 20/12/99, interfaçage avec le nouveau meilu0 C Le préconditionneur est stocké au format MSR (Modified Sparse Row) C (voir la doc de Sparskit version 2+ (Youcef Saad)) 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*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMMATRIK -INC SMLENTI POINTEUR KMORS.PMORS POINTEUR KISA.IZA POINTEUR ILUM.PMORS POINTEUR ILUI.IZA POINTEUR IWORK.MLENTI C*** IRET=0 IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilu0' C On récupère les segments utiles SEGACT MATRIK ILUM =KIDMAT(6) ILUI =KIDMAT(7) SEGDES MATRIK C Le préconditionneur est-il déjà construit ? IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN C La matrice Morse et son préconditionneur ont le meme C profil SEGACT KMORS N=KMORS.IA(/1)-1 NNZ=KMORS.JA(/1) SEGACT KISA NTT=N-1 NJA=NNZ+1 SEGINI ILUM NBVA=NNZ+1 SEGINI ILUI JG=N SEGINI IWORK C Les boucles sont en Fortran pur CALL MEILU0(N,NNZ,KISA.A,KMORS.JA,KMORS.IA, $ ILUI.A,ILUM.JA,ILUM.IA, $ IWORK.LECT, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGSUP IWORK SEGDES ILUI SEGDES ILUM SEGDES KISA SEGDES KMORS C C On stocke la factorisation obtenue du préconditionneur C SEGACT MATRIK*MOD KIDMAT(6)=ILUM KIDMAT(7)=ILUI SEGDES MATRIK C IF (IMPR.GT.6) THEN WRITE(IOIMP,*) 'création du préconditionneur Morse', $ ' de pointeurs',ILUM,'et',ILUI IF (IMPR.GT.8) THEN CALL ECMORS(ILUM,ILUI,(IMPR-1)) ENDIF ENDIF ELSE IF (IMPR.GT.6) THEN WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :', $ 'ILUM=',ILUM,' et ILUI=',ILUI IF (IMPR.GT.8) THEN CALL ECMORS(ILUM,ILUI,(IMPR-1)) ENDIF ENDIF ENDIF * * Normal termination * RETURN * * Format handling * * * Error handling * 9999 CONTINUE WRITE(IOIMP,*) 'An error was detected in prilu0.eso' RETURN * * End of PRILU0 * END