source: LMDZ.3.3/branches/rel-LF/libf/bibio/writephys.F90 @ 272

Last change on this file since 272 was 272, checked in by lmdzadmin, 23 years ago

Rajout de profils de variables par fichiers et non plus globaux
Redefinition des chaines de caracteres passees
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.9 KB
Line 
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 
373return
374
375  END SUBROUTINE writephy_sync
376!
377!###########################################################################
378!
379  END MODULE writephys
Note: See TracBrowser for help on using the repository browser.