source: trunk/MESOSCALE/LMDZ.MARS/libf_gcm/bibio/from36.F @ 134

Last change on this file since 134 was 57, checked in by aslmd, 14 years ago

mineur LMD_MM_MARS: ajout du GCM ancienne physique, systeme maintenant complet sur SVN (ne manque que la base de donnees d'etats initiaux)

File size: 4.0 KB
Line 
1      SUBROUTINE from36(x,nbre,iunit)
2      IMPLICIT NONE
3c====================================================================
4      INTEGER iunit, nbre
5      REAL x(nbre)
6c====================================================================
7      INTEGER i, l
8      INTEGER nbreok, ibaseok, icase
9      REAL xmax, xmin, errcod
10c====================================================================
11      INTEGER lbord
12      PARAMETER (lbord=255)
13      REAL conv(0:lbord)
14c====================================================================     
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'/
27c====================================================================
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
34c    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)
38c====================================================================
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
53c====================================================================
54      READ (iunit,*) xmin
55      READ (iunit,*) xmax
56        PRINT*,'Xmin et Xmax=', xmin, xmax
57c====================================================================
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
65c====================================================================
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))
109c====================================================================
110  123 RETURN
111      END
Note: See TracBrowser for help on using the repository browser.