Download prilut.eso

Back to the list

   1 : C PRILUT    SOURCE    MAGN      09/07/30    21:20:35     6458           
   2 :       SUBROUTINE PRILUT(KMORS,KISA,MATRIK,XLFIL,XDTOL,IVARI,
   3 :      $     IMPR,IRET)
   4 :       IMPLICIT INTEGER(I-N)
   5 :       IMPLICIT REAL*8 (A-H,O-Z)
   6 : C***********************************************************************
   7 : C NOM         : PRILUT
   8 : C DESCRIPTION :
   9 : C     Calcul du préconditionneur ILUT d'une matrice Morse (IVARI=0)
  10 : C     ou d'une variante qui remplit mieux la mémoire et fonctionne mieux
  11 : C     quelquefois (IVARI=1)
  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       meilut
  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  ---------   ILUT 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/LTMF)
  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 REMARQUES :
  48 : C On pourrait effectuer l'ordonnancement des colonnes du préconditionneur  
  49 : C (peut-être que la montée-descente va plus vite après, il faudrait
  50 : C  tester) 
  51 : C***********************************************************************
  52 : C APPELES       : MEILUT
  53 : C APPELE PAR    : KRES2
  54 : C***********************************************************************
  55 : C ENTREES            : MATRIK, XLFIL, XDTOL, IMPR
  56 : C SORTIES            : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET
  57 : C CODE RETOUR (IRET) : 0 si ok
  58 : C                     <0 si problème
  59 : C     MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  60 : C              on pioche dedans les informations nécessaires
  61 : C              (différents pointeurs, nb. de ddl...)
  62 : C     IMPR   : niveau d'impression
  63 : C     ILUM   : pointeur sur segment PMORS de l'include SMMATRIK
  64 : C              profil morse du préconditionneur ILU(0)
  65 : C              =KIDMAT(6)=KMORS=KIDMAT(4) dans MATRIK
  66 : C     ILUI   : pointeur sur segment IZA de l'include SMMATRIK
  67 : C              valeur du préconditionneur ILU(0)
  68 : C              =KIDMAT(7) dans MATRIK
  69 : C***********************************************************************
  70 : C VERSION    : v1, 23/02/2000, version initiale
  71 : C HISTORIQUE : v1, 23/02/2000, création
  72 : C HISTORIQUE :
  73 : C***********************************************************************
  74 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  75 : C en cas de modification de ce sous-programme afin de faciliter
  76 : C la maintenance !
  77 : C***********************************************************************
  78 : -INC CCOPTIO
  79 : -INC SMMATRIK
  80 :       INTEGER NTT,NJA,NBVA
  81 :       POINTEUR KMORS.PMORS
  82 :       POINTEUR KISA.IZA
  83 :       POINTEUR ILUM.PMORS
  84 :       POINTEUR ILUI.IZA
  85 : -INC SMLENTI
  86 :       INTEGER JG
  87 :       POINTEUR IWORK.MLENTI
  88 :       POINTEUR JWORK.MLENTI
  89 : -INC SMLREEL
  90 :       POINTEUR RWORK.MLREEL
  91 : *
  92 :       REAL*8 XLFIL,XDTOL
  93 :       INTEGER IVARI,IMPR,IRET
  94 : *
  95 :       INTEGER ILFIL,NNZA,NNZLU,NNZMLU,NTTDDL
  96 :       REAL*8 XNTLIG
  97 : *
  98 :       IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilut.eso'
  99 : C     On récupère les segments utiles
 100 :       SEGACT MATRIK
 101 :       ILUM =KIDMAT(6)
 102 :       ILUI =KIDMAT(7)
 103 :       SEGDES MATRIK
 104 : C     Le préconditionneur est-il déjà construit ?
 105 :       IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
 106 : C     La matrice Morse et son préconditionneur ont le meme
 107 : C     profil
 108 :          SEGACT KMORS
 109 :          NTTDDL=KMORS.IA(/1)-1
 110 :          NNZA=KMORS.JA(/1)
 111 :          SEGACT KISA
 112 : * Pour faire comme dans priltp
 113 : *         XNTLIG=DBLE(NNZA)/DBLE(NTTDDL)
 114 : *         ILFIL=INT(XNTLIG*XLFIL/2.D0)
 115 : *         NNZMLU=NTTDDL*(2*ILFIL+1)
 116 : *
 117 :          NNZMLU = INT(DBLE(NNZA)*XLFIL) + 1
 118 : *
 119 :          NTT=NTTDDL-1
 120 :          NJA=NNZMLU+1
 121 :          SEGINI ILUM
 122 :          NBVA=NNZMLU+1
 123 :          SEGINI ILUI
 124 :          JG=NTTDDL
 125 :          SEGINI IWORK
 126 :          JG=NTTDDL
 127 :          SEGINI JWORK
 128 :          JG=NTTDDL
 129 :          SEGINI RWORK
 130 : *         WRITE(IOIMP,*) 'NTTDDL=',NTTDDL,'NNZA=',NNZA,
 131 : *     $        'NNZMLU=',NNZMLU
 132 : *         WRITE(IOIMP,*) 'ILFIL=',ILFIL,'XLFIL=',XLFIL,'XDTOL=',XDTOL
 133 : C     Les boucles sont en Fortran pur
 133 :          CALL MEILUT(NTTDDL,NNZA,KISA.A,KMORS.JA,KMORS.IA,
 134 :      $        XLFIL,XDTOL,NNZMLU,
 135 :      $        ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
 136 :      $        IWORK.LECT,JWORK.LECT,RWORK.PROG,
 137 :      $        IVARI,IMPR,IRET)
 138 :          IF (IRET.NE.0) GOTO 9999
 139 :          IF (IMPR.GT.1) THEN
 140 :             WRITE(IOIMP,*) 'Préconditionneur : nb.termesstockés=',
 141 :      $           NNZLU-1
 142 :          ENDIF
 143 : *         SEGPRT,ILUM
 144 : *         SEGPRT,ILUI
 145 :          SEGSUP RWORK
 146 :          SEGSUP JWORK
 147 :          SEGSUP IWORK
 148 :          NBVA=NNZLU
 149 :          SEGADJ,ILUI
 150 :          SEGDES ILUI
 151 :          NTT=NTTDDL-1
 152 :          NJA=NNZLU
 153 :          SEGADJ,ILUM
 154 :          SEGDES ILUM
 155 :          SEGDES KISA
 156 :          SEGDES KMORS
 157 : *         SEGPRT,ILUM
 158 : *         SEGPRT,ILUI
 159 : * Ordonnancement (peut-être que la montée-descente va plus vite, il
 160 : *                 faudrait tester)
 161 : *
 162 : *         SEGACT ILUM*MOD
 163 : *         SEGACT ILUI*MOD
 164 : *         JG=MAX(NTTDDL+1,2*(NNZLU-(NTTDDL+1)))
 165 : *         SEGINI IWORK
 165 : *         CALL CSORT2(NTTDDL,ILUI.A(NTTDDL+2),ILUM.JA(NTTDDL+2),
 166 : *     $        ILUM.JA(1),IWORK.LECT,.TRUE.) 
 167 : *         SEGSUP IWORK
 168 : *         SEGDES ILUI
 169 : *         SEGDES ILUM
 170 : C     
 171 : C     On stocke la factorisation obtenue du préconditionneur
 172 : C     
 173 :          SEGACT MATRIK*MOD
 174 :          KIDMAT(6)=ILUM
 175 :          KIDMAT(7)=ILUI
 176 :          SEGDES MATRIK
 177 : C
 178 :          IF (IMPR.GT.6) THEN
 179 :             WRITE(IOIMP,*) 'création du préconditionneur Morse',
 180 :      $           ' de pointeurs',ILUM,'et',ILUI
 181 :             IF (IMPR.GT.8) THEN
 181 :                CALL ECMORS(ILUM,ILUI,(IMPR-1))
 182 :             ENDIF
 183 :          ENDIF
 184 :       ELSE
 185 :          IF (IMPR.GT.6) THEN
 186 :             WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
 187 :      $           'ILUM=',ILUM,' et ILUI=',ILUI
 188 :             IF (IMPR.GT.8) THEN
 188 :                CALL ECMORS(ILUM,ILUI,(IMPR-1))
 189 :             ENDIF
 190 :          ENDIF
 191 :       ENDIF
 192 : *     
 193 : *     Normal termination
 194 : *     
 195 :       RETURN
 196 : *     
 197 : * Format handling
 198 : *     
 199 : *     
 200 : * Error handling
 201 : *     
 202 :  9999 CONTINUE
 203 :       WRITE(IOIMP,*) 'An error was detected in prilut.eso'
 204 :       RETURN
 205 : *     
 206 : *     End of PRILUT
 207 : *     
 208 :       END
 209 :  
 210 :  
 211 :  
 212 :  
 213 :  
 214 :  
 215 :  
 216 :  
 217 :  

© Cast3M 2003 - All rights reserved.
Disclaimer