C PRILU0    SOURCE    GOUNAND   25/04/30    21:15:32     12258          
      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)
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
C
C     On stocke la factorisation obtenue du préconditionneur
C
         SEGACT MATRIK*MOD
         KIDMAT(6)=ILUM
         KIDMAT(7)=ILUI
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
 
