25 integer,
intent(in) :: status
27 if (status /= nf90_noerr)
then
28 call die_msg(291021908, nf90_strerror(status))
40 integer,
intent(in) :: status
42 character(len=*),
intent(in) :: error_msg
44 if (status /= nf90_noerr)
then
45 call die_msg(701841139, trim(error_msg) &
46 //
" : " // trim(nf90_strerror(status)))
57 character(len=*),
intent(in) :: filename
59 integer,
intent(out) :: ncid
62 "opening " // trim(filename) //
" for reading")
72 character(len=*),
intent(in) :: filename
74 integer,
intent(out) :: ncid
77 "opening " // trim(filename) //
" for writing")
89 integer,
intent(in) :: ncid
101 integer,
intent(in) :: ncid
103 character(len=PMC_UUID_LEN),
intent(in) :: uuid
105 character(len=*),
intent(in) :: source
107 integer,
intent(in),
optional :: write_rank
109 integer,
intent(in),
optional :: write_n_proc
111 character(len=(len_trim(source) + 100)) :: history
112 integer :: use_rank, use_n_proc
115 call pmc_nc_check(nf90_put_att(ncid, nf90_global,
"title", &
116 trim(source) //
" output file"))
117 call pmc_nc_check(nf90_put_att(ncid, nf90_global,
"source", source))
118 call pmc_nc_check(nf90_put_att(ncid, nf90_global,
"UUID", uuid))
120 history((len_trim(history)+1):) = (
" created by " // trim(source))
121 call pmc_nc_check(nf90_put_att(ncid, nf90_global,
"history", history))
122 call pmc_nc_check(nf90_put_att(ncid, nf90_global,
"Conventions",
"CF-1.4"))
125 if (
present(write_rank))
then
126 use_rank = write_rank
130 if (
present(write_n_proc))
then
131 use_n_proc = write_n_proc
138 description=
"the process number (starting from 1) " &
139 //
"that output this data file")
141 description=
"total number of processes")
152 integer,
intent(in) :: ncid
154 real(kind=
dp),
intent(out) :: var
156 character(len=*),
intent(in) :: name
159 logical,
optional,
intent(in) :: must_be_present
161 integer :: varid, status
162 logical :: use_must_be_present
164 if (
present(must_be_present))
then
165 use_must_be_present = must_be_present
167 use_must_be_present = .true.
169 status = nf90_inq_varid(ncid, name, varid)
170 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
177 "getting variable " // trim(name))
187 integer,
intent(in) :: ncid
189 integer,
intent(out) :: var
191 character(len=*),
intent(in) :: name
194 logical,
optional,
intent(in) :: must_be_present
196 integer :: varid, status
197 logical :: use_must_be_present
199 if (
present(must_be_present))
then
200 use_must_be_present = must_be_present
202 use_must_be_present = .true.
204 status = nf90_inq_varid(ncid, name, varid)
205 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
212 "getting variable " // trim(name))
222 integer,
intent(in) :: ncid
224 integer(kind=8),
intent(out) :: var
226 character(len=*),
intent(in) :: name
229 logical,
optional,
intent(in) :: must_be_present
231 integer :: varid, status
232 logical :: use_must_be_present
234 if (
present(must_be_present))
then
235 use_must_be_present = must_be_present
237 use_must_be_present = .true.
239 status = nf90_inq_varid(ncid, name, varid)
240 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
247 "getting variable " // trim(name))
257 integer,
intent(in) :: ncid
259 real(kind=
dp),
intent(inout),
allocatable :: var(:)
261 character(len=*),
intent(in) :: name
264 logical,
optional,
intent(in) :: must_be_present
266 integer :: varid, status, dimids(1), size1
267 logical :: use_must_be_present
269 if (
present(must_be_present))
then
270 use_must_be_present = must_be_present
272 use_must_be_present = .true.
274 status = nf90_inq_varid(ncid, name, varid)
275 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
277 var = [real(kind=
dp)::]
282 "determining size of variable " // trim(name))
284 "determining size of dimension number " &
288 "getting variable " // trim(name))
298 integer,
intent(in) :: ncid
300 integer,
intent(inout),
allocatable :: var(:)
302 character(len=*),
intent(in) :: name
305 logical,
optional,
intent(in) :: must_be_present
307 integer :: varid, status, dimids(1), size1
308 logical :: use_must_be_present
310 if (
present(must_be_present))
then
311 use_must_be_present = must_be_present
313 use_must_be_present = .true.
315 status = nf90_inq_varid(ncid, name, varid)
316 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
323 "determining size of variable " // trim(name))
325 "determining size of dimension number " &
329 "getting variable " // trim(name))
339 integer,
intent(in) :: ncid
341 integer(kind=8),
intent(inout),
allocatable :: var(:)
343 character(len=*),
intent(in) :: name
346 logical,
optional,
intent(in) :: must_be_present
348 integer :: varid, status, dimids(1), size1
349 logical :: use_must_be_present
351 if (
present(must_be_present))
then
352 use_must_be_present = must_be_present
354 use_must_be_present = .true.
356 status = nf90_inq_varid(ncid, name, varid)
357 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
364 "determining size of variable " // trim(name))
366 "determining size of dimension number " &
370 "getting variable " // trim(name))
380 integer,
intent(in) :: ncid
382 real(kind=
dp),
intent(inout),
allocatable :: var(:,:)
384 character(len=*),
intent(in) :: name
387 logical,
optional,
intent(in) :: must_be_present
389 integer :: varid, status, dimids(2), size1, size2
390 logical :: use_must_be_present
392 if (
present(must_be_present))
then
393 use_must_be_present = must_be_present
395 use_must_be_present = .true.
397 status = nf90_inq_varid(ncid, name, varid)
398 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
400 var = reshape([real(kind=
dp)::], [0, 0])
405 "determining size of variable " // trim(name))
407 "determining size of dimension number " &
410 "determining size of dimension number " &
414 "getting variable " // trim(name))
424 integer,
intent(in) :: ncid
426 integer,
intent(inout),
allocatable :: var(:,:)
428 character(len=*),
intent(in) :: name
431 logical,
optional,
intent(in) :: must_be_present
433 integer :: varid, status, dimids(2), size1, size2
434 logical :: use_must_be_present
436 if (
present(must_be_present))
then
437 use_must_be_present = must_be_present
439 use_must_be_present = .true.
441 status = nf90_inq_varid(ncid, name, varid)
442 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
444 var = reshape([
integer::], [0, 0])
449 "determining size of variable " // trim(name))
451 "determining size of dimension number " &
454 "determining size of dimension number " &
458 "getting variable " // trim(name))
468 integer,
intent(in) :: ncid
470 integer,
intent(inout),
allocatable :: var(:,:,:)
472 character(len=*),
intent(in) :: name
475 logical,
optional,
intent(in) :: must_be_present
477 integer :: varid, status, dimids(3), size1, size2, size3
478 logical :: use_must_be_present
480 if (
present(must_be_present))
then
481 use_must_be_present = must_be_present
483 use_must_be_present = .true.
485 status = nf90_inq_varid(ncid, name, varid)
486 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
488 var = reshape([
integer::], [0, 0, 0])
493 "determining size of variable " // trim(name))
495 "determining size of dimension number " &
498 "determining size of dimension number " &
501 "determining size of dimension number " &
505 "getting variable " // trim(name))
515 integer,
intent(in) :: ncid
517 real(kind=
dp),
allocatable,
intent(out) :: var(:,:,:)
519 character(len=*),
intent(in) :: name
522 logical,
optional,
intent(in) :: must_be_present
524 integer :: varid, status
525 logical :: use_must_be_present
527 integer :: size1, size2, size3
529 if (
present(must_be_present))
then
530 use_must_be_present = must_be_present
532 use_must_be_present = .true.
534 status = nf90_inq_varid(ncid, name, varid)
535 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
537 var = reshape([real(kind=
dp)::], [0, 0, 0])
542 "determining size of variable " // trim(name))
544 "determining size of dimension number " &
547 "determining size of dimension number " &
550 "determining size of dimension number " &
554 "getting variable " // trim(name))
564 integer,
intent(in) :: ncid
566 real(kind=
dp),
allocatable,
intent(out) :: var(:,:,:,:)
568 character(len=*),
intent(in) :: name
571 logical,
optional,
intent(in) :: must_be_present
573 integer :: varid, status
574 logical :: use_must_be_present
576 integer :: size1, size2, size3, size4
578 if (
present(must_be_present))
then
579 use_must_be_present = must_be_present
581 use_must_be_present = .true.
583 status = nf90_inq_varid(ncid, name, varid)
584 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
586 var = reshape([real(kind=
dp)::], [0, 0, 0, 0])
591 "determining size of variable " // trim(name))
593 "determining size of dimension number " &
596 "determining size of dimension number " &
599 "determining size of dimension number " &
602 "determining size of dimension number " &
606 "getting variable " // trim(name))
616 integer,
intent(in) :: ncid
618 integer,
allocatable,
intent(out) :: var(:,:,:,:)
620 character(len=*),
intent(in) :: name
623 logical,
optional,
intent(in) :: must_be_present
625 integer :: varid, status
626 logical :: use_must_be_present
628 integer :: size1, size2, size3, size4
630 if (
present(must_be_present))
then
631 use_must_be_present = must_be_present
633 use_must_be_present = .true.
635 status = nf90_inq_varid(ncid, name, varid)
636 if ((.not. use_must_be_present) .and. (status == nf90_enotvar))
then
638 var = reshape([
integer::], [0, 0, 0, 0])
643 "determining size of variable " // trim(name))
645 "determining size of dimension number " &
648 "determining size of dimension number " &
651 "determining size of dimension number " &
654 "determining size of dimension number " &
658 "getting variable " // trim(name))
669 integer,
intent(in) :: ncid
671 integer,
intent(in) :: varid
673 character(len=*),
optional,
intent(in) :: unit
675 character(len=*),
optional,
intent(in) :: long_name
677 character(len=*),
optional,
intent(in) :: standard_name
679 character(len=*),
optional,
intent(in) :: description
681 if (
present(unit))
then
682 call pmc_nc_check(nf90_put_att(ncid, varid,
"unit", unit))
684 if (
present(long_name))
then
685 call pmc_nc_check(nf90_put_att(ncid, varid,
"long_name", long_name))
687 if (
present(standard_name))
then
688 call pmc_nc_check(nf90_put_att(ncid, varid,
"standard_name", &
691 if (
present(description))
then
692 call pmc_nc_check(nf90_put_att(ncid, varid,
"description", &
702 standard_name, description)
705 integer,
intent(in) :: ncid
707 real(kind=
dp),
intent(in) :: var
709 character(len=*),
intent(in) :: name
711 character(len=*),
optional,
intent(in) :: unit
713 character(len=*),
optional,
intent(in) :: long_name
715 character(len=*),
optional,
intent(in) :: standard_name
717 character(len=*),
optional,
intent(in) :: description
719 integer :: varid, dimids(0)
722 call pmc_nc_check(nf90_def_var(ncid, name, nf90_double, dimids, varid))
735 standard_name, description)
738 integer,
intent(in) :: ncid
740 integer,
intent(in) :: var
742 character(len=*),
intent(in) :: name
744 character(len=*),
optional,
intent(in) :: unit
746 character(len=*),
optional,
intent(in) :: long_name
748 character(len=*),
optional,
intent(in) :: standard_name
750 character(len=*),
optional,
intent(in) :: description
752 integer :: varid, dimids(0)
755 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int, dimids, varid))
768 standard_name, description)
771 integer,
intent(in) :: ncid
773 integer(kind=8),
intent(in) :: var
775 character(len=*),
intent(in) :: name
777 character(len=*),
optional,
intent(in) :: unit
779 character(len=*),
optional,
intent(in) :: long_name
781 character(len=*),
optional,
intent(in) :: standard_name
783 character(len=*),
optional,
intent(in) :: description
785 integer :: varid, dimids(0)
788 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int64, dimids, varid))
804 integer,
intent(in) :: ncid
806 character(len=*),
intent(in) :: dim_name
808 integer,
intent(out) :: dimid
810 integer,
intent(in) :: dim_size
812 integer,
intent(in) :: array_dim
814 integer :: status, check_dim_size
815 character(len=NF90_MAX_NAME) :: check_name
817 status = nf90_inq_dimid(ncid, dim_name, dimid)
818 if (status == nf90_noerr)
then
819 call pmc_nc_check(nf90_inquire_dimension(ncid, dimid, check_name, &
821 call assert_msg(657263912, check_dim_size == dim_size, &
824 //
" of data array does not match size " &
826 // trim(dim_name) //
"' dim")
829 if (status /= nf90_ebaddim)
then
835 call pmc_nc_check(nf90_def_dim(ncid, dim_name, dim_size, dimid))
845 long_name, standard_name, description)
848 integer,
intent(in) :: ncid
850 real(kind=
dp),
intent(in) :: var(:)
852 character(len=*),
intent(in) :: name
855 integer,
optional,
intent(in) :: dimids(1)
858 character(len=*),
optional,
intent(in) :: dim_name
860 character(len=*),
optional,
intent(in) :: unit
862 character(len=*),
optional,
intent(in) :: long_name
864 character(len=*),
optional,
intent(in) :: standard_name
866 character(len=*),
optional,
intent(in) :: description
868 integer :: varid, start(1), count(1), use_dimids(1)
870 if (
present(dimids))
then
872 elseif (
present(dim_name))
then
875 call die_msg(891890123,
"either dimids or dim_name must be present")
878 call pmc_nc_check(nf90_def_var(ncid, name, nf90_double, use_dimids, varid))
884 count = (/
size(var, 1) /)
886 start = start, count = count))
894 long_name, standard_name, description)
897 integer,
intent(in) :: ncid
899 integer,
intent(in) :: var(:)
901 character(len=*),
intent(in) :: name
904 integer,
optional,
intent(in) :: dimids(1)
907 character(len=*),
optional,
intent(in) :: dim_name
909 character(len=*),
optional,
intent(in) :: unit
911 character(len=*),
optional,
intent(in) :: long_name
913 character(len=*),
optional,
intent(in) :: standard_name
915 character(len=*),
optional,
intent(in) :: description
917 integer :: varid, start(1), count(1), use_dimids(1)
919 if (
present(dimids))
then
921 elseif (
present(dim_name))
then
924 call die_msg(464170526,
"either dimids or dim_name must be present")
927 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int, use_dimids, varid))
933 count = (/
size(var, 1) /)
935 start = start, count = count))
943 unit, long_name, standard_name, description)
946 integer,
intent(in) :: ncid
948 integer(kind=8),
intent(in) :: var(:)
950 character(len=*),
intent(in) :: name
953 integer,
optional,
intent(in) :: dimids(1)
956 character(len=*),
optional,
intent(in) :: dim_name
958 character(len=*),
optional,
intent(in) :: unit
960 character(len=*),
optional,
intent(in) :: long_name
962 character(len=*),
optional,
intent(in) :: standard_name
964 character(len=*),
optional,
intent(in) :: description
966 integer :: varid, start(1), count(1), use_dimids(1)
968 if (
present(dimids))
then
970 elseif (
present(dim_name))
then
973 call die_msg(895894487,
"either dimids or dim_name must be present")
976 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int64, use_dimids, varid))
982 count = (/
size(var, 1) /)
984 start = start, count = count))
992 dim_name_2, unit, long_name, standard_name, description)
995 integer,
intent(in) :: ncid
997 real(kind=
dp),
intent(in) :: var(:,:)
999 character(len=*),
intent(in) :: name
1002 integer,
optional,
intent(in) :: dimids(2)
1005 character(len=*),
optional,
intent(in) :: dim_name_1
1008 character(len=*),
optional,
intent(in) :: dim_name_2
1010 character(len=*),
optional,
intent(in) :: unit
1012 character(len=*),
optional,
intent(in) :: long_name
1014 character(len=*),
optional,
intent(in) :: standard_name
1016 character(len=*),
optional,
intent(in) :: description
1018 integer :: varid, start(2), count(2), use_dimids(2)
1020 if (
present(dimids))
then
1022 elseif (
present(dim_name_1) .and.
present(dim_name_2))
then
1027 "either dimids or both dim_name_1 and dim_name_2 must be present")
1030 call pmc_nc_check(nf90_def_var(ncid, name, nf90_double, use_dimids, varid))
1036 count = (/
size(var, 1),
size(var, 2) /)
1038 start = start, count = count))
1046 dim_name_2, unit, long_name, standard_name, description)
1049 integer,
intent(in) :: ncid
1051 integer,
intent(in) :: var(:,:)
1053 character(len=*),
intent(in) :: name
1056 integer,
optional,
intent(in) :: dimids(2)
1059 character(len=*),
optional,
intent(in) :: dim_name_1
1062 character(len=*),
optional,
intent(in) :: dim_name_2
1064 character(len=*),
optional,
intent(in) :: unit
1066 character(len=*),
optional,
intent(in) :: long_name
1068 character(len=*),
optional,
intent(in) :: standard_name
1070 character(len=*),
optional,
intent(in) :: description
1072 integer :: varid, start(2), count(2), use_dimids(2)
1074 if (
present(dimids))
then
1076 elseif (
present(dim_name_1) .and.
present(dim_name_2))
then
1081 "either dimids or both dim_name_1 and dim_name_2 must be present")
1084 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int, use_dimids, varid))
1090 count = (/
size(var, 1),
size(var, 2) /)
1092 start = start, count = count))
1100 dim_name_2, dim_name_3, unit, long_name, standard_name, description)
1103 integer,
intent(in) :: ncid
1105 integer,
intent(in) :: var(:,:,:)
1107 character(len=*),
intent(in) :: name
1110 integer,
optional,
intent(in) :: dimids(3)
1113 character(len=*),
optional,
intent(in) :: dim_name_1
1116 character(len=*),
optional,
intent(in) :: dim_name_2
1119 character(len=*),
optional,
intent(in) :: dim_name_3
1121 character(len=*),
optional,
intent(in) :: unit
1123 character(len=*),
optional,
intent(in) :: long_name
1125 character(len=*),
optional,
intent(in) :: standard_name
1127 character(len=*),
optional,
intent(in) :: description
1129 integer :: varid, start(3), count(3), use_dimids(3)
1131 if (
present(dimids))
then
1133 elseif (
present(dim_name_1) .and.
present(dim_name_2) .and. &
1134 present(dim_name_3))
then
1140 "either dimids or dim_name_1, dim_name_2 and dim_name_3" &
1141 //
"must be present")
1144 call pmc_nc_check(nf90_def_var(ncid, name, nf90_int, use_dimids, varid))
1149 start = (/ 1, 1, 1 /)
1150 count = (/
size(var, 1),
size(var, 2) ,
size(var, 3)/)
1152 start = start, count = count))
1160 dim_name_2, dim_name_3, unit, long_name, standard_name, description)
1163 integer,
intent(in) :: ncid
1165 real(kind=
dp),
intent(in) :: var(:,:,:)
1167 character(len=*),
intent(in) :: name
1170 integer,
optional,
intent(in) :: dimids(3)
1173 character(len=*),
optional,
intent(in) :: dim_name_1
1176 character(len=*),
optional,
intent(in) :: dim_name_2
1179 character(len=*),
optional,
intent(in) :: dim_name_3
1181 character(len=*),
optional,
intent(in) :: unit
1183 character(len=*),
optional,
intent(in) :: long_name
1185 character(len=*),
optional,
intent(in) :: standard_name
1187 character(len=*),
optional,
intent(in) :: description
1189 integer :: varid, start(3), count(3), use_dimids(3)
1191 if (
present(dimids))
then
1193 elseif (
present(dim_name_1) .and.
present(dim_name_2) .and. &
1194 present(dim_name_3) )
then
1199 call die_msg(503513757,
"either dimids or dim_name_1, dim_name_2 and " &
1200 //
"dim_name_3 must be present")
1203 call pmc_nc_check(nf90_def_var(ncid, name, nf90_double, use_dimids, varid))
1208 start = (/ 1, 1, 1 /)
1209 count = (/
size(var, 1),
size(var, 2),
size(var, 3) /)
1211 start = start, count = count))
1219 dim_name_2, dim_name_3, dim_name_4, unit, long_name, standard_name, &
1223 integer,
intent(in) :: ncid
1225 real(kind=
dp),
intent(in) :: var(:,:,:,:)
1227 character(len=*),
intent(in) :: name
1230 integer,
optional,
intent(in) :: dimids(4)
1233 character(len=*),
optional,
intent(in) :: dim_name_1
1236 character(len=*),
optional,
intent(in) :: dim_name_2
1239 character(len=*),
optional,
intent(in) :: dim_name_3
1242 character(len=*),
optional,
intent(in) :: dim_name_4
1244 character(len=*),
optional,
intent(in) :: unit
1246 character(len=*),
optional,
intent(in) :: long_name
1248 character(len=*),
optional,
intent(in) :: standard_name
1250 character(len=*),
optional,
intent(in) :: description
1252 integer :: varid, start(4), count(4), use_dimids(4)
1254 if (
present(dimids))
then
1256 elseif (
present(dim_name_1) .and.
present(dim_name_2) .and. &
1257 present(dim_name_3) .and.
present(dim_name_4))
then
1263 call die_msg(464532814,
"either dimids or dim_name_1, dim_name_2 " &
1264 //
"dim_name_3 and dim_name_4 must be present")
1267 call pmc_nc_check(nf90_def_var(ncid, name, nf90_double, use_dimids, varid))
1272 start = (/ 1, 1, 1, 1 /)
1273 count = (/
size(var, 1),
size(var, 2),
size(var, 3),
size(var, 4) /)
1275 start = start, count = count))