1 | ! |
---|
2 | ! $Header$ |
---|
3 | ! |
---|
4 | MODULE writephys |
---|
5 | |
---|
6 | ! |
---|
7 | ! Wrapper d'IOIPSL pour l'ecriture des sorties de la physique. Un seul appel |
---|
8 | ! par variable devrait (?) suffire pour l'initialisation et l'ecriture |
---|
9 | ! |
---|
10 | ! LF, LMD, 07/2001 |
---|
11 | ! |
---|
12 | ! 2 routines principales: |
---|
13 | ! writephy_ini pour l'initialisation des fichiers (appel histbeg, histvert) |
---|
14 | ! writephy pour l'ecriture des champs (appel histdef, histwrite) |
---|
15 | ! dans le futur: |
---|
16 | ! writephy_def pour definir des profils de variables |
---|
17 | ! |
---|
18 | USE IOIPSL |
---|
19 | |
---|
20 | IMPLICIT none |
---|
21 | |
---|
22 | PRIVATE |
---|
23 | PUBLIC :: writephy_ini, writephy, writephy_def, writephy_sync |
---|
24 | |
---|
25 | ! |
---|
26 | ! variables locales |
---|
27 | ! |
---|
28 | ! nombre de fichiers maximum a ouvrir |
---|
29 | integer, parameter :: nb_files_max = 20 |
---|
30 | ! nombre de variables maximum par fichier |
---|
31 | integer, parameter :: nb_var_max = 500 |
---|
32 | ! nombre maximum de "profils" de variables |
---|
33 | integer, parameter :: nb_prof_max = 10 |
---|
34 | ! structure d'infos sur les fichiers |
---|
35 | type fichier |
---|
36 | character*30 :: file_name |
---|
37 | integer :: nitau |
---|
38 | integer :: file_id |
---|
39 | integer :: isize, jsize, lsize, phy_lon |
---|
40 | integer :: nhori, nvert |
---|
41 | logical :: define |
---|
42 | end type fichier |
---|
43 | type (fichier), dimension(nb_files_max), save :: hist_files |
---|
44 | ! structure de profils de variables |
---|
45 | type profils |
---|
46 | real :: freq_op |
---|
47 | real :: freq_wri |
---|
48 | character*6 :: var_op |
---|
49 | integer :: zsize |
---|
50 | integer :: reg_size |
---|
51 | integer,dimension(:), pointer :: reg_index |
---|
52 | end type profils |
---|
53 | type (profils), dimension(nb_prof_max, nb_files_max), save :: var_profs |
---|
54 | |
---|
55 | ! liste des variables par fichier |
---|
56 | character (len=10), save, dimension(nb_var_max,nb_files_max) :: list_var='undefined' |
---|
57 | ! nombre de variables par fichier |
---|
58 | integer, save, dimension(nb_files_max) :: nb_var = 0 |
---|
59 | ! nombre de bits à sauvegarder dans les fichiers |
---|
60 | integer, save :: nbits = 32 |
---|
61 | ! |
---|
62 | ! Quelques initialisations |
---|
63 | ! |
---|
64 | |
---|
65 | CONTAINS |
---|
66 | |
---|
67 | ! |
---|
68 | !########################################################################### |
---|
69 | ! |
---|
70 | SUBROUTINE writephy_ini(nid_file, nom_fichier, klon, iim, jjm, llm, & |
---|
71 | & rlon, rlat, zlev, & |
---|
72 | & date0, dtime) |
---|
73 | ! |
---|
74 | ! Initialisation des fichiers histoire de la physique |
---|
75 | ! Appels a histbeg, histvert |
---|
76 | ! Remplissage des structures d'informations sur les fichiers |
---|
77 | ! |
---|
78 | ! Entree: |
---|
79 | ! nid_file numero/index du fichier a initialiser |
---|
80 | ! nom_fichier nom du fichier |
---|
81 | ! klon taille des champs physiques |
---|
82 | ! iim, jjm, llm taille en i,j,k |
---|
83 | ! rlon, rlat, zlev coordonnees en x, y, z |
---|
84 | ! date0 date debut |
---|
85 | ! dtime pas de temps elementaire de la physique |
---|
86 | ! |
---|
87 | ! Declaration des parametres d'entree |
---|
88 | integer :: nid_file |
---|
89 | character*(*) :: nom_fichier |
---|
90 | integer :: iim, jjm, llm, klon |
---|
91 | real, dimension(iim) :: rlon |
---|
92 | real, dimension(jjm) :: rlat |
---|
93 | real, dimension(llm) :: zlev |
---|
94 | real :: date0, dtime |
---|
95 | ! |
---|
96 | ! Variables locales |
---|
97 | ! |
---|
98 | integer :: i, file_id, nvert, nhori |
---|
99 | real, dimension(iim, jjm) :: temp_lon, temp_lat |
---|
100 | logical, save :: first_call = .true. |
---|
101 | integer,parameter :: nulou = 6 |
---|
102 | ! |
---|
103 | ! Quelques initialisations |
---|
104 | ! |
---|
105 | if (first_call) then |
---|
106 | hist_files(:)%define = .true. |
---|
107 | var_profs(:,:)%freq_wri = -999 |
---|
108 | hist_files(:)%nitau = 1 |
---|
109 | first_call= .false. |
---|
110 | endif |
---|
111 | ! |
---|
112 | ! Mise des coordonnees sur une grille 2D |
---|
113 | ! |
---|
114 | call gr_fi_ecrit(1,klon,iim,jjm,rlon,temp_lon) |
---|
115 | do i = 1, iim |
---|
116 | temp_lon(i,1) = rlon(i+1) |
---|
117 | temp_lon(i,jjm) = rlon(i+1) |
---|
118 | enddo |
---|
119 | call gr_fi_ecrit(1,klon,iim,jjm,rlat,temp_lat) |
---|
120 | ! |
---|
121 | ! Initialisation du fichier |
---|
122 | ! |
---|
123 | call histbeg(nom_fichier, iim, temp_lon, jjm, temp_lat, & |
---|
124 | & 1, iim, 1, jjm, 0, date0, dtime, & |
---|
125 | & nhori, file_id) |
---|
126 | call histvert(file_id, "presnivs", "Vertical levels", "mb", & |
---|
127 | & llm, zlev, nvert) |
---|
128 | |
---|
129 | ! |
---|
130 | ! Remplissage des infos |
---|
131 | ! |
---|
132 | hist_files(nid_file)%file_name = nom_fichier |
---|
133 | hist_files(nid_file)%file_id = file_id |
---|
134 | hist_files(nid_file)%isize = iim |
---|
135 | hist_files(nid_file)%jsize = jjm |
---|
136 | hist_files(nid_file)%lsize = llm |
---|
137 | hist_files(nid_file)%phy_lon = klon |
---|
138 | hist_files(nid_file)%nhori = nhori |
---|
139 | hist_files(nid_file)%nvert = nvert |
---|
140 | |
---|
141 | write(nulou,*)'####################################' |
---|
142 | write(nulou,*)' Definition du fichier no ',nid_file |
---|
143 | write(nulou,*)' nom du fichier ',hist_files(nid_file)%file_name |
---|
144 | write(nulou,*)' identifiant ',hist_files(nid_file)%file_id |
---|
145 | write(nulou,*)' taille en i ',hist_files(nid_file)%isize |
---|
146 | write(nulou,*)' taille en j ',hist_files(nid_file)%jsize |
---|
147 | write(nulou,*)' taille en l ',hist_files(nid_file)%lsize |
---|
148 | |
---|
149 | ! |
---|
150 | END SUBROUTINE writephy_ini |
---|
151 | ! |
---|
152 | !########################################################################### |
---|
153 | ! |
---|
154 | SUBROUTINE writephy_def(profil_n, nid_file, & |
---|
155 | & var_op, freq_op, freq_wri, zsize, & |
---|
156 | & reg_size, reg_index) |
---|
157 | ! |
---|
158 | ! Definition de profil type de sortie de variables |
---|
159 | ! (moyenne, instantanee, indexee ...) |
---|
160 | ! |
---|
161 | ! Parametres d'entree |
---|
162 | ! profil_n numero du profil-type |
---|
163 | ! nid_file numero de fichier |
---|
164 | ! var_op operation a effectuer sur la variable |
---|
165 | ! freq_op frequence de l'operation |
---|
166 | ! freq_wri frequence d'ecriture |
---|
167 | ! zsize variable 2D/3D |
---|
168 | ! reg_size taille de la region a sortir |
---|
169 | ! reg_index indices de la region a sortir |
---|
170 | ! |
---|
171 | integer :: profil_n |
---|
172 | integer :: nid_file |
---|
173 | character*(*) :: var_op |
---|
174 | real :: freq_op, freq_wri |
---|
175 | integer :: zsize |
---|
176 | integer, optional :: reg_size |
---|
177 | integer, dimension(*), optional :: reg_index |
---|
178 | ! |
---|
179 | ! variables locales |
---|
180 | ! |
---|
181 | character (len = 20) :: modname = 'writephy_def' |
---|
182 | character (len = 80) :: message |
---|
183 | integer :: dummy_size |
---|
184 | integer :: error |
---|
185 | integer,parameter :: nulou = 6 |
---|
186 | ! |
---|
187 | ! Differentes verif |
---|
188 | ! |
---|
189 | if (profil_n > nb_prof_max) then |
---|
190 | message = 'numero de profil de variable > nbre maximal de profil' |
---|
191 | call abort_gcm(modname, message, 1) |
---|
192 | endif |
---|
193 | if (var_profs(profil_n, nid_file)%freq_wri /= -999) then |
---|
194 | message = 'numero de profil deja attribue' |
---|
195 | call abort_gcm(modname, message, 1) |
---|
196 | endif |
---|
197 | ! |
---|
198 | ! Remplissage structure infos |
---|
199 | ! |
---|
200 | var_profs(profil_n, nid_file)%var_op = var_op |
---|
201 | var_profs(profil_n, nid_file)%freq_op = freq_op |
---|
202 | var_profs(profil_n, nid_file)%freq_wri = freq_wri |
---|
203 | var_profs(profil_n, nid_file)%zsize = zsize |
---|
204 | ! |
---|
205 | ! test pour region |
---|
206 | ! |
---|
207 | if (present (reg_size)) then |
---|
208 | if ( .not. present (reg_index)) then |
---|
209 | message = 'reg_size defini mais pas de region definie' |
---|
210 | call abort_gcm(modname, message, 1) |
---|
211 | endif |
---|
212 | allocate(var_profs(profil_n, nid_file)%reg_index(reg_size), stat = error) |
---|
213 | if (error /= 0) then |
---|
214 | message='Pb allocation reg_index' |
---|
215 | call abort_gcm(modname,message,1) |
---|
216 | endif |
---|
217 | var_profs(profil_n, nid_file)%reg_size = reg_size |
---|
218 | var_profs(profil_n, nid_file)%reg_index = reg_index(1:reg_size) |
---|
219 | else |
---|
220 | dummy_size = 1 |
---|
221 | allocate(var_profs(profil_n, nid_file)%reg_index(dummy_size), stat = error) |
---|
222 | if (error /= 0) then |
---|
223 | message='Pb allocation reg_index' |
---|
224 | call abort_gcm(modname,message,1) |
---|
225 | endif |
---|
226 | var_profs(profil_n, nid_file)%reg_size = dummy_size |
---|
227 | var_profs(profil_n, nid_file)%reg_index = 0 |
---|
228 | endif |
---|
229 | |
---|
230 | write(nulou,*)' Definition du profil de variable numero ', profil_n |
---|
231 | write(nulou,*)' du fichier ', nid_file |
---|
232 | write(nulou,*)' operation ', & |
---|
233 | & var_profs(profil_n, nid_file)%var_op |
---|
234 | write(nulou,*)' frequence d''operation ', & |
---|
235 | & var_profs(profil_n, nid_file)%freq_op |
---|
236 | write(nulou,*)' frequence d''ecriture ', & |
---|
237 | & var_profs(profil_n, nid_file)%freq_wri |
---|
238 | write(nulou,*)' 2D/3D ', & |
---|
239 | & var_profs(profil_n, nid_file)%zsize |
---|
240 | write(nulou,*)' taille de la region ', & |
---|
241 | & var_profs(profil_n, nid_file)%reg_size |
---|
242 | |
---|
243 | END SUBROUTINE writephy_def |
---|
244 | ! |
---|
245 | !########################################################################### |
---|
246 | ! |
---|
247 | ! A faire: rendre var_title et var_units optionels par lecture d'un tableau |
---|
248 | ! |
---|
249 | ! |
---|
250 | SUBROUTINE writephy(file, iprof, var_name, data, var_title, var_units) |
---|
251 | ! |
---|
252 | ! Definition et ecriture des variables |
---|
253 | ! |
---|
254 | ! file numero du fichier dans lequel ecrire |
---|
255 | ! iprof profil de la variable a ecrire |
---|
256 | ! var_name nom de la variable a ecrire |
---|
257 | ! data les donnees effectives a ecrire |
---|
258 | ! var_title "vrai" nom de la variable, optionel, si non present |
---|
259 | ! interrogation d'un tableau |
---|
260 | ! var_units unite de la variable, optionel, si non present |
---|
261 | ! interrogation d'un tableau |
---|
262 | |
---|
263 | integer :: file, iprof |
---|
264 | character*(*) :: var_name |
---|
265 | real, dimension(*) :: data |
---|
266 | character*(*) :: var_title |
---|
267 | character*(*) :: var_units |
---|
268 | ! |
---|
269 | ! variables locales |
---|
270 | ! |
---|
271 | integer :: i, error |
---|
272 | character (len=6) :: var_op |
---|
273 | real :: freq_op, freq_wri |
---|
274 | integer :: file_id, isize, jsize, lsize, phy_lon, zsize |
---|
275 | integer :: nhori, nvert, klon |
---|
276 | integer :: nitau |
---|
277 | real, dimension(:,:,:), allocatable :: temp_data |
---|
278 | character (len = 20) :: modname = 'writephy' |
---|
279 | character (len = 80) :: message |
---|
280 | ! |
---|
281 | ! Test: toujours en mode definition des variables? |
---|
282 | ! |
---|
283 | if (var_name == list_var(1, file)) then |
---|
284 | hist_files(file)%nitau = hist_files(file)%nitau + 1 |
---|
285 | endif |
---|
286 | if (hist_files(file)%define) then |
---|
287 | if (var_name == list_var(1, file)) then |
---|
288 | ! on a fait le tour des variables |
---|
289 | hist_files(file)%define = .false. |
---|
290 | call histend(hist_files(file)%file_id) |
---|
291 | ! hist_files(file)%nitau = hist_files(file)%nitau + 1 |
---|
292 | else |
---|
293 | ! |
---|
294 | ! pour que l'appel a histdef soit plus lisible, on range tout dans des tampons |
---|
295 | ! |
---|
296 | file_id = hist_files(file)%file_id |
---|
297 | isize = hist_files(file)%isize |
---|
298 | jsize = hist_files(file)%jsize |
---|
299 | nhori = hist_files(file)%nhori |
---|
300 | klon = hist_files(file)%phy_lon |
---|
301 | var_op = var_profs(iprof, file)%var_op |
---|
302 | freq_op = var_profs(iprof, file)%freq_op |
---|
303 | freq_wri = var_profs(iprof, file)%freq_wri |
---|
304 | if (var_profs(iprof, file)%zsize == 0) then |
---|
305 | lsize = 1 |
---|
306 | nvert = -99 |
---|
307 | else |
---|
308 | lsize = hist_files(file)%lsize |
---|
309 | nvert = hist_files(file)%nvert |
---|
310 | endif |
---|
311 | call histdef(file_id, var_name, var_title, var_units, & |
---|
312 | & isize, jsize, nhori, lsize, 1, lsize, nvert, nbits, & |
---|
313 | & var_op, freq_op, freq_wri) |
---|
314 | nb_var(file) = nb_var(file) + 1 |
---|
315 | list_var(nb_var(file), file) = var_name |
---|
316 | endif |
---|
317 | endif |
---|
318 | ! |
---|
319 | ! On ecrit la variable |
---|
320 | ! |
---|
321 | ! Preparation |
---|
322 | ! |
---|
323 | file_id = hist_files(file)%file_id |
---|
324 | isize = hist_files(file)%isize |
---|
325 | jsize = hist_files(file)%jsize |
---|
326 | nhori = hist_files(file)%nhori |
---|
327 | var_op = var_profs(iprof, file)%var_op |
---|
328 | freq_op = var_profs(iprof, file)%freq_op |
---|
329 | freq_wri = var_profs(iprof, file)%freq_wri |
---|
330 | nitau = hist_files(file)%nitau |
---|
331 | |
---|
332 | if (var_profs(iprof, file)%zsize == 0) then |
---|
333 | lsize = 1 |
---|
334 | else |
---|
335 | lsize = hist_files(file)%lsize |
---|
336 | endif |
---|
337 | allocate(temp_data(isize,jsize,lsize), stat = error) |
---|
338 | if (error /= 0) then |
---|
339 | message='Pb allocation temp_data' |
---|
340 | call abort_gcm(modname, message, 1) |
---|
341 | endif |
---|
342 | ! |
---|
343 | ! Ecriture |
---|
344 | ! |
---|
345 | call gr_fi_ecrit(lsize, klon, isize, jsize, data, temp_data) |
---|
346 | call histwrite(file_id, var_name,nitau,temp_data, & |
---|
347 | & var_profs(iprof, file)%reg_size, & |
---|
348 | & var_profs(iprof, file)%reg_index) |
---|
349 | |
---|
350 | return |
---|
351 | ! |
---|
352 | END SUBROUTINE writephy |
---|
353 | ! |
---|
354 | !########################################################################### |
---|
355 | ! |
---|
356 | SUBROUTINE writephy_sync(nid_file) |
---|
357 | ! |
---|
358 | ! Flush des donnees dans le fichier et eventuellement fermeture du |
---|
359 | ! mode 'define' |
---|
360 | ! |
---|
361 | ! Entree: |
---|
362 | ! nid_file numero du fichier a traiter |
---|
363 | ! |
---|
364 | integer :: nid_file |
---|
365 | ! |
---|
366 | if (hist_files(nid_file)%define) then |
---|
367 | call histend(hist_files(nid_file)%file_id) |
---|
368 | hist_files(nid_file)%define = .false. |
---|
369 | endif |
---|
370 | |
---|
371 | call histsync(hist_files(nid_file)%file_id) |
---|
372 | |
---|
373 | return |
---|
374 | |
---|
375 | END SUBROUTINE writephy_sync |
---|
376 | ! |
---|
377 | !########################################################################### |
---|
378 | ! |
---|
379 | END MODULE writephys |
---|