LMDZ
iostart.F90
Go to the documentation of this file.
1 MODULE iostart
2 
3 PRIVATE
4  INTEGER,SAVE :: nid_start
5  INTEGER,SAVE :: nid_restart
6 
7  INTEGER,SAVE :: idim1,idim2,idim3,idim4
8  INTEGER,PARAMETER :: length=100
9 
10  INTERFACE get_field
11  MODULE PROCEDURE get_field_r1,get_field_r2,get_field_r3
12  END INTERFACE get_field
13 
14  INTERFACE get_var
16  END INTERFACE get_var
17 
18  INTERFACE put_field
19  MODULE PROCEDURE put_field_r1,put_field_r2,put_field_r3
20  END INTERFACE put_field
21 
22  INTERFACE put_var
24  END INTERFACE put_var
25 
28 
29 CONTAINS
30 
31  SUBROUTINE open_startphy(filename)
32  USE netcdf
34  IMPLICIT NONE
35  CHARACTER(LEN=*) :: filename
36  INTEGER :: ierr
37 
38  IF (is_mpi_root .AND. is_omp_root) THEN
39  ierr = nf90_open(filename, nf90_nowrite,nid_start)
40  IF (ierr.NE.nf90_noerr) THEN
41  write(6,*)' Pb d''ouverture du fichier '//filename
42  write(6,*)' ierr = ', ierr
43  CALL abort_physic("", "", 1)
44  ENDIF
45  ENDIF
46 
47  END SUBROUTINE open_startphy
48 
49  SUBROUTINE close_startphy
50  USE netcdf
52  IMPLICIT NONE
53  INTEGER :: ierr
54 
55  IF (is_mpi_root .AND. is_omp_root) THEN
56  ierr = nf90_close(nid_start)
57  ENDIF
58 
59  END SUBROUTINE close_startphy
60 
61 
62  FUNCTION inquire_field(Field_name)
63  USE netcdf
65  IMPLICIT NONE
66  CHARACTER(LEN=*) :: field_name
67  LOGICAL :: inquire_field
68  INTEGER :: varid
69  INTEGER :: ierr
70 
71  IF (is_mpi_root .AND. is_omp_root) THEN
72  ierr=nf90_inq_varid(nid_start,field_name,varid)
73  IF (ierr==nf90_noerr) THEN
75  ELSE
77  ENDIF
78  ENDIF
79 
80  CALL bcast(inquire_field)
81 
82  END FUNCTION inquire_field
83 
84 
85  SUBROUTINE get_field_r1(field_name,field,found)
86  IMPLICIT NONE
87  CHARACTER(LEN=*),INTENT(IN) :: Field_name
88  REAL,INTENT(INOUT) :: Field(:)
89  LOGICAL,INTENT(OUT),OPTIONAL :: found
90 
91  IF (PRESENT(found)) THEN
92  CALL get_field_rgen(field_name,field,1,found)
93  ELSE
94  CALL get_field_rgen(field_name,field,1)
95  ENDIF
96 
97  END SUBROUTINE get_field_r1
98 
99  SUBROUTINE get_field_r2(field_name,field,found)
100  IMPLICIT NONE
101  CHARACTER(LEN=*),INTENT(IN) :: Field_name
102  REAL,INTENT(INOUT) :: Field(:,:)
103  LOGICAL,INTENT(OUT),OPTIONAL :: found
104 
105  IF (PRESENT(found)) THEN
106  CALL get_field_rgen(field_name,field,size(field,2),found)
107  ELSE
108  CALL get_field_rgen(field_name,field,size(field,2))
109  ENDIF
110 
111 
112  END SUBROUTINE get_field_r2
113 
114  SUBROUTINE get_field_r3(field_name,field,found)
115  IMPLICIT NONE
116  CHARACTER(LEN=*),INTENT(IN) :: Field_name
117  REAL,INTENT(INOUT) :: Field(:,:,:)
118  LOGICAL,INTENT(OUT),OPTIONAL :: found
119 
120  IF (PRESENT(found)) THEN
121  CALL get_field_rgen(field_name,field,size(field,2)*size(field,3),found)
122  ELSE
123  CALL get_field_rgen(field_name,field,size(field,2)*size(field,3))
124  ENDIF
125 
126  END SUBROUTINE get_field_r3
127 
128  SUBROUTINE get_field_rgen(field_name,field,field_size,found)
129  USE netcdf
130  USE dimphy
133  IMPLICIT NONE
134  CHARACTER(LEN=*) :: Field_name
135  INTEGER :: field_size
136  REAL :: field(klon,field_size)
137  LOGICAL,OPTIONAL :: found
138 
139  REAL :: field_glo(klon_glo,field_size)
140  LOGICAL :: tmp_found
141  INTEGER :: varid
142  INTEGER :: ierr
143 
144  IF (is_mpi_root .AND. is_omp_root) THEN
145 
146  ierr=nf90_inq_varid(nid_start,field_name,varid)
147 
148  IF (ierr==nf90_noerr) THEN
149  CALL body(field_glo)
150  tmp_found=.true.
151  ELSE
152  tmp_found=.false.
153  ENDIF
154 
155  ENDIF
156 
157  CALL bcast(tmp_found)
158 
159  IF (tmp_found) THEN
160  CALL scatter(field_glo,field)
161  ENDIF
162 
163  IF (PRESENT(found)) THEN
164  found=tmp_found
165  ELSE
166  IF (.NOT. tmp_found) THEN
167  print*, 'phyetat0: Le champ <'//field_name//'> est absent'
168  call abort_physic("", "", 1)
169  ENDIF
170  ENDIF
171 
172 
173  CONTAINS
174 
175  SUBROUTINE body(field_glo)
176  REAL :: field_glo(klon_glo*field_size)
177  ierr=nf90_get_var(nid_start,varid,field_glo)
178  IF (ierr/=nf90_noerr) THEN
179  ! La variable exist dans le fichier mais la lecture a echouee.
180  print*, 'phyetat0: Lecture echouee pour <'//field_name//'>'
181 
182  IF (field_name=='CLWCON' .OR. field_name=='RNEBCON' .OR. field_name=='RATQS') THEN
183  ! Essaye de lire le variable sur surface uniqument, comme fait avant
184  field_glo(:)=0.
185  ierr=nf90_get_var(nid_start,varid,field_glo(1:klon_glo))
186  IF (ierr/=nf90_noerr) THEN
187  print*, 'phyetat0: Lecture echouee aussi en 2D pour <'//field_name//'>'
188  call abort_physic("", "", 1)
189  ELSE
190  print*, 'phyetat0: La variable <'//field_name//'> lu sur surface seulement'!, selon ancien format, le reste mis a zero'
191  END IF
192  ELSE
193  call abort_physic("", "", 1)
194  ENDIF
195  ENDIF
196 
197  END SUBROUTINE body
198 
199  END SUBROUTINE get_field_rgen
200 
201 
202  SUBROUTINE get_var_r0(var_name,var,found)
203  IMPLICIT NONE
204  CHARACTER(LEN=*),INTENT(IN) :: var_name
205  REAL,INTENT(INOUT) :: var
206  LOGICAL,OPTIONAL,INTENT(OUT) :: found
207 
208  REAL :: varout(1)
209 
210  IF (PRESENT(found)) THEN
211  CALL get_var_rgen(var_name,varout,size(varout),found)
212  ELSE
213  CALL get_var_rgen(var_name,varout,size(varout))
214  ENDIF
215  var=varout(1)
216 
217  END SUBROUTINE get_var_r0
218 
219  SUBROUTINE get_var_r1(var_name,var,found)
220  IMPLICIT NONE
221  CHARACTER(LEN=*),INTENT(IN) :: var_name
222  REAL,INTENT(INOUT) :: var(:)
223  LOGICAL,OPTIONAL,INTENT(OUT) :: found
224 
225  IF (PRESENT(found)) THEN
226  CALL get_var_rgen(var_name,var,size(var),found)
227  ELSE
228  CALL get_var_rgen(var_name,var,size(var))
229  ENDIF
230 
231  END SUBROUTINE get_var_r1
232 
233  SUBROUTINE get_var_r2(var_name,var,found)
234  IMPLICIT NONE
235  CHARACTER(LEN=*),INTENT(IN) :: var_name
236  REAL,INTENT(OUT) :: var(:,:)
237  LOGICAL,OPTIONAL,INTENT(OUT) :: found
238 
239  IF (PRESENT(found)) THEN
240  CALL get_var_rgen(var_name,var,size(var),found)
241  ELSE
242  CALL get_var_rgen(var_name,var,size(var))
243  ENDIF
244 
245  END SUBROUTINE get_var_r2
246 
247  SUBROUTINE get_var_r3(var_name,var,found)
248  IMPLICIT NONE
249  CHARACTER(LEN=*),INTENT(IN) :: var_name
250  REAL,INTENT(INOUT) :: var(:,:,:)
251  LOGICAL,OPTIONAL,INTENT(OUT) :: found
252 
253  IF (PRESENT(found)) THEN
254  CALL get_var_rgen(var_name,var,size(var),found)
255  ELSE
256  CALL get_var_rgen(var_name,var,size(var))
257  ENDIF
258 
259  END SUBROUTINE get_var_r3
260 
261  SUBROUTINE get_var_rgen(var_name,var,var_size,found)
262  USE netcdf
263  USE dimphy
266  IMPLICIT NONE
267  CHARACTER(LEN=*) :: var_name
268  INTEGER :: var_size
269  REAL :: var(var_size)
270  LOGICAL,OPTIONAL :: found
271 
272  LOGICAL :: tmp_found
273  INTEGER :: varid
274  INTEGER :: ierr
275 
276  IF (is_mpi_root .AND. is_omp_root) THEN
277 
278  ierr=nf90_inq_varid(nid_start,var_name,varid)
279 
280  IF (ierr==nf90_noerr) THEN
281  ierr=nf90_get_var(nid_start,varid,var)
282  IF (ierr/=nf90_noerr) THEN
283  print*, 'phyetat0: Lecture echouee pour <'//var_name//'>'
284  call abort_physic("", "", 1)
285  ENDIF
286  tmp_found=.true.
287  ELSE
288  tmp_found=.false.
289  ENDIF
290 
291  ENDIF
292 
293  CALL bcast(tmp_found)
294 
295  IF (tmp_found) THEN
296  CALL bcast(var)
297  ENDIF
298 
299  IF (PRESENT(found)) THEN
300  found=tmp_found
301  ELSE
302  IF (.NOT. tmp_found) THEN
303  print*, 'phyetat0: La variable champ <'//var_name//'> est absente'
304  call abort_physic("", "", 1)
305  ENDIF
306  ENDIF
307 
308  END SUBROUTINE get_var_rgen
309 
310 
311  SUBROUTINE open_restartphy(filename)
312  USE netcdf
315  USE dimphy
316  IMPLICIT NONE
317  CHARACTER(LEN=*),INTENT(IN) :: filename
318  INTEGER :: ierr
319 
320  IF (is_mpi_root .AND. is_omp_root) THEN
321  ierr = nf90_create(filename, nf90_clobber, nid_restart)
322  IF (ierr/=nf90_noerr) THEN
323  write(6,*)' Pb d''ouverture du fichier '//filename
324  write(6,*)' ierr = ', ierr
325  CALL abort_physic("", "", 1)
326  ENDIF
327 
328  ierr = nf90_put_att(nid_restart, nf90_global, "title","Fichier redemmarage physique")
329 
330  ierr = nf90_def_dim(nid_restart, "index", length, idim1)
331  ierr = nf90_def_dim(nid_restart, "points_physiques", klon_glo, idim2)
332  ierr = nf90_def_dim(nid_restart, "horizon_vertical", klon_glo*klev, idim3)
333  ierr = nf90_def_dim(nid_restart, "horizon_klevp1", klon_glo*klevp1, idim4)
334 
335  ierr = nf90_enddef(nid_restart)
336  ENDIF
337 
338  END SUBROUTINE open_restartphy
339 
340  SUBROUTINE close_restartphy
341  USE netcdf
343  IMPLICIT NONE
344  INTEGER :: ierr
345 
346  IF (is_mpi_root .AND. is_omp_root) THEN
347  ierr = nf90_close(nid_restart)
348  ENDIF
349 
350  END SUBROUTINE close_restartphy
351 
352 
353  SUBROUTINE put_field_r1(field_name,title,field)
354  IMPLICIT NONE
355  CHARACTER(LEN=*),INTENT(IN) :: field_name
356  CHARACTER(LEN=*),INTENT(IN) :: title
357  REAL,INTENT(IN) :: field(:)
358 
359  CALL put_field_rgen(field_name,title,field,1)
360 
361  END SUBROUTINE put_field_r1
362 
363  SUBROUTINE put_field_r2(field_name,title,field)
364  IMPLICIT NONE
365  CHARACTER(LEN=*),INTENT(IN) :: field_name
366  CHARACTER(LEN=*),INTENT(IN) :: title
367  REAL,INTENT(IN) :: field(:,:)
368 
369  CALL put_field_rgen(field_name,title,field,size(field,2))
370 
371  END SUBROUTINE put_field_r2
372 
373  SUBROUTINE put_field_r3(field_name,title,field)
374  IMPLICIT NONE
375  CHARACTER(LEN=*),INTENT(IN) :: field_name
376  CHARACTER(LEN=*),INTENT(IN) :: title
377  REAL,INTENT(IN) :: field(:,:,:)
378 
379  CALL put_field_rgen(field_name,title,field,size(field,2)*size(field,3))
380 
381  END SUBROUTINE put_field_r3
382 
383  SUBROUTINE put_field_rgen(field_name,title,field,field_size)
384  USE netcdf
385  USE dimphy
388  IMPLICIT NONE
389  CHARACTER(LEN=*),INTENT(IN) :: field_name
390  CHARACTER(LEN=*),INTENT(IN) :: title
391  INTEGER,INTENT(IN) :: field_size
392  REAL,INTENT(IN) :: field(klon,field_size)
393 
394  REAL :: field_glo(klon_glo,field_size)
395  INTEGER :: ierr
396  INTEGER :: nvarid
397  INTEGER :: idim
398 
399 
400  CALL gather(field,field_glo)
401 
402  IF (is_mpi_root .AND. is_omp_root) THEN
403 
404  IF (field_size==1) THEN
405  idim=idim2
406  ELSE IF (field_size==klev) THEN
407  idim=idim3
408  ELSE IF (field_size==klevp1) THEN
409  idim=idim4
410  ELSE
411  print *, "erreur phyredem : probleme de dimension"
412  CALL abort_physic("", "", 1)
413  ENDIF
414 
415  ierr = nf90_redef(nid_restart)
416 #ifdef NC_DOUBLE
417  ierr = nf90_def_var(nid_restart, field_name, nf90_double,(/ idim /),nvarid)
418 #else
419  ierr = nf90_def_var(nid_restart, field_name, nf90_float,(/ idim /),nvarid)
420 #endif
421  IF (len_trim(title) > 0) ierr = nf90_put_att(nid_restart,nvarid,"title", title)
422  ierr = nf90_enddef(nid_restart)
423  ierr = nf90_put_var(nid_restart,nvarid,reshape(field_glo,(/klon_glo*field_size/)))
424  ENDIF
425 
426  END SUBROUTINE put_field_rgen
427 
428  SUBROUTINE put_var_r0(var_name,title,var)
429  IMPLICIT NONE
430  CHARACTER(LEN=*),INTENT(IN) :: var_name
431  CHARACTER(LEN=*),INTENT(IN) :: title
432  REAL,INTENT(IN) :: var
433  REAL :: varin(1)
434 
435  varin(1)=var
436 
437  CALL put_var_rgen(var_name,title,varin,size(varin))
438 
439  END SUBROUTINE put_var_r0
440 
441 
442  SUBROUTINE put_var_r1(var_name,title,var)
443  IMPLICIT NONE
444  CHARACTER(LEN=*),INTENT(IN) :: var_name
445  CHARACTER(LEN=*),INTENT(IN) :: title
446  REAL,INTENT(IN) :: var(:)
447 
448  CALL put_var_rgen(var_name,title,var,size(var))
449 
450  END SUBROUTINE put_var_r1
451 
452  SUBROUTINE put_var_r2(var_name,title,var)
453  IMPLICIT NONE
454  CHARACTER(LEN=*),INTENT(IN) :: var_name
455  CHARACTER(LEN=*),INTENT(IN) :: title
456  REAL,INTENT(IN) :: var(:,:)
457 
458  CALL put_var_rgen(var_name,title,var,size(var))
459 
460  END SUBROUTINE put_var_r2
461 
462  SUBROUTINE put_var_r3(var_name,title,var)
463  IMPLICIT NONE
464  CHARACTER(LEN=*),INTENT(IN) :: var_name
465  CHARACTER(LEN=*),INTENT(IN) :: title
466  REAL,INTENT(IN) :: var(:,:,:)
467 
468  CALL put_var_rgen(var_name,title,var,size(var))
469 
470  END SUBROUTINE put_var_r3
471 
472  SUBROUTINE put_var_rgen(var_name,title,var,var_size)
473  USE netcdf
474  USE dimphy
476  IMPLICIT NONE
477  CHARACTER(LEN=*),INTENT(IN) :: var_name
478  CHARACTER(LEN=*),INTENT(IN) :: title
479  INTEGER,INTENT(IN) :: var_size
480  REAL,INTENT(IN) :: var(var_size)
481 
482  INTEGER :: ierr
483  INTEGER :: nvarid
484 
485  IF (is_mpi_root .AND. is_omp_root) THEN
486 
487  IF (var_size/=length) THEN
488  print *, "erreur phyredem : probleme de dimension"
489  call abort_physic("", "", 1)
490  ENDIF
491 
492  ierr = nf90_redef(nid_restart)
493 
494 #ifdef NC_DOUBLE
495  ierr = nf90_def_var(nid_restart, var_name, nf90_double,(/ idim1 /),nvarid)
496 #else
497  ierr = nf90_def_var(nid_restart, var_name, nf90_float,(/ idim1 /),nvarid)
498 #endif
499  IF (len_trim(title)>0) ierr = nf90_put_att(nid_restart,nvarid,"title", title)
500  ierr = nf90_enddef(nid_restart)
501 
502  ierr = nf90_put_var(nid_restart,nvarid,var)
503 
504  ENDIF
505 
506  END SUBROUTINE put_var_rgen
507 
508 END MODULE iostart
!IM Implemente en modes sequentiel et parallele CALL rlon_glo CALL bcast(rlon_glo)!$OMP MASTER if(is_mpi_root) then!zstophy
subroutine get_var_r2(var_name, var, found)
Definition: iostart.F90:234
subroutine body(field_glo)
Definition: iostart.F90:176
subroutine get_var_rgen(var_name, var, var_size, found)
Definition: iostart.F90:262
integer, parameter length
Definition: iostart.F90:8
subroutine, public open_startphy(filename)
Definition: iostart.F90:32
integer, save klon
Definition: dimphy.F90:3
integer, save klon_glo
integer, save klev
Definition: dimphy.F90:7
subroutine put_var_r2(var_name, title, var)
Definition: iostart.F90:453
subroutine put_var_r3(var_name, title, var)
Definition: iostart.F90:463
subroutine put_var_rgen(var_name, title, var, var_size)
Definition: iostart.F90:473
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!IM Implemente en modes sequentiel et parallele CALL gather(rlat, rlat_glo) CALL bcast(rlat_glo) CALL gather(rlon
logical function inquire_field(Field_name)
Definition: iostart.F90:63
subroutine put_field_r2(field_name, title, field)
Definition: iostart.F90:364
subroutine, public close_restartphy
Definition: iostart.F90:341
subroutine get_var_r0(var_name, var, found)
Definition: iostart.F90:203
subroutine get_field_r2(field_name, field, found)
Definition: iostart.F90:100
subroutine, public close_startphy
Definition: iostart.F90:50
subroutine put_field_r1(field_name, title, field)
Definition: iostart.F90:354
subroutine put_var_r0(var_name, title, var)
Definition: iostart.F90:429
integer, save idim1
Definition: iostart.F90:7
integer, save nid_restart
Definition: iostart.F90:5
subroutine put_field_rgen(field_name, title, field, field_size)
Definition: iostart.F90:384
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine get_field_rgen(field_name, field, field_size, found)
Definition: iostart.F90:129
integer, save klevp1
Definition: dimphy.F90:8
integer, save idim2
Definition: iostart.F90:7
integer, save idim4
Definition: iostart.F90:7
subroutine put_var_r1(var_name, title, var)
Definition: iostart.F90:443
integer, save idim3
Definition: iostart.F90:7
subroutine get_var_r3(var_name, var, found)
Definition: iostart.F90:248
integer, save nid_start
Definition: iostart.F90:4
subroutine abort_physic(modname, message, ierr)
Definition: abort_physic.F90:3
subroutine get_field_r3(field_name, field, found)
Definition: iostart.F90:115
Definition: dimphy.F90:1
subroutine put_field_r3(field_name, title, field)
Definition: iostart.F90:374
subroutine, public open_restartphy(filename)
Definition: iostart.F90:312
subroutine get_var_r1(var_name, var, found)
Definition: iostart.F90:220
subroutine get_field_r1(field_name, field, found)
Definition: iostart.F90:86