gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
gdncattrgetchar.f90
Go to the documentation of this file.
1!> @file gdncattrgetchar.f90
2!>
3!> @author GFD Dennou Club
4!> @copyright Copyright (C) GFD Dennou Club, 2000-2026. All rights reserved. <br/>
5!> License is BSD-2-Clause. See [COPYRIGHT](@ref COPYRIGHT) in detail
6!>
7!> @en
8!> @brief Get character attribute from netCDF variable
9!> @enden
10!>
11!> @ja
12!> @brief netCDF 変数から文字属性を取得
13!> @endja
14!>
15
16!>
17!> @en
18!> @brief Get attribute value as character string
19!>
20!> Retrieves an attribute value, converting to character string if needed.
21!> Numeric attributes are converted to string representation.
22!> @enden
23!>
24!> @ja
25!> @brief 属性値を文字列として取得
26!>
27!> 属性値を取得し、必要に応じて文字列に変換します。
28!> 数値属性は文字列表現に変換されます。
29!> @endja
30!>
31!> @param[in] var @en Variable handle @enden @ja 変数ハンドル @endja
32!> @param[in] name @en Attribute name @enden @ja 属性名 @endja
33!> @param[out] value @en Retrieved value @enden @ja 取得した値 @endja
34!> @param[in] default @en Default value if attribute not found @enden
35!> @ja 属性未検出時のデフォルト値 @endja
36!> @param[out] stat @en Status code @enden @ja ステータスコード @endja
37!>
38subroutine gdncattrgetchar(var, name, value, default, stat)
41 use netcdf, only: nf90_noerr, nf90_global, nf90_inquire_attribute, nf90_char, nf90_get_att, &
42 & nf90_double, nf90_float
43 use dc_url, only: gt_plus
44 use dc_string, only: tochar
45 use dc_trace, only: beginsub, endsub
46 use dc_error
47 implicit none
48 type(gd_nc_variable), intent(in):: var
49 character(len = *), intent(in):: name
50 character(len = *), intent(out):: value
51 character(len = *), intent(in):: default
52 integer, intent(out):: stat
53 type(gd_nc_variable_entry):: ent
54 character(len = 64):: buffer
55 double precision, allocatable:: dbuf(:)
56 integer, allocatable:: ibuf(:)
57 character, allocatable:: cbuf(:)
58 integer:: xtype, attrlen, i, iname, varid
59 character(len = *), parameter:: subname = "GDNcAttrGetChar"
60 continue
61 call beginsub(subname, "var=%d name=%c default=%c", i=(/var%id/), &
62 & c1=trim(name), c2=trim(default))
63 stat = vtable_lookup(var, ent)
64 if (stat /= nf90_noerr) goto 900
65 if (name(1:1) == gt_plus) then
66 varid = nf90_global
67 iname = 2
68 else
69 varid = ent%varid
70 iname = 1
71 endif
72 stat = nf90_inquire_attribute(ent%fileid, varid, name(iname:), xtype=xtype, len=attrlen)
73 if (stat /= nf90_noerr) goto 900
74 if (xtype == nf90_char .and. attrlen <= len(buffer)) then
75 stat = nf90_get_att(ent%fileid, varid, name(iname:), buffer)
76 if (stat /= nf90_noerr) goto 900
77 value = buffer(1: attrlen)
78 if (attrlen > len(value)) stat = gt_echarshort
79 else if (xtype == nf90_char) then
80 ! UNIDATA NetCDF ライブラリでは文字列引数の長さを
81 ! まったく取得していないので先頭が結合していれば OK のはず
82 allocate(cbuf(attrlen))
83 stat = nf90_get_att(ent%fileid, varid, name(iname:), cbuf(1))
84 if (stat /= nf90_noerr) goto 900
85 do, i = 1, attrlen
86 value(i:i) = cbuf(i)
87 enddo
88 if (attrlen < len(value)) value(attrlen + 1: ) = ' '
89 if (attrlen > len(value)) stat = gt_echarshort
90 deallocate(cbuf)
91 else if (xtype == nf90_double .or. xtype == nf90_float) then
92 allocate(dbuf(attrlen))
93 stat = nf90_get_att(ent%fileid, varid, name(iname:), dbuf)
94 if (stat /= nf90_noerr) goto 900
95 value = tochar(dbuf)
96 deallocate(dbuf)
97 else
98 allocate(ibuf(attrlen))
99 stat = nf90_get_att(ent%fileid, varid, name(iname:), ibuf)
100 if (stat /= nf90_noerr) goto 900
101 value = tochar(ibuf)
102 deallocate(ibuf)
103 endif
104 call endsub(subname)
105 return
106 ! デフォルト処理
107900 continue
108 value = default
109 call endsub(subname, "value := default")
110 return
111end subroutine gdncattrgetchar
subroutine gdncattrgetchar(var, name, value, default, stat)
Error handling module.
Definition dc_error.f90:454
integer, parameter, public gt_echarshort
Definition dc_error.f90:519
Handling character types.
Definition dc_string.f90:83
Debug tracing module.
Definition dc_trace.f90:150
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
Definition dc_trace.f90:476
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
Definition dc_trace.f90:599
Variable URL string parser.
Definition dc_url.f90:61
character, parameter, public gt_plus
Definition dc_url.f90:109
integer function, public vtable_lookup(var, entry)