! gtvarclose.f90
! Copyright (C) TOYODA Eizi, 2000.  All rights reserved.

subroutine GTVarClose(var, err)
    use gtdata_types, only: GT_VARIABLE
    use gt_map, only: vtb_class_netcdf, vtb_class_memory, &
        & maptabdelete, map_lookup
    use gt_vartable, only: vartabledelete, vartablelookup
    use an_generic, only: ANVarClose, an_variable
    use dc_error, only: StoreError, GT_EBADVAR, nf_enotvar, dc_noerr
    use dc_trace, only: beginsub, endsub, DbgMessage
    use gt_mem
    implicit none
    type(GT_VARIABLE), intent(in), target:: var
    logical, intent(out), optional:: err
    integer:: vid, class, cid
    logical:: action, myerr
continue
    call beginsub('gtvarclose', fmt='var=%d', i=(/var%mapid/))
    call map_lookup(var, vid=vid)
    call maptabdelete(var, myerr)
    if (myerr) goto 999
    ! vid が 0 になるのは dup_dimmap で作られたハンドル
    if (vid == 0) goto 999
    call vartablelookup(vid, class, cid)
    call vartabledelete(vid, action, myerr)
    if (myerr) goto 999
    if (.not. action) then
        call DbgMessage('refcount decrement only, no close internal var')
        goto 999
    else if (class == vtb_class_netcdf) then
        call ANVarClose(an_variable(cid), myerr)
        if (myerr) goto 999
    else if (class == vtb_class_memory) then
        call Close(mem_variable(cid))
        myerr = .false.
    else
        call StoreError(GT_EBADVAR, "GTVarClose", err)
        call endsub('GTVarClose', 'badvar')
        myerr = .true.
    endif
999 continue
    call endsub('gtvarclose')
    if (present(err)) err = myerr
end subroutine
