Download prilup.eso

Back to the list

   1 : C PRILUP    SOURCE    GOUNAND   11/07/21    21:15:44     7046           
   2 :       SUBROUTINE PRILUP(KMORS,KISA,MATRIK,RXILUP,IFILTR,IMPR,IRET)
   3 :       IMPLICIT INTEGER(I-N)
   4 :       IMPLICIT REAL*8 (A-H,O-Z)
   5 : C***********************************************************************
   6 : C NOM         : PRILUP
   7 : C DESCRIPTION :
   8 : C     Calcul du préconditionneur ILU(0) d'une matrice Morse.
   9 : C     ILU(0) : Incomplete LU factorization of level 0
  10 : C              appelée aussi Choleski ou Crout incomplet
  11 : C     
  12 : C     Le préconditionneur est une matrice stockée 
  13 : C     au format MSR (Modified Sparse Row, stockage de l'inverse de la
  14 : C     diagonale) de meme profil que la matrice Morse (format CSR) qu'il
  15 : C     préconditionne.  
  16 : C     Le profil et les valeurs du préconditionneur sont
  17 : C     stockés dans KIDMAT(6 et 7) (réutilisation de l'existant).
  18 : C     
  19 : C     Ce sous-programme est en fait une interface à :
  20 : C       meilu0
  21 : C     qui est en Fortran presque pur (pour raison de rapidité)
  22 : C     et effectue la construction proprement dite du
  23 : C     préconditionneur.
  24 : C     
  25 : C  ATTENTION : pour une matrice A quelconque, la factorisation
  26 : C  ---------   ILU(0) peut ne pas exister (pivot nul) ou avoir
  27 : C              des pivots négatifs MEME SI la factorisation
  28 : C              complète de A existe et n'a que des pivots
  29 : C              positifs.
  30 : C     
  31 : C     
  32 : C LANGAGE     : ESOPE
  33 : C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  34 : C               mél : gounand@semt2.smts.cea.fr
  35 : C REFERENCE (bibtex-like) :
  36 : C  @BOOK{templates,
  37 : C        AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
  38 : C                J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
  39 : C                H. Van der Vorst},
  40 : C        TITLE={Templates for the Solution of Linear Systems :
  41 : C               Building Blocks for Iterative Methods},
  42 : C        PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
  43 : C  -> URL : http://www.netlib.org/templates/Templates.html
  44 : C  Sparskit : a basic tool kit for sparse matrix computations
  45 : C  Version 2 (Youcef Saad) 
  46 : C  -> URL : http://www.cs.umn.edu/Research/arpa/SPARSKIT/sparskit.html
  47 : C***********************************************************************
  48 : C APPELES       : MEILU0
  49 : C APPELES (E/S) : ECMORS
  50 : C APPELE PAR    : KRES2
  51 : C***********************************************************************
  52 : C ENTREES            : MATRIK, IMPR
  53 : C ENTREES/SORTIES    : -
  54 : C SORTIES            : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET
  55 : C CODE RETOUR (IRET) : 0 si ok
  56 : C                     <0 si problème
  57 : C     MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  58 : C              on pioche dedans les informations nécessaires
  59 : C              (différents pointeurs, nb. de ddl...)
  60 : C     IMPR   : niveau d'impression
  61 : C     ILUM   : pointeur sur segment PMORS de l'include SMMATRIK
  62 : C              profil morse du préconditionneur ILU(0)
  63 : C              =KIDMAT(6)=KMORS=KIDMAT(4) dans MATRIK
  64 : C     ILUI   : pointeur sur segment IZA de l'include SMMATRIK
  65 : C              valeur du préconditionneur ILU(0)
  66 : C              =KIDMAT(7) dans MATRIK
  67 : C***********************************************************************
  68 : C VERSION    : v1, 01/04/98, version initiale
  69 : C HISTORIQUE : v1, 01/04/98, création
  70 : C HISTORIQUE : 09/02/99, on ne construit pas le préconditionneur s'il
  71 : C              existe déjà.
  72 : C HISTORIQUE : 20/12/99, interfaçage avec le nouveau meilu0
  73 : C Le préconditionneur est stocké au format MSR (Modified Sparse Row)
  74 : C (voir la doc de Sparskit version 2+ (Youcef Saad))
  75 : C HISTORIQUE :
  76 : C***********************************************************************
  77 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  78 : C en cas de modification de ce sous-programme afin de faciliter
  79 : C la maintenance !
  80 : C***********************************************************************
  81 : -INC CCOPTIO
  82 : -INC SMMATRIK
  83 : -INC SMLENTI
  84 :       POINTEUR KMORS.PMORS
  85 :       POINTEUR KISA.IZA
  86 :       POINTEUR ILUM.PMORS
  87 :       POINTEUR ILUI.IZA
  88 :       POINTEUR IWORK.MLENTI
  89 :       REAL*8 RXILUP
  90 : C***  
  91 :       IRET=0
  92 :       IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilup'
  93 : C     On récupère les segments utiles
  94 :       SEGACT MATRIK
  95 :       ILUM =KIDMAT(6)
  96 :       ILUI =KIDMAT(7)
  97 :       SEGDES MATRIK
  98 : C     Le préconditionneur est-il déjà construit ?
  99 :       IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
 100 : C     La matrice Morse et son préconditionneur ont le meme
 101 : C     profil
 102 :          SEGACT KMORS
 103 :          N=KMORS.IA(/1)-1
 104 :          NNZ=KMORS.JA(/1)
 105 :          SEGACT KISA
 106 :          NTT=N-1
 107 :          NJA=NNZ+1
 108 :          SEGINI ILUM
 109 :          NBVA=NNZ+1
 110 :          SEGINI ILUI
 111 :          JG=N
 112 :          SEGINI IWORK
 113 : C     Les boucles sont en Fortran pur
 113 :          CALL MEILUP(N,NNZ,KISA.A,KMORS.JA,KMORS.IA,
 114 :      $        ILUI.A,ILUM.JA,ILUM.IA,
 115 :      $        IWORK.LECT,
 116 :      $        RXILUP,IFILTR,
 117 :      $        IMPR,IRET)
 118 :          IF (IRET.NE.0) GOTO 9999
 119 :          SEGSUP IWORK
 120 :          SEGDES ILUI
 121 :          SEGDES ILUM
 122 :          SEGDES KISA
 123 :          SEGDES KMORS
 124 : C     
 125 : C     On stocke la factorisation obtenue du préconditionneur
 126 : C     
 127 :          SEGACT MATRIK*MOD
 128 :          KIDMAT(6)=ILUM
 129 :          KIDMAT(7)=ILUI
 130 :          SEGDES MATRIK
 131 : C
 132 :          IF (IMPR.GT.6) THEN
 133 :             WRITE(IOIMP,*) 'création du préconditionneur Morse',
 134 :      $           ' de pointeurs',ILUM,'et',ILUI
 135 :             IF (IMPR.GT.8) THEN
 135 :                CALL ECMORS(ILUM,ILUI,(IMPR-1))
 136 :             ENDIF
 137 :          ENDIF
 138 :       ELSE
 139 :          IF (IMPR.GT.6) THEN
 140 :             WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
 141 :      $           'ILUM=',ILUM,' et ILUI=',ILUI
 142 :             IF (IMPR.GT.8) THEN
 142 :                CALL ECMORS(ILUM,ILUI,(IMPR-1))
 143 :             ENDIF
 144 :          ENDIF
 145 :       ENDIF
 146 : *     
 147 : *     Normal termination
 148 : *     
 149 :       RETURN
 150 : *     
 151 : * Format handling
 152 : *     
 153 : *     
 154 : * Error handling
 155 : *     
 156 :  9999 CONTINUE
 157 :       WRITE(IOIMP,*) 'An error was detected in prilup.eso'
 158 :       RETURN
 159 : *     
 160 : *     End of PRILUP
 161 : *     
 162 :       END
 163 :  
 164 :  
 165 :  
 166 :  
 167 :  
 168 :  
 169 :  
 170 :  
 171 :  

© Cast3M 2003 - All rights reserved.
Disclaimer