1 | SUBROUTINE writestd(champ,icount) |
---|
2 | |
---|
3 | c======================================================================= |
---|
4 | c |
---|
5 | c Auteurs: Jan Polcher, Frederic Hourdin |
---|
6 | c -------- |
---|
7 | c |
---|
8 | c Objet: |
---|
9 | c ------ |
---|
10 | c |
---|
11 | c Subroutine qui ecrit les fichiers dans le format de transfert |
---|
12 | c vers le LMD. |
---|
13 | c format etabli par : |
---|
14 | c Zhao-Xin Li, Frederic Hourdin, Emmanuelle Cohen-Solal, |
---|
15 | c Jan Polcher . |
---|
16 | c Il peut etre utilise pour sortire des evolutions |
---|
17 | c temporelles, des champs 2D (iim,jjm ou jjm,llm) ou des champs 3D. |
---|
18 | c le character # place devant le format determine la fin de la |
---|
19 | c description du champ et permet eventulellement de rajouter |
---|
20 | c des informations (avant le #). |
---|
21 | c le programme de lecture lit , dans la description, les variables |
---|
22 | c qu'il connait et saute apres jusquau #. A partir de la |
---|
23 | c il commence a lire le champ dans le format specifie. |
---|
24 | c |
---|
25 | c----------------------------------------------------------------------- |
---|
26 | c |
---|
27 | c Interface: |
---|
28 | c ---------- |
---|
29 | c |
---|
30 | c ARGUMENTS |
---|
31 | c --------- |
---|
32 | c |
---|
33 | c champ: REAL (icount) |
---|
34 | c champ contenant les valeurs et de longeur icount |
---|
35 | c icount: INTEGER |
---|
36 | c nombre d'element dans le champ |
---|
37 | c |
---|
38 | c COMMON: |
---|
39 | c ------- |
---|
40 | c |
---|
41 | c======================================================================= |
---|
42 | c INCLUDE '/usr/local/lmdgraph/libio/lmdstd.h' |
---|
43 | c |
---|
44 | c INTEGER bandmax |
---|
45 | c PARAMETER(bandmax=24) |
---|
46 | c |
---|
47 | c COMMON/lmdstdch/gtitre,gunites,gformat,gfichier,glistfich(100), |
---|
48 | c $ gentete,gdatedep,gdatefin |
---|
49 | c |
---|
50 | c CHARACTER*100 gtitre !du champ |
---|
51 | c CHARACTER*20 gunites !unites du champ |
---|
52 | c CHARACTER*20 gformat !formats FORTRAN ou zxliN (N=1,2,3) ou '' |
---|
53 | c CHARACTER*100 gfichier !nom du fichier contenant le champ |
---|
54 | c CHARACTER*100 gentete !nom generique (exemple desript. du RUN) |
---|
55 | c CHARACTER*8 gdatedep !date de depart de la moy. ou evol. temp. |
---|
56 | c CHARACTER*8 gdatefin !date de fin '' si une seule datefin |
---|
57 | c CHARACTER*20 glistfich !liste de champs a sortir |
---|
58 | c |
---|
59 | c COMMON/lmdstdnu/ gminimum,gmaximum, |
---|
60 | c $ gdeltajour(bandmax),gdeltapas(bandmax), |
---|
61 | c $ gnbetats(bandmax),gnbfich |
---|
62 | c |
---|
63 | c REAL gminimum ! \ min et max |
---|
64 | c REAL gmaximum ! / du champ |
---|
65 | c INTEGER gnbfich ! nombre de fichier a sortir |
---|
66 | c pour les evolutions temporelles: |
---|
67 | c INTEGER gnbetats ! nombre d'etats par bande |
---|
68 | c INTEGER gdeltapas ! nombre de pas de temps entre 2 sorties |
---|
69 | c REAL gdeltajour ! ecart en jour des sorties sur bandes |
---|
70 | c |
---|
71 | c======================================================================= |
---|
72 | c----------------------------------------------------------------------- |
---|
73 | c Declarations: |
---|
74 | c ------------- |
---|
75 | |
---|
76 | IMPLICIT NONE |
---|
77 | #include "lmdstd.h" |
---|
78 | |
---|
79 | c Arguments: |
---|
80 | c ---------- |
---|
81 | |
---|
82 | INTEGER icount |
---|
83 | REAL champ(icount) |
---|
84 | |
---|
85 | c Local: |
---|
86 | c ------ |
---|
87 | |
---|
88 | INTEGER i,imin,imax |
---|
89 | LOGICAL check, writeornot |
---|
90 | INTEGER lnblnk,ismin,ismax |
---|
91 | EXTERNAL lnblnk,ismin,ismax, isitor, to36 |
---|
92 | |
---|
93 | INTEGER indexfil |
---|
94 | COMMON/indexfil/indexfil |
---|
95 | |
---|
96 | c----------------------------------------------------------------------- |
---|
97 | c verification que le champ est dans la liste predefinie: |
---|
98 | c ------------------------------------------------------- |
---|
99 | |
---|
100 | check = .FALSE. |
---|
101 | |
---|
102 | IF (gnbfich .EQ. 0) THEN |
---|
103 | writeornot = .TRUE. |
---|
104 | ELSE |
---|
105 | CALL isitor(gfichier,writeornot,gnbfich, glistfich) |
---|
106 | ENDIF |
---|
107 | |
---|
108 | IF (check) THEN |
---|
109 | WRITE(*,*) 'MYWRITE:: writeornot=',writeornot |
---|
110 | ENDIF |
---|
111 | |
---|
112 | c----------------------------------------------------------------------- |
---|
113 | IF (writeornot) THEN |
---|
114 | c----------------------------------------------------------------------- |
---|
115 | |
---|
116 | imin = ismin(icount,champ,1) |
---|
117 | imax = ismax(icount,champ,1) |
---|
118 | IF (check) THEN |
---|
119 | WRITE(*,*) gentete(1:lnblnk(gentete)) |
---|
120 | WRITE(*,*) gtitre(1:lnblnk(gtitre)) |
---|
121 | WRITE(*,*) gdatedep |
---|
122 | WRITE(*,*) gdatefin |
---|
123 | WRITE(*,*) gunites(1:lnblnk(gunites)) |
---|
124 | WRITE(*,*) gdeltapas, gnbetats |
---|
125 | WRITE(*,*) gdeltajour |
---|
126 | WRITE(*,*) champ(imin),champ(imax) |
---|
127 | WRITE(*,*) gformat(1:lnblnk(gformat)) |
---|
128 | WRITE(*,*) icount |
---|
129 | ENDIF |
---|
130 | WRITE(*,*) gtitre(1:lnblnk(gtitre)),'min,max:', |
---|
131 | & champ(imin),champ(imax),' ',gunites(1:lnblnk(gunites)) |
---|
132 | |
---|
133 | c----------------------------------------------------------------------- |
---|
134 | c creation eventuelle d'un nom pour le fichier d'ecriture du champ: |
---|
135 | c ----------------------------------------------------------------- |
---|
136 | |
---|
137 | IF(lnblnk(gfichier).LT.1.OR.lnblnk(gfichier).GE.100) THEN |
---|
138 | gfichier(1:5)='champ' |
---|
139 | IF(indexfil.LT.1) indexfil=49 |
---|
140 | gfichier(6:6)=char(indexfil) |
---|
141 | indexfil=indexfil+1 |
---|
142 | PRINT*,'nom du fichier ',gfichier |
---|
143 | ENDIF |
---|
144 | |
---|
145 | c----------------------------------------------------------------------- |
---|
146 | c ecriture sur le fichier de sorties: |
---|
147 | c ----------------------------------- |
---|
148 | |
---|
149 | OPEN (unit=55, file=gfichier(1:lnblnk(gfichier))) |
---|
150 | WRITE(55,'(a)') gentete(1:lnblnk(gentete)) |
---|
151 | WRITE(55,'(a)') gtitre(1:lnblnk(gtitre)) |
---|
152 | WRITE(55,'(a)') gdatedep |
---|
153 | WRITE(55,'(a)') gdatefin |
---|
154 | WRITE(55,'(a)') gunites(1:lnblnk(gunites)) |
---|
155 | WRITE(55,*) gdeltapas, gnbetats |
---|
156 | WRITE(55,*) gdeltajour |
---|
157 | WRITE(55,*) champ(imin),champ(imax) |
---|
158 | WRITE(55,'(a)') '#'//gformat(1:lnblnk(gformat)) |
---|
159 | WRITE(55,*) icount |
---|
160 | |
---|
161 | IF (check) THEN |
---|
162 | WRITE(*,'('//gformat(1:lnblnk(gformat))//')') champ(1) |
---|
163 | ENDIF |
---|
164 | |
---|
165 | IF (lnblnk(gformat).LE.1.OR.lnblnk(gformat).GE.20) THEN |
---|
166 | DO 2230 i=1,icount |
---|
167 | WRITE(55,*) champ(i) |
---|
168 | 2230 CONTINUE |
---|
169 | ELSE |
---|
170 | IF (gformat(1:lnblnk(gformat)) .EQ. 'zxli1') THEN |
---|
171 | CALL to36 (champ,icount,champ(imin),champ(imax),55, 1) |
---|
172 | ELSE |
---|
173 | IF (gformat(1:lnblnk(gformat)) .EQ. 'zxli2') THEN |
---|
174 | CALL to36(champ,icount,champ(imin),champ(imax),55,2) |
---|
175 | ELSE |
---|
176 | IF (gformat(1:lnblnk(gformat)) .EQ. 'zxli3') THEN |
---|
177 | CALL to36(champ,icount,champ(imin),champ(imax),55,3) |
---|
178 | ELSE |
---|
179 | WRITE(55,'('//gformat(1:lnblnk(gformat))//')') |
---|
180 | & (champ(i),i=1,icount) |
---|
181 | ENDIF |
---|
182 | ENDIF |
---|
183 | ENDIF |
---|
184 | ENDIF |
---|
185 | |
---|
186 | CLOSE (unit=55) |
---|
187 | |
---|
188 | gfichier=' ' |
---|
189 | |
---|
190 | c----------------------------------------------------------------------- |
---|
191 | c si on ecrit pas le champ (writeornot.EQ..f.): |
---|
192 | c --------------------------------------------- |
---|
193 | |
---|
194 | ELSE |
---|
195 | WRITE(*,*) 'FILE ',gfichier,'WAS NOT WRITEN' |
---|
196 | ENDIF |
---|
197 | |
---|
198 | RETURN |
---|
199 | END |
---|
200 | |
---|