Download prdilu.eso

Back to the list

   1 : C PRDILU    SOURCE    MAGN      09/07/30    21:20:17     6458           
   2 :       SUBROUTINE PRDILU(KMORS,KISA,MATRIK,IMPR,IRET)
   3 :       IMPLICIT INTEGER(I-N)
   4 :       IMPLICIT REAL*8 (A-H,O-Z)
   5 : C***********************************************************************
   6 : C NOM         : PRDILU
   7 : C DESCRIPTION :
   8 : C     Calcul du préconditionneur D-ILU d'une matrice Morse.
   9 : C     D-ILU : Diagonal Incomplete LU factorization
  10 : C     
  11 : C     On stocke l'inverse des pivots du préconditionneur
  12 : C     dans un segment de type
  13 : C     IZA pointé par IDIAG du segment IDMAT
  14 : C     pointé par KIDMAT(1) du segment MATRIK.
  15 : C     (Toujours la réutilisation de l'existant...)
  16 : C     Normalement, aucun indice strictement nul n'est stocké
  17 : C     (appel de clmors dans melim) donc il suffirait de
  18 : C     tester l'existence de l'indice diagonal
  19 : C     On met toutefois un warning si l'indice est très petit.
  20 : C     
  21 : C     Ce sous-programme est en fait une interface à :
  22 : C       mdilus.eso : dans le cas symétrique
  23 : C       mdilun.eso : dans le cas non-symétrique
  24 : C     qui sont en Fortran presque pur (pour raison de rapidité)
  25 : C     et effectuent la construction proprement dite du
  26 : C     préconditionneur.
  27 : C     
  28 : C  ATTENTION : pour une matrice A quelconque, la factorisation
  29 : C  ---------   D-ILU peut ne pas exister (pivot nul) ou avoir
  30 : C              des pivots négatifs MEME SI la factorisation
  31 : C              complète de A existe et n'a que des pivots
  32 : C              positifs.
  33 : C     
  34 : C     
  35 : C LANGAGE     : ESOPE
  36 : C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  37 : C               mél : gounand@semt2.smts.cea.fr
  38 : C REFERENCE (bibtex-like) :
  39 : C  @BOOK{templates,
  40 : C        AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
  41 : C                J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
  42 : C                H. Van der Vorst},
  43 : C        TITLE={Templates for the Solution of Linear Systems :
  44 : C               Building Blocks for Iterative Methods},
  45 : C        PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
  46 : C  -> URL : http://www.netlib.org/templates/Templates.html
  47 : C***********************************************************************
  48 : C APPELES : -
  49 : C***********************************************************************
  50 : C ENTREES            : MATRIK, IMPR
  51 : C ENTREES/SORTIES    : -
  52 : C SORTIES            : INVPIV (IDIAG dans KIDMAT(1) dans MATRIK)
  53 : C                      IRET
  54 : C CODE RETOUR (IRET) : 0 si ok
  55 : C                     <0 si problème
  56 : C     MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  57 : C              on pioche dedans les informations nécessaires
  58 : C              (différents pointeurs, nb. de ddl...)
  59 : C     IMPR   : niveau d'impression
  60 : C     INVPIV : pointeur sur segment IZA de l'include SMMATRIK
  61 : C              vecteur contenant l'inverse de la factorisation
  62 : C              D-ILU de la matrice morse pointée par MATRIK
  63 : C              (KIDMAT(4-5))
  64 : C***********************************************************************
  65 : C VERSION    : v1, 01/04/98, version initiale
  66 : C HISTORIQUE : v1, 01/04/98, création
  67 : C HISTORIQUE : 09/02/98, on ne construit pas le préconditionneur s'il
  68 : C              existe déjà.
  69 : C HISTORIQUE :
  70 : C***********************************************************************
  71 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  72 : C en cas de modification de ce sous-programme afin de faciliter
  73 : C la maintenance !
  74 : C***********************************************************************
  75 : -INC CCOPTIO
  76 : -INC SMMATRIK
  77 :       POINTEUR KMORS.PMORS
  78 :       POINTEUR KISA.IZA
  79 :       POINTEUR INVPIV.IZA
  80 : *     
  81 : *     .. Variables locales
  82 : C***  
  83 :       IRET=0
  84 :       IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prdilu'
  85 : C     On récupère les segments utiles
  86 :       SEGACT MATRIK
  87 :       NTTT =KNTTT
  88 :       IDMAT=KIDMAT(1)
  89 :       KSIM =KSYM
  90 :       SEGACT IDMAT
  91 :       INVPIV=IDIAG
  92 :       SEGDES IDMAT
  93 :       SEGDES MATRIK
  94 : C     Le préconditionneur est-il déjà construit ?
  95 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  96 : C En fait, on surcharge tout le temps INVPIV car IDIAG peut ne pas 
  97 : C etre nul mais contenir autre chose que le préconditionneur
  98 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  99 :       INVPIV=0
 100 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 101 :       IF (INVPIV.EQ.0) THEN
 102 : C     
 103 : C     On parcourt les lignes de la matrice
 104 : C     comme il sied au stockage Morse
 105 : C     
 106 :          NBVA=NTTT
 107 :          SEGINI INVPIV
 108 :          SEGACT KMORS
 109 :          SEGACT KISA
 110 :          NNZ=KISA.A(/1)
 111 :          IF (KSIM.EQ.0) THEN
 111 :             CALL MDILUS(NTTT,NNZ,
 112 :      $           KMORS.IA,KMORS.JA,KISA.A,
 113 :      $           INVPIV.A,
 114 :      $           IRET)
 115 :             IF (IRET.NE.0) GOTO 9999
 116 : 
 117 :          ELSEIF (KSIM.EQ.2) THEN
 117 :             CALL MDILUN(NTTT,NNZ,
 118 :      $           KMORS.IA,KMORS.JA,KISA.A,
 119 :      $           INVPIV.A,
 120 :      $           IRET)
 121 :             IF (IRET.NE.0) GOTO 9999
 122 :          ELSE
 123 :             WRITE(IOIMP,*) 'Valeur incorrecte KSYM=',KSIM
 124 :             WRITE(IOIMP,*) 'dans le MATRIK',MATRIK
 125 :             IRET=-2
 126 :             GOTO 9999
 127 :          ENDIF
 128 : 
 129 :          IF (IMPR.GT.6) THEN
 130 :             WRITE(IOIMP,*) 'création du pointeur INVPIV='
 131 :      $           ,INVPIV
 132 :             IF (IMPR.GT.7) THEN
 133 :                WRITE(IOIMP,*) 'INVPIV(1..',NBVA,')= '
 134 :                WRITE(IOIMP,1002)(INVPIV.A(II),II=1,NBVA)
 135 :             ENDIF
 136 :          ENDIF
 137 : 
 138 :          SEGDES KISA
 139 :          SEGDES KMORS
 140 :          SEGDES INVPIV
 141 : C     
 142 : C     On stocke l'inverse de la diagonale obtenue
 143 : C     
 144 :          SEGACT IDMAT*MOD
 145 :          IDIAG=INVPIV
 146 :          SEGDES IDMAT
 147 :       ELSE
 148 :          IF (IMPR.GT.6) THEN
 149 :             WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :'
 150 :             WRITE(IOIMP,*) 'INVPIV=',INVPIV
 151 :             IF (IMPR.GT.7) THEN
 152 :                SEGACT INVPIV
 153 :                WRITE(IOIMP,*) 'INVPIV.A(1..',NBVA,')= '
 154 :                WRITE(IOIMP,1002)(INVPIV.A(II),II=1,NBVA)
 155 :                SEGDES INVPIV
 156 :             ENDIF
 157 :          ENDIF
 158 :       ENDIF
 159 : *     
 160 : *     Normal termination
 161 : *     
 162 :       RETURN
 163 : *     
 164 : * Format handling
 165 : *     
 166 :  1002 FORMAT(10(1X,1PE11.4))
 167 : *     
 168 : * Error handling
 169 : *     
 170 :  9999 CONTINUE
 171 :       WRITE(IOIMP,*) 'An error was detected in prdilu.eso'
 172 :       RETURN
 173 : *     
 174 : *     End of PRDILU
 175 : *     
 176 :       END
 177 : 
 178 : 
 179 : 
 180 : 
 181 : 
 182 :  
 183 :  
 184 :  
 185 :  
 186 :  
 187 :  
 188 :  

© Cast3M 2003 - All rights reserved.
Disclaimer