TABLE OF CONTENTS


etsf_io_data_contents

[ Top ] [ etsf_io_data_group ] [ Methods ]

NAME

etsf_io_data_contents

FUNCTION

High-level routine that get informations from a given @filename. Returned values are the list of dimensions, allocated split definitions (if any), flags for main variables (see FLAGS_VARIABLES) and flags for groups (see FLAGS_GROUPS).

This routine can also be used to get the comprehensive list of read variables with their definitions (name, shape, dimension names...). Use etsf_io_vars_free() to deallocate this list.

INPUTS

OUTPUT

SIDE EFFECTS

NOTES

This file has been automatically generated by the autogen_subroutines.py script. Any change you would bring to it will systematically be overwritten.

SOURCE

subroutine etsf_io_data_contents(filename, dims, split, etsf_groups, etsf_variables, &
  & lstat, error_data, vars_infos)

  !Arguments ------------------------------------
  character(len=*), intent(in) :: filename
  type(etsf_dims), intent(out) :: dims
  type(etsf_split), intent(out) :: split
  integer, intent(out) :: etsf_groups
  type(etsf_groups_flags), intent(out) :: etsf_variables
  logical, intent(out) :: lstat
  type(etsf_io_low_error), intent(out) :: error_data
  type(etsf_vars), optional, intent(inout) :: vars_infos
  !Local variables-------------------------------
  character(len=*),parameter :: my_name = 'etsf_io_data_contents'
  integer :: ncid, i
  type(etsf_vars) :: my_vars_infos
  logical :: with_dim_name
  logical :: with_att_name
  integer :: group_id
  integer :: var_id
  logical :: split_id


  ! *************************************************************************

!DEBUG
!write (*,*) 'etsf_io_data_contents : enter'
!ENDDEBUG

  lstat = .false.
  if (present(vars_infos)) then
    vars_infos%n_vars = 0
    vars_infos%parent => null()
    with_dim_name = .true.
    with_att_name = .true.
  else
    with_dim_name = .false.
    with_att_name = .false.
  end if
  
  ! Open file for reading
  call etsf_io_low_open_read(ncid, trim(filename), &
    & lstat, error_data = error_data)
  if (.not. lstat) then
    call etsf_io_low_error_update(error_data, my_name)
    return
  end if
  ! Get the dimensions.
  call etsf_io_dims_get(ncid, dims, lstat, error_data)
  if (.not. lstat) then
    call etsf_io_low_error_update(error_data, my_name)
    return
  end if
  ! We allocate the split arrays.
  call etsf_io_split_allocate(split, dims)
  ! We read the split informations.
  call etsf_io_split_get(ncid, split, lstat, error_data)
  if (.not. lstat) then
    call etsf_io_split_free(split)
    call etsf_io_low_error_update(error_data, my_name)
    return
  end if
  ! Get all variables definitions.
  ! It will allocate my_vars_infos%parent array.
  call etsf_io_low_read_all_var_infos(ncid, my_vars_infos%parent, &
    & lstat, error_data, with_dim_name = with_dim_name, &
    & with_att_name = with_att_name)
  if (.not. lstat) then
    call etsf_io_split_free(split)
    call etsf_io_low_error_update(error_data, my_name)
    return
  end if
  
  etsf_variables%geometry  = etsf_geometry_none
  etsf_variables%electrons  = etsf_electrons_none
  etsf_variables%kpoints  = etsf_kpoints_none
  etsf_variables%basisdata  = etsf_basisdata_none
  etsf_variables%gwdata  = etsf_gwdata_none
  etsf_variables%dielectric  = etsf_dielectric_none
  etsf_variables%main  = etsf_main_none
  if (associated(my_vars_infos%parent)) then
    my_vars_infos%n_vars = size(my_vars_infos%parent)
    if (present(vars_infos)) then
      ! Allocate vars_infos arrays for future use.
      vars_infos%n_vars = my_vars_infos%n_vars
      allocate(vars_infos%group(vars_infos%n_vars))
      allocate(vars_infos%varid(vars_infos%n_vars))
      allocate(vars_infos%split(vars_infos%n_vars))
    end if
    ! get the main_id and the group_id for all variables.
    do i = 1, my_vars_infos%n_vars, 1
      call etsf_io_data_get(group_id, var_id, &
        & split_id, my_vars_infos%parent(i)%name)
      select case (group_id)
        case (etsf_grp_geometry)
          etsf_variables%geometry = ior(etsf_variables%geometry, var_id)
        case (etsf_grp_electrons)
          etsf_variables%electrons = ior(etsf_variables%electrons, var_id)
        case (etsf_grp_kpoints)
          etsf_variables%kpoints = ior(etsf_variables%kpoints, var_id)
        case (etsf_grp_basisdata)
          etsf_variables%basisdata = ior(etsf_variables%basisdata, var_id)
        case (etsf_grp_gwdata)
          etsf_variables%gwdata = ior(etsf_variables%gwdata, var_id)
        case (etsf_grp_dielectric)
          etsf_variables%dielectric = ior(etsf_variables%dielectric, var_id)
        case (etsf_grp_main)
          etsf_variables%main = ior(etsf_variables%main, var_id)
      end select
      etsf_groups = ior(etsf_groups, group_id)
      if (present(vars_infos)) then
        ! Update vars_infos arrays.
        vars_infos%group(i) = group_id
        vars_infos%varid(i) = var_id
        vars_infos%split(i) = split_id
      end if
    end do
  end if
  if (present(vars_infos)) then
    ! Associate vars_infos%parent to the one computed in my_vars_infos.
    vars_infos%parent => my_vars_infos%parent
  else if (associated(my_vars_infos%parent)) then
    call etsf_io_low_free_all_var_infos(my_vars_infos%parent)
  end if
  
  ! Close file
  call etsf_io_low_close(ncid, lstat, error_data = error_data)
  if (.not. lstat) call etsf_io_low_error_update(error_data, my_name)


!DEBUG
!write (*,*) 'etsf_io_data_contents : exit'
!ENDDEBUG

end subroutine etsf_io_data_contents