[135] | 1 | SUBROUTINE from36(x,nbre,iunit) |
---|
| 2 | IMPLICIT NONE |
---|
| 3 | c==================================================================== |
---|
| 4 | INTEGER iunit, nbre |
---|
| 5 | REAL x(nbre) |
---|
| 6 | c==================================================================== |
---|
| 7 | INTEGER i, l |
---|
| 8 | INTEGER nbreok, ibaseok, icase |
---|
| 9 | REAL xmax, xmin, errcod |
---|
| 10 | c==================================================================== |
---|
| 11 | INTEGER lbord |
---|
| 12 | PARAMETER (lbord=255) |
---|
| 13 | REAL conv(0:lbord) |
---|
| 14 | c==================================================================== |
---|
| 15 | INTEGER ibase, maxcas, maxnbr, ifact1, ifact2, ifact3 |
---|
| 16 | PARAMETER (ibase=36, maxcas=3, maxnbr=100000) |
---|
| 17 | PARAMETER(ifact1=ibase**1-1) |
---|
| 18 | PARAMETER(ifact2=ibase**2-1) |
---|
| 19 | PARAMETER(ifact3=ibase**3-1) |
---|
| 20 | CHARACTER*1 base(ibase), fac(maxcas,maxnbr) |
---|
| 21 | INTEGER inte(maxcas) |
---|
| 22 | DATA (base(l),l=1,ibase) |
---|
| 23 | . /'0','1','2','3','4','5','6','7','8','9', |
---|
| 24 | . 'A','B','C','D','E','F','G','H','I','J', |
---|
| 25 | . 'K','L','M','N','O','P','Q','R','S','T', |
---|
| 26 | . 'U','V','W','X','Y','Z'/ |
---|
| 27 | c==================================================================== |
---|
| 28 | IF (nbre .GT. maxnbr) THEN |
---|
| 29 | PRINT*, 'Verifier maxnbr dans from36 (trop petite)' |
---|
| 30 | STOP |
---|
| 31 | ENDIF |
---|
| 32 | DO 10 i = 0, lbord |
---|
| 33 | 10 conv(i) = 1.0e+33 |
---|
| 34 | c 34 c 10 conv(i) = 1.0e+49 |
---|
| 35 | DO 20 i = 1, ibase |
---|
| 36 | l = ICHAR(base(i)) |
---|
| 37 | 20 conv(l) = FLOAT(i-1) |
---|
| 38 | c==================================================================== |
---|
| 39 | READ (iunit,*) nbreok, ibaseok, icase |
---|
| 40 | IF (nbre .NE. nbreok) THEN |
---|
| 41 | PRINT*, 'Incoherence (Nombre elements)', nbreok, nbre |
---|
| 42 | STOP |
---|
| 43 | ENDIF |
---|
| 44 | IF (ibase .NE. ibaseok) THEN |
---|
| 45 | PRINT*, 'Incoherence (Nombre base)', ibaseok, ibase |
---|
| 46 | STOP |
---|
| 47 | ENDIF |
---|
| 48 | IF (icase.NE.1 .AND. icase.NE.2 .AND. icase.NE.3) THEN |
---|
| 49 | PRINT*, 'Verifier icase (1,2,3) dans le fichier a lire', |
---|
| 50 | . icase |
---|
| 51 | STOP |
---|
| 52 | ENDIF |
---|
| 53 | c==================================================================== |
---|
| 54 | READ (iunit,*) xmin |
---|
| 55 | READ (iunit,*) xmax |
---|
| 56 | PRINT*,'Xmin et Xmax=', xmin, xmax |
---|
| 57 | c==================================================================== |
---|
| 58 | IF (xmin .EQ. xmax) THEN |
---|
| 59 | READ(iunit,'(a)') |
---|
| 60 | PRINT*, 'Ce champ est constant' |
---|
| 61 | DO 30 i = 1, nbre |
---|
| 62 | 30 x(i) = xmin |
---|
| 63 | GO TO 123 |
---|
| 64 | END IF |
---|
| 65 | c==================================================================== |
---|
| 66 | IF (icase .EQ. 1) THEN |
---|
| 67 | errcod = (xmax-xmin) / FLOAT(ifact1) |
---|
| 68 | PRINT*,'La precision du codage est entre + / - ', errcod |
---|
| 69 | READ(iunit,91)((fac(l,i),l=1,icase),i=1,nbre) |
---|
| 70 | DO 190 i = 1, nbre |
---|
| 71 | x(i) = 0.0 |
---|
| 72 | DO 191 l = 1, icase |
---|
| 73 | inte(l) = ICHAR( fac(l,i) ) |
---|
| 74 | x(i) = x(i) + conv ( inte(l) ) * FLOAT( ibase**(icase-l) ) |
---|
| 75 | 191 CONTINUE |
---|
| 76 | x(i) = xmin + x(i)/FLOAT(ifact1)*(xmax-xmin) |
---|
| 77 | 190 CONTINUE |
---|
| 78 | ELSE IF (icase .EQ. 2) THEN |
---|
| 79 | errcod = (xmax-xmin) / FLOAT(ifact2) |
---|
| 80 | PRINT*,'La precision du codage est entre + / - ', errcod |
---|
| 81 | READ(iunit,92)((fac(l,i),l=1,icase),i=1,nbre) |
---|
| 82 | DO 290 i = 1, nbre |
---|
| 83 | x(i) = 0.0 |
---|
| 84 | DO 291 l = 1, icase |
---|
| 85 | inte(l) = ICHAR( fac(l,i) ) |
---|
| 86 | x(i) = x(i) + conv ( inte(l) ) * FLOAT( ibase**(icase-l) ) |
---|
| 87 | 291 CONTINUE |
---|
| 88 | x(i) = xmin + x(i)/float(ifact2)*(xmax-xmin) |
---|
| 89 | 290 CONTINUE |
---|
| 90 | ELSE IF (icase .EQ. 3) THEN |
---|
| 91 | errcod = (xmax-xmin) / FLOAT(ifact3) |
---|
| 92 | PRINT*,'La precision du codage est entre + / - ', errcod |
---|
| 93 | READ(iunit,93)((fac(l,i),l=1,icase),i=1,nbre) |
---|
| 94 | DO 390 i = 1, nbre |
---|
| 95 | x(i) = 0.0 |
---|
| 96 | DO 391 l = 1, icase |
---|
| 97 | inte(l) = ICHAR( fac(l,i) ) |
---|
| 98 | x(i) = x(i) + conv ( inte(l) ) * FLOAT( ibase**(icase-l) ) |
---|
| 99 | 391 CONTINUE |
---|
| 100 | x(i) = xmin + x(i)/FLOAT(ifact3)*(xmax-xmin) |
---|
| 101 | 390 CONTINUE |
---|
| 102 | ELSE |
---|
| 103 | PRINT*, 'Verfier icase (1, 2 ou 3)' |
---|
| 104 | STOP |
---|
| 105 | ENDIF |
---|
| 106 | 91 FORMAT(120a1) |
---|
| 107 | 92 FORMAT(64(2a1)) |
---|
| 108 | 93 FORMAT(40(3a1)) |
---|
| 109 | c==================================================================== |
---|
| 110 | 123 RETURN |
---|
| 111 | END |
---|