gtvarinquire.f90
Go to the documentation of this file.
1 !
2 != 変数または属性に関する問い合わせ
3 !
4 ! Authors:: Eizi TOYODA, Yasuhiro MORIKAWA
5 ! Version:: $Id: gtvarinquire.f90,v 1.5 2009-07-04 04:58:06 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 から gtdata_generic#Inquire
11 ! として提供されます。
12 
13 subroutine gtvarinquire(var, growable, rank, alldims, allcount, &
14  & size, xtype, name, url, err )
15  !
16  !== 変数に関する問い合わせ
17  !
18  ! 変数 *var* に関する問い合わせを行います。
19  !
20  ! 返り値となる引数の文字型の実引数の長さが足りないと、
21  ! 結果が損なわれます。引数の文字列の長さとして dc_types#STRING
22  ! を用いることを推奨します。
23  !
24  ! *Inquire* は複数のサブルーチンの総称名であり、
25  ! 問い合わせ方法は複数用意されています。
26  ! 下記のサブルーチンも参照してください。
27  !
28  ! 他にも変数に関する問い合わせのための手続きとして
29  ! Get_Slice, Dimname_to_Dimord があります。
30  !
31  !--
32  ! このサブルーチンは INQUIRE 文を模して作られたもので、
33  ! オブジェクト・変数・属性に関する問い合わせを行います。
34  !++
35  !
36  use gtdata_types, only: gt_variable
37  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
40  use dc_trace, only: beginsub, endsub, dbgmessage
41  implicit none
42  type(gt_variable), intent(in):: var
43  character(len=*), intent(out), optional:: xtype
44  ! 外部型の名前
45  character(len=*), intent(out), optional:: name
46  ! name は変数名の最小の単位を返します。
47  ! ファイル名を含まないため
48  ! プログラム内での一意性は
49  ! 保証されません。
50  !
51  character(len=*), intent(out), optional:: url
52  ! url はファイル名のついた変数名
53  ! を返します。
54  ! プログラム内で一意です。
55  !
56  integer, intent(out), optional:: rank
57  ! コンパクト(縮退)次元を数えない、
58  ! 次元の数
59  !
60  integer, intent(out), optional:: alldims
61  ! 縮退次元を含む全次元数。
62  ! dimord には基本的にこちらを
63  ! 使います。
64  !
65  integer, intent(out), optional:: allcount
66  ! 変数が次元変数である場合、
67  ! 総数を返します。
68  ! エラーの場合はゼロを返します。
69  !
70  integer, intent(out), optional:: size
71  ! 変数の入出力領域の大きさ。
72  ! (変数が依存する各次元の長
73  ! [格子点数]の積)
74  !
75  logical, intent(out), optional:: growable
76  ! 変数が次元変数である場合、
77  ! 自動拡張可能か否かを返します。
78  ! 次元変数でない場合は不定となります。
79  !
80  logical, intent(out), optional:: err
81  ! 例外処理用フラグ.
82  ! デフォルトでは, この手続き内でエラーが
83  ! 生じた場合, プログラムは強制終了します.
84  ! 引数 *err* が与えられる場合,
85  ! プログラムは強制終了せず, 代わりに
86  ! *err* に .true. が代入されます.
87  !
88  ! Exception handling flag.
89  ! By default, when error occur in
90  ! this procedure, the program aborts.
91  ! If this *err* argument is given,
92  ! .true. is substituted to *err* and
93  ! the program does not abort.
94  integer:: class, cid
95 continue
96  call beginsub('gtvarinquire', 'var.mapid=%d', i=(/var%mapid/))
97  call var_class(var, class, cid)
98  select case(class)
99  case(vtb_class_netcdf)
100  if (present(xtype) .or. present(name) .or. present(url)) then
101  call inquire(gd_nc_variable(cid), xtype=xtype, name=name, url=url)
102  if (present(xtype)) call dbgmessage('xtype=%c', c1=trim(xtype))
103  if (present(name)) call dbgmessage('name=%c', c1=trim(name))
104  if (present(url)) call dbgmessage('url=%c', c1=trim(url))
105  endif
106  if (present(growable)) then
107  call inquire(gd_nc_variable(cid), growable=growable)
108  call dbgmessage('growable=%y', l=(/growable/))
109  endif
110  case(vtb_class_memory)
111  call dbgmessage('vtb_class_memory not implemented: skipped')
112  end select
113  if (present(alldims)) alldims = internal_get_alldims(var)
114  if (present(allcount)) allcount = internal_get_allcount(var)
115  if (present(size)) size = internal_get_size(var)
116  if (present(rank)) rank = internal_get_rank(var)
117  call endsub('gtvarinquire')
118  return
119 contains
120 
121  integer function internal_get_alldims(var) result(result)
123  implicit none
124  type(gt_variable), intent(in):: var
125  call map_lookup(var, ndims=result)
126  call dbgmessage('alldims=%d', i=(/result/))
127  end function internal_get_alldims
128 
129  integer function internal_get_allcount(var) result(result)
131  implicit none
132  type(gt_variable), intent(in):: var
133  type(gt_dimmap), allocatable:: map(:)
134  integer:: nd
135  call map_lookup(var, ndims=nd)
136  if (nd <= 0) then
137  call dbgmessage('internal_get_allcount: no map')
138  result = 1
139  return
140  endif
141  allocate(map(nd))
142  call map_lookup(var, map=map)
143  result = product(map(1:nd)%allcount)
144  call dbgmessage('internal_get_allcount: %d map.size=%d', &
145  & i=(/result, nd/))
146  deallocate(map)
147  end function internal_get_allcount
148 
149  integer function internal_get_size(var) result(result)
151  implicit none
152  type(gt_variable), intent(in):: var
153  type(gt_dimmap), allocatable:: map(:)
154  integer:: nd
155  call map_lookup(var, ndims=nd)
156  if (nd <= 0) then
157  call dbgmessage('internal_get_size: no map')
158  result = 1
159  return
160  endif
161  allocate(map(nd))
162  call map_lookup(var, map=map)
163  result = product(map(1:nd)%count)
164  call dbgmessage('internal_get_size: %d map.size=%d', &
165  & i=(/result, nd/))
166  deallocate(map)
167  end function internal_get_size
168 
169  integer function internal_get_rank(var) result(result)
171  implicit none
172  type(gt_variable), intent(in):: var
173  type(gt_dimmap), allocatable:: map(:)
174  integer:: nd
175 
176  call map_lookup(var, ndims=nd)
177  if (nd <= 0) then
178  call dbgmessage('internal_get_rank: no map')
179  result = 0
180  return
181  endif
182  allocate(map(nd))
183  call map_lookup(var, map=map)
184  result = count(map(1:nd)%count > 1)
185  call dbgmessage('internal_get_rank: %d', i=(/result/))
186  deallocate(map)
187  end function internal_get_rank
188 
189 end subroutine gtvarinquire
190 
191 subroutine gtvarinquire2(var, allcount)
192  !
193  !== 変数の依存する次元 (複数) の総数の問い合わせ
194  !
195  ! 変数 *var* が依存する各次元の総数を返します。
196  ! *allcount* の配列のサイズは依存する次元の数だけ必要です。
197  ! 依存する次元の数は上記の *Inquire* の *alldims* で調べることが
198  ! できます。
199  !
200  use gtdata_types, only: gt_variable
201  use gtdata_generic, only: inquire, open, close
202  use dc_trace, only: beginsub, endsub
203  type(gt_variable), intent(in):: var
204  integer, intent(out):: allcount(:) ! alldims 個必要
205  integer:: i, n
206  type(gt_variable):: v
207  call beginsub('gtvarinquire2')
208  call inquire(var, alldims=n)
209  do, i = 1, n
210  call open(v, var, i, count_compact=.true.)
211  call inquire(var, allcount=allcount(i))
212  call close(v)
213  enddo
214  call endsub('gtvarinquire2')
215 end subroutine
216 
217 subroutine gtvarinquirea(var, attrname, xtype)
218  !
219  !== 変数の属性の型の問い合わせ
220  !
221  ! 変数 *var* の属性 *attrname* の値の型を *xtype* に返します。
222  !
223  !--
224  ! 文字数が合わなければ当然変なことが起こるが、気にしない。
225  !++
226  use gtdata_types, only: gt_variable
227  use gtdata_internal_map, only: var_class, vtb_class_netcdf, vtb_class_memory
228  use dc_trace, only: beginsub, endsub
229  use gtdata_netcdf_generic, only: inquire
231  type(gt_variable), intent(in):: var
232  character(len=*), intent(in):: attrname
233  character(len=*), intent(out), optional:: xtype
234  integer:: class, cid
235  character(len = *), parameter:: subnam = "gtvarinquireA"
236 continue
237  call beginsub(subnam, "%c", c1=trim(attrname))
238  call var_class(var, class, cid)
239  select case(class)
240  case(vtb_class_netcdf)
241  call inquire(gd_nc_variable(cid), attrname=attrname, xtype=xtype)
242  end select
243  call endsub(subnam)
244 end subroutine gtvarinquirea
245 
246 subroutine gtvarinquired(var, dimord, url, allcount, err)
247  !
248  !== 変数の次元に関する問い合わせ
249  !
250  ! 変数 *var* の次元順序番号 *dimord* に対応する次元の
251  ! URL *url* と総数 *allcout* を返します。
252  !
253  use gtdata_types, only: gt_variable
254  use gtdata_generic, only: open, close, inquire
255  use dc_trace, only: beginsub, endsub
256  implicit none
257  type(gt_variable), intent(in):: var
258  integer, intent(in):: dimord
259  character(len=*), intent(out), optional:: url
260  integer, intent(out), optional:: allcount
261  logical, intent(out), optional:: err
262  type(gt_variable):: dimvar
263  character(len = *), parameter:: subnam = "gtvarinquireD"
264 continue
265  call beginsub(subnam, "%d", i=(/dimord/))
266  call open(dimvar, source_var=var, dimord=dimord, err=err)
267  if (present(url)) call inquire(dimvar, url=url)
268  if (present(allcount)) call inquire(dimvar, allcount=allcount)
269  call close(dimvar)
270  call endsub(subnam)
271 end subroutine gtvarinquired
subroutine gtvarinquire2(var, allcount)
subroutine gtvarinquire(var, growable, rank, alldims, allcount, size, xtype, name, url, err)
integer function internal_get_size(var)
subroutine, public dbgmessage(fmt, i, r, d, L, n, c1, c2, c3, ca)
Definition: dc_trace.f90:509
subroutine, public beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, version)
Definition: dc_trace.f90:351
integer function internal_get_allcount(var)
integer function internal_get_alldims(var)
subroutine, public map_lookup(var, vid, map, ndims)
subroutine gtvarinquirea(var, attrname, xtype)
subroutine, public endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
Definition: dc_trace.f90:446
subroutine, public var_class(var, class, cid)
integer function internal_get_rank(var)
subroutine gtvarinquired(var, dimord, url, allcount, err)