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

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

Pb de dimensionnement rlon, rlat
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.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, 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(klon) :: rlon
92  real, dimension(klon) :: 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              :: itau
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    else
292!
293! pour que l'appel a histdef soit plus lisible, on range tout dans des tampons
294!
295      file_id = hist_files(file)%file_id
296      isize = hist_files(file)%isize
297      jsize = hist_files(file)%jsize   
298      nhori = hist_files(file)%nhori
299      klon = hist_files(file)%phy_lon
300      var_op = var_profs(iprof, file)%var_op
301      freq_op = var_profs(iprof, file)%freq_op
302      freq_wri = var_profs(iprof, file)%freq_wri
303      if (var_profs(iprof, file)%zsize == 0) then
304        lsize = 1
305        nvert = -99
306      else
307        lsize = hist_files(file)%lsize
308        nvert = hist_files(file)%nvert
309      endif
310!      if (var_name == 'phis') then
311!        write(*,*)'Define: ',var_name
312!        write(*,*)file_id, var_name, var_title, var_units,  &
313! &                isize, jsize, nhori, lsize, 1, lsize, nvert, nbits,  &
314! &                var_op, freq_op, freq_wri
315!      endif
316      call histdef(file_id, var_name, var_title, var_units,  &
317 &                isize, jsize, nhori, lsize, 1, lsize, nvert, nbits,  &
318 &                var_op, freq_op, freq_wri)
319      nb_var(file) = nb_var(file) + 1
320      list_var(nb_var(file), file) = var_name
321    endif
322  endif
323!
324! On ecrit la variable
325!
326! Preparation
327!
328  file_id = hist_files(file)%file_id
329  isize = hist_files(file)%isize
330  jsize = hist_files(file)%jsize   
331  nhori = hist_files(file)%nhori
332  var_op = var_profs(iprof, file)%var_op
333  freq_op = var_profs(iprof, file)%freq_op
334  freq_wri = var_profs(iprof, file)%freq_wri
335  itau = hist_files(file)%nitau
336
337  if (var_profs(iprof, file)%zsize == 0) then
338    lsize = 1
339  else
340    lsize = hist_files(file)%lsize
341  endif
342  allocate(temp_data(isize,jsize,lsize), stat = error)
343  if (error /= 0) then
344    message='Pb allocation temp_data'
345    call abort_gcm(modname, message, 1)
346  endif
347!
348! Ecriture
349!
350  call gr_fi_ecrit(lsize, klon, isize, jsize, data, temp_data)
351  if (var_name == 'tsol') then
352    write(*,*)'writephys itau = ', file_id, var_name, itau
353!    write(*,*)file_id, var_name,itau,temp_data, &
354! &               var_profs(iprof, file)%reg_size, &
355! &               var_profs(iprof, file)%reg_index
356  endif
357  call histwrite(file_id, var_name,itau,temp_data, &
358 &               var_profs(iprof, file)%reg_size, &
359 &               var_profs(iprof, file)%reg_index)
360
361  deallocate(temp_data)
362 
363  return
364!
365  END SUBROUTINE writephy
366!
367!###########################################################################
368!
369  SUBROUTINE writephy_sync(nid_file)
370!
371! Flush des donnees dans le fichier et eventuellement fermeture du
372! mode 'define'
373!
374! Entree:
375!   nid_file    numero du fichier a traiter
376!
377  integer     :: nid_file
378!
379  if (hist_files(nid_file)%define) then
380    call histend(hist_files(nid_file)%file_id)
381    hist_files(nid_file)%define = .false.
382  endif
383
384  call histsync(hist_files(nid_file)%file_id)
385 
386return
387
388  END SUBROUTINE writephy_sync
389!
390!###########################################################################
391!
392  END MODULE writephys
Note: See TracBrowser for help on using the repository browser.