Groups

This page describles procedures handling NetCDF groups.

See the improvements page for an explanation of the mnemonics "basic change", "interface change", "functionality change", "additional procedure".

nf95_inq_file_ncid

(additional procedure)

subroutine nf95_inq_file_ncid(ncid_file, grpid, ncerr)

  ! Find the ncid of the file (that is, the root group), knowing the
  ! ncid of a group in the file.

  integer, intent(out):: ncid_file
  integer, intent(in):: grpid
  integer, intent(out), optional:: ncerr

nf95_inq_grp_full_ncid

(basic change)

subroutine nf95_inq_grp_full_ncid(ncid, full_name, grp_ncid, ncerr)

  integer, intent(in):: ncid ! can be the file id or a group id

  character(len = *), intent(in):: full_name
  ! Should be a path relative to ncid (which can correspond to the
  ! root group or a subgroup). Can be an immediate subgroup or a
  ! deeper subgroup.

  integer, intent(out):: grp_ncid
  integer, intent(out), optional:: ncerr

You know the relative path of a group and you want its ncid.

Reference: nc_inq_grp_full_ncid

nf95_inq_grpname

(functionality change)

subroutine nf95_inq_grpname(ncid, name, ncerr)

  integer, intent(in):: ncid ! can be the file id or a group id
  character(len = :), allocatable, intent(out):: name ! without path
  integer, intent(out), optional:: ncerr

You know the ncid of a group (which can be the root group) and you want the basename of this group. The basename of the group is the last part in the absolute path, as in the Unix basename program. The basename of the root group is “/”.

The functionality change is that the argument name has dynamic, deferred length.

The problem with the Fortran 90 interface: name has assumed length in the Fortran 90 interface. Also, there is no way in the Fortran 90 interface to only inquire about the length of the name. The function nf90_inq_grpname_len gives the length of the absolute path of the group, not the length of the basename of the group.

Reference: nf90_inq_grpname

nf95_inq_grpname_full

(functionality change)

subroutine nf95_inq_grpname_full(ncid, full_name, ncerr)

  integer, intent(in):: ncid
  character(len = :), allocatable, intent(out):: full_name ! absolute path
  integer, intent(out), optional:: ncerr

You know the ncid of a group (which can be the root group) and you want the absolute path of the group.

The functionality change is that the argument full_name has dynamic, deferred length, and there is no length argument. Since full_name is allocated to the exact length of the path, the length argument is useless, you can just query the length of the actual argument after the call.

The problem with the Fortran 90 interface: the name argument has assumed length in the Fortran 90 interface. You have to call nf90_inq_grpname_len first to know the length of the actual argument that you will associate to name.

Reference: nf90_inq_grpname_full

nf95_inq_grp_parent

(basic change)

subroutine nf95_inq_grp_parent(ncid, parent_ncid, ncerr)

  integer, intent(in):: ncid
  integer, intent(out):: parent_ncid
  integer, intent(out), optional:: ncerr

You know the ncid of a group and you want the ncid of the parent group.

nf95_inq_grps

(functionality change)

subroutine nf95_inq_grps(ncid, ncids, ncerr)

  integer, intent(in):: ncid ! can be the file id or a group id
  integer, allocatable, intent(out):: ncids(:)
  integer, intent(out), optional:: ncerr

You know the ncid of a group (which can be the root group) and you want the ncids of its immediate subgroups.

The functionality change is that the argument ncids is allocatable and there is no argument numgrps. Since ncids is allocated to the number of groups, the argument numgrps is useless, you can just query the size of the actual argument associated to ncids after the call.

The problem with the Fortran 90 interface: ncids has assumed shape in the Fortran 90 interface. Also, there is no way in the Fortran 90 interface to only inquire about the number of subgroups. The Fortran 90 interface is dangerous here because it does not check that the size of ncids is large enough: a segmentation violation will occur if it is not. NetCDF95 solves this by going directly to the C interface.

Reference: nf90_inq_grps and nc_inq_grps