10 use,
intrinsic :: iso_c_binding
29 CHARACTER(LEN=LINE_LENGTH),
DIMENSION(LINE_COUNT) ::
err_msg 32 INTEGER,
PARAMETER,
PRIVATE :: max_call_depth = 16
34 INTEGER,
PRIVATE :: call_depth
37 CHARACTER(LEN=128),
DIMENSION(MAX_CALL_DEPTH),
PRIVATE :: callers
40 LOGICAL,
PRIVATE :: scr_log
85 CHARACTER(len=255) :: LOGFILE
86 CHARACTER(len=255) :: FILE_NAME
103 dmp_log = (mype == pe_io) .OR. enable_dmp_log
105 scr_log = (mype == pe_io) .AND.
full_log 112 IF(mype == pe_io)
WRITE (*, 1000)
'short' 115 ELSEIF(nb + 10 > len(logfile))
THEN 116 IF(mype == pe_io)
WRITE (*, 1000)
'long' 121 IF(
numpes == 1 .OR. .NOT.enable_dmp_log)
THEN 122 WRITE(logfile,
"(A)")
run_name(1:(nb-1))
124 WRITE(logfile,
"(A,'_',I1.1)")
run_name(1:(nb-1)), mype
126 WRITE(logfile,
"(A,'_',I2.2)")
run_name(1:(nb-1)), mype
127 ELSEIF(
numpes < 1000)
THEN 128 WRITE(logfile,
"(A,'_',I3.3)")
run_name(1:(nb-1)), mype
129 ELSEIF(
numpes < 10000)
THEN 130 WRITE(logfile,
"(A,'_',I4.4)")
run_name(1:(nb-1)), mype
132 WRITE(logfile,
"(A,'_',I8.8)")
run_name(1:(nb-1)), mype
139 nb = len_trim(logfile)+1
141 'APPEND',
'SEQUENTIAL',
'FORMATTED', 132, ier(mype))
147 IF(sum(ier) /= 0)
THEN 148 IF(mype == pe_io)
WRITE(*,1001) trim(file_name)
154 1000
FORMAT(2/,1x,70(
'*')/
' From: INIT_ERROR_MANAGER',/ &
155 ' Error 1000: RUN_NAME too ',a,
'. Please correct the', &
156 ' mfix.dat file.',/1x,70(
'*'),2/)
158 1001
FORMAT(2/,1x,70(
'*')/
' From: INIT_ERROR_MANAGER',/ &
159 ' Error 1001: Failed to open log file: ',a,/
' Aborting run.'/,&
181 CHARACTER(LEN=*),
intent(IN) :: CALLER
185 IF(call_depth + 1 > max_call_depth)
THEN 186 IF(scr_log)
WRITE(*,1000) call_depth
187 IF(dmp_log)
WRITE(
unit_log,1000) call_depth
192 call_depth = call_depth + 1
193 callers(call_depth) = trim(caller)
201 1000
FORMAT(/1x,70(
'*')/
' From: ERROR_MANAGER --> INIT_ERR_MSG',/ &
202 ' Error 1000: Invalid ERROR_MANAGER usage. The maximum call', &
203 ' depth ',/
' was exceeded. The calls to INIT_ERR_MSG should', &
204 ' have corresponding',/
' calls to FINL_ERR_MSG. The current', &
205 ' CALL tree depth is: ',i4)
227 CHARACTER(LEN=LINE_LENGTH) :: LINE
236 CHARACTER(LEN=128) :: CALLER
239 IF(call_depth < 1)
THEN 240 IF(scr_log)
WRITE(*,1000)
246 caller = callers(call_depth)
247 callers(call_depth) =
'' 248 call_depth = call_depth - 1
255 length = len_trim(line)
256 IF(0 < length .AND. length < 256 ) count = count + 1
262 IF(scr_log)
WRITE(*,1001) trim(caller)
263 IF(dmp_log)
WRITE(
unit_log,1001) trim(caller)
267 length = len_trim(line)
268 IF(0 < length .AND. length < 256 )
THEN 269 IF(scr_log)
WRITE(*,1002)lc, length, trim(line)
270 IF(dmp_log)
WRITE(
unit_log,1002)lc, length, trim(line)
273 IF(scr_log)
WRITE(*,1003)
283 1000
FORMAT(/1x,70(
'*')/
' From: ERROR_MANAGER --> FINL_ERR_MSG',/ &
284 ' Error 1000: Ivalid ERROR_MANAGER usage. A call to FINL_ERR',&
285 '_MSG was',/
' made while the call tree is empty. This can', &
286 ' occur if a call to',/
' FINL_ERR_MSG was made without a', &
287 ' corresponding call to INIT_ERR_MSG.',/
' Aborting MFIX.'/ &
290 1001
FORMAT(/1x,70(
'*')/
' From: ERROR_MANAGER --> FINL_ERR_MSG',/ &
291 ' Error 1001: Error container ERR_MSG not empty.',/ &
292 ' CALLERS: ',a,2/
' Contents:')
294 1002
FORMAT(
' LC ',i2.2,
': LEN: ',i3.3,1x,a)
296 1003
FORMAT(/,1x,
'Aborting MFIX.',1x,70(
'*'),2/)
303 SUBROUTINE flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, &
318 LOGICAL,
INTENT(IN),
OPTIONAL :: DEBUG
320 LOGICAL,
INTENT(IN),
OPTIONAL :: HEADER
322 LOGICAL,
INTENT(IN),
OPTIONAL :: FOOTER
324 LOGICAL,
INTENT(IN),
OPTIONAL :: ABORT
326 LOGICAL,
INTENT(IN),
OPTIONAL :: LOG
328 LOGICAL,
INTENT(IN),
OPTIONAL :: CALL_TREE
333 CHARACTER(LEN=LINE_LENGTH) :: LINE
354 CHARACTER(LEN=128) :: CALLER
357 IF(
PRESENT(abort))
THEN 364 IF(
PRESENT(
debug))
THEN 371 IF(
PRESENT(header))
THEN 378 IF(
PRESENT(footer))
THEN 385 IF(
PRESENT(log))
THEN 386 unt_log = dmp_log .AND. log
392 IF(
PRESENT(call_tree))
THEN 401 caller = callers(call_depth)
403 IF(scr_log)
WRITE(*,2000) trim(caller)
404 IF(unt_log)
WRITE(
unit_log,2000) trim(caller)
406 IF(scr_log)
WRITE(*,1000) trim(caller)
407 IF(unt_log)
WRITE(
unit_log,1000) trim(caller)
415 length = len_trim(line)
416 IF(0 < length .AND. length < 256 ) last_line = lc
423 length = len_trim(line)
425 IF(scr_log)
WRITE(*,2001) lc, length,
"EMPTY." 426 IF(unt_log)
WRITE(
unit_log,2001) lc, length,
"EMPTY." 428 IF(scr_log)
WRITE(*,2001) lc, length,
"OVERFLOW." 429 IF(unt_log)
WRITE(
unit_log,2001) lc, length,
"OVERFLOW." 431 IF(scr_log)
WRITE(*,2001) lc, length, trim(line)
432 IF(unt_log)
WRITE(
unit_log,2001) lc, length, trim(line)
438 length = len_trim(line)
439 IF(0 < length .AND. length < 256 )
THEN 440 IF(scr_log)
WRITE(*,1001) trim(line)
441 IF(unt_log)
WRITE(
unit_log,1001) trim(line)
443 IF(scr_log)
WRITE(*,
"(' ')")
447 IF(last_line == 0)
THEN 448 IF(scr_log)
WRITE(*,
"(' ')")
456 IF(scr_log)
WRITE(*, 2002)
459 IF(scr_log)
WRITE(*, 1002)
472 IF(d_flag)
WRITE(*,3000)
mype 479 1000
FORMAT(2/,1x,70(
'*'),/
' From: ',a)
481 1002
FORMAT(1x,70(
'*'))
483 2000
FORMAT(2/,
'--- HEADER ---> ',70(
'*'),/
'--- HEADER ---> From: ',a)
484 2001
FORMAT(
'LC ',i2.2,
': LEN: ',i3.3,1x,a)
485 2002
FORMAT(
'--- FOOTER --->',1x,70(
'*'))
487 3000
FORMAT(2x,
'Rank ',i5,
' calling MFIX_EXIT from FLUSH_ERR_MSG.')
505 LOGICAL,
INTENT(IN),
OPTIONAL :: HEADER
507 LOGICAL,
INTENT(IN),
OPTIONAL :: FOOTER
519 h_flag = merge(header, .true.,
PRESENT(header))
521 f_flag = merge(footer, .true.,
PRESENT(footer))
525 IF(scr_log)
WRITE(*,1000)
530 DO lc=1,max_call_depth
532 IF(scr_log)
WRITE(*,1001,advance=
'NO')
533 IF(dmp_log)
WRITE(
unit_log,1001,advance=
'NO')
535 IF(scr_log)
WRITE(*,1002,advance=
'YES') callers(lc)
536 IF(dmp_log)
WRITE(
unit_log,1002,advance=
'YES') callers(lc)
541 IF(scr_log)
WRITE(*,1003)
547 1000
FORMAT(2/,1x,70(
'*'),
' CALL TREE INFORMATION')
550 1003
FORMAT(/1x,70(
'*'))
557 CHARACTER(len=32) FUNCTION ivar(VAR, i1, i2, i3)
559 CHARACTER(len=*),
intent(in) :: VAR
561 INTEGER,
intent(in) :: i1
562 INTEGER,
OPTIONAL,
intent(in) :: i2
563 INTEGER,
OPTIONAL,
intent(in) :: i3
565 CHARACTER(len=16) :: iASc
566 CHARACTER(len=64) :: tVAR
568 iasc=
'';
WRITE(iasc,*)i1
569 tvar=
'';
WRITE(tvar,
"(A,'(',A)") &
570 trim(adjustl(var)), trim(adjustl(iasc))
573 iasc=
'';
WRITE(iasc,*)i2
574 WRITE(tvar,
"(A,',',A)") trim(tvar), trim(adjustl(iasc))
578 iasc=
'';
WRITE(iasc,*)i3
579 WRITE(tvar,
"(A,',',A)") trim(tvar), trim(adjustl(iasc))
582 WRITE(tvar,
"(A,')')") trim(tvar)
584 ivar = trim(adjustl(tvar))
592 CHARACTER(len=32) FUNCTION ival_int(VAL)
593 INTEGER,
intent(in) :: VAL
595 CHARACTER(len=32) :: iASc
605 CHARACTER(len=32) FUNCTION ival_dbl(VAL)
606 DOUBLE PRECISION,
intent(in) :: VAL
608 CHARACTER(len=32) :: dASc
610 IF(abs(val) < 1.0d-2 .AND. abs(val) < 1.0d2)
THEN 611 WRITE(dasc,
"(F18.4)") val
613 WRITE(dasc,
"(G18.4)") val
623 CHARACTER(len=32) FUNCTION ival_log(VAL)
624 LOGICAL,
intent(in) :: VAL
subroutine init_error_manager
character(len=32) function ivar(VAR, i1, i2, i3)
subroutine show_call_tree(HEADER, FOOTER)
character(len=32) function ival_dbl(VAL)
integer, parameter line_length
character(len=60) run_name
character(len=32) function ival_int(VAL)
subroutine init_err_msg(CALLER)
subroutine mfix_exit(myID, normal_termination)
subroutine open_file(FILENAME, NB, IUNIT, EXT, FULL_NAME, OPEN_STAT, OPEN_ACCESS, OPEN_FORM, IRECL, IER)
integer, parameter unit_log
character(len=32) function ival_log(VAL)
character(len=line_length), dimension(line_count) err_msg
integer, parameter line_count
logical function reinit_error()
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
character, parameter undefined_c