MFIX  2016-1
error_manager_mod.f
Go to the documentation of this file.
1 ! -*- f90 -*-
2 !----------------------------------------------------------------------!
3 ! Module: ERROR_MANAGER !
4 ! !
5 ! Purpose: Unify error message handeling. !
6 ! !
7 !----------------------------------------------------------------------!
8  MODULE error_manager
9 
10  use, intrinsic :: iso_c_binding
11  use exit, only: mfix_exit
12 
13  implicit none
14 
15 ! Interface
16 !---------------------------------------------------------------------//
17  interface ival
18  module procedure ival_int
19  module procedure ival_dbl
20  module procedure ival_log
21  end interface
22 
23 ! Maximum number of lines a message can have before a flush is needed.
24  INTEGER, PARAMETER :: line_count = 32
25 ! Maximum number of characters per line.
26  INTEGER, PARAMETER :: line_length = 256
27 
28 ! Character string for storing the error message.
29  CHARACTER(LEN=LINE_LENGTH), DIMENSION(LINE_COUNT) :: err_msg
30 
31 ! Depth that the current call tree can go.
32  INTEGER, PARAMETER, PRIVATE :: max_call_depth = 16
33 ! Current call depth.
34  INTEGER, PRIVATE :: call_depth
35 
36 ! The name of the calling routine. Set by calling: INIT_ERR_MSG
37  CHARACTER(LEN=128), DIMENSION(MAX_CALL_DEPTH), PRIVATE :: callers
38 
39 ! Flag for writing messages to the screen.
40  LOGICAL, PRIVATE :: scr_log
41 
42 ! Error Flag.
43  INTEGER :: ier_em
44 
45  contains
46 
47 !``````````````````````````````````````````````````````````````````````!
48 ! Subroutine: INIT_ERROR_MANAGER !
49 ! !
50 ! Purpose: Initialize the error manager. This routine also opens the !
51 ! .LOG file(s) based on user input settings. !
52 !......................................................................!
53  SUBROUTINE init_error_manager
54 
55 ! Global Variables:
56 !---------------------------------------------------------------------//
57 ! Name given to current run.
58  use run, only: run_name
59 ! Flag: All ranks report errors.
60  use output, only: enable_dmp_log
61 ! Flag: My rank reports errors.
62  use funits, only: dmp_log
63 ! Flag: Provide the full log.
64  use output, only: full_log
65 ! Rank ID of process
66  use compar, only: mype
67 ! Rank ID for IO handeling
68  use compar, only: pe_io
69 ! Number of ranks in parallel run.
70  use compar, only: numpes
71 ! File unit for LOG messages.
72  use funits, only: unit_log
73 ! Undefined character string.
74  use param1, only: undefined_c
75 
76 ! Global Routine Access:
77 !---------------------------------------------------------------------//
78  use mpi_utility, only: global_all_sum
79 
80  implicit none
81 
82 ! Local Variables:
83 !---------------------------------------------------------------------//
84 ! Log file name.
85  CHARACTER(len=255) :: LOGFILE
86  CHARACTER(len=255) :: FILE_NAME
87 ! First non-blank character in run_name.
88  INTEGER :: NB
89 ! Integer error flag
90  INTEGER :: IER(0:numpes-1)
91 
92 ! Initialize the error flags.
93  ier = 0
94  ier_em = 0
95 ! Initialize the call tree depth.
96  call_depth = 0
97 ! Clear the error message storage container.
98  err_msg = ''
99 ! Clear the caller routine information.
100  callers = ''
101 
102 ! This turns on error messaging from all processes.
103  dmp_log = (mype == pe_io) .OR. enable_dmp_log
104 ! Flag for printing screen messages.
105  scr_log = (mype == pe_io) .AND. full_log
106 
107 ! Verify the length of user-provided name.
108  logfile = ''
109  nb = index(run_name,' ')
110 ! RUN_NAME length too short.
111  IF(run_name == undefined_c .OR. nb <= 1) THEN
112  IF(mype == pe_io) WRITE (*, 1000) 'short'
113  CALL mfix_exit(mype)
114 ! RUN_NAME length too long.
115  ELSEIF(nb + 10 > len(logfile)) THEN
116  IF(mype == pe_io) WRITE (*, 1000) 'long'
117  CALL mfix_exit(mype)
118 ! RUN_NAME legnth just right.
119  ELSE
120 ! Specify the .LOG file name based on MPI Rank extenion.
121  IF(numpes == 1 .OR. .NOT.enable_dmp_log) THEN
122  WRITE(logfile,"(A)")run_name(1:(nb-1))
123  ELSEIF(numpes < 10) THEN
124  WRITE(logfile,"(A,'_',I1.1)") run_name(1:(nb-1)), mype
125  ELSEIF(numpes < 100) THEN
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
131  ELSE
132  WRITE(logfile,"(A,'_',I8.8)") run_name(1:(nb-1)), mype
133  ENDIF
134  ENDIF
135 
136 ! Open the .LOG file. From here forward, all routines should store
137 ! error messages (at a minimum) in the .LOG file.
138  IF(dmp_log) THEN
139  nb = len_trim(logfile)+1
140  CALL open_file(logfile, nb, unit_log, '.LOG', file_name, &
141  'APPEND', 'SEQUENTIAL', 'FORMATTED', 132, ier(mype))
142  ENDIF
143 
144 ! Verify that the .LOG file was successfully opened. Otherwise, flag the
145 ! error and abort.
146  CALL global_all_sum(ier)
147  IF(sum(ier) /= 0) THEN
148  IF(mype == pe_io) WRITE(*,1001) trim(file_name)
149  CALL mfix_exit(mype)
150  ENDIF
151 
152  RETURN
153 
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/)
157 
158  1001 FORMAT(2/,1x,70('*')/' From: INIT_ERROR_MANAGER',/ &
159  ' Error 1001: Failed to open log file: ',a,/' Aborting run.'/,&
160  1x,70('*'),2/)
161 
162  END SUBROUTINE init_error_manager
163 
164 !``````````````````````````````````````````````````````````````````````!
165 ! Subroutine: INIT_ERR_MSG !
166 ! !
167 ! Purpose: Initialize the error manager for the local routine. This !
168 ! call is needed to set the caller routines name for error messages. !
169 !......................................................................!
170  SUBROUTINE init_err_msg(CALLER)
172 ! Rank ID of process
173  use compar, only: mype
174 ! Flag: My rank reports errors.
175  use funits, only: dmp_log
176 ! File unit for LOG messages.
177  use funits, only: unit_log
178 
179  implicit none
180 
181  CHARACTER(LEN=*), intent(IN) :: CALLER
182 
183 ! Verify that the maximum call dept will not be exceeded. If so, flag
184 ! the error and exit.
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
188  CALL show_call_tree
189  CALL mfix_exit(mype)
190  ELSE
191 ! Store the caller routines name.
192  call_depth = call_depth + 1
193  callers(call_depth) = trim(caller)
194  ENDIF
195 
196 ! Clear out the error manager.
197  err_msg=''
198 
199  RETURN
200 
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)
206 
207  END SUBROUTINE init_err_msg
208 
209 !``````````````````````````````````````````````````````````````````````!
210 ! Subroutine: FINL_ERR_MSG !
211 ! !
212 ! Purpose: Finalize the error manager. The call is needed to clear out !
213 ! old information and unset the lock. !
214 !......................................................................!
215  SUBROUTINE finl_err_msg
217 ! Rank ID of process
218  use compar, only: mype
219 ! Flag: My rank reports errors.
220  use funits, only: dmp_log
221 ! File unit for LOG messages.
222  use funits, only: unit_log
223 
224  implicit none
225 
226 ! Single line.
227  CHARACTER(LEN=LINE_LENGTH) :: LINE
228 ! Line length with trailing space removed.
229  INTEGER :: LENGTH
230 ! Line Counter
231  INTEGER :: LC
232 ! Number of non-empty lines.
233  INTEGER :: COUNT
234 
235 ! The current calling routine.
236  CHARACTER(LEN=128) :: CALLER
237 
238 ! Verify that at the INIT routine was called.
239  IF(call_depth < 1) THEN
240  IF(scr_log) WRITE(*,1000)
241  IF(dmp_log) WRITE(unit_log,1000)
242  CALL mfix_exit(mype)
243  ELSE
244 ! Store the current caller, clear the array position, and decrement
245 ! the counter.
246  caller = callers(call_depth)
247  callers(call_depth) = ''
248  call_depth = call_depth - 1
249  ENDIF
250 
251 ! Verify that the error message container is empty.
252  count = 0
253  DO lc = 1, line_count
254  line = err_msg(lc)
255  length = len_trim(line)
256  IF(0 < length .AND. length < 256 ) count = count + 1
257  ENDDO
258 
259 ! If the error message container is not empty, report the error, dump
260 ! the error message and abort MFIX.
261  IF(count /= 0) THEN
262  IF(scr_log) WRITE(*,1001) trim(caller)
263  IF(dmp_log) WRITE(unit_log,1001) trim(caller)
264 ! Write out the error message container contents.
265  DO lc = 1, line_count
266  line = err_msg(lc)
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)
271  ENDIF
272  ENDDO
273  IF(scr_log) WRITE(*,1003)
274  IF(dmp_log) WRITE(unit_log, 1003)
275  CALL mfix_exit(mype)
276  ENDIF
277 
278 ! This shouldn't be needed, but it doesn't hurt.
279  err_msg = ''
280 
281  RETURN
282 
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.'/ &
288  1x,70('*'),2/)
289 
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:')
293 
294  1002 FORMAT(' LC ',i2.2,': LEN: ',i3.3,1x,a)
295 
296  1003 FORMAT(/,1x,'Aborting MFIX.',1x,70('*'),2/)
297 
298  END SUBROUTINE finl_err_msg
299 
300 !``````````````````````````````````````````````````````````````````````!
301 ! !
302 !......................................................................!
303  SUBROUTINE flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, &
304  call_tree)
306 ! Rank ID of process
307  use compar, only: mype
308 ! Flag: My rank reports errors.
309  use funits, only: dmp_log
310 ! File unit for LOG messages.
311  use funits, only: unit_log
312 ! Flag to reinitialize the code.
313  use run, only: reinitializing
314 
315 ! Dummy Arguments:
316 !---------------------------------------------------------------------//
317 ! Debug flag.
318  LOGICAL, INTENT(IN), OPTIONAL :: DEBUG
319 ! Flag to suppress the message header.
320  LOGICAL, INTENT(IN), OPTIONAL :: HEADER
321 ! Flag to suppress the message footer.
322  LOGICAL, INTENT(IN), OPTIONAL :: FOOTER
323 ! Flag to abort execution by invoking MFIX_EXIT.
324  LOGICAL, INTENT(IN), OPTIONAL :: ABORT
325 ! Flag to force (or override) writing data to the log file.
326  LOGICAL, INTENT(IN), OPTIONAL :: LOG
327 ! Provide the call tree in error message.
328  LOGICAL, INTENT(IN), OPTIONAL :: CALL_TREE
329 
330 ! Local Variables:
331 !---------------------------------------------------------------------//
332 ! Single line.
333  CHARACTER(LEN=LINE_LENGTH) :: LINE
334 ! Line length with trailing space removed.
335  INTEGER :: LENGTH
336 ! Index of last line in the message.
337  INTEGER :: LAST_LINE
338 ! Line Counter
339  INTEGER :: LC
340 ! Local debug flag.
341  LOGICAL :: D_FLAG
342 ! Local flag to suppress writing the header.
343  LOGICAL :: H_FLAG
344 ! Local flag to suppress writing the footer.
345  LOGICAL :: F_FLAG
346 ! Local abort flag.
347  LOGICAL :: A_FLAG
348 ! Local call tree flag.
349  LOGICAL :: CT_FLAG
350 ! Local flag to store output to UNIT_LOG
351  LOGICAL :: UNT_LOG
352 
353 ! The current calling routine.
354  CHARACTER(LEN=128) :: CALLER
355 
356 ! Set the abort flag. Continue running by default.
357  IF(PRESENT(abort))THEN
358  a_flag = abort
359  ELSE
360  a_flag = .false.
361  ENDIF
362 
363 ! Set the local debug flag. Suppress debugging messages by default.
364  IF(PRESENT(debug)) THEN
365  d_flag = debug
366  ELSE
367  d_flag = .false.
368  ENDIF
369 
370 ! Set the header flag. Write the header by default.
371  IF(PRESENT(header)) THEN
372  h_flag = header
373  ELSE
374  h_flag = .true.
375  ENDIF
376 
377 ! Set the footer flag. Write the footer by default.
378  IF(PRESENT(footer))THEN
379  f_flag = footer
380  ELSE
381  f_flag = .true.
382  ENDIF
383 
384 ! Set the call tree flag. Suppress the call tree by default.
385  IF(PRESENT(log)) THEN
386  unt_log = dmp_log .AND. log
387  ELSE
388  unt_log = dmp_log
389  ENDIF
390 
391 ! Set the call tree flag. Suppress the call tree by default.
392  IF(PRESENT(call_tree)) THEN
393  ct_flag = call_tree
394  ELSE
395  ct_flag = .false.
396  ENDIF
397 
398 ! Write out header infomration.
399  IF(h_flag) THEN
400 ! Set the current caller.
401  caller = callers(call_depth)
402  IF(d_flag) THEN
403  IF(scr_log) WRITE(*,2000) trim(caller)
404  IF(unt_log) WRITE(unit_log,2000) trim(caller)
405  ELSE
406  IF(scr_log) WRITE(*,1000) trim(caller)
407  IF(unt_log) WRITE(unit_log,1000) trim(caller)
408  ENDIF
409  ENDIF
410 
411 ! Find the end of the message.
412  last_line = 0
413  DO lc = 1, line_count
414  line = err_msg(lc)
415  length = len_trim(line)
416  IF(0 < length .AND. length < 256 ) last_line = lc
417  ENDDO
418 
419 ! Write the message body.
420  IF(d_flag)THEN
421  DO lc = 1, line_count
422  line = err_msg(lc)
423  length = len_trim(line)
424  IF(length == 0) THEN
425  IF(scr_log) WRITE(*,2001) lc, length, "EMPTY."
426  IF(unt_log) WRITE(unit_log,2001) lc, length, "EMPTY."
427  ELSEIF(length >= line_length)THEN
428  IF(scr_log) WRITE(*,2001) lc, length, "OVERFLOW."
429  IF(unt_log) WRITE(unit_log,2001) lc, length, "OVERFLOW."
430  ELSE
431  IF(scr_log) WRITE(*,2001) lc, length, trim(line)
432  IF(unt_log) WRITE(unit_log,2001) lc, length, trim(line)
433  ENDIF
434  ENDDO
435  ELSE
436  DO lc = 1, last_line
437  line = err_msg(lc)
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)
442  ELSE
443  IF(scr_log) WRITE(*,"(' ')")
444  IF(unt_log) WRITE(unit_log,"(' ')")
445  ENDIF
446  ENDDO
447  IF(last_line == 0) THEN
448  IF(scr_log) WRITE(*,"(' ')")
449  IF(unt_log) WRITE(unit_log,"(' ')")
450  ENDIF
451  ENDIF
452 
453 ! Print footer.
454  IF(f_flag) THEN
455  IF(d_flag) THEN
456  IF(scr_log) WRITE(*, 2002)
457  IF(unt_log) WRITE(unit_log, 2002)
458  ELSE
459  IF(scr_log) WRITE(*, 1002)
460  IF(unt_log) WRITE(unit_log, 1002)
461  ENDIF
462  ENDIF
463 
464 ! Clear the message array.
465  err_msg=''
466 
467 ! Abort the run if specified.
468  IF(a_flag) THEN
469  IF(reinitializing)THEN
470  ier_em = 1
471  ELSE
472  IF(d_flag) WRITE(*,3000) mype
473  CALL mfix_exit(mype)
474  ENDIF
475  ENDIF
476 
477  RETURN
478 
479  1000 FORMAT(2/,1x,70('*'),/' From: ',a)
480  1001 FORMAT(1x,a)
481  1002 FORMAT(1x,70('*'))
482 
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('*'))
486 
487  3000 FORMAT(2x,'Rank ',i5,' calling MFIX_EXIT from FLUSH_ERR_MSG.')
488 
489  END SUBROUTINE flush_err_msg
490 
491 
492 !``````````````````````````````````````````````````````````````````````!
493 ! !
494 !......................................................................!
495  SUBROUTINE show_call_tree(HEADER, FOOTER)
497 ! Flag: My rank reports errors.
498  use funits, only: dmp_log
499 ! File unit for LOG messages.
500  use funits, only: unit_log
501 
502 ! Dummy Arguments:
503 !---------------------------------------------------------------------//
504 ! Flag to suppress the message header.
505  LOGICAL, INTENT(IN), OPTIONAL :: HEADER
506 ! Flag to suppress the message footer.
507  LOGICAL, INTENT(IN), OPTIONAL :: FOOTER
508 
509 ! Local Variables:
510 !---------------------------------------------------------------------//
511 ! Local flag to suppress writing the header.
512  LOGICAL :: H_FLAG
513 ! Local flag to suppress writing the footer.
514  LOGICAL :: F_FLAG
515 ! Generic loop counters.
516  INTEGER :: LC, SL
517 
518 ! Set the header flag. Write the header by default.
519  h_flag = merge(header, .true., PRESENT(header))
520 ! Set the footer flag. Write the footer by default.
521  f_flag = merge(footer, .true., PRESENT(footer))
522 
523 ! Header
524  IF(h_flag) THEN
525  IF(scr_log) WRITE(*,1000)
526  IF(dmp_log) WRITE(unit_log,1000)
527  ENDIF
528 
529 ! Call Tree
530  DO lc=1,max_call_depth
531  DO sl=1,lc
532  IF(scr_log) WRITE(*,1001,advance='NO')
533  IF(dmp_log) WRITE(unit_log,1001,advance='NO')
534  ENDDO
535  IF(scr_log) WRITE(*,1002,advance='YES') callers(lc)
536  IF(dmp_log) WRITE(unit_log,1002,advance='YES') callers(lc)
537  ENDDO
538 
539 ! Footer.
540  IF(f_flag) THEN
541  IF(scr_log) WRITE(*,1003)
542  IF(dmp_log) WRITE(unit_log,1003)
543  ENDIF
544 
545  RETURN
546 
547  1000 FORMAT(2/,1x,70('*'),' CALL TREE INFORMATION')
548  1001 FORMAT(' ')
549  1002 FORMAT('> ',a)
550  1003 FORMAT(/1x,70('*'))
551 
552  END SUBROUTINE show_call_tree
553 
554 !``````````````````````````````````````````````````````````````````````!
555 ! !
556 !......................................................................!
557  CHARACTER(len=32) FUNCTION ivar(VAR, i1, i2, i3)
559  CHARACTER(len=*), intent(in) :: VAR
560 
561  INTEGER, intent(in) :: i1
562  INTEGER, OPTIONAL, intent(in) :: i2
563  INTEGER, OPTIONAL, intent(in) :: i3
564 
565  CHARACTER(len=16) :: iASc
566  CHARACTER(len=64) :: tVAR
567 
568  iasc=''; WRITE(iasc,*)i1
569  tvar=''; WRITE(tvar,"(A,'(',A)") &
570  trim(adjustl(var)), trim(adjustl(iasc))
571 
572  IF(PRESENT(i2))THEN
573  iasc=''; WRITE(iasc,*)i2
574  WRITE(tvar,"(A,',',A)") trim(tvar), trim(adjustl(iasc))
575  ENDIF
576 
577  IF(PRESENT(i3))THEN
578  iasc=''; WRITE(iasc,*)i3
579  WRITE(tvar,"(A,',',A)") trim(tvar), trim(adjustl(iasc))
580  ENDIF
581 
582  WRITE(tvar,"(A,')')") trim(tvar)
583 
584  ivar = trim(adjustl(tvar))
585 
586  RETURN
587  END FUNCTION ivar
588 
589 !``````````````````````````````````````````````````````````````````````!
590 ! !
591 !......................................................................!
592  CHARACTER(len=32) FUNCTION ival_int(VAL)
593  INTEGER, intent(in) :: VAL
594 
595  CHARACTER(len=32) :: iASc
596 
597  WRITE(iasc,*) val
598  ival_int = trim(adjustl(iasc))
599 
600  END FUNCTION ival_int
601 
602 !``````````````````````````````````````````````````````````````````````!
603 ! !
604 !......................................................................!
605  CHARACTER(len=32) FUNCTION ival_dbl(VAL)
606  DOUBLE PRECISION, intent(in) :: VAL
607 
608  CHARACTER(len=32) :: dASc
609 
610  IF(abs(val) < 1.0d-2 .AND. abs(val) < 1.0d2) THEN
611  WRITE(dasc,"(F18.4)") val
612  ELSE
613  WRITE(dasc,"(G18.4)") val
614  ENDIF
615 
616  ival_dbl = trim(adjustl(dasc))
617 
618  END FUNCTION ival_dbl
619 
620 !``````````````````````````````````````````````````````````````````````!
621 ! !
622 !......................................................................!
623  CHARACTER(len=32) FUNCTION ival_log(VAL)
624  LOGICAL, intent(in) :: VAL
625 
626  IF(val) THEN
627  ival_log = ".TRUE."
628  ELSE
629  ival_log = ".FALSE."
630  ENDIF
631 
632  RETURN
633  END FUNCTION ival_log
634 
635 !``````````````````````````````````````````````````````````````````````!
636 ! Function: Reports TRUE if one or more processes set an ABORT flag. !
637 !......................................................................!
638  LOGICAL FUNCTION reinit_error()
640 ! Global Routine Access:
641 !---------------------------------------------------------------------//
642  use mpi_utility, only: global_all_sum
643 
644  CALL global_all_sum(ier_em)
645  reinit_error = (ier_em /= 0)
646  ier_em = 0
647  RETURN
648  END FUNCTION reinit_error
649 
650  END MODULE error_manager
subroutine init_error_manager
logical dmp_log
Definition: funits_mod.f:6
character(len=32) function ivar(VAR, i1, i2, i3)
subroutine finl_err_msg
subroutine show_call_tree(HEADER, FOOTER)
character(len=32) function ival_dbl(VAL)
integer, parameter line_length
character(len=60) run_name
Definition: run_mod.f:24
logical enable_dmp_log
Definition: output_mod.f:33
character(len=32) function ival_int(VAL)
logical full_log
Definition: output_mod.f:31
integer numpes
Definition: compar_mod.f:24
subroutine init_err_msg(CALLER)
integer pe_io
Definition: compar_mod.f:30
subroutine mfix_exit(myID, normal_termination)
Definition: exit.f:5
Definition: debug_mod.f:1
subroutine open_file(FILENAME, NB, IUNIT, EXT, FULL_NAME, OPEN_STAT, OPEN_ACCESS, OPEN_FORM, IRECL, IER)
Definition: open_file.f:24
Definition: exit.f:2
integer, parameter unit_log
Definition: funits_mod.f:21
Definition: run_mod.f:13
character(len=32) function ival_log(VAL)
logical reinitializing
Definition: run_mod.f:208
integer mype
Definition: compar_mod.f:24
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
Definition: param1_mod.f:20