dc_error.f90
Go to the documentation of this file.
1 != エラー処理
2 !
3 != Error handling
4 !
5 ! Authors:: Eizi TOYODA, Yasuhiro MORIKAWA
6 ! Version:: $Id: dc_error.f90,v 1.3 2009-10-03 14:53:46 morikawa Exp $
7 ! Tag Name:: $Name: $
8 ! Copyright:: Copyright (C) GFD Dennou Club, 2000-2005. All rights reserved.
9 ! License:: See COPYRIGHT[link:../../COPYRIGHT]
10 !
11 module dc_error
12  !
13  != エラー処理用モジュール
14  !
15  != Error handling module
16  !
17  ! <b>Note that Japanese and English are described in parallel.</b>
18  !
19  ! プログラムの部品は必ずエラーの取り扱いを明確に規定すべきものです。
20  ! エラーとは当該部品への入力が不適切であるとか、
21  ! 期待される動作をすることができないといった事態を指します。
22  !
23  ! gtool5 ライブラリがユーザに提供する手続
24  ! (手続とはサブルーチンまたは関数の総称) はほとんどの場合、
25  ! 以下の 2 つの方式のいずれかで呼び出し元にエラーを報告します。
26  !
27  ! * エラーが発生すると適切なメッセージを表示してプログラム終了
28  ! * 論理型の省略できる引数 *err* が与えられた場合は、
29  ! エラー時にはそれを <tt>.true.</tt> にします。
30  ! err が省略された場合は上に同じ。
31  !
32  ! これらの処理はすべて *dc_error* モジュールの *StoreError*
33  ! サブルーチンで行っています。引用仕様などに関しては *StoreError*
34  ! を参照してください。
35  !
36  !
37  ! Error handling about parts of programs should be regulated definitely.
38  ! Error means that input to the part of program is invalid, or
39  ! expected operation can not be done, etc.
40  !
41  ! Procedures (procedures is generic name of subroutines and functions)
42  ! provided to users by gtool5 library almost report error to invoker
43  ! in the following two manner.
44  !
45  ! * When error occurs, the program display appropriate messages and
46  ! aborts.
47  ! * If logical optional argument *err* is given, the argument *err* become
48  ! <tt>.true.</tt> when error occurs. If *err* is abbreviated,
49  ! the operation is same as above.
50  !
51  ! *StoreError* subroutine in *dc_error* module handle above all operations.
52  ! See *StoreError* about the interfase of it.
53  !
54  !
55  !== エラーコード一覧
56  !== Error code list
57  !
58  ! gtool5 ライブラリにコードを追加するプログラマは適切な
59  ! エラーコードで *StoreError* を呼び出すようにしなければなりません。
60  ! そこで、 新しいエラーコードを定義する必要があるかどうかを
61  ! 判定するために、 エラーコードの値と対応するメッセージを
62  ! 以下に一覧します。
63  ! エラーコードニーモニックを使用するためには、
64  ! <b><tt>NF_E</tt></b> で始まる名前については netcdf_f77
65  ! モジュールを引用するか include 'netcdf.inc' を行い(後者は推奨しません)、
66  ! <b><tt>GT_E</tt></b>, <b><tt>DC_E</tt></b>, <b><tt>HST_E</tt></b>
67  ! で始まる名前については dc_error モジュールを引用してください。
68  ! また <b><tt>USR_ERRNO</tt></b> 番より小さい値は、
69  ! 各々のユーザが適宜エラーコードを
70  ! 定義して利用するために空けてあります。
71  !
72  ! エラーではない状態を表す非エラーコードは *DC_NOERR* です。
73  !
74  ! エラーコードの数値の欄を設けたのは、新たなエラーコードを
75  ! 割り当てる際の指針を示すためです。
76  ! ソースコードにはエラーコードをニーモニックで与えるべきであり、
77  ! 数値をハードコードすることは厳に慎んで下さい。
78  !
79  !
80  ! Programmers who add codes to gtool5 library must call
81  ! *StoreError* with appropriate error code.
82  ! And so values of error code and corresponding messages are listed
83  ! as follows to figure out if a new error code is needed to declared.
84  ! To use error codes mnemonic,
85  ! require "netcdf_f77" module or include "netcdf.inc" (deprecated)
86  ! about error codes with prefix <b><tt>NF_E</tt></b>, or
87  ! require "dc_error" module
88  ! about error codes with prefix <b><tt>GT_E</tt></b> and
89  ! <b><tt>DC_E</tt></b> and <b><tt>HST_E</tt></b>.
90  ! Error codes smaller than <b><tt>USR_ERRNO</tt></b> are saved
91  ! as user-defined error codes.
92  !
93  ! Non error code that indicates normal (error-free) situation is
94  ! *DC_NOERR*.
95  !
96  ! List of numerical values of error codes
97  ! issues a guideline about declaration of new error codes.
98  ! Give not numerical value but mnemonic of error code to source code.
99  !
100  !=== 利用しないコード
101  !=== Unused codes
102  !
103  ! 正の整数値はエラーコードとして使用しません。
104  !
105  ! NetCDF ライブラリは libc のエラーコード errno を返す可能性があり、
106  ! errno の数値には移植性がないため、全ての正の整数値は errno
107  ! の仕様のために予約されているべきだからです。
108  !
109  ! Positive integer is not used as error codes.
110  !
111  ! NetCDF library might return "libc" error code "error".
112  ! Numerical value of "errno" is no portable, so positive integer
113  ! should be reserved for "errno".
114  !
115  !=== 非エラーコード
116  !=== Non error code
117  !
118  ! 以下の非エラーコードに関しては dc_error モジュールを引用することで
119  ! 利用してください。
120  !
121  ! Use following non error code by refering this "dc_error" module.
122  !
123  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ]</b>
124  !
125  ! 0 :: [ <b>DC_NOERR </b> ]
126  !
127  !
128  !=== netCDF に関するエラーコード
129  !=== Error codes for netCDF
130  !
131  ! 以下のエラーコードに関しては netcdf_f77 モジュールを引用することで
132  ! 利用してください。
133  !
134  ! Use following error codes by refering this "netcdf_f77" module.
135  !
136  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
137  !
138  ! 0 :: [ <b>NF_NOERR </b> ]
139  ! <b></b> :: No Error (非エラーコードです)
140  !
141  ! -33 :: [ <b>NF_EBADID </b> ]
142  ! <b></b> :: Not a netCDF id:
143  !
144  ! -34 :: [ <b>NF_ENFILE </b> ]
145  ! <b></b> :: Too many netCDF files open:
146  !
147  ! -35 :: [ <b>NF_EEXIST </b> ]
148  ! <b></b> :: netCDF file exists && NC_NOCLOBBER:
149  !
150  ! -36 :: [ <b>NF_EINVAL </b> ]
151  ! <b></b> :: Invalid argument:
152  !
153  ! -37 :: [ <b>NF_EPERM </b> ]
154  ! <b></b> :: Write to read only:
155  !
156  ! -38 :: [ <b>NF_ENOTINDEFINE</b> ]
157  ! <b></b> :: Operation not allowed in data mode
158  !
159  ! -39 :: [ <b>NF_EINDEFINE </b> ]
160  ! <b></b> :: Operation not allowed in define mode
161  !
162  ! -40 :: [ <b>NF_EINVALCOORDS</b> ]
163  ! <b></b> :: Index exceeds dimension bound
164  !
165  ! -41 :: [ <b>NF_EMAXDIMS </b> ]
166  ! <b></b> :: NF_MAX_DIMS exceeded
167  !
168  ! -42 :: [ <b>NF_ENAMEINUSE </b> ]
169  ! <b></b> :: String match to name in use
170  !
171  ! -43 :: [ <b>NF_ENOTATT </b> ]
172  ! <b></b> :: Attribute not found
173  !
174  ! -44 :: [ <b>NF_EMAXATTS </b> ]
175  ! <b></b> :: NC_MAX_ATTRS exceeded
176  !
177  ! -45 :: [ <b>NF_EBADTYPE </b> ]
178  ! <b></b> :: Not a netCDF data type or _FillValue type mismatch
179  !
180  ! -46 :: [ <b>NF_EBADDIM </b> ]
181  ! <b></b> :: Invalid dimension id or name
182  !
183  ! -47 :: [ <b>NF_EUNLIMPOS </b> ]
184  ! <b></b> :: NC_UNLIMITED in the wrong index
185  !
186  ! -48 :: [ <b>NF_EMAXVARS </b> ]
187  ! <b></b> :: NF_MAX_VARS exceeded
188  !
189  ! -49 :: [ <b>NF_ENOTVAR </b> ]
190  ! <b></b> :: Variable not found
191  !
192  ! -50 :: [ <b>NF_EGLOBAL </b> ]
193  ! <b></b> :: Action prohibited on NC_GLOBAL varid
194  !
195  ! -51 :: [ <b>NF_ENOTNC </b> ]
196  ! <b></b> :: Not a netCDF file
197  !
198  ! -52 :: [ <b>NF_ESTS </b> ]
199  ! <b></b> :: In Fortran, string too short
200  !
201  ! -53 :: [ <b>NF_EMAXNAME </b> ]
202  ! <b></b> :: NC_MAX_NAME exceeded
203  !
204  ! -54 :: [ <b>NF_EUNLIMIT </b> ]
205  ! <b></b> :: NC_UNLIMITED size already in use
206  !
207  ! -55 :: [ <b>NF_ENORECVARS </b> ]
208  ! <b></b> :: NC_rec op when there are no record vars
209  !
210  ! -56 :: [ <b>NF_ECHAR </b> ]
211  ! <b></b> :: Attempt to convert between text & numbers
212  !
213  ! -57 :: [ <b>NF_EEDGE </b> ]
214  ! <b></b> :: Edge+start exceeds dimension bound
215  !
216  ! -58 :: [ <b>NF_ESTRIDE </b> ]
217  ! <b></b> :: Illegal stride
218  !
219  ! -59 :: [ <b>NF_EBADNAME </b> ]
220  ! <b></b> :: Attribute or variable name contains illegal characters
221  !
222  ! -60 :: [ <b>NF_ERANGE </b> ]
223  ! <b></b> :: Numeric conversion not representable
224  !
225  ! -61 :: [ <b>NF_ENOMEM </b> ]
226  ! <b></b> :: Memory allocation (malloc) failure
227  !
228  ! -62 :: [ <b>NF_EVARSIZE </b> ]
229  ! <b></b> :: One or more variable sizes violate format constraints
230  !
231  ! -63 :: [ <b>NF_EDIMSIZE </b> ]
232  ! <b></b> :: Invalid dimension size
233  !
234  ! -64 :: [ <b>NF_ETRUNC </b> ]
235  ! <b></b> :: File likely truncated or possibly corrupted
236  !
237  ! -62〜-99:: <b> </b>
238  ! <b></b> :: (将来の netCDF の拡張のための gtool5 の予約領域.
239  ! Reserved area for future extensions of netCDF)
240  !
241  !=== gtool5 のデータ構造 (gtdata) に関するエラーコード
242  !=== Error codes for data structure of gtool5 (gtdata)
243  !
244  ! 以下のエラーコードに関しては dc_error モジュールを引用することで
245  ! 利用してください。
246  !
247  ! Use following error codes by refering this "dc_error" module.
248  !
249  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
250  !
251  ! -100 :: [ <b>GT_EFAKE </b> ]
252  ! <b></b> :: function not implemented
253  !
254  ! -101 :: [ <b>GT_ENOMOREDIMS </b> ]
255  ! <b></b> :: dimension number %d is out of range
256  !
257  ! -102 :: [ <b>GT_EDIMNODIM </b> ]
258  ! <b></b> :: dimension variable has no dimension
259  !
260  ! -103 :: [ <b>GT_EDIMMULTIDIM </b> ]
261  ! <b></b> :: dimension variable has many dimensions
262  !
263  ! -104 :: [ <b>GT_EDIMOTHERDIM </b> ]
264  ! <b></b> :: dimension variable has another dimension
265  !
266  ! -105 :: [ <b>GT_EBADDIMNAME </b> ]
267  ! <b></b> :: <i>cause_c</i>: unknown dimension name
268  !
269  ! -106 :: [ <b>GT_ENOTVAR </b> ]
270  ! <b></b> :: variable not opened
271  !
272  ! -107 :: [ <b>GT_ENOMEM </b> ]
273  ! <b></b> :: allocate/deallocate error
274  !
275  ! -108 :: [ <b>GT_EOTHERFILE </b> ]
276  ! <b></b> :: specified dimensional variable not on the same file
277  !
278  ! -109 :: [ <b>GT_EARGSIZEMISMATCH</b> ]
279  ! <b></b> :: arguments (<i>cause_c</i>) array size mismatch
280  !
281  ! -110 :: [ <b>GT_ENOMATCHDIM </b> ]
282  ! <b></b> :: dimension matching failed
283  !
284  ! -111 :: [ <b>GT_ELIMITED </b> ]
285  ! <b></b> :: variable already limited
286  !
287  ! -112 :: [ <b>GT_EBADVAR </b> ]
288  ! <b></b> :: variable type not supported
289  !
290  ! -113 :: [ <b>GT_ECHARSHORT </b> ]
291  ! <b></b> :: character length not enough
292  !
293  ! -114 :: [ <b>GT_ENOUNLIMITDIM </b> ]
294  ! <b></b> :: NC_UNLIMITED dimension is not found
295  !
296  ! -115 :: [ <b>GT_EBADATTRNAME </b> ]
297  ! <b></b> :: invalid attribute name
298  !
299  ! -116 :: [ <b>GT_EBADHISTORY </b> ]
300  ! <b></b> :: invalid GT_HISTORY variable
301  !
302  ! -117 :: [ <b>GT_EBADALLOCATESIZE</b> ]
303  ! <b></b> :: invalid allocated size
304  !
305  ! -118 :: [ <b>GT_ERANKMISMATCH</b> ]
306  ! <b></b> :: rank of data and argument is mismatch (<i>cause_c</i>)
307  ! -119 :: [ <b>GT_ENOTURL </b> ]
308  ! <b></b> :: URL (<i>cause_c</i>) is not found
309  !
310  ! -120 :: [ <b>GT_EBADGT4COMMAGRAPHY </b> ]
311  ! <b></b> :: (<i>cause_c</i>) is not gtool4 comma-graphy (ex. "time=100.0,x=10:20,y=^1:^5")
312  !
313  !
314  ! 〜-299 :: <b> </b>
315  ! <b></b> :: (将来の gtdata 層の拡張のための予約.
316  ! Reserved area for future extensions of gtdata layer)
317  !
318  !=== GrADS データ入出力に関するエラーコード
319  !=== Error codes for GrADS data I/O
320  !
321  ! 以下のエラーコードに関しては dc_error モジュールを引用することで
322  ! 利用してください。
323  !
324  ! Use following error codes by refering this "dc_error" module.
325  !
326  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
327  !
328  ! -300 :: [ <b>GR_ENOTGR </b> ]
329  ! <b></b> :: invalid GrADS file
330  !
331  ! 〜-399 :: <b> </b>
332  ! <b></b> :: (将来の GrADS data 入出力層の拡張のための予約.
333  ! Reserved area for future extensions of GrADS data I/O layer)
334  !
335  !=== DC ユーティリティ用エラーコード
336  !=== Error codes for DC utilities
337  !
338  ! 以下のエラーコードに関しては dc_error モジュールを引用することで
339  ! 利用してください。
340  !
341  ! Use following error codes by refering this "dc_error" module.
342  !
343  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
344  !
345  ! -400 :: [ <b>DC_ENOTINIT </b> ]
346  ! <b></b> :: object (<i>cause_c</i>) is not initialized
347  !
348  ! -401 :: [ <b>DC_EALREADYINIT </b> ]
349  ! <b></b> :: object (<i>cause_c</i>) is already initialized
350  !
351  ! -402 :: [ <b>DC_EBADUNIT</b> ]
352  ! <b></b> :: unit (<i>cause_c</i>) is invalid
353  !
354  ! -403 :: [ <b>DC_EBADCALTYPE</b> ]
355  ! <b></b> :: calendar type (<i>cause_i</i>) is invalid
356  !
357  ! -404 :: [ <b>DC_EBADTIMEZONE</b> ]
358  ! <b></b> :: time zone (<i>cause_c</i>) is invalid
359  !
360  ! -405 :: [ <b>DC_EFILENAMEEMPTY</b> ]
361  ! <b></b> :: filename is empty
362  !
363  ! -406 :: [ <b>DC_EBADFILEOPMODE</b> ]
364  ! <b></b> :: file open mode (<i>cause_c</i>) is invalid
365  !
366  ! -407 :: [ <b>DC_ENOUNITNUM</b> ]
367  ! <b></b> :: available unit number is not found within (<i>cause_c</i>)
368  !
369  ! -408 :: [ <b>DC_ENOFILEEXIST</b> ]
370  ! <b></b> :: file (<i>cause_c</i>) is not found
371  !
372  ! -409 :: [ <b>DC_ENOFILEREAD</b> ]
373  ! <b></b> :: file (<i>cause_c</i>) is not readable
374  !
375  ! -410 :: [ <b>DC_ENOFILEWRITE</b> ]
376  ! <b></b> :: file (<i>cause_c</i>) is not writable
377  !
378  ! -411 :: [ <b>DC_ENEGATIVE </b> ]
379  ! <b></b> :: negative value is invalid for (<i>cause_c</i>)
380  !
381  ! -412 :: [ <b>DC_EARGLACK </b> ]
382  ! <b></b> :: lack of arguments (<i>cause_c</i>)
383  !
384  ! -413 :: [ <b>DC_ENOASSOC </b> ]
385  ! <b></b> :: argument (<i>cause_c</i>) is not associated
386  !
387  ! -414 :: [ <b>DC_ENOENTRY </b> ]
388  ! <b></b> :: entry of (<i>cause_c</i>) is not found
389  !
390  ! -415 :: [ <b>DC_ENODIMTIME</b> ]
391  ! <b></b> :: dimensional time can not be converted into nondimensional time
392  !
393  ! -416 :: [ <b>DC_EDIMTIME</b> ]
394  ! <b></b> :: nondimensional time can not be converted into dimensional time
395  !
396  ! -417 :: [ <b>DC_ETOOLARGETIME</b> ]
397  ! <b></b> :: number is too large for time
398  !
399  ! -418 :: [ <b>DC_EBADDATE</b> ]
400  ! <b></b> :: invalid expression of date
401  !
402  ! -419 :: [ <b>DC_EINCONSISTCALDATE</b> ]
403  ! <b></b> :: calendar and date are inconsistent
404  !
405  !
406  ! -420〜-499 :: <b> </b>
407  ! <b></b> :: (将来の DC ユーティリティの拡張のための予約.
408  ! Reserved area for future extensions of DC utilities)
409  !
410  !=== データ入出力層 (gtool_history, gtool_history_nmlinfo, gtool_historyauto) エラーコード
411  !=== Error codes for data I/O layer (gtool_history, gtool_history_nmlinfo, gtool_historyauto)
412  !
413  ! 以下のエラーコードに関しては dc_error モジュールを引用することで
414  ! 利用してください。
415  !
416  ! Use following error codes by refering this "dc_error" module.
417  !
418  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
419  !
420  ! -500 :: [ <b>HST_ENOTINDEFINE</b> ]
421  ! <b></b> :: operation (<i>cause_c</i>) not allowed in data mode
422  !
423  ! -501 :: [ <b>HST_EINDEFINE </b> ]
424  ! <b></b> :: operation (<i>cause_c</i>) not allowed in define mode
425  !
426  ! -502 :: [ <b>HST_EINTFILE </b> ]
427  ! <b></b> :: different intervals are applied to a file (<i>cause_c</i>)
428  ! -503 :: [ <b>HST_EBADNAME </b> ]
429  ! <b></b> :: name (<i>cause_c</i>) is invalid
430  !
431  ! -504 :: [ <b>HST_ENOTTERMGTHIST </b> ]
432  ! <b></b> :: GT_HISTORY correspond to (<i>cause_c</i>) is not terminated
433  !
434  ! -505 :: [ <b>HST_ENODEPENDTIME </b> ]
435  ! <b></b> :: (<i>cause_c</i>) does not depend on time
436  !
437  ! -506 :: [ <b>HST_EBADVARNAME </b> ]
438  ! <b></b> :: variable name (<i>cause_c</i>) is invalid
439  !
440  ! -507 :: [ <b>HST_ENOTIMEDIM </b> ]
441  ! <b></b> :: time dimension is not found
442  !
443  ! -508 :: [ <b>HST_ENOAXISNAME </b> ]
444  ! <b></b> :: axis or weight (<i>cause_c</i>) is not found
445  !
446  ! -509 :: [ <b>HST_EVARINUSE </b> ]
447  ! <b></b> :: variable name (<i>cause_c</i>) is already used
448  !
449  ! -510 :: [ <b>HST_EALREADYREGVARFIX </b> ]
450  ! <b></b> :: already register of variables is fixed by (<i>cause_c</i>)
451  !
452  ! -511 :: [ <b>HST_EBADSLICE </b> ]
453  ! <b></b> :: slice options are invalid (<i>cause_c</i>)
454  !
455  ! -512 :: [ <b>HST_EBADNEWFILEINT </b> ]
456  ! <b></b> :: invalid newfile interval (<i>cause_c</i>)
457  !
458  ! -513 :: [ <b>HST_EMAXDIMSDEPENDED </b> ]
459  ! <b></b> :: variable (<i>cause_c</i>) depends on (<i>cause_i</i>) dimensions
460  !
461  ! -514 :: [ <b>HST_EINDIVISIBLE </b> ]
462  ! <b></b> :: (<i>cause_c</i>) can not be divided
463  !
464  ! -515 :: [ <b>HST_EBADTERMINUS </b> ]
465  ! <b></b> :: terminus options are invalid (<i>cause_c</i>)
466 
467  ! -516 :: [ <b>HST_EBADORIGIN </b> ]
468  ! <b></b> :: origin options are invalid (<i>cause_c</i>)
469  !
470  ! -517 :: [ <b>HST_EMPINOAXISDATA </b> ]
471  ! <b></b> :: data of axis (<i>cause_c</i>) for MPI is lack
472  !
473  !=== gtool5 の将来の拡張のために予約してあるエラーコード
474  !=== Reserved error codes for future extensions of gtool5
475  !
476  ! 以下のエラーコードは今後の拡張も考えて予約してある部分です。
477  !
478  ! Following error codes are reserved for future extensions.
479  !
480  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
481  !
482  ! -600〜-999 :: <b> </b>
483  ! <b></b> :: (将来の gtool5 の拡張のための予約.
484  ! Reserved area for future extensions of gtool5)
485  !
486  !=== ユーザ定義用エラーコード
487  !=== User-defined error codes
488  !
489  ! -1000 よりも小さいエラーコードは、
490  ! gtool5 の上位のプログラムが利用するエラーコードとして空けてあります。
491  !
492  ! Error codes smaller than -1000 are saved for as user-defined error codes
493  ! used by upper programs.
494  !
495  ! <b>数値. Number</b> :: <b> [ ニーモニック. Mnemonic ] エラーメッセージ. Error message</b>
496  !
497  ! -1000〜 :: [ <b>USR_ERRNO </b> ]
498  ! <b></b> :: <i>cause_c</i> (<i>cause_i</i>)
499  !
500 
501  use netcdf, only: nf90_enotvar, nf90_einval
502  use dc_types, only: string
503  implicit none
504  private
505  public :: nf90_enotvar, nf90_einval
506 
507  ! エラー等を保持
508 
509  integer, public, parameter :: dc_noerr = 0
510  integer, private, save :: errno = dc_noerr
511  integer, private, save :: cause_int = dc_noerr
512  logical, private, save :: cause_int_valid = .false.
513  character(STRING), private, save :: cause_string = ""
514  character(STRING), private, save :: cause_location = ""
515 
516  ! 正のエラー番号は libc システムエラーメッセージのために
517  ! あけてある。システム依存性が大きく、非常に大きな数値も
518  ! 用いられるので空き領域を確保するのは困難である。
519  !
520  ! 負のエラー番号は netCDF が使っている。少々の拡張も見込んで、
521  ! -99 までは使わないで置く。
522 
523  integer, parameter, public:: gt_efake = -100
524 
525  !
526  ! -101 以下: データ構造のエラー
527  !
528  integer, parameter, public:: gt_enomoredims = -101
529  integer, parameter, public:: gt_edimnodim = -102
530  integer, parameter, public:: gt_edimmultidim = -103
531  integer, parameter, public:: gt_edimotherdim = -104
532  integer, parameter, public:: gt_ebaddimname = -105
533  integer, parameter, public:: gt_enotvar = -106
534  integer, parameter, public:: gt_enomem = -107
535  integer, parameter, public:: gt_eotherfile = -108
536  integer, parameter, public:: gt_eargsizemismatch = -109
537  integer, parameter, public:: gt_enomatchdim = -110
538  integer, parameter, public:: gt_elimited = -111
539  integer, parameter, public:: gt_ebadvar = -112
540  integer, parameter, public:: gt_echarshort = -113
541  integer, parameter, public:: gt_enounlimitdim = -114
542  integer, parameter, public:: gt_ebadattrname = -115
543  integer, parameter, public:: gt_ebadhistory = -116
544  integer, parameter, public:: gt_ebadallocatesize = -117
545  integer, parameter, public:: gt_erankmismatch = -118
546  integer, parameter, public:: gt_enoturl = -119
547  integer, parameter, public:: gt_ebadgt4commagraphy = -120
548 
549  !
550  ! -300 以下: GrADS 入出力のエラー
551  !
552  integer, parameter, public:: gr_enotgr = -300
553 
554  !
555  ! -400 以下: dc ユーティリティのエラー
556  !
557  integer, parameter, public:: dc_enotinit = -400
558  integer, parameter, public:: dc_ealreadyinit = -401
559  integer, parameter, public:: dc_ebadunit = -402
560  integer, parameter, public:: dc_ebadcaltype = -403
561  integer, parameter, public:: dc_ebadtimezone = -404
562  integer, parameter, public:: dc_efilenameempty = -405
563  integer, parameter, public:: dc_ebadfileopmode = -406
564  integer, parameter, public:: dc_enounitnum = -407
565  integer, parameter, public:: dc_enofileexist = -408
566  integer, parameter, public:: dc_enofileread = -409
567  integer, parameter, public:: dc_enofilewrite = -410
568  integer, parameter, public:: dc_enegative = -411
569  integer, parameter, public:: dc_earglack = -412
570  integer, parameter, public:: dc_enoassoc = -413
571  integer, parameter, public:: dc_enoentry = -414
572  integer, parameter, public:: dc_enodimtime = -415
573  integer, parameter, public:: dc_edimtime = -416
574  integer, parameter, public:: dc_etoolargetime = -417
575  integer, parameter, public:: dc_ebaddate = -418
576  integer, parameter, public:: dc_einconsistcaldate = -419
577 
578  !
579  ! -500 以下: データ入出力層のエラー
580  !
581  integer, parameter, public:: hst_enotindefine = -500
582  integer, parameter, public:: hst_eindefine = -501
583  integer, parameter, public:: hst_eintfile = -502
584  integer, parameter, public:: hst_ebadname = -503
585  integer, parameter, public:: hst_enottermgthist = -504
586  integer, parameter, public:: hst_enodependtime = -505
587  integer, parameter, public:: hst_ebadvarname = -506
588  integer, parameter, public:: hst_enotimedim = -507
589  integer, parameter, public:: hst_enoaxisname = -508
590  integer, parameter, public:: hst_evarinuse = -509
591  integer, parameter, public:: hst_ealreadyregvarfix = -510
592  integer, parameter, public:: hst_ebadslice = -511
593  integer, parameter, public:: hst_ebadnewfileint = -512
594  integer, parameter, public:: hst_emaxdimsdepended = -513
595  integer, parameter, public:: hst_eindivisible = -514
596  integer, parameter, public:: hst_ebadterminus = -515
597  integer, parameter, public:: hst_ebadorigin = -516
598  integer, parameter, public:: hst_empinoaxisdata = -517
599 
600 
601  !
602  ! -1000 以下: ユーザー定義
603  !
604  integer, parameter, public:: usr_errno = -1000
605 
607  !
608  ! === 手続引用仕様 ===
609  !
610  ! いずれ差し替えられるように外部関数にしておく。
611 
612  interface
613  subroutine dumperror()
614  end subroutine dumperror
615  end interface
616 
617 contains
618 
619  integer function errorcode() result(result)
620  !
621  ! 現在設定されているエラーコードを返します。
622  !
623  ! Return an error code specified currently.
624  !
625  result = errno
626  end function errorcode
627 
628  subroutine geterrormessage(msg)
629  !
630  ! 現在設定されているエラーコードから対応するメッセージを返します。
631  !
632  ! Return messages corresponding to an error code specified currently.
633  !
634  use netcdf, only: nf90_strerror
635  character(len = *), intent(out):: msg
636  character(len = STRING):: message
637  character(len = 20):: errno_c
638  character(len = 20):: cause_int_c
639  continue
640  select case(errno)
641  case(gt_efake)
642  msg = ' function not implemented'
643  !
644  ! -101 以下: データ構造のエラー
645  ! -101 or less: Error of data structure
646  !
647  case(gt_enomoredims)
648  write(message, "(': dimension number', i4, ' is out of range')") cause_int
649  msg = trim(message)
650  case(gt_ebaddimname)
651  msg = '(' // trim(cause_string) // '): unknown dimension name'
652  case(gt_enotvar)
653  msg = ' variable not opened'
654  case(gt_enomem)
655  msg = ' allocate/deallocate error'
656  case(gt_edimnodim)
657  msg = ' dimension variable has no dimension'
658  case(gt_edimmultidim)
659  msg = ' dimension variable has many dimensions'
660  case(gt_edimotherdim)
661  msg = ' dimension variable has another dimension'
662  case(gt_eotherfile)
663  msg = ' specified dimensional variable not on the same file'
664  case(gt_eargsizemismatch)
665  msg = ' arguments (' // trim(cause_string) //') array size mismatch'
666  case(gt_enomatchdim)
667  msg = ' dimension matching failed'
668  case(gt_elimited)
669  msg = ' variable already limited'
670  case(gt_ebadvar)
671  msg = ' variable type not supported'
672  case(gt_echarshort)
673  msg = ' character length not enough'
674  case(gt_enounlimitdim)
675  msg = ' NC_UNLIMITED dimension is not found'
676  case(gt_ebadattrname)
677  msg = ' invalid attribute name'
678  case(gt_ebadallocatesize)
679  msg = ' invalid allocated size'
680  case(gt_erankmismatch)
681  msg = ' rank of data and argument are mismatch (' // trim(cause_string) // ')'
682  case(gt_enoturl)
683  msg = ' URL (' // trim(cause_string) // ') is not found'
685  msg = ' (' // trim(cause_string) // ') is not gtool4 comma-graphy (ex. "time=100.0,x=10:20,y=^1:^5")'
686  !
687  ! -300 以下: GrADS 入出力のエラー
688  ! -300 or less: Error of GrADS I/O
689  !
690  case(gr_enotgr)
691  msg = ' invalid GrADS file'
692  !
693  ! -400 以下: DC ユーティリティのエラー
694  ! -400 or less: Error of DC utilities
695  !
696  case(dc_enotinit)
697  msg = ' object (' // trim(cause_string) // ') is not initialized'
698  case(dc_ealreadyinit)
699  msg = ' object (' // trim(cause_string) // ') is already initialized'
700  case(dc_ebadunit)
701  msg = ' unit (' // trim(cause_string) // ') is invalid'
702  case(dc_ebadcaltype)
703  write(message, '(" calendar type (", i4, ") is invalid")') cause_int
704  msg = trim(message)
705  case(dc_ebadtimezone)
706  msg = ' time zone (' // trim(cause_string) // ') is invalid'
707  case(dc_efilenameempty)
708  msg = ' filename is empty'
709  case(dc_ebadfileopmode)
710  msg = ' file open mode (' // trim(cause_string) // ') is invalid'
711  case(dc_enounitnum)
712  msg = ' available unit number is not found within (' // trim(cause_string) // ')'
713  case(dc_enofileexist)
714  msg = ' file (' // trim(cause_string) // ') is not found'
715  case(dc_enofileread)
716  msg = ' file (' // trim(cause_string) // ') is not readable'
717  case(dc_enofilewrite)
718  msg = ' file (' // trim(cause_string) // ') is not writable'
719  case(dc_enegative)
720  msg = ' negative value is invalid for (' // trim(cause_string) // ')'
721  case(dc_earglack)
722  msg = ' lack of arguments (' // trim(cause_string) // ')'
723  case(dc_enoassoc)
724  msg = ' argument (' // trim(cause_string) // ') is not associated'
725  case(dc_enoentry)
726  msg = ' entry of (' // trim(cause_string) // ') is not found'
727  case(dc_enodimtime)
728  msg = ' dimensional time can not be converted into nondimensional time'
729  case(dc_edimtime)
730  msg = ' nondimensional time can not be converted into dimensional time'
731  case(dc_etoolargetime)
732  msg = ' number is too large for time'
733  case(dc_ebaddate)
734  msg = ' invalid expression of date'
736  msg = ' calendar and date are inconsistent'
737  !
738  ! -500 以下: データ入出力層のエラー
739  ! -500 or less: Error of data I/O layer
740  !
741  case(hst_enotindefine)
742  msg = ' operation (' // trim(cause_string) // ') not allowed in data mode'
743  case(hst_eindefine)
744  msg = ' operation (' // trim(cause_string) // ') not allowed in define mode'
745  case(hst_eintfile)
746  msg = ' different intervals are applied to a file (' // trim(cause_string) // ')'
747  case(hst_ebadname)
748  msg = ' name (' // trim(cause_string) // ') is invalid'
749  case(hst_enottermgthist)
750  msg = ' GT_HISTORY correspond to (' // trim(cause_string) // ') is not terminated'
751  case(hst_enodependtime)
752  msg = ' (' // trim(cause_string) // ') does not depend on time'
753  case(hst_ebadvarname)
754  msg = ' variable name (' // trim(cause_string) // ') is invalid'
755  case(hst_enotimedim)
756  msg = ' time dimension is not found'
757  case(hst_enoaxisname)
758  msg = ' axis or weight (' // trim(cause_string) // ') is not found'
759  case(hst_evarinuse)
760  msg = ' variable name (' // trim(cause_string) // ') is already used'
762  msg = ' already register of variables is fixed by (' // trim(cause_string) // ')'
763  case(hst_ebadslice)
764  msg = ' slice options are invalid (' // trim(cause_string) // ')'
765  case(hst_ebadnewfileint)
766  msg = ' invalid newfile interval (' // trim(cause_string) // ')'
768  write(message, '("(", i4, ")")') cause_int
769  msg = trim(message)
770  msg = ' variable (' // trim(cause_string) // ') depends on ' // trim(message) // ' dimensions'
771  case(hst_eindivisible)
772  msg = ' (' // trim(cause_string) // ') can not be divided'
773  case(hst_ebadterminus)
774  msg = ' terminus options are invalid (' // trim(cause_string) // ')'
775  case(hst_ebadorigin)
776  msg = ' origin options are invalid (' // trim(cause_string) // ')'
777  case(hst_empinoaxisdata)
778  msg = ' data of axis (' // trim(cause_string) // ') for MPI is lack'
779 
780  !
781  !
782  ! -1000 以下: ユーザー定義
783  ! -1000 or less: User-defined error
784  !
785  case(:usr_errno)
786  if (len(trim(adjustl(cause_string))) < 1) then
787  cause_string = 'Unknown error'
788  end if
789  if (cause_int_valid) then
790  write(cause_int_c, "(i8)") cause_int
791  msg = trim(cause_string) // ' (' // trim(adjustl(cause_int_c)) // ')'
792  else
793  msg = trim(cause_string)
794  end if
795  case default
796  goto 999
797  end select
798  write(errno_c, "(i8)") errno
799  msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // &
800  & ') [' // trim(cause_location) // '] *** ' // &
801  & trim(msg)
802  return
803 
804 999 continue
805  if (len(cause_string) > 0) then
806  message = nf90_strerror(errno)
807  write(errno_c, "(i8)") errno
808  msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // &
809  & ') [' // trim(cause_location) // &
810  & '(' // trim(cause_string) // ')] *** ' // &
811  & trim(message)
812  else if (cause_int_valid) then
813  message = nf90_strerror(errno)
814  write(errno_c, "(i8)") errno
815  write(cause_int_c, "(i8)") cause_int
816  msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // &
817  & ') [' // trim(cause_location) // &
818  & '(' // trim(adjustl(cause_int_c)) // ')] *** ' // &
819  & trim(message)
820  else
821  message = nf90_strerror(errno)
822  write(errno_c, "(i8)") errno
823  msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // &
824  & ') [' // trim(cause_location) // '] *** ' // &
825  & trim(message)
826  endif
827  end subroutine geterrormessage
828 
829  subroutine storeerror(number, where, err, cause_c, cause_i)
830  !
831  !== 典型的ライブラリ手続のために作られたエラー処理サブルーチン
832  !== Error handling subroutine for typical procedures of library
833  !
834  ! 必要な引数は2つであり、第1引数 *number* には整数型のエラーコード、
835  ! 第2引数 *where* には文字型でエラーの発生した手続名を与えます。
836  ! デフォルトでは以下の形式の文字列が標準出力に表示されてプログラム
837  ! は終了します。 エラーメッセージ error_message
838  ! はエラーコードから自動的に決まります。
839  ! 対応表がエラーコード一覧にあるので参照してください。
840  !
841  ! Number of necessary arguments is two. Give integer error code
842  ! to first argument *number*, and procedure name where the error
843  ! occurs to second argument *where*. By default, like a following
844  ! string is displayed to standard output, and the program aborts
845  ! Error message <error_message> is determined by error code automatically.
846  ! See error code list.
847  !
848  !
849  ! *** ERROR (Code number) [where] *** error_message
850  !
851  ! *** ERROR (Code number) [where(cause_c)] *** error_message
852  !
853  ! なお、gtool5 のライブラリ外からユーザがエラー処理用ツール
854  ! として StoreError を用いることを想定し、<b><tt>USR_ERRNO</tt></b>
855  ! 番より小さい
856  ! エラーコードは空けてあります。<b><tt>USR_ERRNO</tt></b>
857  ! より小さい値をエラーコードに与えると,
858  ! StoreError は以下の形式の文字列を標準出力に出力してプログラムを
859  ! 終了させます。より安易に使えるメッセージ出力およびエラー発生の
860  ! ためのモジュールとして *dc_message* も用意してあるので
861  ! そちらも参照してください。
862  !
863  ! In addition, for usage that users call StoreError as an error
864  ! handling tool from the outside of gtool5 library,
865  ! error codes smaller than <b><tt>USR_ERRNO</tt></b> is saved.
866  ! When error codes smaller than <b><tt>USR_ERRNO</tt></b> is given,
867  ! StoreError displays like a following string to standard output,
868  ! and stops the program.
869  ! *dc_message* module is prepared too. This module can be used
870  ! more easily for message output and rise of error.
871  !
872  !
873  ! *** ERROR (Code number) [where] *** cause_c
874  !
875  ! *** ERROR (Code number) [where] *** cause_c (cause_i)
876  !
877  !--
878  !== 開発者向け解説
879  !
880  ! エラー番号 number を errno に格納する。同時に付随的情報
881  ! where, cause_i を cause_location, cause_string,
882  ! cause_int に格納する。
883  ! err が与えられている場合、err は number が DC_NOERR の場合だけ偽になる。
884  ! number が DC_NOERR ならば即復帰する。
885  ! err が与えられていなければエラーメッセージを装置 * に出力して
886  ! プログラムを終了する。
887  !++
888 
889  integer, intent(in) :: number
890  ! エラーコード。
891  ! Error code
892  character(len = *), intent(in) :: where
893  ! エラー発生個所。
894  ! Place where error occurs
895  logical, intent(out), optional :: err
896  ! 例外処理用フラグ。
897  ! デフォルトでは、*number* に非エラーコード
898  ! 以外の値が与えられた場合、エラーメッセージを
899  ! 表示してプログラムは強制終了します。
900  ! 引数 *err* が与えられる場合、
901  ! プログラムは強制終了せず、代わりに
902  ! *err* に .true. が代入されます。
903  !
904  ! Exception handling flag.
905  ! By default, when error code (excluding
906  ! non error code) is given to *number*,
907  ! the program display error message and aborts.
908  ! If this *err* argument is given,
909  ! .true. is substituted to *err* and
910  ! the program does not abort.
911  character(len = *), intent(in), optional :: cause_c
912  ! 文字型メッセージ。
913  ! Character message
914  integer, intent(in), optional :: cause_i
915  ! 整数型メッセージ。
916  ! Integer message
917  continue
918  if (present(err)) then
919  err = (number /= dc_noerr)
920  return
921  endif
922  if (number == dc_noerr) return
923  errno = number
924  cause_location = where
925  if (present(cause_c)) then
926  cause_string = trim(cause_c)
927  else
928  cause_string = ""
929  endif
930  if (present(cause_i)) then
931  cause_int = cause_i
932  cause_int_valid = .true.
933  else
934  cause_int_valid = .false.
935  end if
936  call dumperror
937  end subroutine storeerror
938 
939 end module dc_error
940 
941 subroutine dumperror()
942  !
943  ! GetErrorMessage からエラーメッセージを取得後、
944  ! それを sysdep#AbortProgram に渡してプログラムを終了させます。
945  !
946  ! Get error messages from "GetErrorMessage", and put the messages
947  ! to sysdep#AbortProgram, and stop the program.
948  !
949  use dc_types, only: string
950  use dc_error, only: geterrormessage
951  use sysdep, only: abortprogram
952  character(len = STRING):: message
953 continue
954  call geterrormessage(message)
955  call abortprogram(message)
956 end subroutine dumperror
integer, parameter, public dc_earglack
Definition: dc_error.f90:569
integer, parameter, public dc_enofilewrite
Definition: dc_error.f90:567
integer, parameter, public usr_errno
Definition: dc_error.f90:604
integer, parameter, public dc_enounitnum
Definition: dc_error.f90:564
integer, parameter, public dc_enofileexist
Definition: dc_error.f90:565
integer, parameter, public hst_enotindefine
Definition: dc_error.f90:581
integer, parameter, public dc_enotinit
Definition: dc_error.f90:557
integer, parameter, public hst_enodependtime
Definition: dc_error.f90:586
integer, parameter, public hst_eindivisible
Definition: dc_error.f90:595
integer, parameter, public dc_enofileread
Definition: dc_error.f90:566
integer, parameter, public gt_ebadgt4commagraphy
Definition: dc_error.f90:547
integer, parameter, public gt_enotvar
Definition: dc_error.f90:533
integer, parameter, public gt_erankmismatch
Definition: dc_error.f90:545
integer, parameter, public hst_emaxdimsdepended
Definition: dc_error.f90:594
integer, parameter, public hst_eintfile
Definition: dc_error.f90:583
subroutine, public geterrormessage(msg)
Definition: dc_error.f90:629
integer, parameter, public gt_efake
Definition: dc_error.f90:523
integer, parameter, public hst_ealreadyregvarfix
Definition: dc_error.f90:591
integer, parameter, public dc_ebadtimezone
Definition: dc_error.f90:561
integer, parameter, public gt_enomatchdim
Definition: dc_error.f90:537
integer, parameter, public hst_evarinuse
Definition: dc_error.f90:590
integer, parameter, public hst_empinoaxisdata
Definition: dc_error.f90:598
integer, parameter, public dc_etoolargetime
Definition: dc_error.f90:574
integer, parameter, public gt_edimnodim
Definition: dc_error.f90:529
integer, parameter, public dc_ebaddate
Definition: dc_error.f90:575
integer, parameter, public gt_enomem
Definition: dc_error.f90:534
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition: dc_error.f90:830
integer, parameter, public gt_ebadvar
Definition: dc_error.f90:539
integer, parameter, public dc_noerr
Definition: dc_error.f90:509
integer, parameter, public hst_enotimedim
Definition: dc_error.f90:588
character(string), save, private cause_string
Definition: dc_error.f90:513
integer, parameter, public hst_eindefine
Definition: dc_error.f90:582
integer, parameter, public hst_ebadterminus
Definition: dc_error.f90:596
integer, parameter, public gt_eotherfile
Definition: dc_error.f90:535
integer, parameter, public gt_enoturl
Definition: dc_error.f90:546
integer, parameter, public hst_ebadvarname
Definition: dc_error.f90:587
integer, save, private errno
Definition: dc_error.f90:510
integer, parameter, public hst_ebadslice
Definition: dc_error.f90:592
integer, parameter, public hst_ebadnewfileint
Definition: dc_error.f90:593
integer, save, private cause_int
Definition: dc_error.f90:511
integer, parameter, public dc_einconsistcaldate
Definition: dc_error.f90:576
integer, parameter, public gt_ebadallocatesize
Definition: dc_error.f90:544
integer, parameter, public dc_ebadunit
Definition: dc_error.f90:559
integer, parameter, public dc_enoentry
Definition: dc_error.f90:571
integer, parameter, public hst_enottermgthist
Definition: dc_error.f90:585
integer, parameter, public gt_eargsizemismatch
Definition: dc_error.f90:536
integer function, public errorcode()
Definition: dc_error.f90:620
種別型パラメタを提供します。
Definition: dc_types.f90:49
integer, parameter, public hst_enoaxisname
Definition: dc_error.f90:589
integer, parameter, public dc_ebadcaltype
Definition: dc_error.f90:560
integer, parameter, public dc_edimtime
Definition: dc_error.f90:573
integer, parameter, public gt_echarshort
Definition: dc_error.f90:540
integer, parameter, public gt_ebadattrname
Definition: dc_error.f90:542
subroutine dumperror()
Definition: dc_error.f90:942
integer, parameter, public dc_enoassoc
Definition: dc_error.f90:570
integer, parameter, public hst_ebadname
Definition: dc_error.f90:584
integer, parameter, public gr_enotgr
Definition: dc_error.f90:552
integer, parameter, public gt_ebadhistory
Definition: dc_error.f90:543
integer, parameter, public gt_ebaddimname
Definition: dc_error.f90:532
integer, parameter, public dc_enodimtime
Definition: dc_error.f90:572
integer, parameter, public gt_edimmultidim
Definition: dc_error.f90:530
character(string), save, private cause_location
Definition: dc_error.f90:514
integer, parameter, public gt_enomoredims
Definition: dc_error.f90:528
integer, parameter, public gt_elimited
Definition: dc_error.f90:538
integer, parameter, public dc_ebadfileopmode
Definition: dc_error.f90:563
integer, parameter, public dc_efilenameempty
Definition: dc_error.f90:562
integer, parameter, public gt_enounlimitdim
Definition: dc_error.f90:541
integer, parameter, public dc_ealreadyinit
Definition: dc_error.f90:558
integer, parameter, public hst_ebadorigin
Definition: dc_error.f90:597
integer, parameter, public dc_enegative
Definition: dc_error.f90:568
integer, parameter, public gt_edimotherdim
Definition: dc_error.f90:531
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition: dc_types.f90:118
logical, save, private cause_int_valid
Definition: dc_error.f90:512