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 
510 end module gtdata_netcdf_generic
subroutine gdncattrgetreal(var, name, value, stat, default)
subroutine gdncvarputattrreal(var, name, value, err)
subroutine gdncattrinquireplus(var, attrname, varid, nf_attrname)
subroutine gdncvarattrrewind(var)
Definition: gdncvarattr.f90:16
subroutine gdncvarsync(var, stat)
Definition: gdncvarsync.f90:4
subroutine gdncvarputattrdouble(var, name, value, err)
subroutine gdncvarsearchnext(iter, url, end)
subroutine gdncattrgetchar(var, name, value, default, stat)
subroutine gdncvarputreal(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarcreated(var, url, xtype, length, overwrite, err)
subroutine gdncvargetreal(var, start, cnt, stride, imap, siz, val, iostat)
subroutine gdncvarputattrint(var, name, value, err)
subroutine gdncattrinquire(var, attrname, xtype)
subroutine gdncxtypename(ixtype, xtype)
subroutine gdncvargetattrlogical(var, name, value, default)
subroutine gdncvaropenbydimord(var, src_var, dimord, err)
subroutine gdncvarputdouble(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvargetint(var, start, cnt, stride, imap, siz, val, iostat)
integer, parameter, public dp
倍精度実数型変数
Definition: dc_types.f90:83
subroutine gdncattrgetdouble(var, name, value, stat, default)
subroutine gdncvargetdouble(var, start, cnt, stride, imap, siz, val, iostat)
subroutine gdncvarclose(var, err)
Definition: gdncvarclose.f90:4
subroutine gdncvarattrnext(var, name, vend)
Definition: gdncvarattr.f90:30
subroutine gdncvarsearchinit(iter, urlBase)
subroutine gdncvarattrcopy(to, attrname, from, stat)
subroutine gdncvarputchar(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarputattrchar(var, name, val, xtype, err)
種別型パラメタを提供します。
Definition: dc_types.f90:49
subroutine gdncvarputint(var, start, count, stride, imap, siz, value, iostat)
subroutine gdncvarinquire(var, ndims, dimlen, growable, name, url, xtype)
character(string) function gdncvartostring(var)
subroutine gdncvarinquireia(var, dimlen)
integer function gdncsearchdim(var, dimname)
recursive subroutine gdncvaropen(var, url, writable, err)
Definition: gdncvaropen.f90:13
subroutine gdncvardelattr(var, name, err)
subroutine gdncattrgetint(var, name, value, stat, default)
subroutine gdncvarcreate(var, url, xtype, dims, overwrite, err)
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition: dc_types.f90:118