gdncattrgetchar.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine gdncattrgetchar (var, name, value, default, stat)
 

Function/Subroutine Documentation

◆ gdncattrgetchar()

subroutine gdncattrgetchar ( type(gd_nc_variable), intent(in)  var,
character(len = *), intent(in)  name,
character(len = *), intent(out)  value,
character(len = *), intent(in)  default,
integer, intent(out)  stat 
)

Definition at line 4 of file gdncattrgetchar.f90.

References dc_trace::beginsub(), dc_trace::endsub(), dc_error::gt_echarshort, dc_url::gt_plus, and gtdata_netcdf_internal::vtable_lookup().

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  ! デフォルト処理
72 900 continue
73  value = default
74  call endsub(subname, "value := default")
75  return
integer function, public vtable_lookup(var, entry)
character, parameter, public gt_plus
Definition: dc_url.f90:92
subroutine, public beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, version)
Definition: dc_trace.f90:351
文字型変数の操作.
Definition: dc_string.f90:24
integer, parameter, public gt_echarshort
Definition: dc_error.f90:540
subroutine, public endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
Definition: dc_trace.f90:446
Here is the call graph for this function: