Loading...
Searching...
No Matches
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!
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
617contains
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'
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'
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'
708 msg = ' filename is empty'
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'
750 msg = ' GT_HISTORY correspond to (' // trim(cause_string) // ') is not terminated'
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) // ')'
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) // ')'
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
804999 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
939end module dc_error
940
941subroutine 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
953continue
954 call geterrormessage(message)
955 call abortprogram(message)
956end subroutine dumperror
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition dc_error.f90:830
integer, parameter, public gt_ebadhistory
Definition dc_error.f90:543
integer, parameter, public gt_ebadvar
Definition dc_error.f90:539
integer, parameter, public usr_errno
Definition dc_error.f90:604
integer, parameter, public gt_enomatchdim
Definition dc_error.f90:537
integer, parameter, public gt_edimotherdim
Definition dc_error.f90:531
integer, parameter, public gt_echarshort
Definition dc_error.f90:540
integer, parameter, public gt_eotherfile
Definition dc_error.f90:535
integer, parameter, public dc_ebadunit
Definition dc_error.f90:559
integer, parameter, public hst_enottermgthist
Definition dc_error.f90:585
integer, parameter, public gt_enomem
Definition dc_error.f90:534
integer, parameter, public dc_enoassoc
Definition dc_error.f90:570
integer, parameter, public hst_ebadslice
Definition dc_error.f90:592
integer, parameter, public gr_enotgr
Definition dc_error.f90:552
integer, parameter, public dc_enodimtime
Definition dc_error.f90:572
integer function, public errorcode()
Definition dc_error.f90:620
integer, parameter, public hst_ebadvarname
Definition dc_error.f90:587
integer, parameter, public dc_enotinit
Definition dc_error.f90:557
integer, parameter, public dc_ealreadyinit
Definition dc_error.f90:558
integer, parameter, public gt_enounlimitdim
Definition dc_error.f90:541
integer, parameter, public gt_efake
Definition dc_error.f90:523
integer, parameter, public dc_ebadfileopmode
Definition dc_error.f90:563
integer, parameter, public hst_eintfile
Definition dc_error.f90:583
integer, parameter, public dc_earglack
Definition dc_error.f90:569
integer, parameter, public gt_edimnodim
Definition dc_error.f90:529
integer, parameter, public hst_enoaxisname
Definition dc_error.f90:589
integer, parameter, public hst_ebadorigin
Definition dc_error.f90:597
integer, parameter, public gt_ebaddimname
Definition dc_error.f90:532
integer, parameter, public dc_noerr
Definition dc_error.f90:509
integer, parameter, public dc_enegative
Definition dc_error.f90:568
integer, parameter, public dc_etoolargetime
Definition dc_error.f90:574
integer, parameter, public gt_erankmismatch
Definition dc_error.f90:545
integer, parameter, public hst_ealreadyregvarfix
Definition dc_error.f90:591
integer, parameter, public hst_eindefine
Definition dc_error.f90:582
integer, parameter, public dc_enofileread
Definition dc_error.f90:566
integer, parameter, public gt_ebadgt4commagraphy
Definition dc_error.f90:547
integer, parameter, public hst_ebadterminus
Definition dc_error.f90:596
integer, parameter, public hst_enodependtime
Definition dc_error.f90:586
integer, parameter, public gt_eargsizemismatch
Definition dc_error.f90:536
integer, parameter, public gt_ebadallocatesize
Definition dc_error.f90:544
integer, parameter, public gt_edimmultidim
Definition dc_error.f90:530
integer, parameter, public gt_ebadattrname
Definition dc_error.f90:542
integer, parameter, public dc_efilenameempty
Definition dc_error.f90:562
integer, parameter, public gt_elimited
Definition dc_error.f90:538
integer, parameter, public gt_enotvar
Definition dc_error.f90:533
integer, parameter, public hst_emaxdimsdepended
Definition dc_error.f90:594
integer, parameter, public hst_eindivisible
Definition dc_error.f90:595
integer, parameter, public dc_ebaddate
Definition dc_error.f90:575
integer, parameter, public hst_empinoaxisdata
Definition dc_error.f90:598
integer, parameter, public dc_ebadcaltype
Definition dc_error.f90:560
integer, parameter, public hst_evarinuse
Definition dc_error.f90:590
integer, parameter, public dc_ebadtimezone
Definition dc_error.f90:561
integer, parameter, public hst_enotindefine
Definition dc_error.f90:581
integer, parameter, public dc_enofilewrite
Definition dc_error.f90:567
integer, parameter, public dc_edimtime
Definition dc_error.f90:573
integer, parameter, public dc_enofileexist
Definition dc_error.f90:565
integer, parameter, public gt_enoturl
Definition dc_error.f90:546
integer, parameter, public gt_enomoredims
Definition dc_error.f90:528
integer, parameter, public dc_enounitnum
Definition dc_error.f90:564
integer, parameter, public hst_ebadname
Definition dc_error.f90:584
integer, parameter, public dc_enoentry
Definition dc_error.f90:571
subroutine, public geterrormessage(msg)
Definition dc_error.f90:629
integer, parameter, public hst_enotimedim
Definition dc_error.f90:588
integer, parameter, public dc_einconsistcaldate
Definition dc_error.f90:576
integer, parameter, public hst_ebadnewfileint
Definition dc_error.f90:593
Provides kind type parameter values.
Definition dc_types.f90:49
integer, parameter, public string
Character length for string
Definition dc_types.f90:118
subroutine, public abortprogram(message)
Definition sysdep.f90:57