18 use netcdf,
only : nf90_create, nf90_def_dim, nf90_unlimited, nf90_def_var, &
19 nf90_char, nf90_put_att, nf90_int, nf90_int, nf90_global, &
20 nf90_enddef, nf90_put_var, nf90_float, nf90_double, nf90_byte, &
21 nf90_close, nf90_noerr, nf90_strerror, nf90_clobber, &
22 nf90_max_name, nf90_write, nf90_inq_varid, nf90_inquire_variable, &
23 nf90_inquire_dimension, nf90_open, nf90_64bit_offset, nf90_netcdf4, &
24 nf90_inq_varid, nf90_inq_dimid, nf90_inquire, nf90_get_var, nf90_fill_float, &
25 nf90_fill_double, nf90_fill_int
40 integer(i4),
public,
parameter ::
nmaxdim = 5
41 integer(i4),
public,
parameter ::
nmaxatt = 20
42 integer(i4),
public,
parameter ::
maxlen = 256
43 integer(i4),
public,
parameter ::
ngatt = 20
44 integer(i4),
public,
parameter ::
nattdim = 2
49 character (len = maxLen) :: name
56 character (len = maxLen) :: name
58 integer(i4) :: nvalues
59 character (len = maxLen) :: values
64 character (len = maxLen) :: name
71 integer(i4),
dimension(nMaxDim) :: dimids
72 integer(i4),
dimension(nMaxDim) :: dimtypes
75 integer(i4),
dimension(nMaxDim) :: start
76 integer(i4),
dimension(nMaxDim) :: count
78 integer(i1),
pointer :: g0_b
79 integer(i1),
dimension(:),
pointer :: g1_b
80 integer(i1),
dimension(:, :),
pointer :: g2_b
81 integer(i1),
dimension(:, :, :),
pointer :: g3_b
82 integer(i1),
dimension(:, :, :, :),
pointer :: g4_b
83 integer(i4),
pointer :: g0_i
84 integer(i4),
dimension(:),
pointer :: g1_i
85 integer(i4),
dimension(:, :),
pointer :: g2_i
86 integer(i4),
dimension(:, :, :),
pointer :: g3_i
87 integer(i4),
dimension(:, :, :, :),
pointer :: g4_i
88 real(
sp),
pointer :: g0_f
89 real(
sp),
dimension(:),
pointer :: g1_f
90 real(
sp),
dimension(:, :),
pointer :: g2_f
91 real(
sp),
dimension(:, :, :),
pointer :: g3_f
92 real(
sp),
dimension(:, :, :, :),
pointer :: g4_f
93 real(
dp),
pointer :: g0_d
94 real(
dp),
dimension(:),
pointer :: g1_d
95 real(
dp),
dimension(:, :),
pointer :: g2_d
96 real(
dp),
dimension(:, :, :),
pointer :: g3_d
97 real(
dp),
dimension(:, :, :, :),
pointer :: g4_d
103 type (
dims),
public,
dimension(:),
allocatable ::
dnc
145 module procedure dump_netcdf_1d_sp, dump_netcdf_2d_sp, dump_netcdf_3d_sp, &
146 dump_netcdf_4d_sp, dump_netcdf_5d_sp, &
147 dump_netcdf_1d_dp, dump_netcdf_2d_dp, dump_netcdf_3d_dp, &
148 dump_netcdf_4d_dp, dump_netcdf_5d_dp, &
149 dump_netcdf_1d_i4, dump_netcdf_2d_i4, dump_netcdf_3d_i4, &
150 dump_netcdf_4d_i4, dump_netcdf_5d_i4
304 module procedure var2nc_1d_i4, var2nc_1d_sp, var2nc_1d_dp, &
305 var2nc_2d_i4, var2nc_2d_sp, var2nc_2d_dp, &
306 var2nc_3d_i4, var2nc_3d_sp, var2nc_3d_dp, &
307 var2nc_4d_i4, var2nc_4d_sp, var2nc_4d_dp, &
308 var2nc_5d_i4, var2nc_5d_sp, var2nc_5d_dp
355 integer(i4),
intent(in) :: ncid
358 call check(nf90_close(ncid))
409 character(len = *),
intent(in) :: filename
410 integer(i4),
intent(out) :: ncid
411 logical,
intent(in),
optional :: lfs
412 logical,
intent(in),
optional :: netcdf4
413 integer(i4),
intent(in),
optional :: deflate_level
415 integer(i4) :: i, j, k
416 integer(i4),
dimension(nAttDim) :: att_int
417 real(
sp),
dimension(nAttDim) :: att_float
418 real(
dp),
dimension(nAttDim) :: att_double
419 character(len = maxLen),
dimension(nAttDim) :: att_char
422 integer(i4) :: deflate
423 integer(i4) :: buffersize
424 integer(i4),
dimension(:),
allocatable :: chunksizes
427 if (
present(lfs)) largefile = lfs
429 if (
present(netcdf4)) inetcdf4 = netcdf4
431 if (
present(deflate_level)) deflate = deflate_level
434 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
437 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
440 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
446 call check(nf90_def_dim(ncid,
dnc(i)%name,
dnc(i)%len,
dnc(i)%dimId))
452 v(i)%unlimited = .false.
457 if (
dnc(
v(i)%dimTypes(k))%len == nf90_unlimited)
v(i)%unlimited = .true.
458 v(i)%dimids(k) =
dnc(
v(i)%dimTypes(k))%dimId
460 if (
v(i)%unlimited)
then
462 if (
v(i)%nDims == 1) cycle
463 do k = 1,
v(i)%nDims - 1
464 v(i)%count(k) =
dnc(
v(i)%dimTypes(k))%len
470 allocate(chunksizes(maxval(
v(1 :
nvars)%nDims)))
472 if (.not.
v(i)%wFlag) cycle
474 chunksizes(1 :
v(i)%nDims) =
dnc(
v(i)%dimTypes(1 :
v(i)%nDims))%len
475 chunksizes(
v(i)%nDims) = 1
476 call check(nf90_def_var(ncid,
v(i)%name,
v(i)%xtype,
v(i)%dimids(1 :
v(i)%nDims),
v(i)%varId, &
477 chunksizes = chunksizes(1 :
v(i)%nDims), shuffle = .true., deflate_level = deflate))
479 call check(nf90_def_var(ncid,
v(i)%name,
v(i)%xtype,
v(i)%dimids(1 :
v(i)%nDims),
v(i)%varId))
482 select case (
v(i)%att(k)%xType)
485 read(
v(i)%att(k)%values,
'(a)') att_char(1)
486 call check(nf90_put_att(ncid,
v(i)%varId,
v(i)%att(k)%name, att_char(1)))
488 read(
v(i)%att(k)%values, *) (att_int(j), j = 1,
v(i)%att(k)%nValues)
489 call check(nf90_put_att(ncid,
v(i)%varId,
v(i)%att(k)%name, att_int(1 :
v(i)%att(k)%nValues)))
491 read(
v(i)%att(k)%values, *) (att_float(j), j = 1,
v(i)%att(k)%nValues)
492 call check(nf90_put_att(ncid,
v(i)%varId,
v(i)%att(k)%name, att_float(1 :
v(i)%att(k)%nValues)))
494 read(
v(i)%att(k)%values, *) (att_double(j), j = 1,
v(i)%att(k)%nValues)
495 call check(nf90_put_att(ncid,
v(i)%varId,
v(i)%att(k)%name, att_double(1 :
v(i)%att(k)%nValues)))
503 call check(nf90_put_att(ncid, nf90_global,
gatt(k)%name,
gatt(k)%values))
508 call check(nf90_enddef(ncid))
510 deallocate(chunksizes)
517 subroutine dump_netcdf_1d_sp(filename, arr, append, lfs, netcdf4, deflate_level)
521 character(len = *),
intent(in) :: filename
522 real(
sp),
dimension(:),
intent(in) :: arr
523 logical,
optional,
intent(in) :: append
524 logical,
optional,
intent(in) :: lfs
525 logical,
optional,
intent(in) :: netcdf4
526 integer(i4),
optional,
intent(in) :: deflate_level
528 integer(i4),
parameter :: ndim = 1
529 character(len = 1),
dimension(4) :: dnames
530 integer(i4),
dimension(ndim + 1) ::
dims
531 integer(i4),
dimension(ndim + 1) :: dimid
532 integer(i4),
dimension(ndim + 2) :: varid
533 integer(i4),
dimension(ndim + 1) :: start
534 integer(i4),
dimension(ndim + 1) :: counter
535 integer(i4),
dimension(ndim + 1) :: chunksizes
540 character(NF90_MAX_NAME) :: name
543 integer(i4) :: deflate
544 integer(i4) :: buffersize
547 if (
present(append))
then
557 if (
present(lfs)) largefile = lfs
559 if (
present(netcdf4)) inetcdf4 = netcdf4
561 if (
present(deflate_level)) deflate = deflate_level
564 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
568 call check(nf90_open(trim(filename), nf90_write, ncid))
571 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
572 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
573 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
574 if (idim /= ndim + 1) stop
"dump_netcdf_1d_sp: number of variable dimensions /= number of file variable dimensions."
578 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
579 if (i < ndim + 1)
then
580 if (trim(name) /= dnames(i)) stop
"dump_netcdf_1d_sp: dimension name problem."
581 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_1d_sp: variable dimension /= file variable dimension."
583 if (trim(name) /=
'time') stop
"dump_netcdf_1d_sp: time name problem."
590 counter(ndim + 1) = 1
592 start(ndim + 1) =
dims(ndim + 1) + i
593 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
594 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
599 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
602 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
604 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
609 dims(1 : ndim) = shape(arr)
611 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
615 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
620 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
622 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
627 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
629 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
634 chunksizes(1 : ndim) =
dims(1 : ndim)
635 chunksizes(ndim + 1) = 1
636 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 2), &
637 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
639 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 2)))
643 call check(nf90_enddef(ncid))
647 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
653 counter(ndim + 1) = 1
656 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
657 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
662 call check(nf90_close(ncid))
664 end subroutine dump_netcdf_1d_sp
667 subroutine dump_netcdf_2d_sp(filename, arr, append, lfs, netcdf4, deflate_level)
671 character(len = *),
intent(in) :: filename
672 real(
sp),
dimension(:, :),
intent(in) :: arr
673 logical,
optional,
intent(in) :: append
674 logical,
optional,
intent(in) :: lfs
675 logical,
optional,
intent(in) :: netcdf4
676 integer(i4),
optional,
intent(in) :: deflate_level
678 integer(i4),
parameter :: ndim = 2
679 character(len = 1),
dimension(4) :: dnames
680 integer(i4),
dimension(ndim + 1) ::
dims
681 integer(i4),
dimension(ndim + 1) :: dimid
682 integer(i4),
dimension(ndim + 2) :: varid
683 integer(i4),
dimension(ndim + 1) :: start
684 integer(i4),
dimension(ndim + 1) :: counter
685 integer(i4),
dimension(ndim + 1) :: chunksizes
690 character(NF90_MAX_NAME) :: name
693 integer(i4) :: deflate
694 integer(i4) :: buffersize
697 if (
present(append))
then
707 if (
present(lfs)) largefile = lfs
709 if (
present(netcdf4)) inetcdf4 = netcdf4
711 if (
present(deflate_level)) deflate = deflate_level
714 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
718 call check(nf90_open(trim(filename), nf90_write, ncid))
721 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
722 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
723 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
724 if (idim /= ndim + 1) stop
"dump_netcdf_2d_sp: number of variable dimensions /= number of file variable dimensions."
728 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
729 if (i < ndim + 1)
then
730 if (trim(name) /= dnames(i)) stop
"dump_netcdf_2d_sp: dimension name problem."
731 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_2d_sp: variable dimension /= file variable dimension."
733 if (trim(name) /=
'time') stop
"dump_netcdf_2d_sp: time name problem."
740 counter(ndim + 1) = 1
742 start(ndim + 1) =
dims(ndim + 1) + i
743 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
744 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
749 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
752 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
754 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
759 dims(1 : ndim) = shape(arr)
761 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
765 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
770 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
772 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
777 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
779 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
784 chunksizes(1 : ndim) =
dims(1 : ndim)
785 chunksizes(ndim + 1) = 1
786 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 2), &
787 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
789 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 2)))
793 call check(nf90_enddef(ncid))
797 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
803 counter(ndim + 1) = 1
806 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
807 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
812 call check(nf90_close(ncid))
814 end subroutine dump_netcdf_2d_sp
817 subroutine dump_netcdf_3d_sp(filename, arr, append, lfs, netcdf4, deflate_level)
821 character(len = *),
intent(in) :: filename
822 real(
sp),
dimension(:, :, :),
intent(in) :: arr
823 logical,
optional,
intent(in) :: append
824 logical,
optional,
intent(in) :: lfs
825 logical,
optional,
intent(in) :: netcdf4
826 integer(i4),
optional,
intent(in) :: deflate_level
828 integer(i4),
parameter :: ndim = 3
829 character(len = 1),
dimension(4) :: dnames
830 integer(i4),
dimension(ndim) ::
dims
831 integer(i4),
dimension(ndim) :: dimid
832 integer(i4),
dimension(ndim + 1) :: varid
833 integer(i4),
dimension(ndim) :: start
834 integer(i4),
dimension(ndim) :: counter
835 integer(i4),
dimension(ndim) :: chunksizes
840 character(NF90_MAX_NAME) :: name
843 integer(i4) :: deflate
844 integer(i4) :: buffersize
847 if (
present(append))
then
857 if (
present(lfs)) largefile = lfs
859 if (
present(netcdf4)) inetcdf4 = netcdf4
861 if (
present(deflate_level)) deflate = deflate_level
864 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
868 call check(nf90_open(trim(filename), nf90_write, ncid))
871 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
872 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
873 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
874 if (idim /= ndim) stop
"dump_netcdf_3d_sp: number of variable dimensions /= number of file variable dimensions."
878 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
880 if (trim(name) /= dnames(i)) stop
"dump_netcdf_3d_sp: dimension name problem."
881 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_3d_sp: variable dimension /= file variable dimension."
883 if (trim(name) /=
'time') stop
"dump_netcdf_3d_sp: time name problem."
891 do i = 1,
size(arr, ndim)
892 start(ndim) =
dims(ndim) + i
893 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
894 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
899 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
902 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
904 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
911 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
914 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
919 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
921 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
926 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
928 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
933 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
935 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1), &
936 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
938 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1)))
942 call check(nf90_enddef(ncid))
946 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
955 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
956 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
961 call check(nf90_close(ncid))
963 end subroutine dump_netcdf_3d_sp
966 subroutine dump_netcdf_4d_sp(filename, arr, append, lfs, netcdf4, deflate_level)
970 character(len = *),
intent(in) :: filename
971 real(
sp),
dimension(:, :, :, :),
intent(in) :: arr
972 logical,
optional,
intent(in) :: append
973 logical,
optional,
intent(in) :: lfs
974 logical,
optional,
intent(in) :: netcdf4
975 integer(i4),
optional,
intent(in) :: deflate_level
977 integer(i4),
parameter :: ndim = 4
978 character(len = 1),
dimension(4) :: dnames
979 integer(i4),
dimension(ndim) ::
dims
980 integer(i4),
dimension(ndim) :: dimid
981 integer(i4),
dimension(ndim + 1) :: varid
982 integer(i4),
dimension(ndim) :: start
983 integer(i4),
dimension(ndim) :: counter
984 integer(i4),
dimension(ndim) :: chunksizes
989 character(NF90_MAX_NAME) :: name
992 integer(i4) :: deflate
993 integer(i4) :: buffersize
996 if (
present(append))
then
1006 if (
present(lfs)) largefile = lfs
1008 if (
present(netcdf4)) inetcdf4 = netcdf4
1010 if (
present(deflate_level)) deflate = deflate_level
1013 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1017 call check(nf90_open(trim(filename), nf90_write, ncid))
1020 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
1021 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
1022 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
1023 if (idim /= ndim) stop
"dump_netcdf_4d_sp: number of variable dimensions /= number of file variable dimensions."
1027 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1029 if (trim(name) /= dnames(i)) stop
"dump_netcdf_4d_sp: dimension name problem."
1030 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_4d_sp: variable dimension /= file variable dimension."
1032 if (trim(name) /=
'time') stop
"dump_netcdf_4d_sp: time name problem."
1040 do i = 1,
size(arr, ndim)
1041 start(ndim) =
dims(ndim) + i
1042 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
1043 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
1048 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1051 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1053 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1060 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1063 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
1068 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1070 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1075 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1077 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1082 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
1083 chunksizes(ndim) = 1
1084 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1), &
1085 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1087 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1)))
1091 call check(nf90_enddef(ncid))
1095 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1102 do i = 1,
dims(ndim)
1104 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
1105 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
1110 call check(nf90_close(ncid))
1112 end subroutine dump_netcdf_4d_sp
1115 subroutine dump_netcdf_5d_sp(filename, arr, append, lfs, netcdf4, deflate_level)
1119 character(len = *),
intent(in) :: filename
1120 real(
sp),
dimension(:, :, :, :, :),
intent(in) :: arr
1121 logical,
optional,
intent(in) :: append
1122 logical,
optional,
intent(in) :: lfs
1123 logical,
optional,
intent(in) :: netcdf4
1124 integer(i4),
optional,
intent(in) :: deflate_level
1126 integer(i4),
parameter :: ndim = 5
1127 character(len = 1),
dimension(4) :: dnames
1128 integer(i4),
dimension(ndim) ::
dims
1129 integer(i4),
dimension(ndim) :: dimid
1130 integer(i4),
dimension(ndim + 1) :: varid
1131 integer(i4),
dimension(ndim) :: start
1132 integer(i4),
dimension(ndim) :: counter
1133 integer(i4),
dimension(ndim) :: chunksizes
1138 character(NF90_MAX_NAME) :: name
1139 logical :: largefile
1141 integer(i4) :: deflate
1142 integer(i4) :: buffersize
1145 if (
present(append))
then
1155 if (
present(lfs)) largefile = lfs
1157 if (
present(netcdf4)) inetcdf4 = netcdf4
1159 if (
present(deflate_level)) deflate = deflate_level
1162 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1166 call check(nf90_open(trim(filename), nf90_write, ncid))
1169 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
1170 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
1171 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
1172 if (idim /= ndim) stop
"dump_netcdf_5d_sp: number of variable dimensions /= number of file variable dimensions."
1176 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1178 if (trim(name) /= dnames(i)) stop
"dump_netcdf_5d_sp: dimension name problem."
1179 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_5d_sp: variable dimension /= file variable dimension."
1181 if (trim(name) /=
'time') stop
"dump_netcdf_5d_sp: time name problem."
1189 do i = 1,
size(arr, ndim)
1190 start(ndim) =
dims(ndim) + i
1191 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
1192 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
1197 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1200 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1202 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1209 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1212 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
1217 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1219 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1224 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1226 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1231 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
1232 chunksizes(ndim) = 1
1233 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1), &
1234 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1236 call check(nf90_def_var(ncid,
'var', nf90_float, dimid, varid(ndim + 1)))
1240 call check(nf90_enddef(ncid))
1244 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1251 do i = 1,
dims(ndim)
1253 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
1254 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
1259 call check(nf90_close(ncid))
1261 end subroutine dump_netcdf_5d_sp
1264 subroutine dump_netcdf_1d_dp(filename, arr, append, lfs, netcdf4, deflate_level)
1268 character(len = *),
intent(in) :: filename
1269 real(
dp),
dimension(:),
intent(in) :: arr
1270 logical,
optional,
intent(in) :: append
1271 logical,
optional,
intent(in) :: lfs
1272 logical,
optional,
intent(in) :: netcdf4
1273 integer(i4),
optional,
intent(in) :: deflate_level
1275 integer(i4),
parameter :: ndim = 1
1276 character(len = 1),
dimension(4) :: dnames
1277 integer(i4),
dimension(ndim + 1) ::
dims
1278 integer(i4),
dimension(ndim + 1) :: dimid
1279 integer(i4),
dimension(ndim + 2) :: varid
1280 integer(i4),
dimension(ndim + 1) :: start
1281 integer(i4),
dimension(ndim + 1) :: counter
1282 integer(i4),
dimension(ndim + 1) :: chunksizes
1287 character(NF90_MAX_NAME) :: name
1288 logical :: largefile
1290 integer(i4) :: deflate
1291 integer(i4) :: buffersize
1294 if (
present(append))
then
1304 if (
present(lfs)) largefile = lfs
1306 if (
present(netcdf4)) inetcdf4 = netcdf4
1308 if (
present(deflate_level)) deflate = deflate_level
1311 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1315 call check(nf90_open(trim(filename), nf90_write, ncid))
1318 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
1319 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
1320 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
1321 if (idim /= ndim + 1) stop
"dump_netcdf_1d_dp: number of variable dimensions /= number of file variable dimensions."
1325 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1326 if (i < ndim + 1)
then
1327 if (trim(name) /= dnames(i)) stop
"dump_netcdf_1d_dp: dimension name problem."
1328 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_1d_dp: variable dimension /= file variable dimension."
1330 if (trim(name) /=
'time') stop
"dump_netcdf_1d_dp: time name problem."
1337 counter(ndim + 1) = 1
1339 start(ndim + 1) =
dims(ndim + 1) + i
1340 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
1341 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
1346 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1349 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1351 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1356 dims(1 : ndim) = shape(arr)
1358 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1362 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
1367 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1369 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1374 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
1376 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
1381 chunksizes(1 : ndim) =
dims(1 : ndim)
1382 chunksizes(ndim + 1) = 1
1383 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 2), &
1384 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1386 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 2)))
1390 call check(nf90_enddef(ncid))
1394 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1400 counter(ndim + 1) = 1
1403 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
1404 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
1409 call check(nf90_close(ncid))
1411 end subroutine dump_netcdf_1d_dp
1414 subroutine dump_netcdf_2d_dp(filename, arr, append, lfs, netcdf4, deflate_level)
1418 character(len = *),
intent(in) :: filename
1419 real(
dp),
dimension(:, :),
intent(in) :: arr
1420 logical,
optional,
intent(in) :: append
1421 logical,
optional,
intent(in) :: lfs
1422 logical,
optional,
intent(in) :: netcdf4
1423 integer(i4),
optional,
intent(in) :: deflate_level
1425 integer(i4),
parameter :: ndim = 2
1426 character(len = 1),
dimension(4) :: dnames
1427 integer(i4),
dimension(ndim + 1) ::
dims
1428 integer(i4),
dimension(ndim + 1) :: dimid
1429 integer(i4),
dimension(ndim + 2) :: varid
1430 integer(i4),
dimension(ndim + 1) :: start
1431 integer(i4),
dimension(ndim + 1) :: counter
1432 integer(i4),
dimension(ndim + 1) :: chunksizes
1437 character(NF90_MAX_NAME) :: name
1438 logical :: largefile
1440 integer(i4) :: deflate
1441 integer(i4) :: buffersize
1444 if (
present(append))
then
1454 if (
present(lfs)) largefile = lfs
1456 if (
present(netcdf4)) inetcdf4 = netcdf4
1458 if (
present(deflate_level)) deflate = deflate_level
1461 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1465 call check(nf90_open(trim(filename), nf90_write, ncid))
1468 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
1469 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
1470 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
1471 if (idim /= ndim + 1) stop
"dump_netcdf_2d_dp: number of variable dimensions /= number of file variable dimensions."
1475 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1476 if (i < ndim + 1)
then
1477 if (trim(name) /= dnames(i)) stop
"dump_netcdf_2d_dp: dimension name problem."
1478 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_2d_dp: variable dimension /= file variable dimension."
1480 if (trim(name) /=
'time') stop
"dump_netcdf_2d_dp: time name problem."
1487 counter(ndim + 1) = 1
1489 start(ndim + 1) =
dims(ndim + 1) + i
1490 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
1491 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
1496 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1499 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1501 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1506 dims(1 : ndim) = shape(arr)
1508 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1512 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
1517 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1519 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1524 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
1526 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
1531 chunksizes(1 : ndim) =
dims(1 : ndim)
1532 chunksizes(ndim + 1) = 1
1533 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 2), &
1534 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1536 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 2)))
1540 call check(nf90_enddef(ncid))
1544 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1550 counter(ndim + 1) = 1
1553 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
1554 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
1559 call check(nf90_close(ncid))
1561 end subroutine dump_netcdf_2d_dp
1564 subroutine dump_netcdf_3d_dp(filename, arr, append, lfs, netcdf4, deflate_level)
1568 character(len = *),
intent(in) :: filename
1569 real(
dp),
dimension(:, :, :),
intent(in) :: arr
1570 logical,
optional,
intent(in) :: append
1571 logical,
optional,
intent(in) :: lfs
1572 logical,
optional,
intent(in) :: netcdf4
1573 integer(i4),
optional,
intent(in) :: deflate_level
1575 integer(i4),
parameter :: ndim = 3
1576 character(len = 1),
dimension(4) :: dnames
1577 integer(i4),
dimension(ndim) ::
dims
1578 integer(i4),
dimension(ndim) :: dimid
1579 integer(i4),
dimension(ndim + 1) :: varid
1580 integer(i4),
dimension(ndim) :: start
1581 integer(i4),
dimension(ndim) :: counter
1582 integer(i4),
dimension(ndim) :: chunksizes
1587 character(NF90_MAX_NAME) :: name
1588 logical :: largefile
1590 integer(i4) :: deflate
1591 integer(i4) :: buffersize
1594 if (
present(append))
then
1604 if (
present(lfs)) largefile = lfs
1606 if (
present(netcdf4)) inetcdf4 = netcdf4
1608 if (
present(deflate_level)) deflate = deflate_level
1611 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1615 call check(nf90_open(trim(filename), nf90_write, ncid))
1618 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
1619 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
1620 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
1621 if (idim /= ndim) stop
"dump_netcdf_3d_dp: number of variable dimensions /= number of file variable dimensions."
1625 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1627 if (trim(name) /= dnames(i)) stop
"dump_netcdf_3d_dp: dimension name problem."
1628 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_3d_dp: variable dimension /= file variable dimension."
1630 if (trim(name) /=
'time') stop
"dump_netcdf_3d_dp: time name problem."
1638 do i = 1,
size(arr, ndim)
1639 start(ndim) =
dims(ndim) + i
1640 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
1641 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
1646 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1650 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1652 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1659 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1662 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
1667 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1669 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1674 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1676 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1681 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
1682 chunksizes(ndim) = 1
1683 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1), &
1684 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1686 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1)))
1690 call check(nf90_enddef(ncid))
1694 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1701 do i = 1,
dims(ndim)
1703 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
1704 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
1709 call check(nf90_close(ncid))
1711 end subroutine dump_netcdf_3d_dp
1714 subroutine dump_netcdf_4d_dp(filename, arr, append, lfs, netcdf4, deflate_level)
1718 character(len = *),
intent(in) :: filename
1719 real(
dp),
dimension(:, :, :, :),
intent(in) :: arr
1720 logical,
optional,
intent(in) :: append
1721 logical,
optional,
intent(in) :: lfs
1722 logical,
optional,
intent(in) :: netcdf4
1723 integer(i4),
optional,
intent(in) :: deflate_level
1725 integer(i4),
parameter :: ndim = 4
1726 character(len = 1),
dimension(4) :: dnames
1727 integer(i4),
dimension(ndim) ::
dims
1728 integer(i4),
dimension(ndim) :: dimid
1729 integer(i4),
dimension(ndim + 1) :: varid
1730 integer(i4),
dimension(ndim) :: start
1731 integer(i4),
dimension(ndim) :: counter
1732 integer(i4),
dimension(ndim) :: chunksizes
1737 character(NF90_MAX_NAME) :: name
1738 logical :: largefile
1740 integer(i4) :: deflate
1741 integer(i4) :: buffersize
1744 if (
present(append))
then
1754 if (
present(lfs)) largefile = lfs
1756 if (
present(netcdf4)) inetcdf4 = netcdf4
1758 if (
present(deflate_level)) deflate = deflate_level
1761 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1765 call check(nf90_open(trim(filename), nf90_write, ncid))
1768 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
1769 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
1770 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
1771 if (idim /= ndim) stop
"dump_netcdf_4d_dp: number of variable dimensions /= number of file variable dimensions."
1775 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1777 if (trim(name) /= dnames(i)) stop
"dump_netcdf_4d_dp: dimension name problem."
1778 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_4d_dp: variable dimension /= file variable dimension."
1780 if (trim(name) /=
'time') stop
"dump_netcdf_4d_dp: time name problem."
1788 do i = 1,
size(arr, ndim)
1789 start(ndim) =
dims(ndim) + i
1790 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
1791 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
1796 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1799 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1801 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1808 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1811 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
1816 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1818 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1823 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1825 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1830 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
1831 chunksizes(ndim) = 1
1832 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1), &
1833 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1835 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1)))
1839 call check(nf90_enddef(ncid))
1843 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1850 do i = 1,
dims(ndim)
1852 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
1853 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
1858 call check(nf90_close(ncid))
1860 end subroutine dump_netcdf_4d_dp
1863 subroutine dump_netcdf_5d_dp(filename, arr, append, lfs, netcdf4, deflate_level)
1867 character(len = *),
intent(in) :: filename
1868 real(
dp),
dimension(:, :, :, :, :),
intent(in) :: arr
1869 logical,
optional,
intent(in) :: append
1870 logical,
optional,
intent(in) :: lfs
1871 logical,
optional,
intent(in) :: netcdf4
1872 integer(i4),
optional,
intent(in) :: deflate_level
1874 integer(i4),
parameter :: ndim = 5
1875 character(len = 1),
dimension(4) :: dnames
1876 integer(i4),
dimension(ndim) ::
dims
1877 integer(i4),
dimension(ndim) :: dimid
1878 integer(i4),
dimension(ndim + 1) :: varid
1879 integer(i4),
dimension(ndim) :: start
1880 integer(i4),
dimension(ndim) :: counter
1881 integer(i4),
dimension(ndim) :: chunksizes
1886 character(NF90_MAX_NAME) :: name
1887 logical :: largefile
1889 integer(i4) :: deflate
1890 integer(i4) :: buffersize
1893 if (
present(append))
then
1903 if (
present(lfs)) largefile = lfs
1905 if (
present(netcdf4)) inetcdf4 = netcdf4
1907 if (
present(deflate_level)) deflate = deflate_level
1910 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
1914 call check(nf90_open(trim(filename), nf90_write, ncid))
1917 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
1918 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
1919 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
1920 if (idim /= ndim) stop
"dump_netcdf_5d_dp: number of variable dimensions /= number of file variable dimensions."
1924 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
1926 if (trim(name) /= dnames(i)) stop
"dump_netcdf_5d_dp: dimension name problem."
1927 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_5d_dp: variable dimension /= file variable dimension."
1929 if (trim(name) /=
'time') stop
"dump_netcdf_5d_dp: time name problem."
1937 do i = 1,
size(arr, ndim)
1938 start(ndim) =
dims(ndim) + i
1939 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
1940 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
1945 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
1948 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
1950 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
1957 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
1960 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
1965 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1967 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
1972 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1974 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
1979 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
1980 chunksizes(ndim) = 1
1981 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1), &
1982 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
1984 call check(nf90_def_var(ncid,
'var', nf90_double, dimid, varid(ndim + 1)))
1988 call check(nf90_enddef(ncid))
1992 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
1999 do i = 1,
dims(ndim)
2001 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
2002 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
2007 call check(nf90_close(ncid))
2009 end subroutine dump_netcdf_5d_dp
2012 subroutine dump_netcdf_1d_i4(filename, arr, append, lfs, netcdf4, deflate_level)
2016 character(len = *),
intent(in) :: filename
2017 integer(i4),
dimension(:),
intent(in) :: arr
2018 logical,
optional,
intent(in) :: append
2019 logical,
optional,
intent(in) :: lfs
2020 logical,
optional,
intent(in) :: netcdf4
2021 integer(i4),
optional,
intent(in) :: deflate_level
2023 integer(i4),
parameter :: ndim = 1
2024 character(len = 1),
dimension(4) :: dnames
2025 integer(i4),
dimension(ndim + 1) ::
dims
2026 integer(i4),
dimension(ndim + 1) :: dimid
2027 integer(i4),
dimension(ndim + 2) :: varid
2028 integer(i4),
dimension(ndim + 1) :: start
2029 integer(i4),
dimension(ndim + 1) :: counter
2030 integer(i4),
dimension(ndim + 1) :: chunksizes
2035 character(NF90_MAX_NAME) :: name
2036 logical :: largefile
2038 integer(i4) :: deflate
2039 integer(i4) :: buffersize
2042 if (
present(append))
then
2052 if (
present(lfs)) largefile = lfs
2054 if (
present(netcdf4)) inetcdf4 = netcdf4
2056 if (
present(deflate_level)) deflate = deflate_level
2059 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
2063 call check(nf90_open(trim(filename), nf90_write, ncid))
2066 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
2067 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
2068 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
2069 if (idim /= ndim + 1) stop
"dump_netcdf_1d_i4: number of variable dimensions /= number of file variable dimensions."
2073 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
2074 if (i < ndim + 1)
then
2075 if (trim(name) /= dnames(i)) stop
"dump_netcdf_1d_i4: dimension name problem."
2076 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_1d_i4: variable dimension /= file variable dimension."
2078 if (trim(name) /=
'time') stop
"dump_netcdf_1d_i4: time name problem."
2085 counter(ndim + 1) = 1
2087 start(ndim + 1) =
dims(ndim + 1) + i
2088 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
2089 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
2094 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
2097 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
2099 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
2104 dims(1 : ndim) = shape(arr)
2106 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
2110 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
2115 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2117 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2122 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
2124 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
2129 chunksizes(1 : ndim) =
dims(1 : ndim)
2130 chunksizes(ndim + 1) = 1
2131 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 2), &
2132 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
2134 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 2)))
2138 call check(nf90_enddef(ncid))
2142 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
2148 counter(ndim + 1) = 1
2151 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
2152 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
2157 call check(nf90_close(ncid))
2159 end subroutine dump_netcdf_1d_i4
2162 subroutine dump_netcdf_2d_i4(filename, arr, append, lfs, netcdf4, deflate_level)
2166 character(len = *),
intent(in) :: filename
2167 integer(i4),
dimension(:, :),
intent(in) :: arr
2168 logical,
optional,
intent(in) :: append
2169 logical,
optional,
intent(in) :: lfs
2170 logical,
optional,
intent(in) :: netcdf4
2171 integer(i4),
optional,
intent(in) :: deflate_level
2173 integer(i4),
parameter :: ndim = 2
2174 character(len = 1),
dimension(4) :: dnames
2175 integer(i4),
dimension(ndim + 1) ::
dims
2176 integer(i4),
dimension(ndim + 1) :: dimid
2177 integer(i4),
dimension(ndim + 2) :: varid
2178 integer(i4),
dimension(ndim + 1) :: start
2179 integer(i4),
dimension(ndim + 1) :: counter
2180 integer(i4),
dimension(ndim + 1) :: chunksizes
2185 character(NF90_MAX_NAME) :: name
2186 logical :: largefile
2188 integer(i4) :: deflate
2189 integer(i4) :: buffersize
2192 if (
present(append))
then
2202 if (
present(lfs)) largefile = lfs
2204 if (
present(netcdf4)) inetcdf4 = netcdf4
2206 if (
present(deflate_level)) deflate = deflate_level
2209 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
2213 call check(nf90_open(trim(filename), nf90_write, ncid))
2216 call check(nf90_inq_varid(ncid,
'time', varid(ndim + 1)))
2217 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 2)))
2218 call check(nf90_inquire_variable(ncid, varid(ndim + 2),
ndims = idim, dimids = dimid))
2219 if (idim /= ndim + 1) stop
"dump_netcdf_2d_i4: number of variable dimensions /= number of file variable dimensions."
2223 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
2224 if (i < ndim + 1)
then
2225 if (trim(name) /= dnames(i)) stop
"dump_netcdf_2d_i4: dimension name problem."
2226 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_2d_i4: variable dimension /= file variable dimension."
2228 if (trim(name) /=
'time') stop
"dump_netcdf_2d_i4: time name problem."
2235 counter(ndim + 1) = 1
2237 start(ndim + 1) =
dims(ndim + 1) + i
2238 call check(nf90_put_var(ncid, varid(ndim + 1), (/
dims(ndim + 1) + i/), (/
dims(ndim + 1) + i/)))
2239 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
2244 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
2247 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
2249 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
2254 dims(1 : ndim) = shape(arr)
2256 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
2260 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim + 1)))
2265 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2267 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2272 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
2274 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim + 1), varid(ndim + 1)))
2279 chunksizes(1 : ndim) =
dims(1 : ndim)
2280 chunksizes(ndim + 1) = 1
2281 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 2), &
2282 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
2284 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 2)))
2288 call check(nf90_enddef(ncid))
2292 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
2298 counter(ndim + 1) = 1
2301 call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/)))
2302 call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter))
2307 call check(nf90_close(ncid))
2309 end subroutine dump_netcdf_2d_i4
2312 subroutine dump_netcdf_3d_i4(filename, arr, append, lfs, netcdf4, deflate_level)
2316 character(len = *),
intent(in) :: filename
2317 integer(i4),
dimension(:, :, :),
intent(in) :: arr
2318 logical,
optional,
intent(in) :: append
2319 logical,
optional,
intent(in) :: lfs
2320 logical,
optional,
intent(in) :: netcdf4
2321 integer(i4),
optional,
intent(in) :: deflate_level
2323 integer(i4),
parameter :: ndim = 3
2324 character(len = 1),
dimension(4) :: dnames
2325 integer(i4),
dimension(ndim) ::
dims
2326 integer(i4),
dimension(ndim) :: dimid
2327 integer(i4),
dimension(ndim + 1) :: varid
2328 integer(i4),
dimension(ndim) :: start
2329 integer(i4),
dimension(ndim) :: counter
2330 integer(i4),
dimension(ndim) :: chunksizes
2335 character(NF90_MAX_NAME) :: name
2336 logical :: largefile
2338 integer(i4) :: deflate
2339 integer(i4) :: buffersize
2342 if (
present(append))
then
2352 if (
present(lfs)) largefile = lfs
2354 if (
present(netcdf4)) inetcdf4 = netcdf4
2356 if (
present(deflate_level)) deflate = deflate_level
2359 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
2363 call check(nf90_open(trim(filename), nf90_write, ncid))
2366 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
2367 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
2368 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
2369 if (idim /= ndim) stop
"dump_netcdf_3d_i4: number of variable dimensions /= number of file variable dimensions."
2373 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
2375 if (trim(name) /= dnames(i)) stop
"dump_netcdf_3d_i4: dimension name problem."
2376 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_3d_i4: variable dimension /= file variable dimension."
2378 if (trim(name) /=
'time') stop
"dump_netcdf_3d_i4: time name problem."
2386 do i = 1,
size(arr, ndim)
2387 start(ndim) =
dims(ndim) + i
2388 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
2389 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
2394 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
2397 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
2399 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
2406 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
2409 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
2414 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2416 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2421 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2423 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2428 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
2429 chunksizes(ndim) = 1
2430 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1), &
2431 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
2433 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1)))
2437 call check(nf90_enddef(ncid))
2441 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
2448 do i = 1,
dims(ndim)
2450 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
2451 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter))
2456 call check(nf90_close(ncid))
2458 end subroutine dump_netcdf_3d_i4
2461 subroutine dump_netcdf_4d_i4(filename, arr, append, lfs, netcdf4, deflate_level)
2465 character(len = *),
intent(in) :: filename
2466 integer(i4),
dimension(:, :, :, :),
intent(in) :: arr
2467 logical,
optional,
intent(in) :: append
2468 logical,
optional,
intent(in) :: lfs
2469 logical,
optional,
intent(in) :: netcdf4
2470 integer(i4),
optional,
intent(in) :: deflate_level
2472 integer(i4),
parameter :: ndim = 4
2473 character(len = 1),
dimension(4) :: dnames
2474 integer(i4),
dimension(ndim) ::
dims
2475 integer(i4),
dimension(ndim) :: dimid
2476 integer(i4),
dimension(ndim + 1) :: varid
2477 integer(i4),
dimension(ndim) :: start
2478 integer(i4),
dimension(ndim) :: counter
2479 integer(i4),
dimension(ndim) :: chunksizes
2484 character(NF90_MAX_NAME) :: name
2485 logical :: largefile
2487 integer(i4) :: deflate
2488 integer(i4) :: buffersize
2491 if (
present(append))
then
2501 if (
present(lfs)) largefile = lfs
2503 if (
present(netcdf4)) inetcdf4 = netcdf4
2505 if (
present(deflate_level)) deflate = deflate_level
2508 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
2512 call check(nf90_open(trim(filename), nf90_write, ncid))
2515 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
2516 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
2517 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
2518 if (idim /= ndim) stop
"dump_netcdf_4d_i4: number of variable dimensions /= number of file variable dimensions."
2522 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
2524 if (trim(name) /= dnames(i)) stop
"dump_netcdf_4d_i4: dimension name problem."
2525 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_4d_i4: variable dimension /= file variable dimension."
2527 if (trim(name) /=
'time') stop
"dump_netcdf_4d_i4: time name problem."
2535 do i = 1,
size(arr, ndim)
2536 start(ndim) =
dims(ndim) + i
2537 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
2538 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
2543 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
2546 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
2548 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
2555 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
2558 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
2563 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2565 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2570 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2572 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2577 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
2578 chunksizes(ndim) = 1
2579 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1), &
2580 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
2582 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1)))
2586 call check(nf90_enddef(ncid))
2590 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
2597 do i = 1,
dims(ndim)
2599 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
2600 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter))
2605 call check(nf90_close(ncid))
2607 end subroutine dump_netcdf_4d_i4
2610 subroutine dump_netcdf_5d_i4(filename, arr, append, lfs, netcdf4, deflate_level)
2614 character(len = *),
intent(in) :: filename
2615 integer(i4),
dimension(:, :, :, :, :),
intent(in) :: arr
2616 logical,
optional,
intent(in) :: append
2617 logical,
optional,
intent(in) :: lfs
2618 logical,
optional,
intent(in) :: netcdf4
2619 integer(i4),
optional,
intent(in) :: deflate_level
2621 integer(i4),
parameter :: ndim = 5
2622 character(len = 1),
dimension(4) :: dnames
2623 integer(i4),
dimension(ndim) ::
dims
2624 integer(i4),
dimension(ndim) :: dimid
2625 integer(i4),
dimension(ndim + 1) :: varid
2626 integer(i4),
dimension(ndim) :: start
2627 integer(i4),
dimension(ndim) :: counter
2628 integer(i4),
dimension(ndim) :: chunksizes
2633 character(NF90_MAX_NAME) :: name
2634 logical :: largefile
2636 integer(i4) :: deflate
2637 integer(i4) :: buffersize
2640 if (
present(append))
then
2650 if (
present(lfs)) largefile = lfs
2652 if (
present(netcdf4)) inetcdf4 = netcdf4
2654 if (
present(deflate_level)) deflate = deflate_level
2657 dnames(1 : 4) = (/
'x',
'y',
'z',
'l' /)
2661 call check(nf90_open(trim(filename), nf90_write, ncid))
2664 call check(nf90_inq_varid(ncid,
'time', varid(ndim)))
2665 call check(nf90_inq_varid(ncid,
'var', varid(ndim + 1)))
2666 call check(nf90_inquire_variable(ncid, varid(ndim + 1),
ndims = idim, dimids = dimid))
2667 if (idim /= ndim) stop
"dump_netcdf_5d_i4: number of variable dimensions /= number of file variable dimensions."
2671 call check(nf90_inquire_dimension(ncid, dimid(i), name,
dims(i)))
2673 if (trim(name) /= dnames(i)) stop
"dump_netcdf_5d_i4: dimension name problem."
2674 if (
dims(i) /=
size(arr, i)) stop
"dump_netcdf_5d_i4: variable dimension /= file variable dimension."
2676 if (trim(name) /=
'time') stop
"dump_netcdf_5d_i4: time name problem."
2684 do i = 1,
size(arr, ndim)
2685 start(ndim) =
dims(ndim) + i
2686 call check(nf90_put_var(ncid, varid(ndim), (/
dims(ndim) + i/), (/
dims(ndim) + i/)))
2687 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
2692 call check(nf90_create(trim(filename), nf90_netcdf4, ncid))
2695 call check(nf90_create(trim(filename), nf90_64bit_offset, ncid, chunksize = buffersize))
2697 call check(nf90_create(trim(filename), nf90_clobber, ncid, chunksize = buffersize))
2704 call check(nf90_def_dim(ncid, dnames(i),
dims(i), dimid(i)))
2707 call check(nf90_def_dim(ncid,
'time', nf90_unlimited, dimid(ndim)))
2712 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2714 call check(nf90_def_var(ncid, dnames(i), nf90_int, dimid(i), varid(i)))
2719 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2721 call check(nf90_def_var(ncid,
'time', nf90_int, dimid(ndim), varid(ndim)))
2726 chunksizes(1 : ndim - 1) =
dims(1 : ndim - 1)
2727 chunksizes(ndim) = 1
2728 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1), &
2729 chunksizes = chunksizes, shuffle = .true., deflate_level = deflate))
2731 call check(nf90_def_var(ncid,
'var', nf90_int, dimid, varid(ndim + 1)))
2735 call check(nf90_enddef(ncid))
2739 call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1,
dims(i)) /)))
2746 do i = 1,
dims(ndim)
2748 call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/)))
2749 call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter))
2754 call check(nf90_close(ncid))
2756 end subroutine dump_netcdf_5d_i4
2762 subroutine var2nc_1d_i4(f_name, arr, dnames, v_name, dim_unlimited, &
2763 long_name, units, missing_value, attributes, create, ncid, nrec)
2767 integer(i4),
parameter :: ndim_const = 1
2770 character(len = *),
intent(in) :: f_name
2771 integer(i4),
dimension(:),
intent(in) :: arr
2772 character(len = *),
intent(in) :: v_name
2773 character(len = *),
dimension(:),
intent(in) :: dnames
2775 integer(i4),
optional,
intent(in) :: dim_unlimited
2776 character(len = *),
optional,
intent(in) :: long_name
2777 character(len = *),
optional,
intent(in) :: units
2778 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
2779 integer(i4),
optional,
intent(in) :: missing_value
2780 logical,
optional,
intent(in) :: create
2781 integer(i4),
optional,
intent(inout) :: ncid
2782 integer(i4),
optional,
intent(in) :: nrec
2784 logical :: create_loc
2785 character(256) :: dummy_name
2786 integer(i4) :: deflate
2787 integer(i4),
dimension(:),
allocatable :: chunksizes
2788 integer(i4),
dimension(:),
allocatable :: start
2789 integer(i4),
dimension(:),
allocatable :: counter
2791 integer(i4) :: d_unlimit
2792 integer(i4) :: u_dimid
2793 integer(i4) :: u_len
2794 integer(i4) :: f_handle
2795 integer(i4),
dimension(:),
allocatable ::
dims
2796 integer(i4),
dimension(:),
allocatable :: dimid
2797 integer(i4),
dimension(:),
allocatable :: varid
2799 integer(i4),
dimension(:),
allocatable :: dummy_count
2800 integer(i4),
dimension(1) :: dummy
2803 ndim =
size(dnames, 1)
2806 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
2807 if ((
size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
2808 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
2809 stop
'***ERROR see StdOut'
2811 if (
size(dnames, 1) .gt. ndim_const + 1)
then
2812 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
2813 stop
'***ERROR see StdOut'
2815 allocate(chunksizes(ndim))
2816 allocate(start(ndim))
2817 allocate(counter(ndim))
2818 allocate(
dims(ndim))
2819 allocate(dimid(ndim))
2820 allocate(varid(1 + ndim))
2821 allocate(dummy_count(ndim))
2824 if (ndim .gt. ndim_const)
then
2825 chunksizes = (/
size(arr, 1), 1 /)
2826 dims(1 : ndim - 1) = shape(arr)
2829 chunksizes = (/
size(arr, 1) /)
2830 dims(1 : ndim_const) = shape(arr)
2834 dummy = nf90_fill_int
2837 if (
present(ncid))
then
2838 if (ncid < 0_i4)
then
2848 create_loc = .false.
2849 if (
present(create)) create_loc = create
2850 f_handle = open_netcdf(f_name, create = create_loc)
2853 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
2855 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
2856 if (idim .ne. ndim) stop
"var2nc_1d_i4: number of variable dimensions /= number of file variable dimensions."
2858 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
2859 if (u_dimid .eq. -1) stop
'var2nc_1d_i4: cannot append, no unlimited dimension defined'
2861 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_1d_i4: unlimited dimension not specified correctly'
2862 if (
present(nrec))
then
2863 start(d_unlimit) = nrec
2866 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
2869 if (dummy(1) /= nf90_fill_int)
exit
2870 start(d_unlimit) = i
2871 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
2873 start(d_unlimit) = start(d_unlimit) + 1
2879 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
2881 if (i .eq. d_unlimit)
then
2883 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
2886 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
2891 call check(nf90_def_var(f_handle, v_name, nf90_int, dimid, varid(ndim + 1), &
2892 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
2894 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
2895 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
2896 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
2897 if (
present(attributes))
then
2898 do i = 1,
size(attributes, dim = 1)
2899 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
2901 read(attributes(i, 2),
'(I6)') dummy(1)
2902 call check(nf90_put_att(f_handle, varid(ndim + 1), &
2903 trim(attributes(i, 1)), dummy(1)))
2906 call check(nf90_put_att(f_handle, varid(ndim + 1), &
2907 trim(attributes(i, 1)), trim(attributes(i, 2))))
2912 call check(nf90_enddef(f_handle))
2915 do i = 1, ndim_const
2916 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
2917 if (trim(dummy_name) .ne. dnames(i)) &
2918 stop
"var2nc_1d_i4: dimension name problem."
2919 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
2920 stop
"var2nc_1d_i4: variable dimension /= file variable dimension."
2923 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
2925 if (
present(ncid))
then
2926 if (ncid < 0_i4) ncid = f_handle
2931 end subroutine var2nc_1d_i4
2933 subroutine var2nc_1d_sp(f_name, arr, dnames, v_name, dim_unlimited, &
2934 long_name, units, missing_value, attributes, create, ncid, nrec)
2938 integer(i4),
parameter :: ndim_const = 1
2941 character(len = *),
intent(in) :: f_name
2942 real(
sp),
dimension(:),
intent(in) :: arr
2943 character(len = *),
dimension(:),
intent(in) :: dnames
2944 character(len = *),
intent(in) :: v_name
2946 integer(i4),
optional,
intent(in) :: dim_unlimited
2947 character(len = *),
optional,
intent(in) :: long_name
2948 character(len = *),
optional,
intent(in) :: units
2949 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
2950 real(
sp),
optional,
intent(in) :: missing_value
2951 logical,
optional,
intent(in) :: create
2952 integer(i4),
optional,
intent(inout) :: ncid
2953 integer(i4),
optional,
intent(in) :: nrec
2955 logical :: create_loc
2956 character(256) :: dummy_name
2957 integer(i4) :: deflate
2958 integer(i4),
dimension(:),
allocatable :: chunksizes
2959 integer(i4),
dimension(:),
allocatable :: start
2960 integer(i4),
dimension(:),
allocatable :: counter
2962 integer(i4) :: d_unlimit
2963 integer(i4) :: u_dimid
2964 integer(i4) :: u_len
2965 integer(i4) :: f_handle
2966 integer(i4),
dimension(:),
allocatable ::
dims
2967 integer(i4),
dimension(:),
allocatable :: dimid
2968 integer(i4),
dimension(:),
allocatable :: varid
2970 integer(i4),
dimension(:),
allocatable :: dummy_count
2971 real(
sp),
dimension(1) :: dummy
2974 ndim =
size(dnames, 1)
2977 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
2978 if ((
size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
2979 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
2980 stop
'***ERROR see StdOut'
2982 if (
size(dnames, 1) .gt. ndim_const + 1)
then
2983 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
2984 stop
'***ERROR see StdOut'
2986 allocate(chunksizes(ndim))
2987 allocate(start(ndim))
2988 allocate(counter(ndim))
2989 allocate(
dims(ndim))
2990 allocate(dimid(ndim))
2991 allocate(varid(1 + ndim))
2992 allocate(dummy_count(ndim))
2995 if (ndim .gt. ndim_const)
then
2996 chunksizes = (/
size(arr, 1), 1 /)
2997 dims(1 : ndim - 1) = shape(arr)
3000 chunksizes = (/
size(arr, 1) /)
3001 dims(1 : ndim_const) = shape(arr)
3006 dummy = nf90_fill_float
3008 if (
present(ncid))
then
3009 if (ncid < 0_i4)
then
3019 create_loc = .false.
3020 if (
present(create)) create_loc = create
3021 f_handle = open_netcdf(f_name, create = create_loc)
3024 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3026 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3027 if (idim .ne. ndim) stop
"var2nc_1d_sp: number of variable dimensions /= number of file variable dimensions."
3029 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3030 if (u_dimid .eq. -1) stop
'var2nc_1d_sp: cannot append, no unlimited dimension defined'
3032 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_1d_sp: unlimited dimension not specified correctly'
3033 if (
present(nrec))
then
3034 start(d_unlimit) = nrec
3037 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3040 if (
ne(dummy(1), nf90_fill_float))
exit
3041 start(d_unlimit) = i
3042 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3044 start(d_unlimit) = start(d_unlimit) + 1
3050 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3052 if (i .eq. d_unlimit)
then
3054 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3057 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3062 call check(nf90_def_var(f_handle, v_name, nf90_float, dimid, varid(ndim + 1), &
3063 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3064 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3065 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3066 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3067 if (
present(attributes))
then
3068 do i = 1,
size(attributes, dim = 1)
3069 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3071 read(attributes(i, 2),
'(F10.2)') dummy(1)
3072 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3073 trim(attributes(i, 1)), dummy(1)))
3076 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3077 trim(attributes(i, 1)), trim(attributes(i, 2))))
3082 call check(nf90_enddef(f_handle))
3085 do i = 1, ndim_const
3086 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3087 if (trim(dummy_name) .ne. dnames(i)) &
3088 stop
"var2nc_1d_sp: dimension name problem."
3089 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3090 stop
"var2nc_1d_sp: variable dimension /= file variable dimension."
3093 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3095 if (
present(ncid))
then
3096 if (ncid < 0_i4) ncid = f_handle
3101 end subroutine var2nc_1d_sp
3103 subroutine var2nc_1d_dp(f_name, arr, dnames, v_name, dim_unlimited, &
3104 long_name, units, missing_value, attributes, create, ncid, nrec)
3108 integer(i4),
parameter :: ndim_const = 1
3111 character(len = *),
intent(in) :: f_name
3112 real(
dp),
dimension(:),
intent(in) :: arr
3113 character(len = *),
intent(in) :: v_name
3114 character(len = *),
dimension(:),
intent(in) :: dnames
3116 integer(i4),
optional,
intent(in) :: dim_unlimited
3117 character(len = *),
optional,
intent(in) :: long_name
3118 character(len = *),
optional,
intent(in) :: units
3119 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
3120 real(
dp),
optional,
intent(in) :: missing_value
3121 logical,
optional,
intent(in) :: create
3122 integer(i4),
optional,
intent(inout) :: ncid
3123 integer(i4),
optional,
intent(in) :: nrec
3125 logical :: create_loc
3126 character(256) :: dummy_name
3127 integer(i4) :: deflate
3128 integer(i4),
dimension(:),
allocatable :: chunksizes
3129 integer(i4),
dimension(:),
allocatable :: start
3130 integer(i4),
dimension(:),
allocatable :: counter
3132 integer(i4) :: d_unlimit
3133 integer(i4) :: u_dimid
3134 integer(i4) :: u_len
3135 integer(i4) :: f_handle
3136 integer(i4),
dimension(:),
allocatable ::
dims
3137 integer(i4),
dimension(:),
allocatable :: dimid
3138 integer(i4),
dimension(:),
allocatable :: varid
3140 integer(i4),
dimension(:),
allocatable :: dummy_count
3141 real(
dp),
dimension(1) :: dummy
3144 ndim =
size(dnames, 1)
3147 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
3148 if ((
size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
3149 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
3150 stop
'***ERROR see StdOut'
3152 if (
size(dnames, 1) .gt. ndim_const + 1)
then
3153 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
3154 stop
'***ERROR see StdOut'
3156 allocate(chunksizes(ndim))
3157 allocate(start(ndim))
3158 allocate(counter(ndim))
3159 allocate(
dims(ndim))
3160 allocate(dimid(ndim))
3161 allocate(varid(1 + ndim))
3162 allocate(dummy_count(ndim))
3165 if (ndim .gt. ndim_const)
then
3166 chunksizes = (/
size(arr, 1), 1 /)
3167 dims(1 : ndim - 1) = shape(arr)
3170 chunksizes = (/
size(arr, 1) /)
3171 dims(1 : ndim_const) = shape(arr)
3176 dummy = nf90_fill_double
3178 if (
present(ncid))
then
3179 if (ncid < 0_i4)
then
3189 create_loc = .false.
3190 if (
present(create)) create_loc = create
3191 f_handle = open_netcdf(f_name, create = create_loc)
3194 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3196 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3197 if (idim .ne. ndim) stop
"var2nc_1d_dp: number of variable dimensions /= number of file variable dimensions."
3199 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3200 if (u_dimid .eq. -1) stop
'var2nc_1d_dp: cannot append, no unlimited dimension defined'
3202 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_1d_dp: unlimited dimension not specified correctly'
3203 if (
present(nrec))
then
3204 start(d_unlimit) = nrec
3207 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3210 if (
ne(dummy(1), nf90_fill_double))
exit
3211 start(d_unlimit) = i
3212 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3214 start(d_unlimit) = start(d_unlimit) + 1
3220 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3222 if (i .eq. d_unlimit)
then
3224 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3227 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3232 call check(nf90_def_var(f_handle, v_name, nf90_double, dimid, varid(ndim + 1), &
3233 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3234 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3235 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3236 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3237 if (
present(attributes))
then
3238 do i = 1,
size(attributes, dim = 1)
3239 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3241 read(attributes(i, 2),
'(F10.2)') dummy(1)
3242 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3243 trim(attributes(i, 1)), dummy(1)))
3246 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3247 trim(attributes(i, 1)), trim(attributes(i, 2))))
3252 call check(nf90_enddef(f_handle))
3255 do i = 1, ndim_const
3256 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3257 if (trim(dummy_name) .ne. dnames(i)) &
3258 stop
"var2nc_1d_dp: dimension name problem."
3259 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3260 stop
"var2nc_1d_dp: variable dimension /= file variable dimension."
3263 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3265 if (
present(ncid))
then
3266 if (ncid < 0_i4) ncid = f_handle
3271 end subroutine var2nc_1d_dp
3273 subroutine var2nc_2d_i4(f_name, arr, dnames, v_name, dim_unlimited, &
3274 long_name, units, missing_value, attributes, create, ncid, nrec)
3278 integer(i4),
parameter :: ndim_const = 2
3281 character(len = *),
intent(in) :: f_name
3282 integer(i4),
dimension(:, :),
intent(in) :: arr
3283 character(len = *),
intent(in) :: v_name
3284 character(len = *),
dimension(:),
intent(in) :: dnames
3286 integer(i4),
optional,
intent(in) :: dim_unlimited
3287 character(len = *),
optional,
intent(in) :: long_name
3288 character(len = *),
optional,
intent(in) :: units
3289 integer(i4),
optional,
intent(in) :: missing_value
3290 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
3291 logical,
optional,
intent(in) :: create
3292 integer(i4),
optional,
intent(inout) :: ncid
3293 integer(i4),
optional,
intent(in) :: nrec
3295 logical :: create_loc
3296 character(256) :: dummy_name
3297 integer(i4) :: deflate
3298 integer(i4),
dimension(:),
allocatable :: chunksizes
3299 integer(i4),
dimension(:),
allocatable :: start
3300 integer(i4),
dimension(:),
allocatable :: counter
3302 integer(i4) :: f_handle
3303 integer(i4) :: d_unlimit
3304 integer(i4) :: u_dimid
3305 integer(i4) :: u_len
3306 integer(i4),
dimension(:),
allocatable ::
dims
3307 integer(i4),
dimension(:),
allocatable :: dimid
3308 integer(i4),
dimension(:),
allocatable :: varid
3310 integer(i4),
dimension(:),
allocatable :: dummy_count
3311 integer(i4),
dimension(1) :: dummy
3314 ndim =
size(dnames, 1)
3317 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
3318 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
3319 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
3320 stop
'***ERROR see StdOut'
3322 if (ndim .gt. ndim_const + 1)
then
3323 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
3324 stop
'***ERROR see StdOut'
3326 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
3327 (d_unlimit .lt. 0_i4))
then
3328 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
3329 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
3330 stop
'***ERROR see StdOut'
3333 allocate(chunksizes(ndim))
3334 allocate(start(ndim))
3335 allocate(counter(ndim))
3336 allocate(
dims(ndim))
3337 allocate(dimid(ndim))
3338 allocate(varid(1 + ndim))
3339 allocate(dummy_count(ndim))
3342 if (ndim .gt. ndim_const)
then
3343 chunksizes = (/
size(arr, 1),
size(arr, 2), 1 /)
3344 dims(1 : ndim - 1) = shape(arr)
3347 chunksizes = (/
size(arr, 1),
size(arr, 2) /)
3348 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
3349 dims(1 : ndim_const) = shape(arr)
3354 dummy = nf90_fill_int
3356 if (
present(ncid))
then
3357 if (ncid < 0_i4)
then
3367 create_loc = .false.
3368 if (
present(create)) create_loc = create
3369 f_handle = open_netcdf(f_name, create = create_loc)
3372 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3374 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3376 if (idim .ne. ndim) stop
"var2nc_2d_i4: number of variable dimensions /= number of file variable dimensions."
3378 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3379 if (u_dimid .eq. -1) stop
'var2nc_2d_i4: cannot append, no unlimited dimension defined'
3381 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_2d_i4: unlimited dimension not specified correctly'
3382 if (
present(nrec))
then
3383 start(d_unlimit) = nrec
3386 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3389 if (dummy(1) /= nf90_fill_int)
exit
3390 start(d_unlimit) = i
3391 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3393 start(d_unlimit) = start(d_unlimit) + 1
3399 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3401 if (i .eq. d_unlimit)
then
3403 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3406 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3411 call check(nf90_def_var(f_handle, v_name, nf90_int, dimid, varid(ndim + 1), &
3412 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3414 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3415 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3416 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3417 if (
present(attributes))
then
3418 do i = 1,
size(attributes, dim = 1)
3419 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3421 read(attributes(i, 2),
'(I6)') dummy(1)
3422 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3423 trim(attributes(i, 1)), dummy(1)))
3426 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3427 trim(attributes(i, 1)), trim(attributes(i, 2))))
3432 call check(nf90_enddef(f_handle))
3435 do i = 1, ndim_const
3436 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3437 if (trim(dummy_name) .ne. dnames(i)) &
3438 stop
"var2nc_2d_i4: dimension name problem."
3439 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3440 stop
"var2nc_2d_i4: variable dimension /= file variable dimension."
3443 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3445 if (
present(ncid))
then
3446 if (ncid < 0_i4) ncid = f_handle
3451 end subroutine var2nc_2d_i4
3453 subroutine var2nc_2d_sp(f_name, arr, dnames, v_name, dim_unlimited, &
3454 long_name, units, missing_value, attributes, create, ncid, nrec)
3458 integer(i4),
parameter :: ndim_const = 2
3461 character(len = *),
intent(in) :: f_name
3462 real(
sp),
dimension(:, :),
intent(in) :: arr
3463 character(len = *),
intent(in) :: v_name
3464 character(len = *),
dimension(:),
intent(in) :: dnames
3466 integer(i4),
optional,
intent(in) :: dim_unlimited
3467 character(len = *),
optional,
intent(in) :: long_name
3468 character(len = *),
optional,
intent(in) :: units
3469 real(
sp),
optional,
intent(in) :: missing_value
3470 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
3471 logical,
optional,
intent(in) :: create
3472 integer(i4),
optional,
intent(inout) :: ncid
3473 integer(i4),
optional,
intent(in) :: nrec
3475 logical :: create_loc
3476 character(256) :: dummy_name
3477 integer(i4) :: deflate
3478 integer(i4),
dimension(:),
allocatable :: chunksizes
3479 integer(i4),
dimension(:),
allocatable :: start
3480 integer(i4),
dimension(:),
allocatable :: counter
3482 integer(i4) :: f_handle
3483 integer(i4) :: d_unlimit
3484 integer(i4) :: u_dimid
3485 integer(i4) :: u_len
3486 integer(i4),
dimension(:),
allocatable ::
dims
3487 integer(i4),
dimension(:),
allocatable :: dimid
3488 integer(i4),
dimension(:),
allocatable :: varid
3490 integer(i4),
dimension(:),
allocatable :: dummy_count
3491 real(
sp),
dimension(1) :: dummy
3494 ndim =
size(dnames, 1)
3497 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
3498 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
3499 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
3500 stop
'***ERROR see StdOut'
3502 if (ndim .gt. ndim_const + 1)
then
3503 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
3504 stop
'***ERROR see StdOut'
3506 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
3507 (d_unlimit .lt. 0_i4))
then
3508 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
3509 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
3510 stop
'***ERROR see StdOut'
3513 allocate(chunksizes(ndim))
3514 allocate(start(ndim))
3515 allocate(counter(ndim))
3516 allocate(
dims(ndim))
3517 allocate(dimid(ndim))
3518 allocate(varid(1 + ndim))
3519 allocate(dummy_count(ndim))
3522 if (ndim .gt. ndim_const)
then
3523 chunksizes = (/
size(arr, 1),
size(arr, 2), 1 /)
3524 dims(1 : ndim - 1) = shape(arr)
3527 chunksizes = (/
size(arr, 1),
size(arr, 2) /)
3528 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
3529 dims(1 : ndim_const) = shape(arr)
3534 dummy = nf90_fill_float
3536 if (
present(ncid))
then
3537 if (ncid < 0_i4)
then
3547 create_loc = .false.
3548 if (
present(create)) create_loc = create
3549 f_handle = open_netcdf(f_name, create = create_loc)
3552 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3554 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3556 if (idim .ne. ndim) stop
"var2nc_2d_sp: number of variable dimensions /= number of file variable dimensions."
3558 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3559 if (u_dimid .eq. -1) stop
'var2nc_2d_sp: cannot append, no unlimited dimension defined'
3561 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_2d_sp: unlimited dimension not specified correctly'
3562 if (
present(nrec))
then
3563 start(d_unlimit) = nrec
3566 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3569 if (
ne(dummy(1), nf90_fill_float))
exit
3570 start(d_unlimit) = i
3571 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3573 start(d_unlimit) = start(d_unlimit) + 1
3579 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3581 if (i .eq. d_unlimit)
then
3583 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3586 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3591 call check(nf90_def_var(f_handle, v_name, nf90_float, dimid, varid(ndim + 1), &
3592 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3594 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3595 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3596 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3597 if (
present(attributes))
then
3598 do i = 1,
size(attributes, dim = 1)
3599 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3601 read(attributes(i, 2),
'(F10.2)') dummy(1)
3602 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3603 trim(attributes(i, 1)), dummy(1)))
3606 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3607 trim(attributes(i, 1)), trim(attributes(i, 2))))
3612 call check(nf90_enddef(f_handle))
3615 do i = 1, ndim_const
3616 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3617 if (trim(dummy_name) .ne. dnames(i)) &
3618 stop
"var2nc_2d_sp: dimension name problem."
3619 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3620 stop
"var2nc_2d_sp: variable dimension /= file variable dimension."
3623 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3625 if (
present(ncid))
then
3626 if (ncid < 0_i4) ncid = f_handle
3631 end subroutine var2nc_2d_sp
3633 subroutine var2nc_2d_dp(f_name, arr, dnames, v_name, dim_unlimited, &
3634 long_name, units, missing_value, attributes, create, ncid, nrec)
3638 integer(i4),
parameter :: ndim_const = 2
3641 character(len = *),
intent(in) :: f_name
3642 real(
dp),
dimension(:, :),
intent(in) :: arr
3643 character(len = *),
intent(in) :: v_name
3644 character(len = *),
dimension(:),
intent(in) :: dnames
3646 integer(i4),
optional,
intent(in) :: dim_unlimited
3647 character(len = *),
optional,
intent(in) :: long_name
3648 character(len = *),
optional,
intent(in) :: units
3649 real(
dp),
optional,
intent(in) :: missing_value
3650 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
3651 logical,
optional,
intent(in) :: create
3652 integer(i4),
optional,
intent(inout) :: ncid
3653 integer(i4),
optional,
intent(in) :: nrec
3655 logical :: create_loc
3656 character(256) :: dummy_name
3657 integer(i4) :: deflate
3658 integer(i4),
dimension(:),
allocatable :: chunksizes
3659 integer(i4),
dimension(:),
allocatable :: start
3660 integer(i4),
dimension(:),
allocatable :: counter
3662 integer(i4) :: f_handle
3663 integer(i4) :: d_unlimit
3664 integer(i4) :: u_dimid
3665 integer(i4) :: u_len
3666 integer(i4),
dimension(:),
allocatable ::
dims
3667 integer(i4),
dimension(:),
allocatable :: dimid
3668 integer(i4),
dimension(:),
allocatable :: varid
3670 integer(i4),
dimension(:),
allocatable :: dummy_count
3671 real(
dp),
dimension(1) :: dummy
3674 ndim =
size(dnames, 1)
3677 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
3678 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
3679 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
3680 stop
'***ERROR see StdOut'
3682 if (ndim .gt. ndim_const + 1)
then
3683 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
3684 stop
'***ERROR see StdOut'
3686 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
3687 (d_unlimit .lt. 0_i4))
then
3688 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
3689 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
3690 stop
'***ERROR see StdOut'
3693 allocate(chunksizes(ndim))
3694 allocate(start(ndim))
3695 allocate(counter(ndim))
3696 allocate(
dims(ndim))
3697 allocate(dimid(ndim))
3698 allocate(varid(1 + ndim))
3699 allocate(dummy_count(ndim))
3702 if (ndim .gt. ndim_const)
then
3703 chunksizes = (/
size(arr, 1),
size(arr, 2), 1 /)
3704 dims(1 : ndim - 1) = shape(arr)
3707 chunksizes = (/
size(arr, 1),
size(arr, 2) /)
3708 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
3709 dims(1 : ndim_const) = shape(arr)
3714 dummy = nf90_fill_double
3716 if (
present(ncid))
then
3717 if (ncid < 0_i4)
then
3727 create_loc = .false.
3728 if (
present(create)) create_loc = create
3729 f_handle = open_netcdf(f_name, create = create_loc)
3732 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3734 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3736 if (idim .ne. ndim) stop
"var2nc_2d_dp: number of variable dimensions /= number of file variable dimensions."
3738 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3739 if (u_dimid .eq. -1) stop
'var2nc_2d_dp: cannot append, no unlimited dimension defined'
3741 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_2d_dp: unlimited dimension not specified correctly'
3742 if (
present(nrec))
then
3743 start(d_unlimit) = nrec
3746 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3749 if (
ne(dummy(1), nf90_fill_double))
exit
3750 start(d_unlimit) = i
3751 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3753 start(d_unlimit) = start(d_unlimit) + 1
3759 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3761 if (i .eq. d_unlimit)
then
3763 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3766 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3771 call check(nf90_def_var(f_handle, v_name, nf90_double, dimid, varid(ndim + 1), &
3772 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3774 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3775 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3776 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3777 if (
present(attributes))
then
3778 do i = 1,
size(attributes, dim = 1)
3779 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3781 read(attributes(i, 2),
'(F10.2)') dummy(1)
3782 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3783 trim(attributes(i, 1)), dummy(1)))
3786 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3787 trim(attributes(i, 1)), trim(attributes(i, 2))))
3792 call check(nf90_enddef(f_handle))
3795 do i = 1, ndim_const
3796 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3797 if (trim(dummy_name) .ne. dnames(i)) &
3798 stop
"var2nc_2d_dp: dimension name problem."
3799 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3800 stop
"var2nc_2d_dp: variable dimension /= file variable dimension."
3803 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3805 if (
present(ncid))
then
3806 if (ncid < 0_i4) ncid = f_handle
3811 end subroutine var2nc_2d_dp
3813 subroutine var2nc_3d_i4(f_name, arr, dnames, v_name, dim_unlimited, &
3814 long_name, units, missing_value, attributes, create, ncid, nrec)
3818 integer(i4),
parameter :: ndim_const = 3
3821 character(len = *),
intent(in) :: f_name
3822 integer(i4),
dimension(:, :, :),
intent(in) :: arr
3823 character(len = *),
intent(in) :: v_name
3824 character(len = *),
dimension(:),
intent(in) :: dnames
3826 integer(i4),
optional,
intent(in) :: dim_unlimited
3827 character(len = *),
optional,
intent(in) :: long_name
3828 character(len = *),
optional,
intent(in) :: units
3829 integer(i4),
optional,
intent(in) :: missing_value
3830 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
3831 logical,
optional,
intent(in) :: create
3832 integer(i4),
optional,
intent(inout) :: ncid
3833 integer(i4),
optional,
intent(in) :: nrec
3835 logical :: create_loc
3836 character(256) :: dummy_name
3837 integer(i4) :: deflate
3838 integer(i4),
dimension(:),
allocatable :: chunksizes
3839 integer(i4),
dimension(:),
allocatable :: start
3840 integer(i4),
dimension(:),
allocatable :: counter
3842 integer(i4) :: f_handle
3843 integer(i4) :: d_unlimit
3844 integer(i4) :: u_dimid
3845 integer(i4) :: u_len
3846 integer(i4),
dimension(:),
allocatable ::
dims
3847 integer(i4),
dimension(:),
allocatable :: dimid
3848 integer(i4),
dimension(:),
allocatable :: varid
3850 integer(i4),
dimension(:),
allocatable :: dummy_count
3851 integer(i4),
dimension(1) :: dummy
3854 ndim =
size(dnames, 1)
3857 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
3858 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
3859 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
3860 stop
'***ERROR see StdOut'
3862 if (ndim .gt. ndim_const + 1)
then
3863 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
3864 stop
'***ERROR see StdOut'
3866 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
3867 (d_unlimit .lt. 0_i4))
then
3868 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
3869 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
3870 stop
'***ERROR see StdOut'
3873 allocate(chunksizes(ndim))
3874 allocate(start(ndim))
3875 allocate(counter(ndim))
3876 allocate(
dims(ndim))
3877 allocate(dimid(ndim))
3878 allocate(varid(1 + ndim))
3879 allocate(dummy_count(ndim))
3882 if (ndim .gt. ndim_const)
then
3883 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3), 1 /)
3884 dims(1 : ndim - 1) = shape(arr)
3887 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3) /)
3888 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
3889 dims(1 : ndim_const) = shape(arr)
3894 dummy = nf90_fill_int
3896 if (
present(ncid))
then
3897 if (ncid < 0_i4)
then
3907 create_loc = .false.
3908 if (
present(create)) create_loc = create
3909 f_handle = open_netcdf(f_name, create = create_loc)
3912 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
3914 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
3916 if (idim .ne. ndim) stop
"var2nc_3d_i4: number of variable dimensions /= number of file variable dimensions."
3918 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
3919 if (u_dimid .eq. -1) stop
'var2nc_3d_i4: cannot append, no unlimited dimension defined'
3921 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_3d_i4: unlimited dimension not specified correctly'
3922 if (
present(nrec))
then
3923 start(d_unlimit) = nrec
3926 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
3929 if (dummy(1) /= nf90_fill_int)
exit
3930 start(d_unlimit) = i
3931 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
3933 start(d_unlimit) = start(d_unlimit) + 1
3939 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
3941 if (i .eq. d_unlimit)
then
3943 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
3946 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
3951 call check(nf90_def_var(f_handle, v_name, nf90_int, dimid, varid(ndim + 1), &
3952 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
3954 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
3955 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
3956 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
3957 if (
present(attributes))
then
3958 do i = 1,
size(attributes, dim = 1)
3959 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
3961 read(attributes(i, 2),
'(I6)') dummy(1)
3962 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3963 trim(attributes(i, 1)), dummy(1)))
3966 call check(nf90_put_att(f_handle, varid(ndim + 1), &
3967 trim(attributes(i, 1)), trim(attributes(i, 2))))
3972 call check(nf90_enddef(f_handle))
3975 do i = 1, ndim_const
3976 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
3977 if (trim(dummy_name) .ne. dnames(i)) &
3978 stop
"var2nc_3d_i4: dimension name problem."
3979 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
3980 stop
"var2nc_3d_i4: variable dimension /= file variable dimension."
3983 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
3985 if (
present(ncid))
then
3986 if (ncid < 0_i4) ncid = f_handle
3991 end subroutine var2nc_3d_i4
3993 subroutine var2nc_3d_sp(f_name, arr, dnames, v_name, dim_unlimited, &
3994 long_name, units, missing_value, attributes, create, ncid, nrec)
3998 integer(i4),
parameter :: ndim_const = 3
4001 character(len = *),
intent(in) :: f_name
4002 real(
sp),
dimension(:, :, :),
intent(in) :: arr
4003 character(len = *),
intent(in) :: v_name
4004 character(len = *),
dimension(:),
intent(in) :: dnames
4006 integer(i4),
optional,
intent(in) :: dim_unlimited
4007 character(len = *),
optional,
intent(in) :: long_name
4008 character(len = *),
optional,
intent(in) :: units
4009 real(
sp),
optional,
intent(in) :: missing_value
4010 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4011 logical,
optional,
intent(in) :: create
4012 integer(i4),
optional,
intent(inout) :: ncid
4013 integer(i4),
optional,
intent(in) :: nrec
4015 logical :: create_loc
4016 character(256) :: dummy_name
4017 integer(i4) :: deflate
4018 integer(i4),
dimension(:),
allocatable :: chunksizes
4019 integer(i4),
dimension(:),
allocatable :: start
4020 integer(i4),
dimension(:),
allocatable :: counter
4022 integer(i4) :: f_handle
4023 integer(i4) :: d_unlimit
4024 integer(i4) :: u_dimid
4025 integer(i4) :: u_len
4026 integer(i4),
dimension(:),
allocatable ::
dims
4027 integer(i4),
dimension(:),
allocatable :: dimid
4028 integer(i4),
dimension(:),
allocatable :: varid
4030 integer(i4),
dimension(:),
allocatable :: dummy_count
4031 real(
sp),
dimension(1) :: dummy
4034 ndim =
size(dnames, 1)
4037 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4038 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
4039 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
4040 stop
'***ERROR see StdOut'
4042 if (ndim .gt. ndim_const + 1)
then
4043 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
4044 stop
'***ERROR see StdOut'
4046 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4047 (d_unlimit .lt. 0_i4))
then
4048 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4049 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4050 stop
'***ERROR see StdOut'
4053 allocate(chunksizes(ndim))
4054 allocate(start(ndim))
4055 allocate(counter(ndim))
4056 allocate(
dims(ndim))
4057 allocate(dimid(ndim))
4058 allocate(varid(1 + ndim))
4059 allocate(dummy_count(ndim))
4063 if (ndim .gt. ndim_const)
then
4064 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3), 1 /)
4065 dims(1 : ndim - 1) = shape(arr)
4068 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3) /)
4069 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4070 dims(1 : ndim_const) = shape(arr)
4075 dummy = nf90_fill_float
4077 if (
present(ncid))
then
4078 if (ncid < 0_i4)
then
4088 create_loc = .false.
4089 if (
present(create)) create_loc = create
4090 f_handle = open_netcdf(f_name, create = create_loc)
4093 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4095 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4097 if (idim .ne. ndim) stop
"var2nc_3d_sp: number of variable dimensions /= number of file variable dimensions."
4099 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4100 if (u_dimid .eq. -1) stop
'var2nc_3d_sp: cannot append, no unlimited dimension defined'
4102 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_3d_sp: unlimited dimension not specified correctly'
4103 if (
present(nrec))
then
4104 start(d_unlimit) = nrec
4107 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
4110 if (
ne(dummy(1), nf90_fill_float))
exit
4111 start(d_unlimit) = i
4112 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
4114 start(d_unlimit) = start(d_unlimit) + 1
4120 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
4122 if (i .eq. d_unlimit)
then
4124 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
4127 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
4132 call check(nf90_def_var(f_handle, v_name, nf90_float, dimid, varid(ndim + 1), &
4133 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
4135 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
4136 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
4137 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
4138 if (
present(attributes))
then
4139 do i = 1,
size(attributes, dim = 1)
4140 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
4142 read(attributes(i, 2),
'(F10.2)') dummy(1)
4143 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4144 trim(attributes(i, 1)), dummy(1)))
4147 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4148 trim(attributes(i, 1)), trim(attributes(i, 2))))
4153 call check(nf90_enddef(f_handle))
4156 do i = 1, ndim_const
4157 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
4158 if (trim(dummy_name) .ne. dnames(i)) &
4159 stop
"var2nc_3d_sp: dimension name problem."
4160 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
4161 stop
"var2nc_3d_sp: variable dimension /= file variable dimension."
4164 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
4166 if (
present(ncid))
then
4167 if (ncid < 0_i4) ncid = f_handle
4172 end subroutine var2nc_3d_sp
4174 subroutine var2nc_3d_dp(f_name, arr, dnames, v_name, dim_unlimited, &
4175 long_name, units, missing_value, attributes, create, ncid, nrec)
4179 integer(i4),
parameter :: ndim_const = 3
4182 character(len = *),
intent(in) :: f_name
4183 real(
dp),
dimension(:, :, :),
intent(in) :: arr
4184 character(len = *),
intent(in) :: v_name
4185 character(len = *),
dimension(:),
intent(in) :: dnames
4187 integer(i4),
optional,
intent(in) :: dim_unlimited
4188 character(len = *),
optional,
intent(in) :: long_name
4189 character(len = *),
optional,
intent(in) :: units
4190 real(
dp),
optional,
intent(in) :: missing_value
4191 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4192 logical,
optional,
intent(in) :: create
4193 integer(i4),
optional,
intent(inout) :: ncid
4194 integer(i4),
optional,
intent(in) :: nrec
4196 logical :: create_loc
4197 character(256) :: dummy_name
4198 integer(i4) :: deflate
4199 integer(i4),
dimension(:),
allocatable :: chunksizes
4200 integer(i4),
dimension(:),
allocatable :: start
4201 integer(i4),
dimension(:),
allocatable :: counter
4203 integer(i4) :: f_handle
4204 integer(i4) :: d_unlimit
4205 integer(i4) :: u_dimid
4206 integer(i4) :: u_len
4207 integer(i4),
dimension(:),
allocatable ::
dims
4208 integer(i4),
dimension(:),
allocatable :: dimid
4209 integer(i4),
dimension(:),
allocatable :: varid
4211 integer(i4),
dimension(:),
allocatable :: dummy_count
4212 real(
dp),
dimension(1) :: dummy
4215 ndim =
size(dnames, 1)
4218 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4219 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
4220 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
4221 stop
'***ERROR see StdOut'
4223 if (ndim .gt. ndim_const + 1)
then
4224 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
4225 stop
'***ERROR see StdOut'
4227 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4228 (d_unlimit .lt. 0_i4))
then
4229 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4230 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4231 stop
'***ERROR see StdOut'
4234 allocate(chunksizes(ndim))
4235 allocate(start(ndim))
4236 allocate(counter(ndim))
4237 allocate(
dims(ndim))
4238 allocate(dimid(ndim))
4239 allocate(varid(1 + ndim))
4240 allocate(dummy_count(ndim))
4243 if (ndim .gt. ndim_const)
then
4244 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3), 1 /)
4245 dims(1 : ndim - 1) = shape(arr)
4248 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3) /)
4249 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4250 dims(1 : ndim_const) = shape(arr)
4255 dummy = nf90_fill_double
4257 if (
present(ncid))
then
4258 if (ncid < 0_i4)
then
4268 create_loc = .false.
4269 if (
present(create)) create_loc = create
4270 f_handle = open_netcdf(f_name, create = create_loc)
4273 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4275 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4277 if (idim .ne. ndim) stop
"var2nc_3d_dp: number of variable dimensions /= number of file variable dimensions."
4279 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4280 if (u_dimid .eq. -1) stop
'var2nc_3d_dp: cannot append, no unlimited dimension defined'
4282 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_3d_dp: unlimited dimension not specified correctly'
4283 if (
present(nrec))
then
4284 start(d_unlimit) = nrec
4287 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
4290 if (
ne(dummy(1), nf90_fill_double))
exit
4291 start(d_unlimit) = i
4292 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
4294 start(d_unlimit) = start(d_unlimit) + 1
4300 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
4302 if (i .eq. d_unlimit)
then
4304 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
4307 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
4312 call check(nf90_def_var(f_handle, v_name, nf90_double, dimid, varid(ndim + 1), &
4313 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
4315 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
4316 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
4317 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
4318 if (
present(attributes))
then
4319 do i = 1,
size(attributes, dim = 1)
4320 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
4322 read(attributes(i, 2),
'(F10.2)') dummy(1)
4323 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4324 trim(attributes(i, 1)), dummy(1)))
4327 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4328 trim(attributes(i, 1)), trim(attributes(i, 2))))
4333 call check(nf90_enddef(f_handle))
4336 do i = 1, ndim_const
4337 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
4338 if (trim(dummy_name) .ne. dnames(i)) &
4339 stop
"var2nc_3d_dp: dimension name problem."
4340 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
4341 stop
"var2nc_3d_dp: variable dimension /= file variable dimension."
4344 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
4346 if (
present(ncid))
then
4347 if (ncid < 0_i4) ncid = f_handle
4352 end subroutine var2nc_3d_dp
4354 subroutine var2nc_4d_i4(f_name, arr, dnames, v_name, dim_unlimited, &
4355 long_name, units, missing_value, attributes, create, ncid, nrec)
4359 integer(i4),
parameter :: ndim_const = 4
4362 character(len = *),
intent(in) :: f_name
4363 integer(i4),
dimension(:, :, :, :),
intent(in) :: arr
4364 character(len = *),
intent(in) :: v_name
4365 character(len = *),
dimension(:),
intent(in) :: dnames
4367 integer(i4),
optional,
intent(in) :: dim_unlimited
4368 character(len = *),
optional,
intent(in) :: long_name
4369 character(len = *),
optional,
intent(in) :: units
4370 integer(i4),
optional,
intent(in) :: missing_value
4371 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4372 logical,
optional,
intent(in) :: create
4373 integer(i4),
optional,
intent(inout) :: ncid
4374 integer(i4),
optional,
intent(in) :: nrec
4376 logical :: create_loc
4377 character(256) :: dummy_name
4378 integer(i4) :: deflate
4379 integer(i4),
dimension(:),
allocatable :: chunksizes
4380 integer(i4),
dimension(:),
allocatable :: start
4381 integer(i4),
dimension(:),
allocatable :: counter
4383 integer(i4) :: f_handle
4384 integer(i4) :: d_unlimit
4385 integer(i4) :: u_dimid
4386 integer(i4) :: u_len
4387 integer(i4),
dimension(:),
allocatable ::
dims
4388 integer(i4),
dimension(:),
allocatable :: dimid
4389 integer(i4),
dimension(:),
allocatable :: varid
4391 integer(i4),
dimension(:),
allocatable :: dummy_count
4392 integer(i4),
dimension(1) :: dummy
4395 ndim =
size(dnames, 1)
4398 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4399 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
4400 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
4401 stop
'***ERROR see StdOut'
4403 if (ndim .gt. ndim_const + 1)
then
4404 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
4405 stop
'***ERROR see StdOut'
4407 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4408 (d_unlimit .lt. 0_i4))
then
4409 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4410 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4411 stop
'***ERROR see StdOut'
4414 allocate(chunksizes(ndim))
4415 allocate(start(ndim))
4416 allocate(counter(ndim))
4417 allocate(
dims(ndim))
4418 allocate(dimid(ndim))
4419 allocate(varid(1 + ndim))
4420 allocate(dummy_count(ndim))
4423 if (ndim .gt. ndim_const)
then
4424 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4425 size(arr, 3),
size(arr, 4), 1 /)
4426 dims(1 : ndim - 1) = shape(arr)
4429 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4430 size(arr, 3),
size(arr, 4) /)
4431 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4432 dims(1 : ndim_const) = shape(arr)
4437 dummy = nf90_fill_int
4439 if (
present(ncid))
then
4440 if (ncid < 0_i4)
then
4450 create_loc = .false.
4451 if (
present(create)) create_loc = create
4452 f_handle = open_netcdf(f_name, create = create_loc)
4455 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4457 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4459 if (idim .ne. ndim) stop
"var2nc_4d_i4: number of variable dimensions /= number of file variable dimensions."
4461 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4462 if (u_dimid .eq. -1) stop
'var2nc_4d_i4: cannot append, no unlimited dimension defined'
4464 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_4d_sp: unlimited dimension not specified correctly'
4465 if (
present(nrec))
then
4466 start(d_unlimit) = nrec
4469 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
4472 if (dummy(1) /= nf90_fill_int)
exit
4473 start(d_unlimit) = i
4474 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
4476 start(d_unlimit) = start(d_unlimit) + 1
4482 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
4484 if (i .eq. d_unlimit)
then
4486 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
4489 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
4494 call check(nf90_def_var(f_handle, v_name, nf90_int, dimid, varid(ndim + 1), &
4495 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
4497 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
4498 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
4499 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
4500 if (
present(attributes))
then
4501 do i = 1,
size(attributes, dim = 1)
4502 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
4504 read(attributes(i, 2),
'(I6)') dummy(1)
4505 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4506 trim(attributes(i, 1)), dummy(1)))
4509 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4510 trim(attributes(i, 1)), trim(attributes(i, 2))))
4515 call check(nf90_enddef(f_handle))
4518 do i = 1, ndim_const
4519 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
4520 if (trim(dummy_name) .ne. dnames(i)) &
4521 stop
"var2nc_4d_i4: dimension name problem."
4522 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
4523 stop
"var2nc_4d_i4: variable dimension /= file variable dimension."
4526 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
4528 if (
present(ncid))
then
4529 if (ncid < 0_i4) ncid = f_handle
4534 end subroutine var2nc_4d_i4
4536 subroutine var2nc_4d_sp(f_name, arr, dnames, v_name, dim_unlimited, &
4537 long_name, units, missing_value, attributes, create, ncid, nrec)
4541 integer(i4),
parameter :: ndim_const = 4
4544 character(len = *),
intent(in) :: f_name
4545 real(
sp),
dimension(:, :, :, :),
intent(in) :: arr
4546 character(len = *),
intent(in) :: v_name
4547 character(len = *),
dimension(:),
intent(in) :: dnames
4549 integer(i4),
optional,
intent(in) :: dim_unlimited
4550 character(len = *),
optional,
intent(in) :: long_name
4551 character(len = *),
optional,
intent(in) :: units
4552 real(
sp),
optional,
intent(in) :: missing_value
4553 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4554 logical,
optional,
intent(in) :: create
4555 integer(i4),
optional,
intent(inout) :: ncid
4556 integer(i4),
optional,
intent(in) :: nrec
4558 logical :: create_loc
4559 character(256) :: dummy_name
4560 integer(i4) :: deflate
4561 integer(i4),
dimension(:),
allocatable :: chunksizes
4562 integer(i4),
dimension(:),
allocatable :: start
4563 integer(i4),
dimension(:),
allocatable :: counter
4565 integer(i4) :: f_handle
4566 integer(i4) :: d_unlimit
4567 integer(i4) :: u_dimid
4568 integer(i4) :: u_len
4569 integer(i4),
dimension(:),
allocatable ::
dims
4570 integer(i4),
dimension(:),
allocatable :: dimid
4571 integer(i4),
dimension(:),
allocatable :: varid
4573 integer(i4),
dimension(:),
allocatable :: dummy_count
4574 real(
sp),
dimension(1) :: dummy
4577 ndim =
size(dnames, 1)
4580 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4581 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
4582 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
4583 stop
'***ERROR see StdOut'
4585 if (ndim .gt. ndim_const + 1)
then
4586 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
4587 stop
'***ERROR see StdOut'
4589 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4590 (d_unlimit .lt. 0_i4))
then
4591 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4592 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4593 stop
'***ERROR see StdOut'
4596 allocate(chunksizes(ndim))
4597 allocate(start(ndim))
4598 allocate(counter(ndim))
4599 allocate(
dims(ndim))
4600 allocate(dimid(ndim))
4601 allocate(varid(1 + ndim))
4602 allocate(dummy_count(ndim))
4605 if (ndim .gt. ndim_const)
then
4606 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4607 size(arr, 3),
size(arr, 4), 1 /)
4608 dims(1 : ndim - 1) = shape(arr)
4611 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4612 size(arr, 3),
size(arr, 4) /)
4613 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4614 dims(1 : ndim_const) = shape(arr)
4619 dummy = nf90_fill_float
4621 if (
present(ncid))
then
4622 if (ncid < 0_i4)
then
4632 create_loc = .false.
4633 if (
present(create)) create_loc = create
4634 f_handle = open_netcdf(f_name, create = create_loc)
4637 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4639 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4641 if (idim .ne. ndim) stop
"var2nc_4d_sp: number of variable dimensions /= number of file variable dimensions."
4643 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4644 if (u_dimid .eq. -1) stop
'var2nc_4d_sp: cannot append, no unlimited dimension defined'
4646 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_4d_sp: unlimited dimension not specified correctly'
4647 if (
present(nrec))
then
4648 start(d_unlimit) = nrec
4651 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
4654 if (
ne(dummy(1), nf90_fill_float))
exit
4655 start(d_unlimit) = i
4656 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
4658 start(d_unlimit) = start(d_unlimit) + 1
4664 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
4666 if (i .eq. d_unlimit)
then
4668 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
4671 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
4676 call check(nf90_def_var(f_handle, v_name, nf90_float, dimid, varid(ndim + 1), &
4677 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
4679 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
4680 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
4681 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
4682 if (
present(attributes))
then
4683 do i = 1,
size(attributes, dim = 1)
4684 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
4686 read(attributes(i, 2),
'(F10.2)') dummy(1)
4687 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4688 trim(attributes(i, 1)), dummy(1)))
4691 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4692 trim(attributes(i, 1)), trim(attributes(i, 2))))
4697 call check(nf90_enddef(f_handle))
4700 do i = 1, ndim_const
4701 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
4702 if (trim(dummy_name) .ne. dnames(i)) &
4703 stop
"var2nc_4d_sp: dimension name problem."
4704 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
4705 stop
"var2nc_4d_sp: variable dimension /= file variable dimension."
4708 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
4710 if (
present(ncid))
then
4711 if (ncid < 0_i4) ncid = f_handle
4716 end subroutine var2nc_4d_sp
4718 subroutine var2nc_4d_dp(f_name, arr, dnames, v_name, dim_unlimited, &
4719 long_name, units, missing_value, attributes, create, ncid, nrec)
4723 integer(i4),
parameter :: ndim_const = 4
4726 character(len = *),
intent(in) :: f_name
4727 real(
dp),
dimension(:, :, :, :),
intent(in) :: arr
4728 character(len = *),
intent(in) :: v_name
4729 character(len = *),
dimension(:),
intent(in) :: dnames
4731 integer(i4),
optional,
intent(in) :: dim_unlimited
4732 character(len = *),
optional,
intent(in) :: long_name
4733 character(len = *),
optional,
intent(in) :: units
4734 real(
dp),
optional,
intent(in) :: missing_value
4735 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4736 logical,
optional,
intent(in) :: create
4737 integer(i4),
optional,
intent(inout) :: ncid
4738 integer(i4),
optional,
intent(in) :: nrec
4740 logical :: create_loc
4741 character(256) :: dummy_name
4742 integer(i4) :: deflate
4743 integer(i4),
dimension(:),
allocatable :: chunksizes
4744 integer(i4),
dimension(:),
allocatable :: start
4745 integer(i4),
dimension(:),
allocatable :: counter
4747 integer(i4) :: f_handle
4748 integer(i4) :: d_unlimit
4749 integer(i4) :: u_dimid
4750 integer(i4) :: u_len
4751 integer(i4),
dimension(:),
allocatable ::
dims
4752 integer(i4),
dimension(:),
allocatable :: dimid
4753 integer(i4),
dimension(:),
allocatable :: varid
4755 integer(i4),
dimension(:),
allocatable :: dummy_count
4756 real(
dp),
dimension(1) :: dummy
4759 ndim =
size(dnames, 1)
4762 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4763 if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1))
then
4764 print *,
'***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited'
4765 stop
'***ERROR see StdOut'
4767 if (ndim .gt. ndim_const + 1)
then
4768 print *,
'***ERROR too many dimension name specified, should be atmost ndim_const + 1'
4769 stop
'***ERROR see StdOut'
4771 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4772 (d_unlimit .lt. 0_i4))
then
4773 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4774 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4775 stop
'***ERROR see StdOut'
4778 allocate(chunksizes(ndim))
4779 allocate(start(ndim))
4780 allocate(counter(ndim))
4781 allocate(
dims(ndim))
4782 allocate(dimid(ndim))
4783 allocate(varid(1 + ndim))
4784 allocate(dummy_count(ndim))
4787 if (ndim .gt. ndim_const)
then
4788 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4789 size(arr, 3),
size(arr, 4), 1 /)
4790 dims(1 : ndim - 1) = shape(arr)
4793 chunksizes = (/
size(arr, 1),
size(arr, 2), &
4794 size(arr, 3),
size(arr, 4) /)
4795 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4796 dims(1 : ndim_const) = shape(arr)
4801 dummy = nf90_fill_double
4803 if (
present(ncid))
then
4804 if (ncid < 0_i4)
then
4814 create_loc = .false.
4815 if (
present(create)) create_loc = create
4816 f_handle = open_netcdf(f_name, create = create_loc)
4819 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4821 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4823 if (idim .ne. ndim) stop
"var2nc_4d_dp: number of variable dimensions /= number of file variable dimensions."
4825 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4826 if (u_dimid .eq. -1) stop
'var2nc_4d_dp: cannot append, no unlimited dimension defined'
4828 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_4d_dp: unlimited dimension not specified correctly'
4829 if (
present(nrec))
then
4830 start(d_unlimit) = nrec
4833 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
4836 if (
ne(dummy(1), nf90_fill_double))
exit
4837 start(d_unlimit) = i
4838 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
4840 start(d_unlimit) = start(d_unlimit) + 1
4846 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
4848 if (i .eq. d_unlimit)
then
4850 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
4853 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
4858 call check(nf90_def_var(f_handle, v_name, nf90_double, dimid, varid(ndim + 1), &
4859 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
4861 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
4862 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
4863 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
4864 if (
present(attributes))
then
4865 do i = 1,
size(attributes, dim = 1)
4866 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
4868 read(attributes(i, 2),
'(F10.2)') dummy(1)
4869 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4870 trim(attributes(i, 1)), dummy(1)))
4873 call check(nf90_put_att(f_handle, varid(ndim + 1), &
4874 trim(attributes(i, 1)), trim(attributes(i, 2))))
4879 call check(nf90_enddef(f_handle))
4882 do i = 1, ndim_const
4883 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
4884 if (trim(dummy_name) .ne. dnames(i)) &
4885 stop
"var2nc_4d_dp: dimension name problem."
4886 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
4887 stop
"var2nc_4d_dp: variable dimension /= file variable dimension."
4890 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
4892 if (
present(ncid))
then
4893 if (ncid < 0_i4) ncid = f_handle
4898 end subroutine var2nc_4d_dp
4900 subroutine var2nc_5d_i4(f_name, arr, dnames, v_name, dim_unlimited, &
4901 long_name, units, missing_value, attributes, create, ncid, nrec)
4905 integer(i4),
parameter :: ndim_const = 5
4908 character(len = *),
intent(in) :: f_name
4909 integer(i4),
dimension(:, :, :, :, :),
intent(in) :: arr
4910 character(len = *),
intent(in) :: v_name
4911 character(len = *),
dimension(:),
intent(in) :: dnames
4913 integer(i4),
optional,
intent(in) :: dim_unlimited
4914 character(len = *),
optional,
intent(in) :: long_name
4915 character(len = *),
optional,
intent(in) :: units
4916 integer(i4),
optional,
intent(in) :: missing_value
4917 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
4918 logical,
optional,
intent(in) :: create
4919 integer(i4),
optional,
intent(inout) :: ncid
4920 integer(i4),
optional,
intent(in) :: nrec
4922 logical :: create_loc
4923 character(256) :: dummy_name
4924 integer(i4) :: deflate
4925 integer(i4),
dimension(:),
allocatable :: chunksizes
4926 integer(i4),
dimension(:),
allocatable :: start
4927 integer(i4),
dimension(:),
allocatable :: counter
4929 integer(i4) :: f_handle
4930 integer(i4) :: d_unlimit
4931 integer(i4) :: u_dimid
4932 integer(i4) :: u_len
4933 integer(i4),
dimension(:),
allocatable ::
dims
4934 integer(i4),
dimension(:),
allocatable :: dimid
4935 integer(i4),
dimension(:),
allocatable :: varid
4937 integer(i4),
dimension(:),
allocatable :: dummy_count
4938 integer(i4),
dimension(1) :: dummy
4941 ndim =
size(dnames, 1)
4943 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4945 if (ndim .gt. ndim_const)
then
4946 print *,
'***ERROR more than five dimension names given'
4947 stop
'***ERROR see StdOut'
4949 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
4950 (d_unlimit .lt. 0_i4))
then
4951 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
4952 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
4953 stop
'***ERROR see StdOut'
4956 allocate(chunksizes(ndim))
4957 allocate(start(ndim))
4958 allocate(counter(ndim))
4959 allocate(
dims(ndim))
4960 allocate(dimid(ndim))
4961 allocate(varid(1 + ndim))
4962 allocate(dummy_count(ndim))
4965 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3),
size(arr, 4),
size(arr, 5) /)
4966 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
4967 dims(1 : ndim) = shape(arr)
4971 dummy = nf90_fill_int
4973 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
4975 if (
present(ncid))
then
4976 if (ncid < 0_i4)
then
4986 create_loc = .false.
4987 if (
present(create)) create_loc = create
4988 f_handle = open_netcdf(f_name, create = create_loc)
4991 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
4993 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
4995 if (idim .ne. ndim) stop
"var2nc_5d_i4: number of variable dimensions /= number of file variable dimensions."
4997 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
4998 if (u_dimid .eq. -1) stop
'var2nc_5d_i4: cannot append, no unlimited dimension defined'
5000 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_5d_sp: unlimited dimension not specified correctly'
5001 if (
present(nrec))
then
5002 start(d_unlimit) = nrec
5005 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
5008 if (dummy(1) /= nf90_fill_int)
exit
5009 start(d_unlimit) = i
5010 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
5012 start(d_unlimit) = start(d_unlimit) + 1
5018 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
5020 if (i .eq. d_unlimit)
then
5022 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
5025 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
5030 call check(nf90_def_var(f_handle, v_name, nf90_int, dimid, varid(ndim + 1), &
5031 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
5033 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
5034 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
5035 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
5036 if (
present(attributes))
then
5037 do i = 1,
size(attributes, dim = 1)
5038 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
5040 read(attributes(i, 2),
'(I6)') dummy(1)
5041 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5042 trim(attributes(i, 1)), dummy(1)))
5045 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5046 trim(attributes(i, 1)), trim(attributes(i, 2))))
5051 call check(nf90_enddef(f_handle))
5054 do i = 1, ndim_const
5055 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
5056 if (trim(dummy_name) .ne. dnames(i)) &
5057 stop
"var2nc_5d_i4: dimension name problem."
5058 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
5059 stop
"var2nc_5d_i4: variable dimension /= file variable dimension."
5062 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
5064 if (
present(ncid))
then
5065 if (ncid < 0_i4) ncid = f_handle
5070 end subroutine var2nc_5d_i4
5072 subroutine var2nc_5d_sp(f_name, arr, dnames, v_name, dim_unlimited, &
5073 long_name, units, missing_value, attributes, create, ncid, nrec)
5077 integer(i4),
parameter :: ndim_const = 5
5080 character(len = *),
intent(in) :: f_name
5081 real(
sp),
dimension(:, :, :, :, :),
intent(in) :: arr
5082 character(len = *),
intent(in) :: v_name
5083 character(len = *),
dimension(:),
intent(in) :: dnames
5085 integer(i4),
optional,
intent(in) :: dim_unlimited
5086 character(len = *),
optional,
intent(in) :: long_name
5087 character(len = *),
optional,
intent(in) :: units
5088 real(
sp),
optional,
intent(in) :: missing_value
5089 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
5090 logical,
optional,
intent(in) :: create
5091 integer(i4),
optional,
intent(inout) :: ncid
5092 integer(i4),
optional,
intent(in) :: nrec
5094 logical :: create_loc
5095 character(256) :: dummy_name
5096 integer(i4) :: deflate
5097 integer(i4),
dimension(:),
allocatable :: chunksizes
5098 integer(i4),
dimension(:),
allocatable :: start
5099 integer(i4),
dimension(:),
allocatable :: counter
5101 integer(i4) :: f_handle
5102 integer(i4) :: d_unlimit
5103 integer(i4) :: u_dimid
5104 integer(i4) :: u_len
5105 integer(i4),
dimension(:),
allocatable ::
dims
5106 integer(i4),
dimension(:),
allocatable :: dimid
5107 integer(i4),
dimension(:),
allocatable :: varid
5109 integer(i4),
dimension(:),
allocatable :: dummy_count
5110 real(
sp),
dimension(1) :: dummy
5113 ndim =
size(dnames, 1)
5115 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
5117 if (ndim .gt. ndim_const)
then
5118 print *,
'***ERROR more than five dimension names given'
5119 stop
'***ERROR see StdOut'
5121 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
5122 (d_unlimit .lt. 0_i4))
then
5123 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
5124 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
5125 stop
'***ERROR see StdOut'
5128 allocate(chunksizes(ndim))
5129 allocate(start(ndim))
5130 allocate(counter(ndim))
5131 allocate(
dims(ndim))
5132 allocate(dimid(ndim))
5133 allocate(varid(1 + ndim))
5134 allocate(dummy_count(ndim))
5137 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3),
size(arr, 4),
size(arr, 5) /)
5138 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
5139 dims(1 : ndim) = shape(arr)
5143 dummy = nf90_fill_float
5145 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
5147 if (
present(ncid))
then
5148 if (ncid < 0_i4)
then
5158 create_loc = .false.
5159 if (
present(create)) create_loc = create
5160 f_handle = open_netcdf(f_name, create = create_loc)
5163 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
5165 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
5167 if (idim .ne. ndim) stop
"var2nc_5d_sp: number of variable dimensions /= number of file variable dimensions."
5169 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
5170 if (u_dimid .eq. -1) stop
'var2nc_5d_sp: cannot append, no unlimited dimension defined'
5172 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_5d_sp: unlimited dimension not specified correctly'
5173 if (
present(nrec))
then
5174 start(d_unlimit) = nrec
5177 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
5180 if (
ne(dummy(1), nf90_fill_float))
exit
5181 start(d_unlimit) = i
5182 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
5184 start(d_unlimit) = start(d_unlimit) + 1
5190 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
5192 if (i .eq. d_unlimit)
then
5194 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
5197 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
5202 call check(nf90_def_var(f_handle, v_name, nf90_float, dimid, varid(ndim + 1), &
5203 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
5205 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
5206 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
5207 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
5208 if (
present(attributes))
then
5209 do i = 1,
size(attributes, dim = 1)
5210 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
5212 read(attributes(i, 2),
'(F10.2)') dummy(1)
5213 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5214 trim(attributes(i, 1)), dummy(1)))
5217 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5218 trim(attributes(i, 1)), trim(attributes(i, 2))))
5223 call check(nf90_enddef(f_handle))
5226 do i = 1, ndim_const
5227 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
5228 if (trim(dummy_name) .ne. dnames(i)) &
5229 stop
"var2nc_5d_sp: dimension name problem."
5230 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
5231 stop
"var2nc_5d_sp: variable dimension /= file variable dimension."
5234 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
5236 if (
present(ncid))
then
5237 if (ncid < 0_i4) ncid = f_handle
5242 end subroutine var2nc_5d_sp
5244 subroutine var2nc_5d_dp(f_name, arr, dnames, v_name, dim_unlimited, &
5245 long_name, units, missing_value, attributes, create, ncid, nrec)
5249 integer(i4),
parameter :: ndim_const = 5
5252 character(len = *),
intent(in) :: f_name
5253 real(
dp),
dimension(:, :, :, :, :),
intent(in) :: arr
5254 character(len = *),
intent(in) :: v_name
5255 character(len = *),
dimension(:),
intent(in) :: dnames
5257 integer(i4),
optional,
intent(in) :: dim_unlimited
5258 character(len = *),
optional,
intent(in) :: long_name
5259 character(len = *),
optional,
intent(in) :: units
5260 real(
dp),
optional,
intent(in) :: missing_value
5261 character(256),
dimension(:, :),
optional,
intent(in) :: attributes
5262 logical,
optional,
intent(in) :: create
5263 integer(i4),
optional,
intent(inout) :: ncid
5264 integer(i4),
optional,
intent(in) :: nrec
5266 logical :: create_loc
5267 character(256) :: dummy_name
5268 integer(i4) :: deflate
5269 integer(i4),
dimension(:),
allocatable :: chunksizes
5270 integer(i4),
dimension(:),
allocatable :: start
5271 integer(i4),
dimension(:),
allocatable :: counter
5273 integer(i4) :: f_handle
5274 integer(i4) :: d_unlimit
5275 integer(i4) :: u_dimid
5276 integer(i4) :: u_len
5277 integer(i4),
dimension(:),
allocatable ::
dims
5278 integer(i4),
dimension(:),
allocatable :: dimid
5279 integer(i4),
dimension(:),
allocatable :: varid
5281 integer(i4),
dimension(:),
allocatable :: dummy_count
5282 real(
dp),
dimension(1) :: dummy
5285 ndim =
size(dnames, 1)
5287 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
5289 if (ndim .gt. ndim_const)
then
5290 print *,
'***ERROR more than five dimension names given'
5291 stop
'***ERROR see StdOut'
5293 if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. &
5294 (d_unlimit .lt. 0_i4))
then
5295 print*,
'***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions'
5296 print*,
'***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit
5297 stop
'***ERROR see StdOut'
5300 allocate(chunksizes(ndim))
5301 allocate(start(ndim))
5302 allocate(counter(ndim))
5303 allocate(
dims(ndim))
5304 allocate(dimid(ndim))
5305 allocate(varid(1 + ndim))
5306 allocate(dummy_count(ndim))
5309 chunksizes = (/
size(arr, 1),
size(arr, 2),
size(arr, 3),
size(arr, 4),
size(arr, 5) /)
5310 if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1
5311 dims(1 : ndim) = shape(arr)
5315 dummy = nf90_fill_double
5317 if (
present(dim_unlimited)) d_unlimit = dim_unlimited
5319 if (
present(ncid))
then
5320 if (ncid < 0_i4)
then
5330 create_loc = .false.
5331 if (
present(create)) create_loc = create
5332 f_handle = open_netcdf(f_name, create = create_loc)
5335 if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1)))
then
5337 call check(nf90_inquire_variable(f_handle, varid(ndim + 1),
ndims = idim, dimids = dimid))
5339 if (idim .ne. ndim) stop
"var2nc_5d_dp: number of variable dimensions /= number of file variable dimensions."
5341 call check(nf90_inquire(f_handle, unlimiteddimid = u_dimid))
5342 if (u_dimid .eq. -1) stop
'var2nc_5d_dp: cannot append, no unlimited dimension defined'
5344 if (dimid(d_unlimit) .ne. u_dimid) stop
'var2nc_5d_dp: unlimited dimension not specified correctly'
5345 if (
present(nrec))
then
5346 start(d_unlimit) = nrec
5349 call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len))
5352 if (
ne(dummy(1), nf90_fill_double))
exit
5353 start(d_unlimit) = i
5354 call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count))
5356 start(d_unlimit) = start(d_unlimit) + 1
5362 if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i)))
then
5364 if (i .eq. d_unlimit)
then
5366 call check(nf90_def_dim(f_handle, trim(dnames(i)), nf90_unlimited, dimid(i)))
5369 call check(nf90_def_dim(f_handle, trim(dnames(i)),
dims(i), dimid(i)))
5374 call check(nf90_def_var(f_handle, v_name, nf90_double, dimid, varid(ndim + 1), &
5375 chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate))
5377 if (
present(long_name))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'long_name', long_name))
5378 if (
present(units))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'units', units))
5379 if (
present(missing_value))
call check(nf90_put_att(f_handle, varid(ndim + 1),
'missing_value', missing_value))
5380 if (
present(attributes))
then
5381 do i = 1,
size(attributes, dim = 1)
5382 if (trim(attributes(i, 1)) .eq.
'missing_value')
then
5384 read(attributes(i, 2),
'(F10.2)') dummy(1)
5385 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5386 trim(attributes(i, 1)), dummy(1)))
5389 call check(nf90_put_att(f_handle, varid(ndim + 1), &
5390 trim(attributes(i, 1)), trim(attributes(i, 2))))
5395 call check(nf90_enddef(f_handle))
5398 do i = 1, ndim_const
5399 call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name,
dims(i)))
5400 if (trim(dummy_name) .ne. dnames(i)) &
5401 stop
"var2nc_5d_dp: dimension name problem."
5402 if ((
dims(i) .ne.
size(arr, i)) .and. (d_unlimit .ne. i)) &
5403 stop
"var2nc_5d_dp: variable dimension /= file variable dimension."
5406 call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter))
5408 if (
present(ncid))
then
5409 if (ncid < 0_i4) ncid = f_handle
5414 end subroutine var2nc_5d_dp
5451 integer(i4),
intent(in) :: ncid
5452 integer(i4),
intent(in) :: irec
5462 if (.not.
v(i)%unlimited) cycle
5463 if (.not.
v(i)%wFlag) cycle
5464 v(i)%start (
v(i)%nDims) = irec
5465 select case (
v(i)%xtype)
5467 select case (
v(i)%nDims)
5469 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_b,
v(i)%start))
5471 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_b,
v(i)%start,
v(i)%count))
5473 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_b,
v(i)%start,
v(i)%count))
5475 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_b,
v(i)%start,
v(i)%count))
5477 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_b,
v(i)%start,
v(i)%count))
5480 select case (
v(i)%nDims - 1)
5482 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_i,
v(i)%start))
5484 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_i,
v(i)%start,
v(i)%count))
5486 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_i,
v(i)%start,
v(i)%count))
5488 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_i,
v(i)%start,
v(i)%count))
5490 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_i,
v(i)%start,
v(i)%count))
5493 select case (
v(i)%nDims - 1)
5495 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_f,
v(i)%start))
5497 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_f,
v(i)%start,
v(i)%count))
5499 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_f,
v(i)%start,
v(i)%count))
5501 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_f,
v(i)%start,
v(i)%count))
5503 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_f,
v(i)%start,
v(i)%count))
5506 select case (
v(i)%nDims - 1)
5508 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_d,
v(i)%start))
5510 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_d,
v(i)%start,
v(i)%count))
5512 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_d,
v(i)%start,
v(i)%count))
5514 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_d,
v(i)%start,
v(i)%count))
5516 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_d,
v(i)%start,
v(i)%count))
5553 integer(i4),
intent(in) :: ncid
5559 if (
v(i)%unlimited) cycle
5560 if (.not.
v(i)%wFlag) cycle
5561 select case (
v(i)%xtype)
5563 select case (
v(i)%nDims)
5565 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_b))
5567 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_b))
5569 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_b))
5571 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_b))
5573 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_b))
5576 select case (
v(i)%nDims)
5578 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_i))
5580 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_i))
5582 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_i))
5584 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_i))
5586 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_i))
5589 select case (
v(i)%nDims)
5591 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_f))
5593 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_f))
5595 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_f))
5597 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_f))
5599 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_f))
5602 select case (
v(i)%nDims)
5604 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G0_d))
5606 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G1_d))
5608 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G2_d))
5610 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G3_d))
5612 call check(nf90_put_var(ncid,
v(i)%varId,
v(i)%G4_d))
5626 function open_netcdf(f_name, create)
5629 character(len = *),
intent(in) :: f_name
5630 logical,
intent(in) :: create
5632 integer(i4) :: open_netcdf
5636 call check(nf90_create(trim(f_name), nf90_netcdf4, open_netcdf))
5639 call check(nf90_open(trim(f_name), nf90_write, open_netcdf))
5641 end function open_netcdf
5647 subroutine check(status)
5651 integer(i4),
intent(in) :: status
5653 if (status /= nf90_noerr)
then
5654 write(*, *)
'mo_ncwrite.check error: ', trim(nf90_strerror(status))
5658 end subroutine check
Variable simple write in netcdf.
Extended dump_netcdf for multiple variables.
Comparison of real values for inequality.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter i1
1 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
integer(i4), parameter, public nmaxatt
nr. max attributes
integer(i4), public ndims
nr. dimensions
integer(i4), parameter, public nmaxdim
nr. max dimensions
integer(i4), parameter, public maxlen
nr. string length
subroutine, public write_static_netcdf(ncid)
static writer
subroutine, public write_dynamic_netcdf(ncid, irec)
dynamic writer
integer(i4), parameter, public nattdim
dim array of attribute values
subroutine, public close_netcdf(ncid)
Closes netcdf file stream.
integer(i4), parameter, public ngatt
nr. global attributes
type(variable), dimension(:), allocatable, public v
variable list, THIS STRUCTURE WILL BE WRITTEN IN THE FILE
type(dims), dimension(:), allocatable, public dnc
dimensions list
integer(i4), public nvars
nr. variables
type(attribute), dimension(ngatt), public gatt
global attributes for netcdf
subroutine, public create_netcdf(filename, ncid, lfs, netcdf4, deflate_level)
Open and write on new netcdf file.
logical function, public nonull(str)
Checks if string was already used.
General utilities for the CHS library.