MODULE Error_Handling USE Precision IMPLICIT NONE PUBLIC::InitializeErrorHandling,TerminateErrorHandling,& Warning,NonCriticalError,CriticalError PRIVATE INTEGER,PUBLIC,SAVE::error_status=0 CHARACTER(LEN=100),PUBLIC,PARAMETER::options_file="/home/hpf/Fortran/src/NO01/F90/Plots.options",& null_file="ScratchFile.log" CHARACTER(LEN=100),PUBLIC,SAVE::log_file="Network.log" CHARACTER(LEN=100),PUBLIC,SAVE::print_file="" LOGICAL,PUBLIC,SAVE::append=.FALSE. INTEGER,PARAMETER,PUBLIC::stdin=5,stdout=6,stderr=0 INTEGER,PARAMETER,PUBLIC::null_unit=1,log_unit=2 INTEGER,SAVE,PUBLIC::print_unit=stdout INTEGER,PARAMETER,PUBLIC::program_options_unit=10 INTEGER,PUBLIC,SAVE::log_level=3,print_level=4 INTEGER,PUBLIC,SAVE::message_log_unit=log_unit,message_print_unit=null_unit,& warning_log_unit=log_unit,warning_print_unit=stdout,& error_log_unit=log_unit,error_print_unit=stdout CHARACTER(LEN=1),PUBLIC,SAVE::warning_action="C",non_critical_action="P" CONTAINS SUBROUTINE InitializeErrorHandling() IMPLICIT NONE CHARACTER(LEN=15)::file_positioning IF(append)THEN file_positioning="APPEND" ELSE file_positioning="REWIND" END IF IF(print_file/="")THEN print_unit=3 OPEN(UNIT=print_unit,FILE=TRIM(print_file),STATUS="UNKNOWN",& ACCESS="SEQUENTIAL",ACTION="WRITE",POSITION=file_positioning) ELSE print_unit=stdout END IF OPEN(UNIT=log_unit,FILE=TRIM(log_file),STATUS="UNKNOWN",& ACCESS="SEQUENTIAL",ACTION="WRITE",POSITION=file_positioning) OPEN(UNIT=null_unit,FILE=TRIM(null_file),STATUS="UNKNOWN",& ACCESS="SEQUENTIAL",ACTION="WRITE",POSITION=file_positioning) IF(log_level>=4)THEN message_log_unit=log_unit ELSE message_log_unit=null_unit END IF IF(print_level>=4)THEN message_print_unit=print_unit ELSE message_print_unit=null_unit END IF IF(log_level>=3)THEN warning_log_unit=log_unit ELSE warning_log_unit=null_unit END IF IF(print_level>=3)THEN warning_print_unit=print_unit ELSE warning_print_unit=null_unit END IF IF(log_level>=2)THEN error_log_unit=log_unit ELSE error_log_unit=null_unit END IF IF(print_level>=2)THEN error_print_unit=print_unit ELSE error_print_unit=null_unit END IF END SUBROUTINE InitializeErrorHandling SUBROUTINE TerminateErrorHandling(keep_null) IMPLICIT NONE LOGICAL,INTENT(IN),OPTIONAL::keep_null CLOSE(unit=log_unit) IF(print_unit/=stdout)CLOSE(UNIT=print_unit) IF(PRESENT(keep_null))THEN IF(keep_null)THEN CLOSE(UNIT=null_unit,STATUS="KEEP") ELSE CLOSE(UNIT=null_unit,STATUS="DELETE") END IF ELSE CLOSE(UNIT=null_unit,STATUS="DELETE") END IF END SUBROUTINE TerminateErrorHandling SUBROUTINE Warning(message,caller,action) IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN)::message CHARACTER(LEN=*),INTENT(IN),OPTIONAL::caller CHARACTER(LEN=*),INTENT(IN),OPTIONAL::action CHARACTER(LEN=1)::local_action WRITE(UNIT=warning_log_unit,FMT="(A,A,A)",ADVANCE="NO")"Warning"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=warning_log_unit,FMT="(A,A)")" occured in: ",caller WRITE(UNIT=warning_print_unit,FMT="(A,A,A)",ADVANCE="NO")"Warning"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=warning_print_unit,FMT="(A,A)")" occured in: ",caller IF(PRESENT(action))THEN local_action=action(1:1) ELSE local_action=warning_action END IF SELECT CASE(local_action) CASE('P','p') PAUSE CASE DEFAULT RETURN ENDSELECT END SUBROUTINE Warning SUBROUTINE NonCriticalError(message,caller,action) IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN)::message CHARACTER(LEN=*),INTENT(IN),OPTIONAL::caller CHARACTER(LEN=*),INTENT(IN),OPTIONAL::action CHARACTER(LEN=1)::local_action IF(PRESENT(action))THEN local_action=action(1:1) ELSE local_action=non_critical_action END IF WRITE(UNIT=error_log_unit,FMT="(A,A,A)",ADVANCE="NO")"Non-Critical error"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=error_log_unit,FMT="(A,A)")" occured in: ",caller WRITE(UNIT=error_print_unit,FMT="(A,A,A)",ADVANCE="NO")"Non-Critical error"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=error_print_unit,FMT="(A,A)")" occured in: ",caller SELECT CASE(local_action) CASE('C','c') RETURN CASE('S','s') WRITE(UNIT=error_log_unit,FMT="(A)")"Stopping program with hard breakdown..." WRITE(UNIT=error_print_unit,FMT="(A)")"Stopping program with hard breakdown..." STOP CASE DEFAULT PAUSE ENDSELECT END SUBROUTINE NonCriticalError SUBROUTINE CriticalError(message,caller) IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN)::message CHARACTER(LEN=*),INTENT(IN),OPTIONAL::caller WRITE(UNIT=error_log_unit,FMT="(A,A,A)",ADVANCE="NO")"Critical error"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=error_log_unit,FMT="(A,A)")" occured in: ",caller WRITE(UNIT=error_print_unit,FMT="(A,A,A)",ADVANCE="NO")"Critical error"," (!!!): ",message IF(PRESENT(caller))WRITE(UNIT=error_print_unit,FMT="(A,A)")" occured in: ",caller WRITE(UNIT=error_log_unit,FMT="(A)")"Stopping program with hard breakdown..." WRITE(UNIT=error_print_unit,FMT="(A)")"Stopping program with hard breakdown..." STOP END SUBROUTINE CriticalError END MODULE Error_Handling