module ncdc_state
    use ncd_kinds, only: i_long
    use ncdc_types, only: nc_diag_cat_dim_names, data_blob
    
    implicit none
    
#ifdef USE_MPI
    integer(i_long)                    :: cur_proc, num_procs, ierr
#endif
    
    character(len=10000000) :: prgm_name, dummy_arg, output_file, input_file
    integer(i_long)         :: cli_arg_count, input_count
    
    integer(i_long)                    :: ncid_output, ncid_input
    
    ! Dimension storage
    character(len=100), dimension(:), allocatable     :: dim_names
    integer(i_long),    dimension(:), allocatable     :: dim_sizes
    integer(i_long),    dimension(:), allocatable     :: dim_output_ids
    integer(i_long),    dimension(:), allocatable     :: dim_counters
    integer(i_long),    dimension(:), allocatable     :: dim_unlim_sizes
    
    ! Array storage info for dimension storage
    integer(i_long)                                   :: dim_arr_total = 0
    integer(i_long)                                   :: dim_arr_size = 0
    
    integer(i_long)                                   :: num_unlims
    
    ! dim_sizes(i) of -1 designates an unlimited dimension
    
    ! Variable dimensions storage
    ! See ncdc_realloc for nc_diag_cat_dim_names derived type def
    
    ! Variable storage
    character(len=100),    dimension(:), allocatable  :: var_names
    integer(i_long),       dimension(:), allocatable  :: var_types
    type(nc_diag_cat_dim_names), dimension(:), allocatable  :: var_dim_names
    integer(i_long),       dimension(:), allocatable  :: var_output_ids
    integer(i_long),       dimension(:), allocatable  :: var_counters
    logical,               dimension(:), allocatable  :: var_hasunlim
    
    ! Array storage info for variable storage
    integer(i_long)                                   :: var_arr_total = 0
    integer(i_long)                                   :: var_arr_size = 0
    
    ! Data blob stores entire variable's data!
    ! Indexing uses the metadata indexing system.
    type(data_blob),    dimension(:), allocatable     :: data_blobs
end module ncdc_state