gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
gtvarinquire.f90
Go to the documentation of this file.
1
21
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
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
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
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)
デバッグ時の追跡用モジュール
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)