@@ -17,17 +17,24 @@ MODULE m_ncio
17
17
IMPLICIT NONE
18
18
PRIVATE
19
19
20
- ! PUBLIC :: NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_SHORT, NF90_BYTE
20
+ PUBLIC :: NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_SHORT, NF90_BYTE
21
21
22
22
! open/close file
23
23
PUBLIC :: nc_get_fid, nc_close_fid
24
24
25
+ ! Create new file/dim/var
26
+ PUBLIC :: nc_create_file, nc_create_dim, nc_create_var
27
+
28
+ ! End def mode
29
+ PUBLIC :: nc_end_create
30
+
25
31
! Read Attributes
26
32
PUBLIC :: nc_rdatt
27
33
28
34
! low-level read Attributes
29
35
PUBLIC :: nc_rdatt_str, nc_rdatt_i1, nc_rdatt_i2, nc_rdatt_i4, &
30
36
nc_rdatt_r4 , nc_rdatt_r8
37
+
31
38
! Get dimension
32
39
PUBLIC :: nc_rddim
33
40
@@ -133,6 +140,10 @@ MODULE m_ncio
133
140
INTEGER (i1) :: attval = 4
134
141
INTEGER (i1) :: dimid = 5
135
142
INTEGER (i1) :: dimval = 6
143
+ INTEGER (i1) :: genfile = 7
144
+ INTEGER (i1) :: gendim = 8
145
+ INTEGER (i1) :: genvar = 9
146
+ INTEGER (i1) :: endgen = 10
136
147
INTEGER (i1) :: undef = 127 ! max positive for signed 8-byte int
137
148
END TYPE
138
149
TYPE (t_errcode),SAVE ,PRIVATE :: errcode
@@ -153,6 +164,45 @@ SUBROUTINE mystop(errcode)
153
164
END SUBROUTINE
154
165
155
166
167
+
168
+ !- -------------------------------------------------------------------------------
169
+ ! end def mode
170
+ !- -------------------------------------------------------------------------------
171
+ SUBROUTINE nc_end_create (fid )
172
+ IMPLICIT NONE
173
+
174
+ INTEGER (i4),INTENT (IN ) :: fid
175
+
176
+ INTEGER (i4) :: istat
177
+
178
+ istat = nf90_enddef(fid)
179
+ if (istat /= NF90_NOERR) then
180
+ write (lout_log,* ) " [err] nc_end_create: cannot close def mode for fid:" , fid
181
+ call mystop(errcode% endgen)
182
+ end if
183
+
184
+ END SUBROUTINE
185
+
186
+
187
+ !- -------------------------------------------------------------------------------
188
+ ! create nc file
189
+ !- -------------------------------------------------------------------------------
190
+ SUBROUTINE nc_create_file (filename , fid )
191
+ IMPLICIT NONE
192
+
193
+ CHARACTER (* ),INTENT (IN ) :: filename
194
+ INTEGER (i4), INTENT (OUT ) :: fid
195
+
196
+ INTEGER (i4) :: istat
197
+
198
+ istat = nf90_create(trim (filename), NF90_CLOBBER, fid)
199
+ if (istat /= NF90_NOERR) then
200
+ write (lout_log,* ) " [err] nc_create_file: cannot get fid for file" , trim (filename)
201
+ call mystop(errcode% genfile)
202
+ end if
203
+
204
+ END SUBROUTINE nc_create_file
205
+
156
206
!- -------------------------------------------------------------------------------
157
207
! open/close nc file
158
208
!- -------------------------------------------------------------------------------
@@ -196,6 +246,29 @@ SUBROUTINE nc_close_fid(fid)
196
246
197
247
END SUBROUTINE nc_close_fid
198
248
249
+
250
+ !- -------------------------------------------------------------------------------
251
+ ! create vars
252
+ !- -------------------------------------------------------------------------------
253
+ SUBROUTINE nc_create_var (fid , varname , vartype , varsize , varid )
254
+ IMPLICIT NONE
255
+
256
+ INTEGER (i4), INTENT (IN ) :: fid
257
+ CHARACTER (* ),INTENT (IN ) :: varname
258
+ INTEGER (i4), INTENT (IN ) :: vartype
259
+ INTEGER (i4), INTENT (IN ) :: varsize(:)
260
+ INTEGER (i4), INTENT (OUT ) :: varid
261
+
262
+ INTEGER (i4) :: istat
263
+
264
+ istat = nf90_def_var(fid, trim (varname), vartype, varsize, varid)
265
+ if (istat /= NF90_NOERR) then
266
+ write (lout_log,* ) " [err] nc_create_vars: cannot create var:" , trim (varname)
267
+ call mystop(errcode% genvar)
268
+ end if
269
+
270
+ END SUBROUTINE
271
+
199
272
!- -------------------------------------------------------------------------------
200
273
! read 1D
201
274
!- -------------------------------------------------------------------------------
@@ -605,6 +678,33 @@ SUBROUTINE nc_rdatt_r8(fid, varname, attname, attval)
605
678
include " nc_rdatt.f90.inc"
606
679
END SUBROUTINE
607
680
681
+ !- -------------------------------------------------------------------------------
682
+ ! define dimension
683
+ !- -------------------------------------------------------------------------------
684
+ SUBROUTINE nc_create_dim (fid , dimname , dimsize , lunlimited , dimid )
685
+ IMPLICIT NONE
686
+
687
+ INTEGER (i4), INTENT (IN ) :: fid
688
+ CHARACTER (* ),INTENT (IN ) :: dimname
689
+ INTEGER (i4), INTENT (IN ) :: dimsize
690
+ LOGICAL , INTENT (IN ) :: lunlimited
691
+ INTEGER (i4), INTENT (OUT ) :: dimid
692
+
693
+ INTEGER :: istat
694
+
695
+ if (lunlimited) then
696
+ istat = nf90_def_dim(fid, trim (dimname), NF90_UNLIMITED, dimid)
697
+ else
698
+ istat = nf90_def_dim(fid, trim (dimname), dimsize, dimid)
699
+ end if
700
+ if (istat /= NF90_NOERR) then
701
+ write (lout_log,* ) " [err] nc_create_dim: cannot create dim:" // trim (dimname)
702
+ call mystop(errcode% gendim)
703
+ end if
704
+
705
+
706
+ END SUBROUTINE
707
+
608
708
609
709
!- -------------------------------------------------------------------------------
610
710
! read dimension
0 commit comments