! Copyright (C) GFD Dennou Club, 2000-2001.  All rights reserved.

subroutine GTVarGetDouble(var, value, nvalue, err)
    use gtdata_types, only: gt_variable
    use gt_map, only: var_class, vtb_class_netcdf, &
        & map_to_internal_specs, gtvar_dump
    use an_generic, only: get, an_variable
    use dc_trace, only: beginsub, endsub
    use dc_error
    implicit none
    type(gt_variable), intent(inout)        :: var
    real(8),           intent(out)          :: value(*)
    integer,           intent(in)           :: nvalue
    logical,           intent(out), optional:: err
    integer:: class, cid, stat
    integer, pointer:: specs(:, :)
    call var_class(var, class, cid)
    call beginsub('GTVarGetDouble')
    call gtvar_dump(var)
    call map_to_internal_specs(var, specs)
    if (class == vtb_class_netcdf) then
        call get(an_variable(cid), start=specs(:, 1), count=specs(:, 2), &
            & stride=specs(:, 3), imap=specs(:, 4), siz=nvalue, value=value, &
            & iostat=stat)
    else
        stat = gt_efake
    endif
    if (associated(specs)) deallocate(specs)
    call storeerror(stat, "GTVarGetDouble", err)
    call endsub('GTVarGetDouble', 'stat=%d', i=(/stat/))
end subroutine
