source: trunk/LMDZ.VENUS/libf/phyvenus/iostart.F90 @ 3892

Last change on this file since 3892 was 3841, checked in by emillour, 5 months ago

Venus PCM:
Some work towards making OpenMP work:

  • adding some threadprivate statements for saved variables (many more missing)
  • turn conf_phys.F90 into a module
  • update way of reading/writing startphy (iostart.F90/phyredem.F)

EM

File size: 17.4 KB
Line 
1MODULE iostart
2
3PRIVATE
4    INTEGER,SAVE :: nid_start
5    INTEGER,SAVE :: nid_restart
6!$OMP THREADPRIVATE(nid_start,nid_restart)   
7
8    INTEGER,SAVE :: idim1,idim2,idim3,idim4
9!$OMP THREADPRIVATE(idim1,idim2,idim3,idim4)
10    INTEGER,PARAMETER :: length=100
11   
12    INTERFACE get_field
13      MODULE PROCEDURE Get_field_r1,Get_field_r2,Get_field_r3
14    END INTERFACE get_field
15   
16    INTERFACE get_var
17      MODULE PROCEDURE get_var_r0,Get_var_r1,Get_var_r2,Get_var_r3
18    END INTERFACE get_var
19
20    INTERFACE put_field
21      MODULE PROCEDURE put_field_r1,put_field_r2,put_field_r3
22    END INTERFACE put_field
23
24    INTERFACE put_var
25      MODULE PROCEDURE put_var_r0,put_var_r1,put_var_r2,put_var_r3
26    END INTERFACE put_var
27
28    PUBLIC get_field,get_var,put_field,put_var
29    PUBLIC open_startphy,close_startphy,open_restartphy,close_restartphy
30    PUBLIC enddef_restartphy
31   
32CONTAINS
33
34  SUBROUTINE open_startphy(filename)
35  USE netcdf, ONLY: NF90_OPEN, nf90_strerror, NF90_NOWRITE, NF90_NOERR
36  USE mod_phys_lmdz_para, ONLY: is_master
37  IMPLICIT NONE
38    CHARACTER(LEN=*),INTENT(IN) :: filename
39    INTEGER          :: ierr
40
41    IF (is_master) THEN
42      ierr = NF90_OPEN (filename, NF90_NOWRITE,nid_start)
43      IF (ierr.NE.NF90_NOERR) THEN
44        write(*,*)'open_startphy: problem opening file '//trim(filename)
45        write(*,*)trim(nf90_strerror(ierr))
46        CALL abort_physic("open_startphy","Cannot open file",1)
47      ENDIF
48    ENDIF
49   
50  END SUBROUTINE open_startphy
51
52  SUBROUTINE Close_startphy
53  USE netcdf, ONLY: NF90_CLOSE
54  USE mod_phys_lmdz_para, ONLY: is_master
55  IMPLICIT NONE
56    INTEGER          :: ierr
57
58    IF (is_master) THEN
59        ierr = NF90_CLOSE (nid_start)
60    ENDIF
61
62  END SUBROUTINE close_startphy
63
64
65  FUNCTION Inquire_Field(Field_name)
66  USE netcdf, ONLY: NF90_INQ_VARID, NF90_NOERR
67  USE mod_phys_lmdz_para, only: is_master, bcast
68  IMPLICIT NONE
69    CHARACTER(LEN=*),INTENT(IN) :: Field_name
70    LOGICAL :: inquire_field
71    INTEGER :: varid
72    INTEGER :: ierr
73   
74    IF (is_master) THEN
75      ierr=NF90_INQ_VARID(nid_start,Field_name,varid)
76      IF (ierr==NF90_NOERR) THEN
77        Inquire_field=.TRUE.
78      ELSE
79        Inquire_field=.FALSE.
80      ENDIF
81    ENDIF
82
83    CALL bcast(Inquire_field)
84
85  END FUNCTION Inquire_Field
86 
87 
88  SUBROUTINE Get_Field_r1(field_name,field,found)
89  IMPLICIT NONE
90    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
91    REAL,INTENT(INOUT)               :: Field(:)
92    LOGICAL,INTENT(OUT),OPTIONAL   :: found
93
94    IF (PRESENT(found)) THEN
95      CALL Get_field_rgen(field_name,field,1,found)
96    ELSE
97      CALL Get_field_rgen(field_name,field,1)
98    ENDIF
99     
100  END SUBROUTINE Get_Field_r1
101 
102  SUBROUTINE Get_Field_r2(field_name,field,found)
103  IMPLICIT NONE
104    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
105    REAL,INTENT(INOUT)               :: Field(:,:)
106    LOGICAL,INTENT(OUT),OPTIONAL   :: found
107
108    IF (PRESENT(found)) THEN
109      CALL Get_field_rgen(field_name,field,size(field,2),found)
110    ELSE
111      CALL Get_field_rgen(field_name,field,size(field,2))
112    ENDIF
113
114     
115  END SUBROUTINE Get_Field_r2
116 
117  SUBROUTINE Get_Field_r3(field_name,field,found)
118  IMPLICIT NONE
119    CHARACTER(LEN=*),INTENT(IN)    :: Field_name
120    REAL,INTENT(INOUT)               :: Field(:,:,:)
121    LOGICAL,INTENT(OUT),OPTIONAL   :: found
122
123    IF (PRESENT(found)) THEN
124      CALL Get_field_rgen(field_name,field,size(field,2)*size(field,3),found)
125    ELSE
126      CALL Get_field_rgen(field_name,field,size(field,2)*size(field,3))
127    ENDIF
128     
129  END SUBROUTINE Get_Field_r3
130 
131  SUBROUTINE Get_field_rgen(field_name,field,field_size,found)
132  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
133  USE dimphy, ONLY: klon ! number of columns on local grid
134  USE geometry_mod, ONLY: ind_cell_glo
135  USE mod_grid_phy_lmdz, ONLY: klon_glo ! number of columns on global grid
136  USE mod_phys_lmdz_para, ONLY: is_master, bcast, scatter, gather
137  IMPLICIT NONE
138    CHARACTER(LEN=*),INTENT(IN) :: Field_name
139    INTEGER,INTENT(IN) :: field_size
140    REAL,INTENT(OUT) :: field(klon,field_size)
141    LOGICAL,OPTIONAL,INTENT(OUT) :: found
142   
143    REAL,ALLOCATABLE :: field_glo(:,:) ! field on global grid
144    REAL,ALLOCATABLE :: field_glo_tmp(:,:)
145    INTEGER,ALLOCATABLE :: ind_cell_glo_glo(:) ! cell indexes on global grid
146    LOGICAL :: tmp_found
147    INTEGER :: varid
148    INTEGER :: ierr, i
149   
150    IF (is_master) THEN
151      ALLOCATE(ind_cell_glo_glo(klon_glo))
152      ALLOCATE(field_glo(klon_glo,field_size))
153      ALLOCATE(field_glo_tmp(klon_glo,field_size))
154    ELSE
155      ALLOCATE(ind_cell_glo_glo(0))
156      ALLOCATE(field_glo(0,0))
157    ENDIF
158
159    ! gather columns indexes on global grid
160    CALL gather(ind_cell_glo,ind_cell_glo_glo)
161
162    IF (is_master) THEN
163 
164      ierr=NF90_INQ_VARID(nid_start,Field_name,varid)
165     
166      IF (ierr==NF90_NOERR) THEN
167        CALL body(field_glo_tmp)
168        tmp_found=.TRUE.
169      ELSE
170        tmp_found=.FALSE.
171      ENDIF
172   
173    ENDIF ! of IF (is_master)
174   
175    CALL bcast(tmp_found)
176
177    IF (tmp_found) THEN
178      IF (is_master) THEN
179        ! reorder columns according to ind_cell_glo(:) indexes
180        DO i=1,klon_glo
181          field_glo(i,:)=field_glo_tmp(ind_cell_glo_glo(i),:)
182        ENDDO
183      ENDIF
184      CALL scatter(field_glo,field)
185    ENDIF
186   
187    IF (PRESENT(found)) THEN
188      found=tmp_found
189    ELSE
190      IF (.NOT. tmp_found) THEN
191        PRINT*, 'get_field_rgen: Field <'//field_name//'> not found'
192        CALL abort_physic("get_field_rgen","Failed to find field",1)
193      ENDIF
194    ENDIF
195 
196   
197    CONTAINS
198     
199     SUBROUTINE body(field_glo)
200       REAL :: field_glo(klon_glo*field_size)
201         ierr=NF90_GET_VAR(nid_start,varid,field_glo)
202         IF (ierr/=NF90_NOERR) THEN
203           ! La variable exist dans le fichier mais la lecture a echouee.
204           PRINT*, 'get_field_rgen: Failed reading <'//field_name//'>'
205           ! It looks like the following is for Earth physics only...
206           !IF (field_name=='CLWCON' .OR. field_name=='RNEBCON' .OR. field_name=='RATQS') THEN
207           !   ! Essaye de lire le variable sur surface uniqument, comme fait avant
208           !   field_glo(:)=0.
209           !   ierr=NF90_GET_VAR(nid_start,varid,field_glo(1:klon_glo))
210           !   IF (ierr/=NF90_NOERR) THEN
211           !      PRINT*, 'phyetat0: Lecture echouee aussi en 2D pour <'//field_name//'>'
212           !      CALL abort
213           !   ELSE
214           !      PRINT*, 'phyetat0: La variable <'//field_name//'> lu sur surface seulement'!, selon ancien format, le reste mis a zero'
215           !   END IF
216           !ELSE
217          CALL abort_physic("get_field_rgen","Failed to read field",1)
218           !ENDIF
219         ENDIF
220
221     END SUBROUTINE body
222
223  END SUBROUTINE Get_field_rgen
224 
225
226  SUBROUTINE get_var_r0(var_name,var,found)
227  IMPLICIT NONE 
228    CHARACTER(LEN=*),INTENT(IN)  :: var_name
229    REAL,INTENT(INOUT)             :: var
230    LOGICAL,OPTIONAL,INTENT(OUT) :: found
231
232    REAL                         :: varout(1)
233   
234    IF (PRESENT(found)) THEN
235      CALL Get_var_rgen(var_name,varout,size(varout),found)
236    ELSE
237      CALL Get_var_rgen(var_name,varout,size(varout))
238    ENDIF
239    var=varout(1)
240 
241  END SUBROUTINE get_var_r0
242
243  SUBROUTINE get_var_r1(var_name,var,found)
244  IMPLICIT NONE 
245    CHARACTER(LEN=*),INTENT(IN)  :: var_name
246    REAL,INTENT(INOUT)             :: var(:)
247    LOGICAL,OPTIONAL,INTENT(OUT) :: found
248   
249    IF (PRESENT(found)) THEN
250      CALL Get_var_rgen(var_name,var,size(var),found)
251    ELSE
252      CALL Get_var_rgen(var_name,var,size(var))
253    ENDIF
254 
255  END SUBROUTINE get_var_r1
256
257  SUBROUTINE get_var_r2(var_name,var,found)
258  IMPLICIT NONE 
259    CHARACTER(LEN=*),INTENT(IN)  :: var_name
260    REAL,INTENT(OUT)             :: var(:,:)
261    LOGICAL,OPTIONAL,INTENT(OUT) :: found
262   
263    IF (PRESENT(found)) THEN
264      CALL Get_var_rgen(var_name,var,size(var),found)
265    ELSE
266      CALL Get_var_rgen(var_name,var,size(var))
267    ENDIF
268 
269  END SUBROUTINE get_var_r2
270
271  SUBROUTINE get_var_r3(var_name,var,found)
272  IMPLICIT NONE 
273    CHARACTER(LEN=*),INTENT(IN)  :: var_name
274    REAL,INTENT(INOUT)             :: var(:,:,:)
275    LOGICAL,OPTIONAL,INTENT(OUT) :: found
276   
277    IF (PRESENT(found)) THEN
278      CALL Get_var_rgen(var_name,var,size(var),found)
279    ELSE
280      CALL Get_var_rgen(var_name,var,size(var))
281    ENDIF
282 
283  END SUBROUTINE get_var_r3
284
285  SUBROUTINE Get_var_rgen(var_name,var,var_size,found)
286  USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR
287  USE mod_phys_lmdz_para, ONLY: is_master, bcast
288  IMPLICIT NONE
289    CHARACTER(LEN=*),INTENT(IN) :: var_name
290    INTEGER,INTENT(IN) :: var_size
291    REAL,INTENT(OUT) :: var(var_size)
292    LOGICAL,OPTIONAL,INTENT(OUT) :: found
293   
294    LOGICAL :: tmp_found
295    INTEGER :: varid
296    INTEGER :: ierr
297   
298    IF (is_master) THEN
299 
300      ierr=NF90_INQ_VARID(nid_start,var_name,varid)
301     
302      IF (ierr==NF90_NOERR) THEN
303        ierr=NF90_GET_VAR(nid_start,varid,var)
304        IF (ierr/=NF90_NOERR) THEN
305          PRINT*, 'phyetat0: Failed loading <'//trim(var_name)//'>'
306          CALL abort_physic("get_var_rgen","Failed to read variable",1)
307        ENDIF
308        tmp_found=.TRUE.
309      ELSE
310        tmp_found=.FALSE.
311      ENDIF
312   
313    ENDIF
314   
315    CALL bcast(tmp_found)
316
317    IF (tmp_found) THEN
318      CALL bcast(var)
319    ENDIF
320   
321    IF (PRESENT(found)) THEN
322      found=tmp_found
323    ELSE
324      IF (.NOT. tmp_found) THEN
325        PRINT*, 'phyetat0: Variable <'//trim(var_name)//'> not found'
326        CALL abort_physic("get_var_rgen","Failed to read variable",1)
327      ENDIF
328    ENDIF
329
330  END SUBROUTINE Get_var_rgen
331
332
333  SUBROUTINE open_restartphy(filename)
334  USE netcdf, ONLY: NF90_CREATE, NF90_CLOBBER, NF90_NOERR, nf90_strerror, &
335                    NF90_PUT_ATT, NF90_GLOBAL, NF90_DEF_DIM, &
336                    NF90_ENDDEF
337  USE mod_phys_lmdz_para,ONLY: is_master
338  USE mod_grid_phy_lmdz, ONLY: klon_glo
339  USE dimphy, ONLY: klev, klevp1
340  IMPLICIT NONE
341    CHARACTER(LEN=*),INTENT(IN) :: filename
342    INTEGER                     :: ierr
343   
344    IF (is_master) THEN
345      ierr = NF90_CREATE(filename, NF90_CLOBBER, nid_restart)
346      IF (ierr/=NF90_NOERR) THEN
347          write(*,*)'open_restartphy: problem creating file '//trim(filename)
348          write(*,*)trim(nf90_strerror(ierr))
349          CALL abort_physic("open_restartphy","Failed creating file",1)
350      ENDIF
351
352      ierr = NF90_PUT_ATT (nid_restart, NF90_GLOBAL, "title","Fichier redemarrage physique")
353
354      ierr = NF90_DEF_DIM (nid_restart, "index", length, idim1)
355      ierr = NF90_DEF_DIM (nid_restart, "points_physiques", klon_glo, idim2)
356      ierr = NF90_DEF_DIM (nid_restart, "horizon_vertical", klon_glo*klev, idim3)
357      ierr = NF90_DEF_DIM (nid_restart, "horizon_klevp1", klon_glo*klevp1, idim4)
358
359!      ierr = NF90_ENDDEF(nid_restart)
360    ENDIF ! of IF (is_master)
361
362  END SUBROUTINE open_restartphy
363 
364  SUBROUTINE enddef_restartphy
365  USE netcdf, ONLY: NF90_ENDDEF
366  USE mod_phys_lmdz_para, ONLY: is_master
367  IMPLICIT NONE
368    INTEGER          :: ierr
369
370    IF (is_master) ierr = NF90_ENDDEF(nid_restart)
371 
372  END SUBROUTINE enddef_restartphy
373
374  SUBROUTINE close_restartphy
375  USE netcdf, ONLY: NF90_CLOSE
376  USE mod_phys_lmdz_para, ONLY: is_master
377  IMPLICIT NONE
378    INTEGER          :: ierr
379
380    IF (is_master) THEN
381      ierr = NF90_CLOSE (nid_restart)
382    ENDIF
383 
384  END SUBROUTINE close_restartphy
385
386 
387  SUBROUTINE put_field_r1(pass,field_name,title,field)
388  IMPLICIT NONE
389  INTEGER,INTENT(IN) :: pass
390  CHARACTER(LEN=*),INTENT(IN)    :: field_name
391  CHARACTER(LEN=*),INTENT(IN)    :: title
392  REAL,INTENT(IN)                :: field(:)
393 
394    CALL put_field_rgen(pass,field_name,title,field,1)
395 
396  END SUBROUTINE put_field_r1
397
398  SUBROUTINE put_field_r2(pass,field_name,title,field)
399  IMPLICIT NONE
400  INTEGER,INTENT(IN) :: pass
401  CHARACTER(LEN=*),INTENT(IN)    :: field_name
402  CHARACTER(LEN=*),INTENT(IN)    :: title
403  REAL,INTENT(IN)                :: field(:,:)
404 
405    CALL put_field_rgen(pass,field_name,title,field,size(field,2))
406 
407  END SUBROUTINE put_field_r2
408
409  SUBROUTINE put_field_r3(pass,field_name,title,field)
410  IMPLICIT NONE
411  INTEGER,INTENT(IN) :: pass
412  CHARACTER(LEN=*),INTENT(IN)    :: field_name
413  CHARACTER(LEN=*),INTENT(IN)    :: title
414  REAL,INTENT(IN)                :: field(:,:,:)
415 
416    CALL put_field_rgen(pass,field_name,title,field,size(field,2)*size(field,3))
417 
418  END SUBROUTINE put_field_r3
419 
420  SUBROUTINE put_field_rgen(pass,field_name,title,field,field_size)
421  USE netcdf, ONLY: NF90_REDEF, NF90_ENDDEF, NF90_DEF_VAR, NF90_PUT_ATT, &
422                    NF90_INQ_VARID, NF90_PUT_VAR, NF90_FLOAT, NF90_DOUBLE
423  USE dimphy, ONLY: klon, klev, klevp1
424  USE mod_grid_phy_lmdz, ONLY: klon_glo
425  USE mod_phys_lmdz_para, ONLY: is_master, gather
426  USE geometry_mod, ONLY: ind_cell_glo
427
428  IMPLICIT NONE
429  INTEGER,INTENT(IN) :: pass
430  CHARACTER(LEN=*),INTENT(IN)    :: field_name
431  CHARACTER(LEN=*),INTENT(IN)    :: title
432  INTEGER,INTENT(IN)             :: field_size
433  REAL,INTENT(IN)                :: field(klon,field_size)
434 
435  REAL,ALLOCATABLE :: field_glo(:,:)
436  REAL,ALLOCATABLE :: field_glo_tmp(:,:)
437  INTEGER,ALLOCATABLE :: ind_cell_glo_glo(:) ! cell indexes on global grid
438 
439  INTEGER                        :: ierr
440  INTEGER                        :: nvarid
441  INTEGER                        :: idim
442  INTEGER :: i
443   
444! first pass : definition   
445  IF (pass==1) THEN
446   
447    IF (is_master) THEN
448
449      IF (field_size==1) THEN
450        idim=idim2
451      ELSE IF (field_size==klev) THEN
452        idim=idim3
453      ELSE IF (field_size==klevp1) THEN
454        idim=idim4
455      ELSE
456        WRITE(*,*)"put_field_rgen error: issue with dimensions"
457        CALL abort_physic("put_field_rgen","wrong field dimensions",1)
458      ENDIF
459         
460!      ierr = NF90_REDEF (nid_restart)
461#ifdef NC_DOUBLE
462      ierr = NF90_DEF_VAR (nid_restart, field_name, NF90_DOUBLE,(/ idim /),nvarid)
463#else
464      ierr = NF90_DEF_VAR (nid_restart, field_name, NF90_FLOAT,(/ idim /),nvarid)
465#endif
466      IF (LEN_TRIM(title) > 0) ierr = NF90_PUT_ATT (nid_restart,nvarid,"title", title)
467!      ierr = NF90_ENDDEF(nid_restart)
468    ENDIF ! of IF (is_master)
469
470! second pass : write     
471   ELSE IF (pass==2) THEN
472
473     IF (is_master) THEN
474       ALLOCATE(ind_cell_glo_glo(klon_glo))
475       ALLOCATE(field_glo(klon_glo,field_size))
476       ALLOCATE(field_glo_tmp(klon_glo,field_size))
477     ELSE
478       ALLOCATE(ind_cell_glo_glo(0))
479       ALLOCATE(field_glo_tmp(0,0))
480     ENDIF
481
482     ! gather indexes on global grid
483    CALL gather(ind_cell_glo,ind_cell_glo_glo)
484    ! gather field on master
485    CALL gather(field,field_glo_tmp)
486   
487    IF (is_master) THEN
488      ! reorder columns
489      DO i=1,klon_glo
490        field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:)
491      ENDDO
492     
493      ierr = NF90_INQ_VARID(nid_restart, field_name, nvarid)
494      ierr = NF90_PUT_VAR(nid_restart,nvarid,RESHAPE(field_glo,(/klon_glo*field_size/)))
495    ENDIF ! of IF(is_master)
496   
497   ENDIF ! of IF (pass=1) ELSE IF (pass==2)
498
499   END SUBROUTINE put_field_rgen 
500 
501   SUBROUTINE put_var_r0(pass,var_name,title,var)
502   IMPLICIT NONE
503     INTEGER,INTENT(IN) :: pass
504     CHARACTER(LEN=*),INTENT(IN) :: var_name
505     CHARACTER(LEN=*),INTENT(IN) :: title
506     REAL,INTENT(IN)             :: var
507     REAL                        :: varin(1)
508     
509     varin(1)=var
510     
511     CALL put_var_rgen(pass,var_name,title,varin,size(varin))
512
513  END SUBROUTINE put_var_r0
514
515
516   SUBROUTINE put_var_r1(pass,var_name,title,var)
517   IMPLICIT NONE
518     INTEGER,INTENT(IN) :: pass
519     CHARACTER(LEN=*),INTENT(IN) :: var_name
520     CHARACTER(LEN=*),INTENT(IN) :: title
521     REAL,INTENT(IN)             :: var(:)
522     
523     CALL put_var_rgen(pass,var_name,title,var,size(var))
524
525  END SUBROUTINE put_var_r1
526 
527  SUBROUTINE put_var_r2(pass,var_name,title,var)
528   IMPLICIT NONE
529     INTEGER,INTENT(IN) :: pass
530     CHARACTER(LEN=*),INTENT(IN) :: var_name
531     CHARACTER(LEN=*),INTENT(IN) :: title
532     REAL,INTENT(IN)             :: var(:,:)
533     
534     CALL put_var_rgen(pass,var_name,title,var,size(var))
535
536  END SUBROUTINE put_var_r2     
537 
538  SUBROUTINE put_var_r3(pass,var_name,title,var)
539   IMPLICIT NONE
540     INTEGER,INTENT(IN) :: pass
541     CHARACTER(LEN=*),INTENT(IN) :: var_name
542     CHARACTER(LEN=*),INTENT(IN) :: title
543     REAL,INTENT(IN)             :: var(:,:,:)
544     
545     CALL put_var_rgen(pass,var_name,title,var,size(var))
546
547  END SUBROUTINE put_var_r3
548
549  SUBROUTINE put_var_rgen(pass,var_name,title,var,var_size)
550  USE netcdf, ONLY: NF90_REDEF, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_VAR, &
551                    NF90_INQ_VARID, NF90_PUT_ATT, NF90_FLOAT, NF90_DOUBLE
552  USE mod_phys_lmdz_para, ONLY: is_master
553  IMPLICIT NONE
554     INTEGER,INTENT(IN) :: pass
555     CHARACTER(LEN=*),INTENT(IN) :: var_name
556     CHARACTER(LEN=*),INTENT(IN) :: title
557     INTEGER,INTENT(IN)          :: var_size
558     REAL,INTENT(IN)             :: var(var_size)
559     
560     INTEGER :: ierr
561     INTEGER :: nvarid
562         
563    IF (is_master) THEN
564
565      IF (var_size/=length) THEN
566        WRITE(*,*)"put_var_rgen error: issue with dimensions"
567        CALL abort_physic("put_var_rgen","wrong field dimensions",1)
568      ENDIF
569     
570     ! first pass : definition   
571      IF (pass==1) THEN
572
573!      ierr = NF90_REDEF (nid_restart)
574
575#ifdef NC_DOUBLE
576        ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_DOUBLE,(/ idim1 /),nvarid)
577#else
578        ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_FLOAT,(/ idim1 /),nvarid)
579#endif
580        IF (LEN_TRIM(title)>0) ierr = NF90_PUT_ATT (nid_restart,nvarid,"title", title)
581!      ierr = NF90_ENDDEF(nid_restart)
582     
583    ! second pass : write     
584      ELSE IF (pass==2) THEN
585        ierr = NF90_INQ_VARID(nid_restart, var_name, nvarid)
586        ierr = NF90_PUT_VAR(nid_restart,nvarid,var)
587      ENDIF
588
589    ENDIF ! of IF (is_master)
590   
591  END SUBROUTINE put_var_rgen     
592   
593END MODULE iostart
Note: See TracBrowser for help on using the repository browser.