source: LMDZ.3.3/trunk/libf/bibio/writephys.F90 @ 4360

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

Surcouche de IOIPSL pour l'ecriture des champs de la physique
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.4 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), 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 (len=30) :: 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, var_op, freq_op, freq_wri, zsize, &
155 &                        reg_size, reg_index)
156!
157! Definition de profil type de sortie de variables
158!               (moyenne, instantanee, indexee ...)
159!
160! Parametres d'entree
161!   profil_n      numero du profil-type
162!   var_op        operation a effectuer sur la variable
163!   freq_op       frequence de l'operation
164!   freq_wri      frequence d'ecriture
165!   zsize         variable 2D/3D
166!   reg_size      taille de la region a sortir
167!   reg_index     indices de la region a sortir
168!
169  integer                         :: profil_n
170  character (len = 6)             :: var_op
171  real                            :: freq_op, freq_wri
172  integer                         :: zsize
173  integer, optional               :: reg_size
174  integer, dimension(*), optional :: reg_index
175!
176! variables locales
177!
178  character (len = 20) :: modname = 'writephy_def'
179  character (len = 80) :: message
180  integer              :: dummy_size
181  integer              :: error
182  integer,parameter    :: nulou = 6
183!
184! Differentes verif
185!
186  if (profil_n > nb_prof_max) then
187    message = 'numero de profil de variable > nbre maximal de profil'
188    call abort_gcm(modname, message, 1)
189  endif
190  if (var_profs(profil_n)%freq_wri /= -999) then
191    message = 'numero de profil deja attribue'
192    call abort_gcm(modname, message, 1)
193  endif       
194!
195! Remplissage structure infos
196!
197  var_profs(profil_n)%var_op = var_op
198  var_profs(profil_n)%freq_op = freq_op
199  var_profs(profil_n)%freq_wri = freq_wri
200  var_profs(profil_n)%zsize = zsize
201!
202! test pour region
203!
204  if (present (reg_size)) then
205    if ( .not. present (reg_index)) then
206      message = 'reg_size defini mais pas de region definie'
207      call abort_gcm(modname, message, 1)
208    endif
209    allocate(var_profs(profil_n)%reg_index(reg_size), stat = error)
210    if (error /= 0) then
211      message='Pb allocation reg_index'
212      call abort_gcm(modname,message,1)
213    endif
214    var_profs(profil_n)%reg_size = reg_size
215    var_profs(profil_n)%reg_index = reg_index(1:reg_size)
216  else
217    dummy_size = 1
218    allocate(var_profs(profil_n)%reg_index(dummy_size), stat = error)
219    if (error /= 0) then
220      message='Pb allocation reg_index'
221      call abort_gcm(modname,message,1)
222    endif
223    var_profs(profil_n)%reg_size = dummy_size
224    var_profs(profil_n)%reg_index = 0
225  endif
226
227  write(nulou,*)' Definition du profil de variable numero ', profil_n
228  write(nulou,*)'     operation               ',var_profs(profil_n)%var_op
229  write(nulou,*)'     frequence d''operation  ',var_profs(profil_n)%freq_op
230  write(nulou,*)'     frequence d''ecriture   ',var_profs(profil_n)%freq_wri
231  write(nulou,*)'     2D/3D                   ',var_profs(profil_n)%zsize
232  write(nulou,*)'     taille de la region     ',var_profs(profil_n)%reg_size
233
234  END SUBROUTINE writephy_def
235!
236!###########################################################################
237!
238! A faire: rendre var_title et var_units optionels par lecture d'un tableau
239!
240!
241  SUBROUTINE writephy(file, iprof, var_name, data, var_title, var_units)
242!
243! Definition et ecriture des variables
244!
245! file             numero du fichier dans lequel ecrire
246! iprof            profil de la variable a ecrire
247! var_name         nom de la variable a ecrire
248! data             les donnees effectives a ecrire 
249! var_title        "vrai" nom de la variable, optionel, si non present
250!                  interrogation d'un tableau
251! var_units        unite de la variable, optionel, si non present
252!                  interrogation d'un tableau
253
254  integer              :: file, iprof
255  character (len=10)   :: var_name
256  real, dimension(*)   :: data
257  character (len=40)   :: var_title
258  character (len=20)   :: var_units
259!
260! variables locales
261!
262  integer              :: i, error
263  character (len=6)   :: var_op
264  real                 :: freq_op, freq_wri
265  integer              :: file_id, isize, jsize, lsize, phy_lon, zsize
266  integer              :: nhori, nvert, klon
267  integer              :: nitau
268  real, dimension(:,:,:), allocatable :: temp_data
269  character (len = 20) :: modname = 'writephy'
270  character (len = 80) :: message
271!
272! Test: toujours en mode definition des variables?
273!
274  if (var_name == list_var(1, file)) then
275    hist_files(file)%nitau = hist_files(file)%nitau + 1
276  endif
277  if (hist_files(file)%define) then
278    if (var_name == list_var(1, file)) then
279!     on a fait le tour des variables
280      hist_files(file)%define = .false.
281      call histend(hist_files(file)%file_id)
282!      hist_files(file)%nitau = hist_files(file)%nitau + 1
283    else
284!
285! pour que l'appel a histdef soit plus lisible, on range tout dans des tampons
286!
287      file_id = hist_files(file)%file_id
288      isize = hist_files(file)%isize
289      jsize = hist_files(file)%jsize   
290      nhori = hist_files(file)%nhori
291      klon = hist_files(file)%phy_lon
292      var_op = var_profs(iprof)%var_op
293      freq_op = var_profs(iprof)%freq_op
294      freq_wri = var_profs(iprof)%freq_wri
295      if (var_profs(iprof)%zsize == 0) then
296        lsize = 1
297        nvert = -99
298      else
299        lsize = hist_files(file)%lsize
300        nvert = hist_files(file)%nvert
301      endif
302      call histdef(file_id, var_name, var_title, var_units,  &
303 &                isize, jsize, nhori, lsize, 1, lsize, nvert, nbits,  &
304 &                var_op, freq_op, freq_wri)
305      nb_var(file) = nb_var(file) + 1
306      list_var(nb_var(file), file) = var_name
307    endif
308  endif
309!
310! On ecrit la variable
311!
312! Preparation
313!
314  file_id = hist_files(file)%file_id
315  isize = hist_files(file)%isize
316  jsize = hist_files(file)%jsize   
317  nhori = hist_files(file)%nhori
318  var_op = var_profs(iprof)%var_op
319  freq_op = var_profs(iprof)%freq_op
320  freq_wri = var_profs(iprof)%freq_wri
321  nitau = hist_files(file)%nitau
322
323  if (var_profs(iprof)%zsize == 0) then
324    lsize = 1
325  else
326    lsize = hist_files(file)%lsize
327  endif
328  allocate(temp_data(isize,jsize,lsize), stat = error)
329  if (error /= 0) then
330    message='Pb allocation temp_data'
331    call abort_gcm(modname, message, 1)
332  endif
333!
334! Ecriture
335!
336  call gr_fi_ecrit(lsize, klon, isize, jsize, data, temp_data)
337  call histwrite(file_id, var_name,nitau,temp_data, &
338 &               var_profs(iprof)%reg_size,var_profs(iprof)%reg_index)
339   
340  return
341!
342  END SUBROUTINE writephy
343!
344!###########################################################################
345!
346  SUBROUTINE writephy_sync(nid_file)
347!
348! Flush des donnees dans le fichier et eventuellement fermeture du
349! mode 'define'
350!
351! Entree:
352!   nid_file    numero du fichier a traiter
353!
354  integer     :: nid_file
355!
356  if (hist_files(nid_file)%define) then
357    call histend(hist_files(nid_file)%file_id)
358    hist_files(nid_file)%define = .false.
359  endif
360
361  call histsync(hist_files(nid_file)%file_id)
362 
363return
364
365  END SUBROUTINE writephy_sync
366!
367!###########################################################################
368!
369  END MODULE writephys
Note: See TracBrowser for help on using the repository browser.