Loading...
Searching...
No Matches
gtvargetattr.f90
Go to the documentation of this file.
1!
2!= 数値型属性の入力
3!
4! Authors:: Eizi TOYODA, Yasuhiro MORIKAWA
5! Version:: $Id: gtvargetattr.f90,v 1.6 2010-06-17 00:41:41 morikawa Exp $
6! Tag Name:: $Name: $
7! Copyright:: Copyright (C) GFD Dennou Club, 2000-2005. All rights reserved.
8! License:: See COPYRIGHT[link:../../COPYRIGHT]
9!
10! 以下のサブルーチン, 関数は gtdata_generic から提供されます。
11!
12!--
13! 引数の型に応じていろいろあるが、どうせ下部構造では同じモノを使っている。
14!
15! スカラで受け取るのが一番簡単。解釈可能な値がとられ、残りは捨てられる。
16!++
17
18subroutine gtvargetattri(var, attrname, value, default)
19 !
20 !== 属性の入力
21 !
22 ! 変数 *var* に付加されている属性 *name* の値を返します。
23 ! *Get_Attr* は複数のサブルーチンの総称名なので、
24 ! *value* には様々な型の変数 (ポインタも可能)
25 ! を与えることが可能です。
26 ! 以下のサブルーチンを参照してください。
27 !
28 ! 属性の値が正常に取得できず、且つ *default* が与えられて
29 ! いた場合、その値が返ります。
30 ! *default* が与えられない場合のデフォルトの値はそれぞれ以下の
31 ! 通りです。
32 !
33 ! character :: "" (空文字)
34 ! real :: netcdf_f77#NF90_FILL_REAL
35 ! real(DP) :: netcdf_f77#NF90_FILL_DOUBLE
36 ! integer :: netcdf_f77#NF90_FILL_INT
37 !
38 ! *value* がポインタの場合は、型に依らず空状態が返ります。
39 !
40 ! *value* にポインタを与えた場合、属性の値に応じて自動的に
41 ! 割り付けが行われます。そのため、必ず空状態にしてから与えてください。
42 !
43 ! *value* に固定長配列を用意する場合 *default* が必須になりますが、
44 ! これは Fortran の言語仕様上ポインタ方式と引用仕様が同じであっては
45 ! ならないからです。
46 !
47 use gtdata_types, only: gt_variable
48 use gtdata_internal_map, only: var_class, vtb_class_netcdf
51 use netcdf, only: nf90_fill_int
52 use dc_string, only: stoi
54 use dc_types, only: string
55 implicit none
56 type(gt_variable), intent(in):: var
57 character(len = *), intent(in):: attrname
58 integer, intent(out):: value
59 integer, intent(in), optional:: default
60 integer:: stat, buffer(1), class, cid
61 character(STRING):: cbuffer
62 logical:: err
63continue
64 call var_class(var, class, cid)
65 if (class == vtb_class_netcdf) then
66 call get_attr(gd_nc_variable(cid), attrname, buffer, stat, default)
67 if (stat >= 1) then
68 value = buffer(1)
69 return
70 end if
71 else
72 call storeerror(gt_enotvar, "GTVarGetAttrI")
73 endif
74 value = nf90_fill_int
75 if (present(default)) value = default
76end subroutine gtvargetattri
77
78subroutine gtvargetattrr(var, attrname, value, default)
79 use gtdata_types, only: gt_variable
82 use gtdata_internal_map, only: var_class, vtb_class_netcdf
84 use dc_string, only: stod
85 use netcdf, only: nf90_fill_float
86 use dc_types, only: string
87 implicit none
88 type(gt_variable), intent(in):: var
89 character(len = *), intent(in):: attrname
90 real, intent(out):: value
91 real, intent(in), optional:: default
92 integer:: stat
93 real:: buffer(1)
94 character(STRING):: cbuffer
95 integer:: class, cid
96 logical:: err
97continue
98 call var_class(var, class, cid)
99 if (class == vtb_class_netcdf) then
100 call get_attr(gd_nc_variable(cid), attrname, value=buffer, &
101 & stat=stat, default=default)
102 if (stat >= 1) then
103 value = buffer(1)
104 return
105 endif
106 else
107 call storeerror(gt_ebadvar, "GTVarGetAttrR")
108 endif
109 if (present(default)) then
110 value = default
111 else
112 value = nf90_fill_float
113 endif
114end subroutine gtvargetattrr
115
116subroutine gtvargetattrd(var, attrname, value, default)
117 use gtdata_types, only: gt_variable
118 use gtdata_internal_map, only: var_class, vtb_class_netcdf
121 use dc_string, only: stod
122 use dc_error, only: gt_enotvar, storeerror
123 use dc_types, only: dp
124 use netcdf, only: nf90_fill_double
125 use dc_types, only: string
126 implicit none
127 type(gt_variable), intent(in):: var
128 character(len = *), intent(in):: attrname
129 real(DP), intent(out):: value
130 real(DP), intent(in), optional:: default
131 integer:: stat
132 real(DP):: buffer(1)
133 character(STRING):: cbuffer
134 integer:: class, cid
135 logical:: err
136continue
137 call var_class(var, class, cid)
138 select case(class)
139 case (vtb_class_netcdf)
140 call get_attr(gd_nc_variable(cid), attrname, value=buffer, &
141 & stat=stat, default=default)
142 if (stat >= 1) then
143 value = buffer(1)
144 return
145 end if
146 case default
147 call storeerror(gt_enotvar, "GTVarGetAttrR")
148 end select
149 value = nf90_fill_double
150 if (present(default)) value = default
151end subroutine
152
153!
154! ポインタ配列を使って受け取る場合は解釈可能な数だけ実体が割り付けられる。
155!
156
157subroutine gtvargetattrip(var, name, value)
158 use gtdata_types, only: gt_variable
159 use gtdata_internal_map, only: var_class, vtb_class_netcdf
162 use dc_error, only: gt_enotvar, storeerror
163 use dc_string, only: get_array
164 use dc_types, only: string
165 implicit none
166 type(gt_variable), intent(in):: var
167 character(len = *), intent(in):: name
168 integer, pointer:: value(:) !(out)
169 integer:: stat, class, cid
170 character(STRING):: cbuffer
171 logical:: err
172continue
173 call var_class(var, class, cid)
174 if (class == vtb_class_netcdf) then
175 allocate(value(1))
176 call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
177 deallocate(value)
178 if (stat < 1) return
179 allocate(value(stat))
180 call get_attr(gd_nc_variable(cid), name, value, stat)
181 if (stat < 1) deallocate(value)
182 else
183 call storeerror(gt_enotvar, "GTVarGetAttrIP")
184 endif
185end subroutine gtvargetattrip
186
187subroutine gtvargetattrrp(var, name, value)
188 use gtdata_types, only: gt_variable
189 use gtdata_internal_map, only: var_class, vtb_class_netcdf
192 use dc_string, only: get_array
193 use dc_error, only: gt_enotvar, storeerror
194 use dc_types, only: string
195 implicit none
196 type(gt_variable), intent(in):: var
197 character(len = *), intent(in):: name
198 real, pointer:: value(:) !(out)
199 integer:: stat, class, cid
200 character(STRING):: cbuffer
201 logical:: err
202continue
203 call var_class(var, class, cid)
204 if (class == vtb_class_netcdf) then
205 allocate(value(1))
206 call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
207 deallocate(value)
208 if (stat < 1) return
209 allocate(value(stat))
210 call get_attr(gd_nc_variable(cid), name, value, stat)
211 if (stat < 1) deallocate(value)
212 else
213 nullify(value)
214 call storeerror(gt_enotvar, "GTVarGetAttrRP")
215 endif
216end subroutine gtvargetattrrp
217
218subroutine gtvargetattrdp(var, name, value)
219 use gtdata_types, only: gt_variable
220 use gtdata_internal_map, only: var_class, vtb_class_netcdf
223 use dc_types, only: dp
224 use dc_error, only: gt_enotvar, storeerror
225 use dc_string, only: get_array
226 use dc_types, only: string
227 implicit none
228 type(gt_variable), intent(in):: var
229 character(len = *), intent(in):: name
230 real(DP), pointer:: value(:) !(out)
231 integer:: stat, class, cid
232 character(STRING):: cbuffer
233 logical:: err
234continue
235 call var_class(var, class, cid)
236 if (class == vtb_class_netcdf) then
237 allocate(value(1))
238 call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
239 deallocate(value)
240 if (stat < 1) return
241 allocate(value(stat))
242 call get_attr(gd_nc_variable(cid), name, value, stat)
243 if (stat < 1) deallocate(value)
244 else
245 call storeerror(gt_enotvar, "GTVarGetAttrRP")
246 endif
247end subroutine gtvargetattrdp
248
249! integer 配列, real 配列として受け取る
250! 場合は属性長があまっている場合には切り捨てられ、
251! 属性長が足りない場合は default 値 (ポインタと違い必須) を埋める。
252
253subroutine gtvargetattria(var, name, value, default)
254 use gtdata_types, only: gt_variable
255 use gtdata_generic, only: friend => get_attr
256 use gtdata_internal_map, only: var_class, vtb_class_netcdf
259 use dc_error, only: gt_enotvar, storeerror
260 implicit none
261 type(gt_variable), intent(in):: var
262 character(len = *), intent(in):: name
263 integer, intent(out):: value(:)
264 integer, intent(in):: default
265 integer, pointer:: ptr(:)
266 integer:: n, stat, class, cid
267continue
268 call var_class(var, class, cid)
269 if (class == vtb_class_netcdf) then
270 call get_attr(gd_nc_variable(cid), name, value, stat, default)
271 else
272 call storeerror(gt_enotvar, "GTVarGetAttrIA")
273 endif
274end subroutine gtvargetattria
275
276subroutine gtvargetattrra(var, name, value, default)
277 use gtdata_types, only: gt_variable
278 use gtdata_generic, only: friend => get_attr
279 use gtdata_internal_map, only: var_class, vtb_class_netcdf
282 use dc_error, only: gt_enotvar, storeerror
283 implicit none
284 type(gt_variable), intent(in):: var
285 character(len = *), intent(in):: name
286 real, intent(out):: value(:)
287 real, intent(in):: default
288 real, pointer:: ptr(:)
289 integer:: n, class, cid, stat
290continue
291 call var_class(var, class, cid)
292 if (class == vtb_class_netcdf) then
293 call get_attr(gd_nc_variable(cid), name, value, stat, default)
294 else
295 call storeerror(gt_enotvar, "GTVarGetAttrRA")
296 endif
297end subroutine gtvargetattrra
298
299subroutine gtvargetattrda(var, name, value, default)
300 use gtdata_types, only: gt_variable
301 use gtdata_generic, only: friend => get_attr
302 use gtdata_internal_map, only: var_class, vtb_class_netcdf
305 use dc_types, only: dp
306 use dc_error, only: gt_enotvar, storeerror
307 implicit none
308 type(gt_variable), intent(in):: var
309 character(len = *), intent(in):: name
310 real(DP), intent(out):: value(:)
311 real(DP), intent(in):: default
312 real(DP), pointer:: ptr(:)
313 integer:: n, stat, class, cid
314continue
315 call var_class(var, class, cid)
316 if (class == vtb_class_netcdf) then
317 call get_attr(gd_nc_variable(cid), name, value, stat, default)
318 else
319 call storeerror(gt_enotvar, "GTVarGetAttrRA")
320 endif
321end subroutine gtvargetattrda
subroutine gtvargetattrra(var, name, value, default)
subroutine gtvargetattrip(var, name, value)
subroutine gtvargetattrd(var, attrname, value, default)
subroutine gtvargetattrrp(var, name, value)
subroutine gtvargetattria(var, name, value, default)
subroutine gtvargetattrda(var, name, value, default)
subroutine gtvargetattrdp(var, name, value)
subroutine gtvargetattrr(var, attrname, value, default)
subroutine gtvargetattri(var, attrname, value, default)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition dc_error.f90:830
integer, parameter, public gt_ebadvar
Definition dc_error.f90:539
integer, parameter, public gt_enotvar
Definition dc_error.f90:533
Provides kind type parameter values.
Definition dc_types.f90:49
integer, parameter, public string
Character length for string
Definition dc_types.f90:118
integer, parameter, public dp
Double Precision Real number
Definition dc_types.f90:83
subroutine, public var_class(var, class, cid)