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
51  use netcdf, only: nf90_fill_int
52  use dc_string, only: stoi
53  use dc_error, only: gt_enotvar, storeerror
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
63 continue
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
76 end subroutine gtvargetattri
77 
78 subroutine gtvargetattrr(var, attrname, value, default)
79  use gtdata_types, only: gt_variable
82  use gtdata_internal_map, only: var_class, vtb_class_netcdf
83  use dc_error, only: gt_ebadvar, storeerror
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
97 continue
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
114 end subroutine gtvargetattrr
115 
116 subroutine 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
136 continue
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
151 end subroutine
152 
153 !
154 ! ポインタ配列を使って受け取る場合は解釈可能な数だけ実体が割り付けられる。
155 !
156 
157 subroutine 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
172 continue
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
185 end subroutine gtvargetattrip
186 
187 subroutine 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
202 continue
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
216 end subroutine gtvargetattrrp
217 
218 subroutine 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
234 continue
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
247 end subroutine gtvargetattrdp
248 
249 ! integer 配列, real 配列として受け取る
250 ! 場合は属性長があまっている場合には切り捨てられ、
251 ! 属性長が足りない場合は default 値 (ポインタと違い必須) を埋める。
252 
253 subroutine 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
267 continue
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
274 end subroutine gtvargetattria
275 
276 subroutine 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
290 continue
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
297 end subroutine gtvargetattrra
298 
299 subroutine 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
314 continue
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
321 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
Double Precision Real number.
Definition: dc_types.f90:83
subroutine gtvargetattrdp(var, name, value)
subroutine gtvargetattria(var, name, value, default)
Provides kind type parameter values.
Definition: dc_types.f90:49
subroutine gtvargetattri(var, attrname, value, default)
subroutine, public var_class(var, class, cid)
integer, parameter, public string
Character length for string.
Definition: dc_types.f90:118
subroutine gtvargetattrrp(var, name, value)