Functions/Subroutines
gtvarinquire.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine gtvarinquire (var, growable, rank, alldims, allcount, size, xtype, name, url, err)
 
integer function internal_get_alldims (var)
 
integer function internal_get_allcount (var)
 
integer function internal_get_size (var)
 
integer function internal_get_rank (var)
 
subroutine gtvarinquire2 (var, allcount)
 
subroutine gtvarinquirea (var, attrname, xtype)
 
subroutine gtvarinquired (var, dimord, url, allcount, err)
 

Function/Subroutine Documentation

◆ gtvarinquire()

subroutine gtvarinquire ( type(gt_variable), intent(in)  var,
logical, intent(out), optional  growable,
integer, intent(out), optional  rank,
integer, intent(out), optional  alldims,
integer, intent(out), optional  allcount,
integer, intent(out), optional  size,
character(len=*), intent(out), optional  xtype,
character(len=*), intent(out), optional  name,
character(len=*), intent(out), optional  url,
logical, intent(out), optional  err 
)

Definition at line 15 of file gtvarinquire.f90.

References internal_get_allcount(), internal_get_alldims(), internal_get_rank(), internal_get_size(), and gtdata_internal_map::var_class().

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
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  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
117 contains
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 
integer function internal_get_size(var)
integer function internal_get_allcount(var)
integer function internal_get_alldims(var)
subroutine, public map_lookup(var, vid, map, ndims)
subroutine, public var_class(var, class, cid)
integer function internal_get_rank(var)
Here is the call graph for this function:

◆ gtvarinquire2()

subroutine gtvarinquire2 ( type(gt_variable), intent(in)  var,
integer, dimension(:), intent(out)  allcount 
)

Definition at line 190 of file gtvarinquire.f90.

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')

◆ gtvarinquirea()

subroutine gtvarinquirea ( type(gt_variable), intent(in)  var,
character(len=*), intent(in)  attrname,
character(len=*), intent(out), optional  xtype 
)

Definition at line 216 of file gtvarinquire.f90.

References gtdata_internal_map::var_class().

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
227  use gtdata_netcdf_generic, only: inquire
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"
234 continue
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)
subroutine, public var_class(var, class, cid)
Here is the call graph for this function:

◆ gtvarinquired()

subroutine gtvarinquired ( type(gt_variable), intent(in)  var,
integer, intent(in)  dimord,
character(len=*), intent(out), optional  url,
integer, intent(out), optional  allcount,
logical, intent(out), optional  err 
)

Definition at line 245 of file gtvarinquire.f90.

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"
262 continue
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)

◆ internal_get_allcount()

integer function gtvarinquire::internal_get_allcount ( type(gt_variable), intent(in)  var)

Definition at line 128 of file gtvarinquire.f90.

References gtdata_internal_map::map_lookup().

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)
subroutine, public map_lookup(var, vid, map, ndims)
Here is the call graph for this function:

◆ internal_get_alldims()

integer function gtvarinquire::internal_get_alldims ( type(gt_variable), intent(in)  var)

Definition at line 120 of file gtvarinquire.f90.

References gtdata_internal_map::map_lookup().

121  implicit none
122  type(gt_variable), intent(in):: var
123  call map_lookup(var, ndims=result)
124  call dbgmessage('alldims=%d', i=(/result/))
subroutine, public map_lookup(var, vid, map, ndims)
Here is the call graph for this function:

◆ internal_get_rank()

integer function gtvarinquire::internal_get_rank ( type(gt_variable), intent(in)  var)

Definition at line 168 of file gtvarinquire.f90.

References gtdata_internal_map::map_lookup().

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)
subroutine, public map_lookup(var, vid, map, ndims)
Here is the call graph for this function:

◆ internal_get_size()

integer function gtvarinquire::internal_get_size ( type(gt_variable), intent(in)  var)

Definition at line 148 of file gtvarinquire.f90.

References gtdata_internal_map::map_lookup().

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)
subroutine, public map_lookup(var, vid, map, ndims)
Here is the call graph for this function: