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 
18 subroutine 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, vtb_class_memory
53  use netcdf, only: nf90_fill_int
54  use dc_string, only: stoi
55  use dc_error, only: gt_enotvar, storeerror
56  use dc_types, only: string
57  implicit none
58  type(gt_variable), intent(in):: var
59  character(len = *), intent(in):: attrname
60  integer, intent(out):: value
61  integer, intent(in), optional:: default
62  integer:: stat, buffer(1), class, cid
63  character(STRING):: cbuffer
64  logical:: err
65 continue
66  call var_class(var, class, cid)
67  if (class == vtb_class_netcdf) then
68  call get_attr(gd_nc_variable(cid), attrname, buffer, stat, default)
69  if (stat >= 1) then
70  value = buffer(1)
71  return
72  end if
73  else if (class == vtb_class_memory) then
74  call get_attr(gd_mem_variable(cid), attrname, cbuffer, err)
75  if (.not. err) then
76  value = stoi(cbuffer)
77  return
78  endif
79  else
80  call storeerror(gt_enotvar, "GTVarGetAttrI")
81  endif
82  value = nf90_fill_int
83  if (present(default)) value = default
84 end subroutine gtvargetattri
85 
86 subroutine gtvargetattrr(var, attrname, value, default)
92  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
93  use dc_error, only: gt_ebadvar, storeerror
94  use dc_string, only: stod
95  use netcdf, only: nf90_fill_float
96  use dc_types, only: string
97  implicit none
98  type(gt_variable), intent(in):: var
99  character(len = *), intent(in):: attrname
100  real, intent(out):: value
101  real, intent(in), optional:: default
102  integer:: stat
103  real:: buffer(1)
104  character(STRING):: cbuffer
105  integer:: class, cid
106  logical:: err
107 continue
108  call var_class(var, class, cid)
109  if (class == vtb_class_netcdf) then
110  call get_attr(gd_nc_variable(cid), attrname, value=buffer, &
111  & stat=stat, default=default)
112  if (stat >= 1) then
113  value = buffer(1)
114  return
115  endif
116  else if (class == vtb_class_memory) then
117  call get_attr(gd_mem_variable(cid), attrname, cbuffer, err)
118  if (.not. err) then
119  value = stod(cbuffer)
120  return
121  endif
122  else
123  call storeerror(gt_ebadvar, "GTVarGetAttrR")
124  endif
125  if (present(default)) then
126  value = default
127  else
128  value = nf90_fill_float
129  endif
130 end subroutine gtvargetattrr
131 
132 subroutine gtvargetattrd(var, attrname, value, default)
134  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
139  use dc_string, only: stod
140  use dc_error, only: gt_enotvar, storeerror
141  use dc_types, only: dp
142  use netcdf, only: nf90_fill_double
143  use dc_types, only: string
144  implicit none
145  type(gt_variable), intent(in):: var
146  character(len = *), intent(in):: attrname
147  real(DP), intent(out):: value
148  real(DP), intent(in), optional:: default
149  integer:: stat
150  real(DP):: buffer(1)
151  character(STRING):: cbuffer
152  integer:: class, cid
153  logical:: err
154 continue
155  call var_class(var, class, cid)
156  select case(class)
157  case (vtb_class_netcdf)
158  call get_attr(gd_nc_variable(cid), attrname, value=buffer, &
159  & stat=stat, default=default)
160  if (stat >= 1) then
161  value = buffer(1)
162  return
163  end if
164  case (vtb_class_memory)
165  call get_attr(gd_mem_variable(cid), attrname, cbuffer, err)
166  if (.not. err) then
167  value = stod(cbuffer)
168  return
169  endif
170  case default
171  call storeerror(gt_enotvar, "GTVarGetAttrR")
172  end select
173  value = nf90_fill_double
174  if (present(default)) value = default
175 end subroutine
176 
177 !
178 ! ポインタ配列を使って受け取る場合は解釈可能な数だけ実体が割り付けられる。
179 !
180 
181 subroutine gtvargetattrip(var, name, value)
183  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
188  use dc_error, only: gt_enotvar, storeerror
189  use dc_string, only: get_array
190  use dc_types, only: string
191  implicit none
192  type(gt_variable), intent(in):: var
193  character(len = *), intent(in):: name
194  integer, pointer:: value(:) !(out)
195  integer:: stat, class, cid
196  character(STRING):: cbuffer
197  logical:: err
198 continue
199  call var_class(var, class, cid)
200  if (class == vtb_class_netcdf) then
201  allocate(value(1))
202  call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
203  deallocate(value)
204  if (stat < 1) return
205  allocate(value(stat))
206  call get_attr(gd_nc_variable(cid), name, value, stat)
207  if (stat < 1) deallocate(value)
208  else if (class == vtb_class_memory) then
209  call get_attr(gd_mem_variable(cid), name, cbuffer, err)
210  if (err) then
211  nullify(value)
212  return
213  endif
214  call get_array(value, cbuffer)
215  cbuffer = ""
216  else
217  call storeerror(gt_enotvar, "GTVarGetAttrIP")
218  endif
219 end subroutine gtvargetattrip
220 
221 subroutine gtvargetattrrp(var, name, value)
223  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
228  use dc_string, only: get_array
229  use dc_error, only: gt_enotvar, storeerror
230  use dc_types, only: string
231  implicit none
232  type(gt_variable), intent(in):: var
233  character(len = *), intent(in):: name
234  real, pointer:: value(:) !(out)
235  integer:: stat, class, cid
236  character(STRING):: cbuffer
237  logical:: err
238 continue
239  call var_class(var, class, cid)
240  if (class == vtb_class_netcdf) then
241  allocate(value(1))
242  call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
243  deallocate(value)
244  if (stat < 1) return
245  allocate(value(stat))
246  call get_attr(gd_nc_variable(cid), name, value, stat)
247  if (stat < 1) deallocate(value)
248  else if (class == vtb_class_memory) then
249  call get_attr(gd_mem_variable(cid), name, cbuffer, err)
250  if (err) then
251  nullify(value)
252  return
253  endif
254  call get_array(value, cbuffer)
255  cbuffer = ""
256  else
257  nullify(value)
258  call storeerror(gt_enotvar, "GTVarGetAttrRP")
259  endif
260 end subroutine gtvargetattrrp
261 
262 subroutine gtvargetattrdp(var, name, value)
264  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
269  use dc_types, only: dp
270  use dc_error, only: gt_enotvar, storeerror
271  use dc_string, only: get_array
272  use dc_types, only: string
273  implicit none
274  type(gt_variable), intent(in):: var
275  character(len = *), intent(in):: name
276  real(DP), pointer:: value(:) !(out)
277  integer:: stat, class, cid
278  character(STRING):: cbuffer
279  logical:: err
280 continue
281  call var_class(var, class, cid)
282  if (class == vtb_class_netcdf) then
283  allocate(value(1))
284  call get_attr(gd_nc_variable(cid), name, value(1:0), stat)
285  deallocate(value)
286  if (stat < 1) return
287  allocate(value(stat))
288  call get_attr(gd_nc_variable(cid), name, value, stat)
289  if (stat < 1) deallocate(value)
290  else if (class == vtb_class_memory) then
291  call get_attr(gd_mem_variable(cid), name, cbuffer, err)
292  if (err) then
293  nullify(value)
294  return
295  endif
296  call get_array(value, cbuffer)
297  cbuffer = ""
298  else
299  call storeerror(gt_enotvar, "GTVarGetAttrRP")
300  endif
301 end subroutine gtvargetattrdp
302 
303 ! integer 配列, real 配列として受け取る
304 ! 場合は属性長があまっている場合には切り捨てられ、
305 ! 属性長が足りない場合は default 値 (ポインタと違い必須) を埋める。
306 
307 subroutine gtvargetattria(var, name, value, default)
309  use gtdata_generic, only: friend => get_attr
310  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
313  use dc_error, only: gt_enotvar, storeerror
314  implicit none
315  type(gt_variable), intent(in):: var
316  character(len = *), intent(in):: name
317  integer, intent(out):: value(:)
318  integer, intent(in):: default
319  integer, pointer:: ptr(:)
320  integer:: n, stat, class, cid
321 continue
322  call var_class(var, class, cid)
323  if (class == vtb_class_netcdf) then
324  call get_attr(gd_nc_variable(cid), name, value, stat, default)
325  else if (class == vtb_class_memory) then
326  call friend(var, name, ptr)
327  if (.not. associated(ptr)) then
328  value(:) = default
329  else
330  n = min(size(ptr), size(value))
331  value(1:n) = ptr(1:n)
332  if (n < size(ptr)) value(n+1: ) = default
333  deallocate(ptr)
334  endif
335  else
336  call storeerror(gt_enotvar, "GTVarGetAttrIA")
337  endif
338 end subroutine gtvargetattria
339 
340 subroutine gtvargetattrra(var, name, value, default)
342  use gtdata_generic, only: friend => get_attr
343  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
346  use dc_error, only: gt_enotvar, storeerror
347  implicit none
348  type(gt_variable), intent(in):: var
349  character(len = *), intent(in):: name
350  real, intent(out):: value(:)
351  real, intent(in):: default
352  real, pointer:: ptr(:)
353  integer:: n, class, cid, stat
354 continue
355  call var_class(var, class, cid)
356  if (class == vtb_class_netcdf) then
357  call get_attr(gd_nc_variable(cid), name, value, stat, default)
358  else if (class == vtb_class_memory) then
359  call friend(var, name, ptr)
360  if (.not. associated(ptr)) then
361  value(:) = default
362  else
363  n = min(size(ptr), size(value))
364  value(1:n) = ptr(1:n)
365  if (n < size(ptr)) value(n+1: ) = default
366  deallocate(ptr)
367  endif
368  else
369  call storeerror(gt_enotvar, "GTVarGetAttrRA")
370  endif
371 end subroutine gtvargetattrra
372 
373 subroutine gtvargetattrda(var, name, value, default)
375  use gtdata_generic, only: friend => get_attr
376  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
379  use dc_types, only: dp
380  use dc_error, only: gt_enotvar, storeerror
381  implicit none
382  type(gt_variable), intent(in):: var
383  character(len = *), intent(in):: name
384  real(DP), intent(out):: value(:)
385  real(DP), intent(in):: default
386  real(DP), pointer:: ptr(:)
387  integer:: n, stat, class, cid
388 continue
389  call var_class(var, class, cid)
390  if (class == vtb_class_netcdf) then
391  call get_attr(gd_nc_variable(cid), name, value, stat, default)
392  else if (class == vtb_class_memory) then
393  call friend(var, name, ptr)
394  if (.not. associated(ptr)) then
395  value(:) = default
396  else
397  n = min(size(ptr), size(value))
398  value(1:n) = ptr(1:n)
399  if (n < size(ptr)) value(n+1: ) = default
400  deallocate(ptr)
401  endif
402  else
403  call storeerror(gt_enotvar, "GTVarGetAttrRA")
404  endif
405 end subroutine gtvargetattrda
subroutine gtvargetattrip(var, name, value)
integer, parameter, public gt_enotvar
Definition: dc_error.f90:533
subroutine gtvargetattrda(var, name, 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
subroutine gtvargetattrr(var, attrname, value, default)
subroutine gtvargetattrra(var, name, value, default)
subroutine gtvargetattrd(var, attrname, value, default)
integer, parameter, public dp
倍精度実数型変数
Definition: dc_types.f90:83
subroutine gtvargetattrdp(var, name, value)
subroutine gtvargetattria(var, name, value, default)
文字型変数の操作.
Definition: dc_string.f90:24
種別型パラメタを提供します。
Definition: dc_types.f90:49
subroutine gtvargetattri(var, attrname, value, default)
subroutine, public var_class(var, class, cid)
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition: dc_types.f90:118
subroutine gtvargetattrrp(var, name, value)