Download openrb.eso

Back to the list

   1 : C OPENRB    SOURCE    JC220346  13/12/16    21:16:06     7884           
   2 : C SORMAT    SOURCE    JC220346  12/06/18    21:15:25     7403
   3 : ************************************************************************
   4 : * NOM         : openrb.eso
   5 : * DESCRIPTION : Ouverture d'un fichier au format RUTHERFORD BOEING (.rb)
   6 : * REFERENCES  : The Rutherford-Boeing Sparse Matrix Collection,
   7 : *               Duff I. S., Grimes R. G., Lewis G. L. (Sep 1997)
   8 : ************************************************************************
   9 : * HISTORIQUE :  4/12/2012 : JCARDO : création de la subroutine
  10 : * HISTORIQUE :
  11 : * HISTORIQUE :
  12 : ************************************************************************
  13 : * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES
  14 : * en cas de modification de ce sous-programme afin de faciliter
  15 : * la maintenance !
  16 : ************************************************************************
  17 : * APPELÉ PAR : sormat.eso
  18 : ************************************************************************
  19 : 
  20 :       SUBROUTINE OPENRB(CHNOMF,CHTYPE,CHTITR,
  21 :      &                  IVA1,IVA2,IVA3,IVA4,IVA5,IVA6,IVA7,IVA8,
  22 :      &                  CVA1,CVA2,CVA3,CVA4)
  23 : 
  24 : *              |    Fichier matrice    |  Fichier auxiliaire  |
  25 : *      --------+-----------------------+----------------------+
  26 : *        IVA1  |        TOTCRD         |        M             |
  27 : *        IVA2  |        PTRCRD         |        NVEC          |
  28 : *        IVA3  |        INDCRD         |        NAUXD         |
  29 : *        IVA4  |        VALCRD         |                      |
  30 : *        IVA5  |     NROW ou MVAR      |                      |
  31 : *        IVA6  |     NCOL ou NELT      |                      |
  32 : *        IVA7  |   NNZERO ou NVARIX    |                      |
  33 : *        IVA8  |        NELTVL         |                      |
  34 : *      --------+-----------------------+----------------------+
  35 : *        CVA1  |        MXTYPE         | DATTYP+POSITN+ORGNIZ |
  36 : *              |                       |       +CASEID+NUMERF |
  37 : *        CVA2  |        PTRFMT         |        AUXFM1        |
  38 : *        CVA3  |        INDFMT         |        AUXFM2        |
  39 : *        CVA4  |        VALFMT         |        AUXFM3        |
  40 : *
  41 : 
  42 :       IMPLICIT INTEGER(I-N)
  43 :       IMPLICIT REAL*8(A-H,O-Z)
  44 : 
  45 :       EXTERNAL LONG
  46 : 
  47 : -INC CCOPTIO
  48 : 
  49 :       CHARACTER*(*) CHNOMF,CHTYPE,CHTITR,CVA1,CVA2,CVA3,CVA4
  50 : 
  51 :       CHARACTER*8   NOMFUC,NOMFLC
  52 :       CHARACTER*256 CHDIRF
  53 :       CHARACTER*8   CHA8
  54 : 
  55 :       CHARACTER*26  MINUSC,MAJUSC
  56 :       CHARACTER*11  MDIGIT
  57 :       CHARACTER*63  MCHARS
  58 :       PARAMETER (MINUSC='abcdefghijklmnopqrstuvwxyz')
  59 :       PARAMETER (MAJUSC='ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  60 :       PARAMETER (MDIGIT='0123456789_')
  61 :       PARAMETER (MCHARS=MINUSC//MAJUSC//MDIGIT)
  62 : 
  63 : 
  64 : *     VERIFICATION DU NOM
  65 : *     ===================
  66 : 
  67 : *     On récupère le nom du répertoire dans NOM1, s'il existe
  68 :       IREP=INDEX(CHNOMF,'/',BACK=.TRUE.)
  69 :       CHDIRF='./'
  70 :       IF (IREP.GT.0) THEN
  71 :           CHDIRF=CHNOMF(1:IREP)
  72 :           CHNOMF=CHNOMF(IREP+1:LONG(CHNOMF))
  73 :       ENDIF
  74 : 
  75 : *     Longueur du nom du fichier
  76 :       LC=LONG(CHNOMF)
  77 :       IF (LC.GT.8) THEN
  78 :           WRITE(*,*) 'le nom doit faire 8 char. max'
  79 :           MOTERR(1:8)=CHNOMF(1:5)//'...'
  79 :           CALL ERREUR(705)
  80 :           RETURN
  81 :       ENDIF
  82 :       MOTERR=CHNOMF
  83 :       
  84 : *     Conversion en majuscules/minuscules
  85 :       NOMFUC=CHNOMF
  86 :       NOMFLC=CHNOMF
  87 :       DO K=1,LC
  88 :           IC=INDEX(MCHARS,CHNOMF(K:K))
  89 :           IF (IC.EQ.0) THEN
  90 :               WRITE(*,*) 'le nom contient des caracteres interdits'
  90 :               CALL ERREUR(705)
  91 :               RETURN
  92 :           ENDIF
  93 :           IF (IC.LE.26) THEN
  94 :               NOMFUC(K:K)=MAJUSC(IC:IC)
  95 :           ELSEIF (IC.LE.52) THEN
  96 :               ID=IC-26
  97 :               NOMFLC(K:K)=MINUSC(ID:ID)
  98 :           ENDIF
  99 :       ENDDO
 100 : 
 101 : *     Le premier caractère ne peut pas être un _
 102 :       IF (NOMFUC(1:1).EQ.'_') THEN
 103 :           WRITE(*,*) 'le premier caractère doit etre alphanumerique'
 103 :           CALL ERREUR(705)
 104 :           RETURN
 105 :       ENDIF
 106 : 
 107 : 
 108 : 
 109 : *     OUVERTURE DU FICHIER
 110 : *     ====================
 111 : 
 112 :       OPEN(UNIT   = IOPER        ,
 113 :      &     STATUS = 'UNKNOWN'    ,
 114 :      &     FILE   = CHDIRF(1:LONG(CHDIRF))//CHNOMF(1:LC)//'.'//
 115 :      &              CHTYPE(1:LONG(CHTYPE))//'.rb' ,
 116 :      &     IOSTAT = IOS          ,
 117 :      &     FORM   = 'FORMATTED'  )
 118 : 
 119 : 
 120 : 
 121 : *     ÉCRITURE DE L'ENTETE
 122 : *     ====================
 123 : 
 124 : *     Ligne 1 : TITLE + MTRXID
 125 :       WRITE(UNIT=IOPER,FMT='(A71,A8)')
 126 :      .CHTITR(1:71),
 127 :      .NOMFUC(1:LC)
 128 : 
 129 : 
 130 :       IF (CHTYPE.EQ.'mtx') THEN
 131 : 
 132 : *         Ligne 2 : TOTCRD + PTRCRD + INDCRD + VALCRD
 133 :           WRITE(IOPER,FMT='(I14,3(1X,I13))')
 134 :      &    IVA1,IVA2,IVA3,IVA4
 135 : 
 136 : *         Ligne 3 : MXTYPE NROW NCOL NNZERO
 137 : *                ou MXTYPE MVAR NELT NVARIX NELTVL
 138 :           WRITE(IOPER,FMT='(A3,11X,4(1X,I13))')
 139 :      &    CVA1(1:3),IVA5,IVA6,IVA7,IVA8
 140 : 
 141 : *         Ligne 4 : PTRFMT + INDFMT + VALFMT
 142 :           WRITE(IOPER,FMT='(2A16,A20)')
 143 :      &    CVA2,CVA3,CVA4
 144 : 
 145 :       ELSE
 146 : 
 147 : *         Ligne 2 : DATTYP/POSITN/ORGNIZ/CASEID/NUMERF + M + NVEC + NAUXD
 148 :           WRITE(IOPER,FMT='(A5,1X,A8,1X,A1,3(1X,I13))')
 149 :      &    CVA1(1:5),CVA1(6:13),CVA1(14:14),IVA1,IVA2,IVA3
 150 : 
 151 : *         Ligne 3 : AUXFM1 + AUXFM2 + AUXFM3
 152 :           WRITE(IOPER,FMT='(3A20)')
 153 :      &    CVA2,CVA3,CVA4
 154 : 
 155 :       ENDIF
 156 : 
 157 : 
 158 : 
 159 :       RETURN
 160 : 
 161 :       END
 162 :  

© Cast3M 2003 - All rights reserved.
Disclaimer