| 1 | SUBROUTINE readstd(imx,champ,imax) |
|---|
| 2 | IMPLICIT NONE |
|---|
| 3 | |
|---|
| 4 | c======================================================================= |
|---|
| 5 | c |
|---|
| 6 | c Auteurs: Jan Polcher, Frederic Hourdin 20/04/91 |
|---|
| 7 | c -------- |
|---|
| 8 | c |
|---|
| 9 | c Objet: |
|---|
| 10 | c ------ |
|---|
| 11 | c |
|---|
| 12 | c Subroutine qui lit les fichiers dans le format lmdstd |
|---|
| 13 | c format etabli par : |
|---|
| 14 | c Jan Polcher,Zhao-Xin Li, Frederic Hourdin, Emmanuelle Cohen-Solal, |
|---|
| 15 | c Il peut etre utilise pour sortire des evolutions |
|---|
| 16 | c temporelles, des champs 2D (iim,jjm ou jjm,llm) ou des champs 3D. |
|---|
| 17 | c le character # place devant le format determine la fin de la |
|---|
| 18 | c description du champ et permet eventulellement de rajouter |
|---|
| 19 | c des informations (avant le #). |
|---|
| 20 | c le programme de lecture lit , dans la description, les variables |
|---|
| 21 | c qu'il connait et saute apres jusquau #. A partir de la |
|---|
| 22 | c il commence a lire le champ dans le format specifie. |
|---|
| 23 | c |
|---|
| 24 | c----------------------------------------------------------------------- |
|---|
| 25 | c |
|---|
| 26 | c Interface: |
|---|
| 27 | c ---------- |
|---|
| 28 | c |
|---|
| 29 | c ARGUMENTS |
|---|
| 30 | c --------- |
|---|
| 31 | c |
|---|
| 32 | c imx : INTEGER |
|---|
| 33 | c taille du tableau contenant le champ |
|---|
| 34 | c champ: REAL (imx) |
|---|
| 35 | c champ contenant les valeurs et de longeur icount |
|---|
| 36 | c imax : INTEGER |
|---|
| 37 | c nombre d'element dans le champ |
|---|
| 38 | c |
|---|
| 39 | c COMMON: |
|---|
| 40 | c ------- |
|---|
| 41 | c |
|---|
| 42 | c======================================================================= |
|---|
| 43 | c INCLUDE '/usr/local/lmdgraph/libio/lmdstd.h' |
|---|
| 44 | c |
|---|
| 45 | c INTEGER bandmax |
|---|
| 46 | c PARAMETER(bandmax=24) |
|---|
| 47 | c |
|---|
| 48 | c COMMON/lmdstdch/gtitre,gunites,gformat,gfichier,glistfich(100), |
|---|
| 49 | c $ gentete,gdatedep,gdatefin |
|---|
| 50 | c |
|---|
| 51 | c CHARACTER*100 gtitre !du champ |
|---|
| 52 | c CHARACTER*20 gunites !unites du champ |
|---|
| 53 | c CHARACTER*20 gformat !formats FORTRAN ou zxliN (N=1,2,3) ou '' |
|---|
| 54 | c CHARACTER*100 gfichier !nom du fichier contenant le champ |
|---|
| 55 | c CHARACTER*100 gentete !nom generique (exemple desript. du RUN) |
|---|
| 56 | c CHARACTER*8 gdatedep !date de depart de la moy. ou evol. temp. |
|---|
| 57 | c CHARACTER*8 gdatefin !date de fin '' si une seule datefin |
|---|
| 58 | c CHARACTER*20 glistfich !liste de champs a sortir |
|---|
| 59 | c |
|---|
| 60 | c COMMON/lmdstdnu/ gminimum,gmaximum, |
|---|
| 61 | c $ gdeltajour(bandmax),gdeltapas(bandmax), |
|---|
| 62 | c $ gnbetats(bandmax),gnbfich |
|---|
| 63 | c |
|---|
| 64 | c REAL gminimum ! \ min et max |
|---|
| 65 | c REAL gmaximum ! / du champ |
|---|
| 66 | c INTEGER gnbfich ! nombre de fichier a sortir |
|---|
| 67 | c pour les evolutions temporelles: |
|---|
| 68 | c INTEGER gnbetats ! nombre d'etats par bande |
|---|
| 69 | c INTEGER gdeltapas ! nombre de pas de temps entre 2 sorties |
|---|
| 70 | c REAL gdeltajour ! ecart en jour des sorties sur bandes |
|---|
| 71 | c |
|---|
| 72 | c======================================================================= |
|---|
| 73 | c----------------------------------------------------------------------- |
|---|
| 74 | c Declarations: |
|---|
| 75 | c ------------- |
|---|
| 76 | |
|---|
| 77 | #include "lmdstd.h" |
|---|
| 78 | |
|---|
| 79 | c Arguments: |
|---|
| 80 | c ---------- |
|---|
| 81 | |
|---|
| 82 | INTEGER imx,imax |
|---|
| 83 | REAL champ(imx) |
|---|
| 84 | |
|---|
| 85 | c Local: |
|---|
| 86 | c ------ |
|---|
| 87 | |
|---|
| 88 | INTEGER i |
|---|
| 89 | |
|---|
| 90 | CHARACTER*200 test(20) |
|---|
| 91 | CHARACTER*200 helptest(20) |
|---|
| 92 | CHARACTER*200 help |
|---|
| 93 | INTEGER reccount |
|---|
| 94 | |
|---|
| 95 | LOGICAL check,continue |
|---|
| 96 | |
|---|
| 97 | EXTERNAL lnblnk |
|---|
| 98 | INTEGER lnblnk |
|---|
| 99 | |
|---|
| 100 | c----------------------------------------------------------------------- |
|---|
| 101 | c Initialisations: |
|---|
| 102 | c ---------------- |
|---|
| 103 | |
|---|
| 104 | check = .FALSE. |
|---|
| 105 | DO 9876 i=1,20 |
|---|
| 106 | helptest(i) = ' ' |
|---|
| 107 | 9876 CONTINUE |
|---|
| 108 | |
|---|
| 109 | |
|---|
| 110 | c----------------------------------------------------------------------- |
|---|
| 111 | c lecture le l'entete: |
|---|
| 112 | c -------------------- |
|---|
| 113 | |
|---|
| 114 | 2222 OPEN (unit=10,file=gfichier(1:lnblnk(gfichier)), form='formatted', |
|---|
| 115 | & ERR = 9999, status='old') |
|---|
| 116 | GOTO 1111 |
|---|
| 117 | |
|---|
| 118 | 9999 WRITE(*,*) 'Je ne peut pas lire le fichier: ', |
|---|
| 119 | & gfichier(1:lnblnk(gfichier)) |
|---|
| 120 | CLOSE(10) |
|---|
| 121 | WRITE(*,*) 'Entrez S.V.P. un autre nom de fichier (path absolu) ' |
|---|
| 122 | WRITE(*,*) 'ou RETURN pour stopper lexecution' |
|---|
| 123 | READ (*,'(a)') gfichier |
|---|
| 124 | IF(lnblnk(gfichier).EQ.0) STOP |
|---|
| 125 | GOTO 2222 |
|---|
| 126 | |
|---|
| 127 | 1111 continue = .TRUE. |
|---|
| 128 | DO 2345 i=1,20 |
|---|
| 129 | IF (continue) THEN |
|---|
| 130 | READ (10,'(a200)') test(i) |
|---|
| 131 | IF ( test(i)(1:1) .EQ. '#' .OR. test(i)(1:1) .EQ. 'f10' ) THEN |
|---|
| 132 | continue = .FALSE. |
|---|
| 133 | reccount = i |
|---|
| 134 | ENDIF |
|---|
| 135 | ENDIF |
|---|
| 136 | 2345 CONTINUE |
|---|
| 137 | |
|---|
| 138 | DO 1223 i=1,reccount-1 |
|---|
| 139 | helptest(i) = test(i) |
|---|
| 140 | 1223 CONTINUE |
|---|
| 141 | helptest(20) = test(reccount) |
|---|
| 142 | |
|---|
| 143 | |
|---|
| 144 | IF (check) THEN |
|---|
| 145 | WRITE(*,*) 'gentete' |
|---|
| 146 | ENDIF |
|---|
| 147 | IF ( helptest(1) .NE. ' ' ) THEN |
|---|
| 148 | read (helptest(1),'(a100)') gentete |
|---|
| 149 | ELSE |
|---|
| 150 | c WRITE(*,*) 'la description du run' |
|---|
| 151 | c READ (*,'(a100)') gentete |
|---|
| 152 | gentete = ' ' |
|---|
| 153 | ENDIF |
|---|
| 154 | |
|---|
| 155 | IF (check) THEN |
|---|
| 156 | WRITE(*,*) 'titre' |
|---|
| 157 | ENDIF |
|---|
| 158 | IF ( helptest(2) .NE. ' ' ) THEN |
|---|
| 159 | read (helptest(2),'(a100)') gtitre |
|---|
| 160 | ELSE |
|---|
| 161 | c WRITE(*,*) 'le titre du dessin' |
|---|
| 162 | c READ (*,'(a100)') gtitre |
|---|
| 163 | gtitre = ' ' |
|---|
| 164 | ENDIF |
|---|
| 165 | |
|---|
| 166 | IF (check) THEN |
|---|
| 167 | WRITE(*,*) 'datefins' |
|---|
| 168 | ENDIF |
|---|
| 169 | IF ( helptest(3) .NE. ' ' ) THEN |
|---|
| 170 | read (helptest(3),'(a8)') gdatedep |
|---|
| 171 | read (helptest(4),'(a8)') gdatefin |
|---|
| 172 | ELSE |
|---|
| 173 | c WRITE(*,*) |
|---|
| 174 | c & 'datefin du debut de la moyenne (ou le mois tout simplement)' |
|---|
| 175 | c READ (*,'(a8)') gdatedep |
|---|
| 176 | c WRITE(*,*) 'et celle de la fin (ou rien du tout)' |
|---|
| 177 | c READ (*,'(a8)') gdatefin |
|---|
| 178 | gdatedep = ' ' |
|---|
| 179 | gdatefin = ' ' |
|---|
| 180 | ENDIF |
|---|
| 181 | |
|---|
| 182 | IF (check) THEN |
|---|
| 183 | WRITE(*,*) 'unitees' |
|---|
| 184 | ENDIF |
|---|
| 185 | IF ( helptest(5) .NE. ' ' ) THEN |
|---|
| 186 | read (helptest(5),'(a20)') gunites |
|---|
| 187 | ELSE |
|---|
| 188 | c WRITE(*,*) 'les unitees du champ' |
|---|
| 189 | c READ (*,'(a20)') gunites |
|---|
| 190 | gunites = ' ' |
|---|
| 191 | ENDIF |
|---|
| 192 | |
|---|
| 193 | IF (check) THEN |
|---|
| 194 | WRITE(*,*) 'deltapas et nbetats' |
|---|
| 195 | ENDIF |
|---|
| 196 | IF ( helptest(6) .NE. ' ' ) THEN |
|---|
| 197 | c READ (helptest(6),*,ERR=1212) |
|---|
| 198 | c . (gdeltapas(i),i=1,bandmax),(gnbetats(i),i=1,bandmax) |
|---|
| 199 | GOTO 1213 |
|---|
| 200 | |
|---|
| 201 | 1212 help =helptest(6)(1:lnblnk(helptest(6)))// |
|---|
| 202 | . helptest(7)(1:lnblnk(helptest(7))) |
|---|
| 203 | helptest(6) = help |
|---|
| 204 | IF (check) THEN |
|---|
| 205 | WRITE(*,*) 'Problems while reading', help |
|---|
| 206 | ENDIF |
|---|
| 207 | DO 1214 i=7,reccount |
|---|
| 208 | helptest(i) = helptest(i+1) |
|---|
| 209 | 1214 CONTINUE |
|---|
| 210 | c READ (helptest(6),*,ERR=1212) |
|---|
| 211 | c . (gdeltapas(i),i=1,bandmax),(gnbetats(i),i=1,bandmax) |
|---|
| 212 | |
|---|
| 213 | 1213 CONTINUE |
|---|
| 214 | ENDIF |
|---|
| 215 | |
|---|
| 216 | IF (check) THEN |
|---|
| 217 | WRITE(*,*) 'deltajour' |
|---|
| 218 | ENDIF |
|---|
| 219 | IF ( helptest(7) .NE. ' ' ) THEN |
|---|
| 220 | c READ (helptest(7),*,ERR=1312) (gdeltajour(i),i=1,bandmax) |
|---|
| 221 | GOTO 1313 |
|---|
| 222 | |
|---|
| 223 | 1312 help =helptest(7)(1:lnblnk(helptest(7)))// |
|---|
| 224 | . helptest(8)(1:lnblnk(helptest(8))) |
|---|
| 225 | helptest(7) = help |
|---|
| 226 | IF (check) THEN |
|---|
| 227 | WRITE(*,*) 'Problems while reading', help |
|---|
| 228 | ENDIF |
|---|
| 229 | DO 1314 i=8,reccount |
|---|
| 230 | helptest(i) = helptest(i+1) |
|---|
| 231 | 1314 CONTINUE |
|---|
| 232 | c READ (helptest(7),*,ERR=1312) (gdeltajour(i),i=1,bandmax) |
|---|
| 233 | |
|---|
| 234 | 1313 CONTINUE |
|---|
| 235 | ENDIF |
|---|
| 236 | |
|---|
| 237 | IF (check) THEN |
|---|
| 238 | WRITE(*,*) 'min et max' |
|---|
| 239 | ENDIF |
|---|
| 240 | IF ( helptest(8) .NE. ' ' ) THEN |
|---|
| 241 | c READ (helptest(8),*) gminimum,gmaximum |
|---|
| 242 | ENDIF |
|---|
| 243 | |
|---|
| 244 | gformat = helptest(20)(2:20) |
|---|
| 245 | |
|---|
| 246 | IF (check) THEN |
|---|
| 247 | WRITE(*,*) gentete |
|---|
| 248 | WRITE(*,*) gtitre |
|---|
| 249 | WRITE(*,*) gdatedep |
|---|
| 250 | WRITE(*,*) gdatefin |
|---|
| 251 | WRITE(*,*) gdeltapas,gnbetats |
|---|
| 252 | WRITE(*,*) gdeltajour |
|---|
| 253 | WRITE(*,*) gminimum,gmaximum |
|---|
| 254 | WRITE(*,*) gformat |
|---|
| 255 | ENDIF |
|---|
| 256 | |
|---|
| 257 | c----------------------------------------------------------------------- |
|---|
| 258 | c lecture du champ proprement dit: |
|---|
| 259 | c -------------------------------- |
|---|
| 260 | |
|---|
| 261 | READ (10,*) imax |
|---|
| 262 | |
|---|
| 263 | IF(imax.GT.imx) THEN |
|---|
| 264 | WRITE(*,*) 'Vous essayez de lire un champ dont la taille est' |
|---|
| 265 | WRITE(*,*) 'superieure a la taille maximum autorisee' |
|---|
| 266 | WRITE(*,*) 'c est a dire a la dimension du champ utilise' |
|---|
| 267 | WRITE(*,*) 'pour lappel a la procedure writestd.' |
|---|
| 268 | STOP |
|---|
| 269 | ENDIF |
|---|
| 270 | |
|---|
| 271 | IF (gformat(1:4) .EQ. 'zxli') THEN |
|---|
| 272 | CALL from36 (champ,imax,10) |
|---|
| 273 | ELSE |
|---|
| 274 | IF (lnblnk(gformat).LE.1.OR.lnblnk(gformat).GE.20) THEN |
|---|
| 275 | READ(10,*) (champ (i),i=1,imax) |
|---|
| 276 | ELSE |
|---|
| 277 | READ(10,'('//gformat(1:lnblnk(gformat))//')') |
|---|
| 278 | $ (champ (i),i=1,imax) |
|---|
| 279 | ENDIF |
|---|
| 280 | ENDIF |
|---|
| 281 | |
|---|
| 282 | CLOSE (unit=10) |
|---|
| 283 | |
|---|
| 284 | |
|---|
| 285 | RETURN |
|---|
| 286 | END |
|---|