Loading...
Searching...
No Matches
gdncattrgetchar.f90
Go to the documentation of this file.
1! Copyright (C) GFD Dennou Club, 2000. All rights reserved
2
3subroutine gdncattrgetchar(var, name, value, default, stat)
6 use netcdf, only: nf90_noerr, nf90_global, nf90_inquire_attribute, nf90_char, nf90_get_att, &
7 & nf90_double, nf90_float
8 use dc_url, only: gt_plus
9 use dc_string, only: tochar
10 use dc_trace, only: beginsub, endsub
11 use dc_error
12 implicit none
13 type(gd_nc_variable), intent(in):: var
14 character(len = *), intent(in):: name
15 character(len = *), intent(out):: value
16 character(len = *), intent(in):: default
17 integer, intent(out):: stat
18 type(gd_nc_variable_entry):: ent
19 character(len = 64):: buffer
20 double precision, allocatable:: dbuf(:)
21 integer, allocatable:: ibuf(:)
22 character, allocatable:: cbuf(:)
23 integer:: xtype, attrlen, i, iname, varid
24 character(len = *), parameter:: subname = "GDNcAttrGetChar"
25 continue
26 call beginsub(subname, "var=%d name=%c default=%c", i=(/var%id/), &
27 & c1=trim(name), c2=trim(default))
28 stat = vtable_lookup(var, ent)
29 if (stat /= nf90_noerr) goto 900
30 if (name(1:1) == gt_plus) then
31 varid = nf90_global
32 iname = 2
33 else
34 varid = ent%varid
35 iname = 1
36 endif
37 stat = nf90_inquire_attribute(ent%fileid, varid, name(iname:), xtype=xtype, len=attrlen)
38 if (stat /= nf90_noerr) goto 900
39 if (xtype == nf90_char .and. attrlen <= len(buffer)) then
40 stat = nf90_get_att(ent%fileid, varid, name(iname:), buffer)
41 if (stat /= nf90_noerr) goto 900
42 value = buffer(1: attrlen)
43 if (attrlen > len(value)) stat = gt_echarshort
44 else if (xtype == nf90_char) then
45 ! UNIDATA NetCDF ライブラリでは文字列引数の長さを
46 ! まったく取得していないので先頭が結合していれば OK のはず
47 allocate(cbuf(attrlen))
48 stat = nf90_get_att(ent%fileid, varid, name(iname:), cbuf(1))
49 if (stat /= nf90_noerr) goto 900
50 do, i = 1, attrlen
51 value(i:i) = cbuf(i)
52 enddo
53 if (attrlen < len(value)) value(attrlen + 1: ) = ' '
54 if (attrlen > len(value)) stat = gt_echarshort
55 deallocate(cbuf)
56 else if (xtype == nf90_double .or. xtype == nf90_float) then
57 allocate(dbuf(attrlen))
58 stat = nf90_get_att(ent%fileid, varid, name(iname:), dbuf)
59 if (stat /= nf90_noerr) goto 900
60 value = tochar(dbuf)
61 deallocate(dbuf)
62 else
63 allocate(ibuf(attrlen))
64 stat = nf90_get_att(ent%fileid, varid, name(iname:), ibuf)
65 if (stat /= nf90_noerr) goto 900
66 value = tochar(ibuf)
67 deallocate(ibuf)
68 endif
69 call endsub(subname)
70 return
71 ! デフォルト処理
72900 continue
73 value = default
74 call endsub(subname, "value := default")
75 return
76end subroutine gdncattrgetchar
subroutine gdncattrgetchar(var, name, value, default, stat)
integer, parameter, public gt_echarshort
Definition dc_error.f90:540
character, parameter, public gt_plus
Definition dc_url.f90:92
integer function, public vtable_lookup(var, entry)