source: LMDZ6/trunk/libf/phylmd/iotd_ini.f90

Last change on this file was 5270, checked in by abarral, 35 hours ago

Replace F77 netcdf library by F90 netcdf library

File size: 5.1 KB
Line 
1      SUBROUTINE iotd_ini(fichnom,iim,jjm,llm,prlon,prlat,pcoordv,jour0,mois0,an0,t0,timestep,calendrier)
2      USE netcdf, ONLY: nf90_enddef, nf90_put_att, nf90_float, nf90_def_var, nf90_redef, &
3            nf90_global, nf90_def_dim, nf90_create, nf90_clobber, nf90_unlimited, nf90_put_var
4      IMPLICIT NONE
5
6!=======================================================================
7!
8!   Auteur:  F. Hourdin
9!   -------
10!
11!   Objet:
12!   ------
13!   Light interface for netcdf outputs. can be used outside LMDZ
14!
15!=======================================================================
16!-----------------------------------------------------------------------
17!   Declarations:
18!   -------------
19      INCLUDE "iotd.h"
20
21!   Arguments:
22!   ----------
23
24      integer iim,jjm,llm
25      real prlon(iim),prlat(jjm),pcoordv(llm),timestep,t0
26      INTEGER id_FOCE
27      INTEGER jour0,mois0,an0
28      CHARACTER*(*) calendrier
29
30      integer corner(4),edges(4),ndim
31      real  px(1000)
32      character (len=10) :: nom
33      real*4 rlon(iim),rlat(jjm),coordv(llm)
34
35!   Local:
36!   ------
37      CHARACTER*3,DIMENSION(12) :: cmois=(/'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'/)
38      CHARACTER*10 date0
39      CHARACTER*11 date0b
40
41      INTEGER :: ierr
42
43      integer :: nvarid
44      integer, dimension(2) :: id 
45
46      character*(*) fichnom
47
48      real pi
49
50      iotd_ts=timestep
51      iotd_t0=t0
52      print*,'iotd_ini, ',timestep,iotd_ts
53      imax=iim
54      jmax=jjm
55      lmax=llm
56      ! Utile pour passer en real*4 pour les ecritures
57      rlon=prlon
58      rlat=prlat
59      coordv=pcoordv
60
61
62      !-----------------------------------------------------------------------
63      ! Possibilité de spécifier une liste de variables à sortir
64      ! dans iotd.def
65      ! Si iotd.def existe et est non vide,
66      ! seules les variables faisant à la fois l'objet d'un call iotd_ecrit
67      ! et étant spécifiées dans iotd.def sont sorties.
68      ! Sinon, toutes les variables faisant l'objet d'un call iotd_ecrit
69      ! sont sorties
70      !-----------------------------------------------------------------------
71      n_names_iotd_def=0
72      open(99,file='iotd.def',form='formatted',status='old',iostat=ierr)
73         if ( ierr.eq.0 ) then
74            ierr=0
75            do while (ierr==0)
76               read(99,*,iostat=ierr) un_nom
77               if (ierr==0) then
78                  n_names_iotd_def=n_names_iotd_def+1
79                  names_iotd_def(n_names_iotd_def)=un_nom
80               endif
81            enddo
82         endif
83         print*,n_names_iotd_def,names_iotd_def(1:n_names_iotd_def)
84      close(99)
85
86
87      pi=2.*asin(1.)
88
89! Define dimensions
90   
91      ! Create the NetCDF file
92      ierr=nf90_create(fichnom, nf90_clobber, nid)
93      ierr=nf90_def_dim(nid, "lon", iim, dim_coord(1))
94      ierr=nf90_def_dim(nid, "lat", jjm, dim_coord(2))
95      ierr=nf90_def_dim(nid, "lev", llm, dim_coord(3))
96      ierr=nf90_def_dim(nid,"time",nf90_unlimited,dim_coord(4))
97      ierr = nf90_put_att(nid,nf90_global,'Conventions',"CF-1.1")
98      ierr=nf90_enddef(nid)
99
100      ! Switch out of NetCDF Define mode
101
102
103      ierr=nf90_enddef(nid)
104!
105!  Contol parameters for this run
106! ---- longitude -----------
107
108      ierr=nf90_redef(nid)
109      ierr=nf90_def_var(nid,"lon", nf90_float, dim_coord(1),nvarid)
110      ierr = nf90_put_att(nid,nvarid,'axis','X')
111      ierr=nf90_put_att(nid,nvarid,'units',"degrees_east")
112      ierr=nf90_enddef(nid)
113      ierr=nf90_put_var(nid,nvarid,rlon)
114       print*,ierr
115
116! ---- latitude ------------
117      ierr=nf90_redef(nid)
118      ierr=nf90_def_var(nid, "lat", nf90_float, dim_coord(2),nvarid)
119      ierr = nf90_put_att(nid,nvarid,'axis','Y')
120      ierr=nf90_put_att(nid,nvarid,'units',"degrees_north")
121      ierr=nf90_enddef(nid)
122      ierr=nf90_put_var(nid,nvarid,rlat)
123!
124! ---- vertical ------------
125      ierr=nf90_redef(nid)
126      ierr=nf90_def_var(nid, "lev", nf90_float, dim_coord(3),nvarid)
127      ierr=nf90_put_att(nid,nvarid,"long_name","vert level")
128      if ( coordv(2)>coordv(1) ) then
129         ierr=nf90_put_att(nid,nvarid,"long_name","pseudo-alt")
130         ierr=nf90_put_att(nid,nvarid,'positive',"up")
131      else
132         ierr=nf90_put_att(nid,nvarid,"long_name","pressure")
133         ierr = nf90_put_att (nid,nvarid,'positive',"down")
134      endif
135      ierr=nf90_enddef(nid)
136      ierr=nf90_put_var(nid,nvarid,coordv)
137
138!
139! ---- time ----------------
140      ierr=nf90_redef(nid)
141      ! Define the 'time' variable
142      ierr=nf90_def_var(nid, "time", nf90_float, dim_coord(4),nvarid)
143!     ! Add attributes
144      ierr = nf90_put_att(nid,nvarid,'axis','T')
145      ierr = nf90_put_att(nid,nvarid,'standard_name','time')
146      WRITE(date0,'(i4.4,"-",i2.2,"-",i2.2)') an0,mois0,jour0
147      ierr=nf90_put_att(nid, nvarid,'units', &
148     & "seconds since "//date0//" 00:00:00")
149      ierr = nf90_put_att(nid,nvarid,'calendar',calendrier)
150      !ierr = nf90_put_att(nid,nvarid,'calendar','360d')
151      ierr = nf90_put_att(nid,nvarid,'title','Time')
152      ierr = nf90_put_att(nid,nvarid,'long_name','Time axis')
153      WRITE(date0b,'(i4.4,"-",a3,"-",i2.2)') an0,cmois(mois0),jour0
154      ierr = nf90_put_att(nid,nvarid,'time_origin', &
155     &        date0b//' 00:00:00')
156      ierr=nf90_enddef(nid)
157
158
159      END
Note: See TracBrowser for help on using the repository browser.