gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
gtvarinquire.f90
Go to the documentation of this file.
1!> @file gtvarinquire.f90
2!>
3!> @author Eizi TOYODA, Yasuhiro MORIKAWA
4!> @copyright Copyright (C) GFD Dennou Club, 2000-2026. All rights reserved. <br/>
5!> License is BSD-2-Clause. See [COPYRIGHT](@ref COPYRIGHT) in detail
6!>
7!> @en
8!> @brief Variable or attribute inquiry
9!>
10!> These subroutines are provided as gtdata_generic#Inquire
11!> through gtdata_generic.
12!> @enden
13!>
14!> @ja
15!> @brief 変数または属性に関する問い合わせ
16!>
17!> これらのサブルーチンは gtdata_generic から gtdata_generic#Inquire
18!> として提供されます。
19!> @endja
20!>
21
22!>
23!> @en
24!> @brief Inquire about variable properties
25!>
26!> Inquires about variable var. This subroutine is modeled after
27!> the INQUIRE statement.
28!>
29!> If the character argument length is insufficient, results may be
30!> truncated. Using dc_types#STRING for argument string lengths is
31!> recommended.
32!>
33!> Inquire is a generic name for multiple subroutines with various
34!> inquiry methods. See also Get_Slice and Dimname_to_Dimord.
35!> @param[in] var Variable handle
36!> @param[out] growable Whether variable can auto-extend (optional)
37!> @param[out] rank Number of non-compact dimensions (optional)
38!> @param[out] alldims Total number of dimensions including degenerate (optional)
39!> @param[out] allcount Total count for dimension variable (optional)
40!> @param[out] size Size of I/O region (optional)
41!> @param[out] xtype External type name (optional)
42!> @param[out] name Variable name (optional)
43!> @param[out] url Full URL of variable (optional)
44!> @param[out] err Error flag (optional)
45!> @enden
46!>
47!> @ja
48!> @brief 変数の属性に関する問い合わせ
49!>
50!> 変数 var に関する問い合わせを行います。
51!> このサブルーチンは INQUIRE 文を模して作られたものです。
52!>
53!> 返り値となる引数の文字型の実引数の長さが足りないと、
54!> 結果が損なわれます。引数の文字列の長さとして dc_types#STRING
55!> を用いることを推奨します。
56!>
57!> Inquire は複数のサブルーチンの総称名であり、
58!> 問い合わせ方法は複数用意されています。
59!> Get_Slice, Dimname_to_Dimord も参照してください。
60!> @param[in] var 変数ハンドル
61!> @param[out] growable 自動拡張可能か否か (省略可能)
62!> @param[out] rank コンパクト次元を数えない次元の数 (省略可能)
63!> @param[out] alldims 縮退次元を含む全次元数 (省略可能)
64!> @param[out] allcount 次元変数の総数 (省略可能)
65!> @param[out] size 入出力領域の大きさ (省略可能)
66!> @param[out] xtype 外部型の名前 (省略可能)
67!> @param[out] name 変数名 (省略可能)
68!> @param[out] url 変数のフルURL (省略可能)
69!> @param[out] err エラーフラグ (省略可能)
70!> @endja
71!>
72subroutine gtvarinquire(var, growable, rank, alldims, allcount, &
73 & size, xtype, name, url, err )
74 use gtdata_types, only: gt_variable
75 use gtdata_internal_map, only: var_class, vtb_class_netcdf
79 implicit none
80 type(gt_variable), intent(in):: var
81 character(len=*), intent(out), optional:: xtype
82 ! 外部型の名前
83 character(len=*), intent(out), optional:: name
84 ! name は変数名の最小の単位を返します。
85 ! ファイル名を含まないため
86 ! プログラム内での一意性は
87 ! 保証されません。
88 !
89 character(len=*), intent(out), optional:: url
90 ! url はファイル名のついた変数名
91 ! を返します。
92 ! プログラム内で一意です。
93 !
94 integer, intent(out), optional:: rank
95 ! コンパクト(縮退)次元を数えない、
96 ! 次元の数
97 !
98 integer, intent(out), optional:: alldims
99 ! 縮退次元を含む全次元数。
100 ! dimord には基本的にこちらを
101 ! 使います。
102 !
103 integer, intent(out), optional:: allcount
104 ! 変数が次元変数である場合、
105 ! 総数を返します。
106 ! エラーの場合はゼロを返します。
107 !
108 integer, intent(out), optional:: size
109 ! 変数の入出力領域の大きさ。
110 ! (変数が依存する各次元の長
111 ! [格子点数]の積)
112 !
113 logical, intent(out), optional:: growable
114 ! 変数が次元変数である場合、
115 ! 自動拡張可能か否かを返します。
116 ! 次元変数でない場合は不定となります。
117 !
118 logical, intent(out), optional:: err
119 ! 例外処理用フラグ.
120 ! デフォルトでは, この手続き内でエラーが
121 ! 生じた場合, プログラムは強制終了します.
122 ! 引数 *err* が与えられる場合,
123 ! プログラムは強制終了せず, 代わりに
124 ! *err* に .true. が代入されます.
125 !
126 ! Exception handling flag.
127 ! By default, when error occur in
128 ! this procedure, the program aborts.
129 ! If this *err* argument is given,
130 ! .true. is substituted to *err* and
131 ! the program does not abort.
132 integer:: class, cid
133continue
134 if (present(err)) err = .false.
135 call beginsub('gtvarinquire', 'var.mapid=%d', i=(/var%mapid/))
136 call var_class(var, class, cid)
137 select case(class)
138 case(vtb_class_netcdf)
139 if (present(xtype) .or. present(name) .or. present(url)) then
140 call inquire(gd_nc_variable(cid), xtype=xtype, name=name, url=url)
141 if (present(xtype)) call dbgmessage('xtype=%c', c1=trim(xtype))
142 if (present(name)) call dbgmessage('name=%c', c1=trim(name))
143 if (present(url)) call dbgmessage('url=%c', c1=trim(url))
144 endif
145 if (present(growable)) then
146 call inquire(gd_nc_variable(cid), growable=growable)
147 call dbgmessage('growable=%y', l=(/growable/))
148 endif
149 end select
150 if (present(alldims)) alldims = internal_get_alldims(var)
151 if (present(allcount)) allcount = internal_get_allcount(var)
152 if (present(size)) size = internal_get_size(var)
153 if (present(rank)) rank = internal_get_rank(var)
154 call endsub('gtvarinquire')
155 return
156contains
157
158 integer function internal_get_alldims(var) result(result)
160 implicit none
161 type(gt_variable), intent(in):: var
162 call map_lookup(var, ndims=result)
163 call dbgmessage('alldims=%d', i=(/result/))
164 end function internal_get_alldims
165
166 integer function internal_get_allcount(var) result(result)
168 implicit none
169 type(gt_variable), intent(in):: var
170 type(gt_dimmap), allocatable:: map(:)
171 integer:: nd
172 call map_lookup(var, ndims=nd)
173 if (nd <= 0) then
174 call dbgmessage('internal_get_allcount: no map')
175 result = 1
176 return
177 endif
178 allocate(map(nd))
179 call map_lookup(var, map=map)
180 result = product(map(1:nd)%allcount)
181 call dbgmessage('internal_get_allcount: %d map.size=%d', &
182 & i=(/result, nd/))
183 deallocate(map)
184 end function internal_get_allcount
185
186 integer function internal_get_size(var) result(result)
188 implicit none
189 type(gt_variable), intent(in):: var
190 type(gt_dimmap), allocatable:: map(:)
191 integer:: nd
192 call map_lookup(var, ndims=nd)
193 if (nd <= 0) then
194 call dbgmessage('internal_get_size: no map')
195 result = 1
196 return
197 endif
198 allocate(map(nd))
199 call map_lookup(var, map=map)
200 result = product(map(1:nd)%count)
201 call dbgmessage('internal_get_size: %d map.size=%d', &
202 & i=(/result, nd/))
203 deallocate(map)
204 end function internal_get_size
205
206 integer function internal_get_rank(var) result(result)
208 implicit none
209 type(gt_variable), intent(in):: var
210 type(gt_dimmap), allocatable:: map(:)
211 integer:: nd
212
213 call map_lookup(var, ndims=nd)
214 if (nd <= 0) then
215 call dbgmessage('internal_get_rank: no map')
216 result = 0
217 return
218 endif
219 allocate(map(nd))
220 call map_lookup(var, map=map)
221 result = count(map(1:nd)%count > 1)
222 call dbgmessage('internal_get_rank: %d', i=(/result/))
223 deallocate(map)
224 end function internal_get_rank
225
226end subroutine gtvarinquire
227
228!> @en
229!> @brief Inquire total counts for all dimensions of a variable
230!>
231!> Returns the total count for each dimension that variable var depends on.
232!> The allcount array size must be at least the number of dependent dimensions.
233!> Use Inquire with alldims to determine the number of dimensions.
234!> @param[in] var Variable handle
235!> @param[out] allcount Total count for each dimension
236!> @enden
237!> @ja
238!> @brief 変数の依存する次元 (複数) の総数の問い合わせ
239!>
240!> 変数 var が依存する各次元の総数を返します。
241!> allcount の配列のサイズは依存する次元の数だけ必要です。
242!> 依存する次元の数は Inquire の alldims で調べることができます。
243!> @param[in] var 変数ハンドル
244!> @param[out] allcount 各次元の総数
245!> @endja
246subroutine gtvarinquire2(var, allcount)
247 use gtdata_types, only: gt_variable
248 use gtdata_generic, only: inquire, open, close
249 use dc_trace, only: beginsub, endsub
250 type(gt_variable), intent(in):: var
251 integer, intent(out):: allcount(:) ! alldims 個必要
252 integer:: i, n
253 type(gt_variable):: v
254 call beginsub('gtvarinquire2')
255 call inquire(var, alldims=n)
256 do, i = 1, n
257 call open(v, var, i, count_compact=.true.)
258 call inquire(var, allcount=allcount(i))
259 call close(v)
260 enddo
261 call endsub('gtvarinquire2')
262end subroutine
263
264!> @en
265!> @brief Inquire attribute type of a variable
266!>
267!> Returns the type of attribute attrname of variable var in xtype.
268!> @param[in] var Variable handle
269!> @param[in] attrname Attribute name
270!> @param[out] xtype Attribute type (optional)
271!> @enden
272!> @ja
273!> @brief 変数の属性の型の問い合わせ
274!>
275!> 変数 var の属性 attrname の値の型を xtype に返します。
276!> @param[in] var 変数ハンドル
277!> @param[in] attrname 属性名
278!> @param[out] xtype 属性の型 (省略可能)
279!> @endja
280subroutine gtvarinquirea(var, attrname, xtype)
281 use gtdata_types, only: gt_variable
282 use gtdata_internal_map, only: var_class, vtb_class_netcdf
283 use dc_trace, only: beginsub, endsub
286 type(gt_variable), intent(in):: var
287 character(len=*), intent(in):: attrname
288 character(len=*), intent(out), optional:: xtype
289 integer:: class, cid
290 character(len = *), parameter:: subnam = "gtvarinquireA"
291continue
292 call beginsub(subnam, "%c", c1=trim(attrname))
293 call var_class(var, class, cid)
294 select case(class)
295 case(vtb_class_netcdf)
296 call inquire(gd_nc_variable(cid), attrname=attrname, xtype=xtype)
297 end select
298 call endsub(subnam)
299end subroutine gtvarinquirea
300
301!> @en
302!> @brief Inquire about a dimension of a variable
303!>
304!> Returns the URL and total count for the dimension at order number
305!> dimord of variable var.
306!> @param[in] var Variable handle
307!> @param[in] dimord Dimension order number
308!> @param[out] url Dimension URL (optional)
309!> @param[out] allcount Total count (optional)
310!> @param[out] err Error flag (optional)
311!> @enden
312!> @ja
313!> @brief 変数の次元に関する問い合わせ
314!>
315!> 変数 var の次元順序番号 dimord に対応する次元の
316!> URL url と総数 allcount を返します。
317!> @param[in] var 変数ハンドル
318!> @param[in] dimord 次元順序番号
319!> @param[out] url 次元URL (省略可能)
320!> @param[out] allcount 総数 (省略可能)
321!> @param[out] err エラーフラグ (省略可能)
322!> @endja
323subroutine gtvarinquired(var, dimord, url, allcount, err)
324 use gtdata_types, only: gt_variable
325 use gtdata_generic, only: open, close, inquire
326 use dc_trace, only: beginsub, endsub
327 implicit none
328 type(gt_variable), intent(in):: var
329 integer, intent(in):: dimord
330 character(len=*), intent(out), optional:: url
331 integer, intent(out), optional:: allcount
332 logical, intent(out), optional:: err
333 type(gt_variable):: dimvar
334 character(len = *), parameter:: subnam = "gtvarinquireD"
335continue
336 call beginsub(subnam, "%d", i=(/dimord/))
337 call open(dimvar, source_var=var, dimord=dimord, err=err)
338 if (present(url)) call inquire(dimvar, url=url)
339 if (present(allcount)) call inquire(dimvar, allcount=allcount)
340 call close(dimvar)
341 call endsub(subnam)
342end 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)
Debug tracing module.
Definition dc_trace.f90:150
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
Definition dc_trace.f90:680
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
Definition dc_trace.f90:476
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
Definition dc_trace.f90:599
subroutine, public map_lookup(var, vid, map, ndims)
subroutine, public var_class(var, class, cid)