Loading...
Searching...
No Matches
gtdata_netcdf_generic.f90
Go to the documentation of this file.
1!
2!== 抽象 (abstruct) netCDF インターフェイスの総称宣言
3!
4! Authors:: Eizi TOYODA, Yasuhiro MORIKAWA
5! Version:: $Id: gtdata_netcdf_generic.f90,v 1.2 2009-10-11 07:36:33 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
12 !
13 !== 抽象 netCDF インターフェイスの総称宣言
14 !
15
16 implicit none
17 !
18 ! === 基本開閉動作 ===
19 !
20
21 !
22 ! an ライブラリでは「ファイル」ではなく「変数」を開いたり閉じたりする。
23 ! すべてのものは変数とその属性である。
24
25 interface open
26 !
27 ! open(var, url, [writable], [err]) は url で識別される
28 ! 変数を開き var に格納する。ここで変数とは netCDF 変数または
29 ! netCDF 次元である。次元と同名の netCDF 変数がある場合には両者は
30 ! 同一視される。writable を真に指定すると書き込み可で開こうとする。
31 ! デフォルトは writable=.FALSE. である。エラーが発生した場合は
32 ! err が真となる。err を与えなければプログラムは停止する。
33 !
34 recursive subroutine gdncvaropen(var, url, writable, err)
36 type(gd_nc_variable), intent(out):: var
37 character(len = *), intent(in):: url
38 logical, intent(in), optional:: writable
39 logical, intent(out), optional:: err
40 end subroutine gdncvaropen
41 !
42 ! gdnc ライブラリの変数は netCDF の変数と次元を統合したもの
43 ! である。次元構造体は存在しない。そこで、gdnc の立場では
44 ! 変数は任意個の次元と呼ばれる変数を持つということになる。
45 ! 従来次元変数と呼ばれていたものは、変数が自分自身のみを
46 ! 次元としてもつ場合を指す。
47 !
48 ! open(var, src_var, dimord, [count_compact], [err]) は
49 ! 既に開かれた変数 src_var の ord 番目の次元にあたる変数を
50 ! 開き var に格納する。順序 ord は現在の入出力範囲が
51 ! 幅1になっている (コンパクト化している)を飛ばした
52 ! 順序であるが、count_compact に真を指定すると
53 ! すべての次元のなかの順序になる。
54 !
55 subroutine gdncvaropenbydimord(var, src_var, dimord, err)
57 type(gd_nc_variable), intent(out):: var
58 type(gd_nc_variable), intent(in):: src_var
59 integer, intent(in):: dimord
60 logical, intent(out), optional:: err
61 end subroutine gdncvaropenbydimord
62 end interface
63
64 interface search_dim
65 integer function gdncsearchdim(var, dimname)
67 type(gd_nc_variable), intent(in):: var
68 character(len = *), intent(in):: dimname
69 end function gdncsearchdim
70 end interface
71
72 interface create
73 !
74 ! 従属変数 create
75 !
76 ! create(var, url, dims, [xtype], [overwrite], [err]) は
77 ! 場所 url に次元 dims を持った変数を作成し、それを開いた
78 ! ものを var に格納する。型 xtype を省略すると real と
79 ! みなされる。既存変数があるとき失敗するが
80 ! overwrite が真であれば続行する。
81 ! ゼロ次元変数を作るには dims に長さゼロの配列を渡すこと。
82 !
83 subroutine gdncvarcreate(var, url, xtype, dims, overwrite, err)
85 type(gd_nc_variable), intent(out):: var
86 character(len = *), intent(in):: url
87 character(len = *), intent(in):: xtype
88 type(gd_nc_variable), intent(in):: dims(:)
89 logical, intent(in), optional:: overwrite
90 logical, intent(out), optional:: err
91 end subroutine gdncvarcreate
92 !
93 ! 次元変数 create
94 !
95 ! create(var, url, xtype, length, [overwrite], [err]) は
96 ! 長さ length の次元変数を作成する。
97 !
98 subroutine gdncvarcreated(var, url, xtype, length, overwrite, err)
100 type(gd_nc_variable), intent(out):: var
101 character(len = *), intent(in):: url
102 character(len = *), intent(in):: xtype
103 integer, intent(in):: length
104 logical, intent(in), optional:: overwrite
105 logical, intent(out), optional:: err
106 end subroutine gdncvarcreated
107 end interface
108
109 interface
110 subroutine gdncvardel(varname, hint, stat)
111 character(len = *), intent(in):: varname
112 character(len = *), intent(in):: hint
113 integer, intent(out):: stat
114 end subroutine gdncvardel
115 end interface
116
117 interface close
118 subroutine gdncvarclose(var, err)
120 type(gd_nc_variable), intent(in):: var
121 logical, intent(out), optional:: err
122 end subroutine gdncvarclose
123 end interface
124
125 !
126 ! === 変数に関する問い合わせ万般 ===
127 !
128
129 ! mainly for PRINT debugging
130 interface tostring
131 function gdncvartostring(var) result(result)
132 use dc_types, only: string
134 character(string):: result
135 type(gd_nc_variable), intent(in):: var
136 end function gdncvartostring
137 end interface
138
139 interface inquire
140
141 subroutine gdncvarinquire(var, ndims, dimlen, growable, name, url, xtype)
143 type(gd_nc_variable), intent(in):: var
144 ! 変数の次元数
145 integer, intent(out), optional:: ndims
146 ! 変数が1次元である場合、次元長
147 integer, intent(out), optional:: dimlen
148 ! 変数が成長可能次元を持つか
149 logical, intent(out), optional:: growable
150 ! 文字型引数が短いと値の切り詰めが起こりうる
151 ! '?' のあとの変数名
152 character(*), intent(out), optional:: name
153 ! 変数名、少なくともファイル名を含む、なるべく長い名前
154 character(*), intent(out), optional:: url
155 ! 変数の型名
156 character(*), intent(out), optional:: xtype
157 end subroutine gdncvarinquire
158
159 ! 引数は ndims 個でなければならない
160 subroutine gdncvarinquireia(var, dimlen)
162 type(gd_nc_variable), intent(in):: var
163 integer, intent(out):: dimlen(:)
164 end subroutine gdncvarinquireia
165
166 subroutine gdncattrinquire(var, attrname, xtype)
168 type(gd_nc_variable), intent(in):: var
169 character(len=*), intent(in):: attrname
170 character(len=*), intent(out), optional:: xtype
171 end subroutine gdncattrinquire
172
173 end interface
174
175 interface inquireplus
176
177 subroutine gdncattrinquireplus(var, attrname, varid, nf_attrname)
179 type(gd_nc_variable), intent(in):: var
180 character(len=*), intent(in):: attrname
181 integer, intent(out):: varid
182 character(len=*), intent(out):: nf_attrname
183 end subroutine gdncattrinquireplus
184
185 end interface
186
187 !
188 ! === 属性関係 ===
189 !
190
191 ! すべては変数という an ライブラリの立場から、
192 ! 大域属性は変数属性とみなされる。
193 ! 属性読み取り時には変数属性の次に大域属性を検索する。
194 ! 属性書き込み時には一部の例外を除き変数属性として書き込む。
195 ! gtool4 規約で大域属性と規定された属性 Conventions,
196 ! gt_version, title, gt_subtitle, comment, source,
197 ! institution, production, history についてはまず
198 ! 大域属性として書き込もうとする。既存の値があった
199 ! 場合 Conventions, gt_version は gtool4 同士ならば
200 ! 版数が大きくなるようにする。history は規定どおり
201 ! 追加動作を行う。その他の属性名については既存と異なる
202 ! 属性値があれば変数属性として書き込む。
203
204 !
205 ! --- 属性の列挙 ---
206 !
207
208 ! ある変数 var に付随した属性をすべて取得するにはまず
209 ! attr_rewind(var) を呼び出してから無限ループの中で
210 ! attr_next(var, name, [end]) を呼び出す。name がひとつ
211 ! ひとつの属性名を与える。name が空文字列になったとき、
212 ! すべての属性を探索し終えたことになる。このとき end を
213 ! 与えていればそれが真になることでも判定できる。
214
215 interface attr_rewind
216 subroutine gdncvarattrrewind(var)
218 type(gd_nc_variable), intent(in):: var
219 end subroutine gdncvarattrrewind
220 end interface
221
222 interface attr_next
223 subroutine gdncvarattrnext(var, name, end)
225 type(gd_nc_variable), intent(in):: var
226 character(len = *), intent(out):: name
227 logical, intent(out), optional:: end
228 end subroutine gdncvarattrnext
229 end interface
230
231 ! 変数 var の属性 name を取得して value に格納する。
232 ! 属性が存在しないか value の長さが不足している場合
233 ! default が補われる。属性の型はなんでもよく型変換をする。
234
235 interface get_attr
236
237 subroutine gdncattrgetchar(var, name, value, default, stat)
239 type(gd_nc_variable), intent(in):: var
240 character(len = *), intent(in):: name
241 character(len = *), intent(out):: value
242 character(len = *), intent(in):: default
243 integer, intent(out):: stat
244 end subroutine gdncattrgetchar
245
246 subroutine gdncvargetattrlogical(var, name, value, default)
248 type(gd_nc_variable), intent(in):: var
249 character(len = *), intent(in):: name
250 logical, intent(out):: value
251 logical, intent(in), optional:: default
252 end subroutine gdncvargetattrlogical
253
254 ! お客様向きではないけれど、情報落ちのないインターフェイスということで....
255 ! stat = -1: その属性は存在しなかった
256 ! stat = 0 ... size(value): その属性を全部読み取った。サイズは stat 個
257 ! stat > size(value): 配列長不足のため属性が全部読み取れなかった。
258 ! サイズは stat 個必要
259
260 subroutine gdncattrgetreal(var, name, value, stat, default)
262 type(gd_nc_variable), intent(in):: var
263 character(len = *), intent(in):: name
264 real, intent(out):: value(:)
265 integer, intent(out):: stat
266 real, intent(in), optional:: default
267 end subroutine gdncattrgetreal
268
269 subroutine gdncattrgetdouble(var, name, value, stat, default)
270 use dc_types, only: dp
272 type(gd_nc_variable), intent(in):: var
273 character(len = *), intent(in):: name
274 real(DP), intent(out):: value(:)
275 integer, intent(out):: stat
276 real(DP), intent(in), optional:: default
277 end subroutine gdncattrgetdouble
278
279 subroutine gdncattrgetint(var, name, value, stat, default)
281 type(gd_nc_variable), intent(in):: var
282 character(len = *), intent(in):: name
283 integer, intent(out):: value(:)
284 integer, intent(out):: stat
285 integer, intent(in), optional:: default
286 end subroutine gdncattrgetint
287
288 end interface
289
290 ! 変数 var の属性 name に value を格納する。
291 ! 属性の型は value の型に適合するように設定される。
292 ! 論理型は 1 文字の文字型として格納され、真は T,
293 ! 偽は F となる。
294
295 interface put_attr
296
297 subroutine gdncvarputattrreal(var, name, value, err)
299 type(gd_nc_variable), intent(in):: var
300 character(len = *), intent(in):: name
301 real, intent(in):: value(:)
302 logical, intent(out), optional:: err
303 end subroutine gdncvarputattrreal
304
305 subroutine gdncvarputattrdouble(var, name, value, err)
306 use dc_types, only: dp
308 type(gd_nc_variable), intent(in):: var
309 character(len = *), intent(in):: name
310 real(DP), intent(in):: value(:)
311 logical, intent(out), optional:: err
312 end subroutine gdncvarputattrdouble
313
314 subroutine gdncvarputattrint(var, name, value, err)
316 type(gd_nc_variable), intent(in):: var
317 character(len = *), intent(in):: name
318 integer, intent(in):: value(:)
319 logical, intent(out), optional:: err
320 end subroutine gdncvarputattrint
321
322 subroutine gdncvarputattrlogical(var, name, value, err)
324 type(gd_nc_variable), intent(in):: var
325 character(len = *), intent(in):: name
326 logical, intent(in):: value
327 logical, intent(out), optional:: err
328 end subroutine gdncvarputattrlogical
329
330 subroutine gdncvarputattrchar(var, name, value, xtype, err)
332 type(gd_nc_variable), intent(in):: var
333 character(len = *), intent(in):: name
334 character(len = *), intent(in):: value
335 character(len = *), intent(in), optional:: xtype
336 logical, intent(out), optional:: err
337 end subroutine gdncvarputattrchar
338
339 end interface
340
341 interface del_attr
342 subroutine gdncvardelattr(var, name, err)
344 type(gd_nc_variable), intent(in):: var
345 character(len = *), intent(in):: name
346 logical, intent(out), optional:: err
347 end subroutine gdncvardelattr
348 end interface
349
350 interface copy_attr
351 subroutine gdncvarattrcopy(to, attrname, from, stat)
353 type(gd_nc_variable), intent(in):: to
354 character(len = *), intent(in):: attrname
355 type(gd_nc_variable), intent(in):: from
356 integer, intent(out):: stat
357 end subroutine gdncvarattrcopy
358 end interface
359
360 !
361 ! 入出力
362 !
363
364 interface get
365
366 subroutine gdncvargetreal(var, start, count, stride, imap, &
367 & siz, value, iostat)
369 type(gd_nc_variable), intent(in):: var
370 integer, intent(in):: start(:)
371 integer, intent(in):: count(:)
372 integer, intent(in):: stride(:)
373 integer, intent(in):: imap(:)
374 integer, intent(in):: siz
375 real, intent(out):: value(siz)
376 integer, intent(out):: iostat
377 end subroutine gdncvargetreal
378
379 subroutine gdncvargetdouble(var, start, count, stride, imap, &
380 & siz, value, iostat)
381 use dc_types, only: dp
383 type(gd_nc_variable), intent(in):: var
384 integer, intent(in):: start(:)
385 integer, intent(in):: count(:)
386 integer, intent(in):: stride(:)
387 integer, intent(in):: imap(:)
388 integer, intent(in):: siz
389 real(DP), intent(out):: value(siz)
390 integer, intent(out):: iostat
391 end subroutine gdncvargetdouble
392
393 subroutine gdncvargetint(var, start, count, stride, imap, &
394 & siz, value, iostat)
395 use dc_types, only: dp
397 type(gd_nc_variable), intent(in):: var
398 integer, intent(in):: start(:)
399 integer, intent(in):: count(:)
400 integer, intent(in):: stride(:)
401 integer, intent(in):: imap(:)
402 integer, intent(in):: siz
403 integer, intent(out):: value(siz)
404 integer, intent(out):: iostat
405 end subroutine gdncvargetint
406
407 end interface
408
409 interface put
410
411 subroutine gdncvarputreal(var, start, count, stride, imap, &
412 & siz, value, iostat)
414 type(gd_nc_variable), intent(in):: var
415 integer, intent(in):: start(:)
416 integer, intent(in):: count(:)
417 integer, intent(in):: stride(:)
418 integer, intent(in):: imap(:)
419 integer, intent(in):: siz
420 real, intent(in):: value(siz)
421 integer, intent(out):: iostat
422 end subroutine gdncvarputreal
423
424 subroutine gdncvarputdouble(var, start, count, stride, imap, &
425 & siz, value, iostat)
426 use dc_types, only: dp
428 type(gd_nc_variable), intent(in):: var
429 integer, intent(in):: start(:)
430 integer, intent(in):: count(:)
431 integer, intent(in):: stride(:)
432 integer, intent(in):: imap(:)
433 integer, intent(in):: siz
434 real(DP), intent(in):: value(siz)
435 integer, intent(out):: iostat
436 end subroutine gdncvarputdouble
437
438 subroutine gdncvarputint(var, start, count, stride, imap, &
439 & siz, value, iostat)
441 type(gd_nc_variable), intent(in):: var
442 integer, intent(in):: start(:)
443 integer, intent(in):: count(:)
444 integer, intent(in):: stride(:)
445 integer, intent(in):: imap(:)
446 integer, intent(in):: siz
447 integer, intent(in):: value(siz)
448 integer, intent(out):: iostat
449 end subroutine gdncvarputint
450
451 subroutine gdncvarputchar(var, start, count, stride, imap, &
452 & siz, value, iostat)
454 type(gd_nc_variable), intent(in):: var
455 integer, intent(in):: start(:)
456 integer, intent(in):: count(:)
457 integer, intent(in):: stride(:)
458 integer, intent(in):: imap(:)
459 integer, intent(in):: siz
460 character(*), intent(in):: value(siz)
461 integer, intent(out):: iostat
462 end subroutine gdncvarputchar
463
464 end interface
465
466 !
467 ! === ファイル名から変数をさがす ===
468 !
469
470 interface var_search
471
472 subroutine gdncvarsearchinit(iter, urlBase)
474 type(gd_nc_variable_search), intent(out):: iter
475 character(len = *), intent(in):: urlBase
476 end subroutine gdncvarsearchinit
477
478 subroutine gdncvarsearchnext(iter, url, end)
480 type(gd_nc_variable_search), intent(inout):: iter
481 character(len = *), intent(out):: url
482 logical, intent(out):: end
483 end subroutine gdncvarsearchnext
484
485 end interface
486
487 !
488 ! 非常脱出用。このルーチンは SysDepAbort からも呼ばれるため、
489 ! 自分で StoreError することはない。
490 !
491
492 interface
493 subroutine gdncvarsync(var, stat)
495 type(gd_nc_variable), intent(in), optional:: var
496 integer, intent(out), optional:: stat
497 end subroutine gdncvarsync
498 end interface
499
500 !
501 ! an 層の内部的使用のためのルーチン
502 !
503 interface
504 subroutine gdncxtypename(ixtype, xtype)
505 integer, intent(in):: ixtype
506 character(*), intent(out):: xtype
507 end subroutine gdncxtypename
508 end interface
509
510end module gtdata_netcdf_generic
subroutine gdncattrgetchar(var, name, value, default, stat)
subroutine gdncattrinquire(var, attrname, xtype)
subroutine gdncattrinquireplus(var, attrname, varid, nf_attrname)
integer function gdncsearchdim(var, dimname)
subroutine gdncvarattrnext(var, name, vend)
subroutine gdncvarattrrewind(var)
subroutine gdncvarattrcopy(to, attrname, from, stat)
subroutine gdncvargetattrlogical(var, name, value, default)
subroutine gdncvarclose(var, err)
subroutine gdncvarcreate(var, url, xtype, dims, overwrite, err)
subroutine gdncvarcreated(var, url, xtype, length, overwrite, err)
subroutine gdncvardelattr(var, name, err)
subroutine gdncvargetreal(var, start, cnt, stride, imap, siz, val, iostat)
subroutine gdncvargetint(var, start, cnt, stride, imap, siz, val, iostat)
subroutine gdncvargetdouble(var, start, cnt, stride, imap, siz, val, iostat)
subroutine gdncvarinquire(var, ndims, dimlen, growable, name, url, xtype)
subroutine gdncvarinquireia(var, dimlen)
recursive subroutine gdncvaropen(var, url, writable, err)
subroutine gdncvaropenbydimord(var, src_var, dimord, err)
subroutine gdncvarputattrchar(var, name, val, xtype, err)
subroutine gdncvarputattrint(var, name, value, err)
subroutine gdncvarputattrreal(var, name, value, err)
subroutine gdncvarputattrdouble(var, name, value, err)
subroutine gdncvarputchar(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarputint(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarputreal(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarputdouble(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarsearchnext(iter, url, end)
subroutine gdncvarsearchinit(iter, urlbase)
character(string) function gdncvartostring(var)
種別型パラメタを提供します。
Definition dc_types.f90:49
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:83
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition dc_types.f90:118