anvarattr.f90

Path: anvarattr.f90
Last Update: Wed May 10 18:05:13 JST 2006

Copyright (C) GFD Dennou Club, 2000. All rights reserved. — 属性の列挙 — ある変数 var に付随した属性をすべて取得するにはまず attr_rewind(var) を呼び出してから無限ループの中で attr_next(var, name, [end]) を呼び出す。name がひとつ ひとつの属性名を与える。name が空文字列になったとき、 すべての属性を探索し終えたことになる。このとき end を 与えていればそれが真になることでも判定できる。 大域属性は、その名前の先頭に "+" が付加された普通の変数属性で あるかのように見える。

Methods

Included Modules

an_types an_vartable netcdf_f77 dc_trace dc_url

Public Instance methods

Subroutine :
var :type(AN_VARIABLE), intent(in)
name :character(len = *), intent(out)
end :logical, intent(out), optional

[Source]

subroutine ANVarAttrNext(var, name, end)
    use an_types, only: AN_VARIABLE, an_variable_entry
    use an_vartable, only: vtable_set_attrid, vtable_lookup
    use netcdf_f77
    use dc_url, only: GT_PLUS
    implicit none
    type(AN_VARIABLE), intent(in):: var
    character(len = *), intent(out):: name
    type(an_variable_entry):: ent
    logical, intent(out), optional:: end
    character(len = NF_MAX_NAME):: attrname
    integer:: stat
    integer:: new_attrid

    stat = vtable_lookup(var, ent)
    if (stat /= NF_NOERR) goto 999

    new_attrid = ent%attrid
    ! 最初は変数属性の検索
    if (ent%attrid >= 0) then
        new_attrid = ent%attrid + 1
        stat = NF_INQ_ATTNAME(ent%fileid, ent%varid, new_attrid, attrname)
        if (stat == NF_NOERR) then
            name = attrname
            stat = vtable_set_attrid(var, new_attrid)
            end = .FALSE.
            return
        endif
        new_attrid = -1
    endif

    ! 次は大域属性の検索
    stat = NF_INQ_ATTNAME(ent%fileid, NF_GLOBAL, -new_attrid, attrname)
    if (stat == NF_NOERR) then
        new_attrid = new_attrid - 1
        name = GT_PLUS // attrname
        stat = vtable_set_attrid(var, new_attrid)
        end = .FALSE.
        return
    endif

999 continue
    ! ここでは attrid の再設定はしない。次呼んでもエラーになるのが適当。
    end = .TRUE.
    name = ""
    return
end subroutine
Subroutine :
var :type(AN_VARIABLE), intent(in)

[Source]

subroutine ANVarAttrRewind(var)
    use an_types, only: AN_VARIABLE, an_variable_entry
    use an_vartable, only: vtable_set_attrid
    use netcdf_f77, only: NF_NOERR
    use dc_trace, only: DbgMessage
    implicit none
    type(AN_VARIABLE), intent(in):: var
    integer:: stat
    stat = vtable_set_attrid(var, 0)
    call DbgMessage("anvarattrrewind %d", i=(/stat/))
end subroutine

[Validate]