26 subroutine char_write_0d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
28 class(fmsnetcdffile_t),
intent(in) :: fileobj
29 character(len=*),
intent(in) :: variable_name
30 character(len=*),
intent(in) :: variable_data
31 character(len=200),
intent(in) :: append_error_msg
32 integer,
intent(inout) :: err
33 integer,
intent(in) :: varid
36 integer,
dimension(:),
allocatable :: start
37 integer,
dimension(:),
allocatable :: dimsizes
38 character,
dimension(:),
allocatable :: charbuf
42 ndims = get_variable_num_dimensions(fileobj, variable_name, broadcast=.false.)
43 if (ndims .ne. 1)
then
44 call error(
"currently only scalar and 1d character writes are supported: "//trim(append_error_msg))
46 allocate(start(ndims))
48 allocate(dimsizes(ndims))
49 call get_variable_size(fileobj, variable_name, dimsizes, .false.)
50 call allocate_array(charbuf, dimsizes)
52 tlen = len_trim(variable_data)
53 if (tlen .gt. dimsizes(1))
then
54 call error(
"character buffer is too big; decrease length: "//trim(append_error_msg))
57 charbuf(i) = variable_data(i:i)
59 err = nf90_put_var(fileobj%ncid, varid, charbuf, start=start, count=dimsizes)
66 subroutine character_write_1d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
68 class(fmsnetcdffile_t),
intent(in) :: fileobj
69 character(len=*),
intent(in) :: variable_name
70 character(len=*),
dimension(:),
intent(in) :: variable_data
71 character(len=200),
intent(in) :: append_error_msg
72 integer,
intent(inout) :: err
73 integer,
intent(in) :: varid
76 integer,
dimension(:),
allocatable :: start
77 integer,
dimension(:),
allocatable :: dimsizes
78 character,
dimension(:,:),
allocatable :: charbuf
79 character(len=1024) :: sbuf
84 ndims = get_variable_num_dimensions(fileobj, variable_name, broadcast=.false.)
85 if (ndims .ne. 2)
then
86 call error(
"currently only scalar and 1d character writes are supported: "//trim(append_error_msg))
88 allocate(start(ndims))
90 allocate(dimsizes(ndims))
91 call get_variable_size(fileobj, variable_name, dimsizes, .false.)
92 call allocate_array(charbuf, dimsizes)
94 tlen = len(variable_data(1))
95 if (tlen .gt. dimsizes(1))
then
96 call error(
"character buffer is too big; decrease length: "//trim(append_error_msg))
98 if (
size(variable_data) .ne. dimsizes(2))
then
99 call error(
"incorrect size of variable_data array: "//trim(append_error_msg))
101 do j = 1, dimsizes(2)
102 call string_copy(sbuf, variable_data(j))
104 charbuf(i,j) = sbuf(i:i)
107 err = nf90_put_var(fileobj%ncid, varid, charbuf, start=start, count=dimsizes)
117 class(fmsnetcdffile_t),
intent(in) :: fileobj
118 character(len=*),
intent(in) :: variable_name
119 class(*),
intent(in) :: variable_data
120 integer,
intent(in),
optional :: unlim_dim_level
121 integer,
intent(in),
optional :: corner
128 integer :: unlim_dim_index
129 integer,
dimension(1) :: c
130 character(len=200) :: append_error_msg
132 append_error_msg =
"netcdf_write_data_0d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
133 if (fileobj%is_root)
then
135 if (
present(corner))
then
138 if (
present(unlim_dim_level))
then
139 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
141 if (unlim_dim_index .ne. 1)
then
142 call error(
"unlimited dimension must be the slowest varying dimension: "//trim(append_error_msg))
144 c(unlim_dim_index) = unlim_dim_level
146 call set_netcdf_mode(fileobj%ncid, data_mode)
147 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
148 select type(variable_data)
149 type is (
integer(kind=i4_kind))
150 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c)
151 type is (
integer(kind=i8_kind))
152 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c)
153 type is (real(kind=r4_kind))
154 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c)
155 type is (real(kind=r8_kind))
156 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c)
157 type is (
character(len=*))
158 call char_write_0d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
160 call error(
"Unsupported variable type: "//trim(append_error_msg))
162 call check_netcdf_code(err, append_error_msg)
169 corner, edge_lengths)
171 class(fmsnetcdffile_t),
intent(in) :: fileobj
172 character(len=*),
intent(in) :: variable_name
173 class(*),
dimension(:),
intent(in) :: variable_data
174 integer,
intent(in),
optional :: unlim_dim_level
175 integer,
dimension(1),
intent(in),
optional :: corner
179 integer,
dimension(1),
intent(in),
optional :: edge_lengths
186 integer :: unlim_dim_index
187 integer,
dimension(2) :: c
188 integer,
dimension(2) :: e
189 character(len=200) :: append_error_msg
191 append_error_msg =
"netcdf_write_data_1d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
193 if (fileobj%is_root)
then
195 if (
present(corner))
then
199 if (
present(edge_lengths))
then
200 e(1:1) = edge_lengths(:)
202 e(1:1) = shape(variable_data)
204 if (
present(unlim_dim_level))
then
205 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
207 if (unlim_dim_index .ne. 2)
then
208 call error(
"unlimited dimension must be the slowest varying dimension: "//trim(append_error_msg))
210 c(unlim_dim_index) = unlim_dim_level
212 call set_netcdf_mode(fileobj%ncid, data_mode)
213 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
214 select type(variable_data)
215 type is (
integer(kind=i4_kind))
216 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
217 type is (
integer(kind=i8_kind))
218 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
219 type is (real(kind=r4_kind))
220 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
221 type is (real(kind=r8_kind))
222 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
223 type is (
character(len=*))
224 call character_write_1d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
226 call error(
"Unsupported variable type: "//trim(append_error_msg))
228 call check_netcdf_code(err, append_error_msg)
235 corner, edge_lengths)
237 class(fmsnetcdffile_t),
intent(in) :: fileobj
238 character(len=*),
intent(in) :: variable_name
239 class(*),
dimension(:,:),
intent(in) :: variable_data
240 integer,
intent(in),
optional :: unlim_dim_level
241 integer,
dimension(2),
intent(in),
optional :: corner
245 integer,
dimension(2),
intent(in),
optional :: edge_lengths
252 integer :: unlim_dim_index
253 integer,
dimension(3) :: c
254 integer,
dimension(3) :: e
255 character(len=200) :: append_error_msg
257 append_error_msg =
"netcdf_write_data_2d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
259 if (fileobj%is_root)
then
261 if (
present(corner))
then
265 if (
present(edge_lengths))
then
266 e(1:2) = edge_lengths(:)
268 e(1:2) = shape(variable_data)
270 if (
present(unlim_dim_level))
then
271 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
273 if (unlim_dim_index .ne. 3)
then
274 call error(
"unlimited dimension must be the slowest varying dimension: "//trim(append_error_msg))
276 c(unlim_dim_index) = unlim_dim_level
278 call set_netcdf_mode(fileobj%ncid, data_mode)
279 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
280 select type(variable_data)
281 type is (
integer(kind=i4_kind))
282 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
283 type is (
integer(kind=i8_kind))
284 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
285 type is (real(kind=r4_kind))
286 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
287 type is (real(kind=r8_kind))
288 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c ,count=e)
290 call error(
"Unsupported variable type: "//trim(append_error_msg))
292 call check_netcdf_code(err, append_error_msg)
299 corner, edge_lengths)
301 class(fmsnetcdffile_t),
intent(in) :: fileobj
302 character(len=*),
intent(in) :: variable_name
303 class(*),
dimension(:,:,:),
intent(in) :: variable_data
304 integer,
intent(in),
optional :: unlim_dim_level
306 integer,
dimension(3),
intent(in),
optional :: corner
310 integer,
dimension(3),
intent(in),
optional :: edge_lengths
317 integer :: unlim_dim_index
318 integer,
dimension(4) :: c
319 integer,
dimension(4) :: e
320 character(len=200) :: append_error_msg
322 append_error_msg =
"netcdf_write_data_3d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
324 if (fileobj%is_root)
then
326 if (
present(corner))
then
330 if (
present(edge_lengths))
then
331 e(1:3) = edge_lengths(:)
333 e(1:3) = shape(variable_data)
335 if (
present(unlim_dim_level))
then
336 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
338 if (unlim_dim_index .ne. 4)
then
339 call error(
"unlimited dimension must be the slowest varying dimension: "//trim(append_error_msg))
341 c(unlim_dim_index) = unlim_dim_level
343 call set_netcdf_mode(fileobj%ncid, data_mode)
344 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
345 select type(variable_data)
346 type is (
integer(kind=i4_kind))
347 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
348 type is (
integer(kind=i8_kind))
349 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
350 type is (real(kind=r4_kind))
351 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
352 type is (real(kind=r8_kind))
353 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
355 call error(
"Unsupported variable type: "//trim(append_error_msg))
357 call check_netcdf_code(err, append_error_msg)
364 corner, edge_lengths)
366 class(fmsnetcdffile_t),
intent(in) :: fileobj
367 character(len=*),
intent(in) :: variable_name
368 class(*),
dimension(:,:,:,:),
intent(in) :: variable_data
369 integer,
intent(in),
optional :: unlim_dim_level
370 integer,
dimension(4),
intent(in),
optional :: corner
374 integer,
dimension(4),
intent(in),
optional :: edge_lengths
381 integer :: unlim_dim_index
382 integer,
dimension(5) :: c
383 integer,
dimension(5) :: e
384 character(len=200) :: append_error_msg
386 append_error_msg =
"netcdf_write_data_4d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
388 if (fileobj%is_root)
then
390 if (
present(corner))
then
394 if (
present(edge_lengths))
then
395 e(1:4) = edge_lengths(:)
397 e(1:4) = shape(variable_data)
399 if (
present(unlim_dim_level))
then
400 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
402 if (unlim_dim_index /= -1)
then
403 c(unlim_dim_index) = unlim_dim_level
406 call set_netcdf_mode(fileobj%ncid, data_mode)
407 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
408 select type(variable_data)
409 type is (
integer(kind=i4_kind))
410 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
411 type is (
integer(kind=i8_kind))
412 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
413 type is (real(kind=r4_kind))
414 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
415 type is (real(kind=r8_kind))
416 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
418 call error(
"Unsupported variable type: "//trim(append_error_msg))
420 call check_netcdf_code(err, append_error_msg)
427 corner, edge_lengths)
429 class(fmsnetcdffile_t),
intent(in) :: fileobj
430 character(len=*),
intent(in) :: variable_name
431 class(*),
dimension(:,:,:,:,:),
intent(in),
target :: variable_data
433 integer,
intent(in),
optional :: unlim_dim_level
435 integer,
dimension(5),
intent(in),
optional :: corner
439 integer,
dimension(5),
intent(in),
optional :: edge_lengths
446 integer :: unlim_dim_index
447 integer,
dimension(6) :: c
448 integer,
dimension(6) :: e
449 character(len=200) :: append_error_msg
451 append_error_msg =
"netcdf_write_data_5d: file:"//trim(fileobj%path)//
" variable: "//trim(variable_name)
453 if (fileobj%is_root)
then
455 if (
present(corner))
then
459 if (
present(edge_lengths))
then
460 e(1:5) = edge_lengths(:)
462 e(1:5) = shape(variable_data)
464 if (
present(unlim_dim_level))
then
465 unlim_dim_index = get_variable_unlimited_dimension_index(fileobj, variable_name, &
467 if (unlim_dim_index .ne. 6)
then
468 call error(
"unlimited dimension must be the slowest varying dimension: "//trim(append_error_msg))
470 c(unlim_dim_index) = unlim_dim_level
472 call set_netcdf_mode(fileobj%ncid, data_mode)
473 varid = get_variable_id(fileobj%ncid, trim(variable_name), msg=append_error_msg)
474 select type(variable_data)
475 type is (
integer(kind=i4_kind))
476 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
477 type is (
integer(kind=i8_kind))
478 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
479 type is (real(kind=r4_kind))
480 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
481 type is (real(kind=r8_kind))
482 err = nf90_put_var(fileobj%ncid, varid, variable_data, start=c, count=e)
484 call error(
"Unsupported variable type: "//trim(append_error_msg))
486 call check_netcdf_code(err, append_error_msg)
subroutine char_write_0d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
Character write 0d function.
subroutine netcdf_write_data_4d(fileobj, variable_name, variable_data, unlim_dim_level, corner, edge_lengths)
Write data to a variable in a netcdf file.
subroutine character_write_1d(fileobj, variable_name, variable_data, append_error_msg, err, varid)
Character write 1d function.
subroutine netcdf_write_data_0d(fileobj, variable_name, variable_data, unlim_dim_level, corner)
Write data to a variable in a netcdf file.
subroutine netcdf_write_data_3d(fileobj, variable_name, variable_data, unlim_dim_level, corner, edge_lengths)
Write data to a variable in a netcdf file.
subroutine netcdf_write_data_1d(fileobj, variable_name, variable_data, unlim_dim_level, corner, edge_lengths)
Write data to a variable in a netcdf file.
subroutine netcdf_write_data_2d(fileobj, variable_name, variable_data, unlim_dim_level, corner, edge_lengths)
Write data to a variable in a netcdf file.
subroutine netcdf_write_data_5d(fileobj, variable_name, variable_data, unlim_dim_level, corner, edge_lengths)
Write data to a variable in a netcdf file.