Loading...
Searching...
No Matches
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
13subroutine 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
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
95continue
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 end select
111 if (present(alldims)) alldims = internal_get_alldims(var)
112 if (present(allcount)) allcount = internal_get_allcount(var)
113 if (present(size)) size = internal_get_size(var)
114 if (present(rank)) rank = internal_get_rank(var)
115 call endsub('gtvarinquire')
116 return
117contains
118
119 integer function internal_get_alldims(var) result(result)
121 implicit none
122 type(gt_variable), intent(in):: var
123 call map_lookup(var, ndims=result)
124 call dbgmessage('alldims=%d', i=(/result/))
125 end function internal_get_alldims
126
127 integer function internal_get_allcount(var) result(result)
129 implicit none
130 type(gt_variable), intent(in):: var
131 type(gt_dimmap), allocatable:: map(:)
132 integer:: nd
133 call map_lookup(var, ndims=nd)
134 if (nd <= 0) then
135 call dbgmessage('internal_get_allcount: no map')
136 result = 1
137 return
138 endif
139 allocate(map(nd))
140 call map_lookup(var, map=map)
141 result = product(map(1:nd)%allcount)
142 call dbgmessage('internal_get_allcount: %d map.size=%d', &
143 & i=(/result, nd/))
144 deallocate(map)
145 end function internal_get_allcount
146
147 integer function internal_get_size(var) result(result)
149 implicit none
150 type(gt_variable), intent(in):: var
151 type(gt_dimmap), allocatable:: map(:)
152 integer:: nd
153 call map_lookup(var, ndims=nd)
154 if (nd <= 0) then
155 call dbgmessage('internal_get_size: no map')
156 result = 1
157 return
158 endif
159 allocate(map(nd))
160 call map_lookup(var, map=map)
161 result = product(map(1:nd)%count)
162 call dbgmessage('internal_get_size: %d map.size=%d', &
163 & i=(/result, nd/))
164 deallocate(map)
165 end function internal_get_size
166
167 integer function internal_get_rank(var) result(result)
169 implicit none
170 type(gt_variable), intent(in):: var
171 type(gt_dimmap), allocatable:: map(:)
172 integer:: nd
173
174 call map_lookup(var, ndims=nd)
175 if (nd <= 0) then
176 call dbgmessage('internal_get_rank: no map')
177 result = 0
178 return
179 endif
180 allocate(map(nd))
181 call map_lookup(var, map=map)
182 result = count(map(1:nd)%count > 1)
183 call dbgmessage('internal_get_rank: %d', i=(/result/))
184 deallocate(map)
185 end function internal_get_rank
186
187end subroutine gtvarinquire
188
189subroutine gtvarinquire2(var, allcount)
190 !
191 !== 変数の依存する次元 (複数) の総数の問い合わせ
192 !
193 ! 変数 *var* が依存する各次元の総数を返します。
194 ! *allcount* の配列のサイズは依存する次元の数だけ必要です。
195 ! 依存する次元の数は上記の *Inquire* の *alldims* で調べることが
196 ! できます。
197 !
198 use gtdata_types, only: gt_variable
199 use gtdata_generic, only: inquire, open, close
200 use dc_trace, only: beginsub, endsub
201 type(gt_variable), intent(in):: var
202 integer, intent(out):: allcount(:) ! alldims 個必要
203 integer:: i, n
204 type(gt_variable):: v
205 call beginsub('gtvarinquire2')
206 call inquire(var, alldims=n)
207 do, i = 1, n
208 call open(v, var, i, count_compact=.true.)
209 call inquire(var, allcount=allcount(i))
210 call close(v)
211 enddo
212 call endsub('gtvarinquire2')
213end subroutine
214
215subroutine gtvarinquirea(var, attrname, xtype)
216 !
217 !== 変数の属性の型の問い合わせ
218 !
219 ! 変数 *var* の属性 *attrname* の値の型を *xtype* に返します。
220 !
221 !--
222 ! 文字数が合わなければ当然変なことが起こるが、気にしない。
223 !++
224 use gtdata_types, only: gt_variable
225 use gtdata_internal_map, only: var_class, vtb_class_netcdf
226 use dc_trace, only: beginsub, endsub
229 type(gt_variable), intent(in):: var
230 character(len=*), intent(in):: attrname
231 character(len=*), intent(out), optional:: xtype
232 integer:: class, cid
233 character(len = *), parameter:: subnam = "gtvarinquireA"
234continue
235 call beginsub(subnam, "%c", c1=trim(attrname))
236 call var_class(var, class, cid)
237 select case(class)
238 case(vtb_class_netcdf)
239 call inquire(gd_nc_variable(cid), attrname=attrname, xtype=xtype)
240 end select
241 call endsub(subnam)
242end subroutine gtvarinquirea
243
244subroutine gtvarinquired(var, dimord, url, allcount, err)
245 !
246 !== 変数の次元に関する問い合わせ
247 !
248 ! 変数 *var* の次元順序番号 *dimord* に対応する次元の
249 ! URL *url* と総数 *allcout* を返します。
250 !
251 use gtdata_types, only: gt_variable
252 use gtdata_generic, only: open, close, inquire
253 use dc_trace, only: beginsub, endsub
254 implicit none
255 type(gt_variable), intent(in):: var
256 integer, intent(in):: dimord
257 character(len=*), intent(out), optional:: url
258 integer, intent(out), optional:: allcount
259 logical, intent(out), optional:: err
260 type(gt_variable):: dimvar
261 character(len = *), parameter:: subnam = "gtvarinquireD"
262continue
263 call beginsub(subnam, "%d", i=(/dimord/))
264 call open(dimvar, source_var=var, dimord=dimord, err=err)
265 if (present(url)) call inquire(dimvar, url=url)
266 if (present(allcount)) call inquire(dimvar, allcount=allcount)
267 call close(dimvar)
268 call endsub(subnam)
269end subroutine gtvarinquired
integer function internal_get_alldims(var)
subroutine gtvarinquire(var, growable, rank, alldims, allcount, size, xtype, name, url, err)
subroutine gtvarinquired(var, dimord, url, allcount, err)
subroutine gtvarinquire2(var, allcount)
subroutine gtvarinquirea(var, attrname, xtype)
subroutine, public map_lookup(var, vid, map, ndims)
subroutine, public var_class(var, class, cid)