123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 |
- !
- ! go print : tools for standard output
- !
- ! Example:
- !
- ! ! messages printed by root only:
- ! call GO_Print_Init( status, apply=myid==root, &
- ! prompt_pe=npes>1, pe=myid, &
- ! trace=.false. )
- ! if (status/=0) stop
- !
- ! ! set routine label:
- ! call goLabel( 'mymod/myroutine' )
- !
- ! ! write single message (including processor prompt?) :
- ! ! [00] This is number 3
- ! write (gol,'("This is number ",i2)') 3; call goPr
- !
- ! ! write error message and traceback using the
- ! ! previous defined routine label:
- ! ! [00] ERROR - Something wrong.
- ! ! [00] ERROR in mymod/myroutine
- ! write (gol,'("Something wrong.")'); call goErr
- ! call goErr
- !
- ! ! close label
- ! call goLabel()
- !
- ! ! done
- ! call GO_Print_Done( status )
- ! if (status/=0) stop
- !
- ! Nedit macro's:
- !
- ! o change error traceback:
- ! write (*,'("ERROR in ",a)') rname
- ! call goErr
- !
- ! o change error traceback:
- ! write (*,'("ERROR in ",a)') rname
- ! write (gol,'("in ",a)') rname; call goErr
- !
- ! o change error message:
- ! write \(\*,'\("ERROR - (.*$)
- ! write (gol,'("\1; call goErr
- !
- ! o change other message:
- ! write \(\*,(.*$)
- ! write (gol,\1; call goPr
- !
- ! o change error time messages:
- ! (goprdt.*ERROR.*$)
- ! \1; call goErr
- !
- ! o change time messages:
- ! printdate2
- ! wrtgol
- ! call printdate2\( 'ERROR - (.*$)
- ! call wrtgol( '\1; call goErr
- ! printdate
- ! wrtgol
- ! call printdate\( 'ERROR - (.*$)
- ! call wrtgol( '\1; call goErr
- !
- !
- !
- ! o change error messages:
- ! (ERROR.*; call )goPr
- ! \1goErr
- !
- ! o change time messages:
- ! (call goprdt.*$)
- ! \1; call goPr
- !
- module GO_Print
- implicit none
-
- ! --- in/out ---------------------------------
-
- private
-
- public :: gol
- public :: GO_Print_Init, GO_Print_Done
- public :: goPr, goErr, goBug
- public :: goLabel
-
-
- ! --- const ---------------------------------
-
- character(len=*), parameter :: mname = 'GO_Print'
-
- ! --- var ------------------------------------
-
- ! buffer for standard output
- character(len=1024) :: gol
-
- ! stack with labels:
- integer, parameter :: mstack = 400
- character(len=64) :: labels(0:mstack)
- integer :: istack = 0
-
- ! initialized ?
- ! some errors might be printed before initialization ...
- logical :: pr_initialized = .false.
-
- ! destination file unit:
- integer :: pr_fu
-
- ! flags etc
- logical :: pr_apply
- logical :: pr_trace
-
- ! processor prompt
- logical :: pr_prompt_pe
- integer :: pr_pe
-
- ! white space for indents:
- integer, parameter :: dindent = 2
- integer :: indent = 0
-
- ! writ to file ?
- logical :: pr_file
- character(len=256) :: pr_file_name
-
-
- contains
- ! ***************************************************************************
- ! ***
- ! *** module init/done
- ! ***
- ! ***************************************************************************
-
-
- subroutine GO_Print_Init( status, apply, prompt_pe, pe, trace, file, file_name )
-
- use go_fu, only : goStdOut
-
- ! --- in/out ----------------------------
-
- integer, intent(out) :: status
- logical, intent(in), optional :: apply
- logical, intent(in), optional :: prompt_pe
- integer, intent(in), optional :: pe
- logical, intent(in), optional :: trace
- logical, intent(in), optional :: file
- character(len=*), intent(in), optional :: file_name
-
- ! --- const ----------------------------
-
- character(len=*), parameter :: rname = mname//'/GO_Print_Init'
-
- ! --- local -----------------------------
-
- logical :: opened
-
- ! --- begin -----------------------------
-
- ! print or not ?
- pr_apply = .true.
- if ( present(apply) ) pr_apply = apply
-
- ! processor number
- pr_pe = 0
- if ( present(pe) ) pr_pe = pe
-
- ! prompt processor number ?
- pr_prompt_pe = .false.
- if ( present(prompt_pe) ) pr_prompt_pe = prompt_pe
-
- ! trace labels ?
- pr_trace = .false.
- if ( present(trace) ) pr_trace = trace
-
- ! write to file ?
- pr_file = .false.
- if ( present(file) ) pr_file = file
- pr_file_name = 'go.out'
- if ( present(file_name) ) pr_file_name = file_name
-
- ! init label stack:
- labels(0) = '<no-label>'
- istack = 0
-
- ! no indent yet
- indent = 0
- if ( .not. pr_trace ) indent = -2
-
- ! write messages to file ?
- if ( pr_file ) then
- ! select free file unit:
- pr_fu = 10
- do
- inquire( pr_fu, opened=opened )
- if ( .not. opened ) exit
- pr_fu = pr_fu + 1
- end do
- ! open requested output file:
- open( unit=pr_fu, file=pr_file_name, status='replace', iostat=status )
- if ( status/=0 ) then
- write (*,'("ERROR - opening file for output:")')
- write (*,'("ERROR - unit : ",i6)') pr_fu
- write (*,'("ERROR - file : ",a)') trim(pr_file_name)
- write (*,'("ERROR in ",a)') rname; status=1; return
- end if
- else
- ! write to standard output:
- pr_fu = goStdOut
- end if
- ! now the module is initialized ...
- pr_initialized = .true.
- ! ok
- status = 0
-
- end subroutine GO_Print_Init
-
-
- ! ***
-
-
- subroutine GO_Print_Done( status )
-
- ! --- in/out ----------------------------
-
- integer, intent(out) :: status
-
- ! --- const ----------------------------
-
- character(len=*), parameter :: rname = mname//'/GO_Print_Done'
-
- ! --- begin -----------------------------
-
- ! output to file ?
- if ( pr_file ) then
- ! close file:
- close( pr_fu, iostat=status )
- if ( status/=0 ) then
- write (*,'("ERROR - closing output file:")')
- write (*,'("ERROR - unit : ",i6)') pr_fu
- write (*,'("ERROR - file : ",a)') trim(pr_file_name)
- write (*,'("ERROR in ",a)') rname; status=1; return
- end if
- end if
-
- ! ok
- status = 0
-
- end subroutine GO_Print_Done
-
-
- ! ***************************************************************************
- ! ***
- ! *** printing
- ! ***
- ! ***************************************************************************
-
-
- subroutine goPr
- ! --- local --------------------------------
-
- character(len=16) :: prompt, s
- integer :: nind
-
- ! --- const ----------------------------
-
- character(len=*), parameter :: rname = mname//'/goPr'
-
- ! --- begin --------------------------------
-
- ! not initialized yet ? then print to standard output:
- if ( .not. pr_initialized ) then
- write (*,'(a)') trim(gol)
- gol = ''
- return
- end if
-
- ! print go line ?
- if ( pr_apply ) then
-
- ! number of spaces to indent:
- nind = max( 0, indent )
- ! processor prompt ?
- if ( pr_prompt_pe ) then
- write (prompt,'("[",i2.2,"]")') pr_pe
- nind = nind + 1
- else
- prompt = ''
- end if
- ! write prompt, indention, go line:
- if ( nind > 0 ) then
- write (pr_fu,'(a,a,a)') trim(prompt), repeat(' ',nind), trim(gol)
- else
- write (pr_fu,'(a,a)') trim(prompt), trim(gol)
- end if
- end if
- ! call Flush( pr_fu )
-
- ! clear output line:
- gol = ''
- end subroutine goPr
- ! ***
-
- ! Print error message.
- ! Now printed to standard output, in future to standard error ?
- ! Make gol empty before leaving.
- ! If still empty in next call, this is a trace back
- ! (print error label, one label back)
-
- subroutine goErr
-
- ! --- local -------------------------------
-
- integer :: ilab
-
- ! --- const ----------------------------
-
- character(len=*), parameter :: rname = mname//'/goErr'
-
- ! --- local ----------------------------
-
- logical :: save_pr_apply
- character(len=len(gol)) :: gol2
-
- ! --- begin --------------------------------
-
- ! store original apply flag:
- save_pr_apply = pr_apply
- ! always print error messages:
- pr_apply = .true.
-
- ! message in buffer ?
- if ( len_trim(gol) > 0 ) then
-
- ! error message;
- ! make a copy of the message to avoid problems with
- ! re-writing a character string that occures on some machines:
- gol2 = trim(gol)
- write (gol,'("ERROR - ",a)') trim(gol2); call goPr
-
- else
-
- ! label index:
- ilab = min( istack, mstack )
- ! write error message:
- write (gol,'("ERROR in ",a)') trim(labels(ilab)); call goPr
- ! one level back:
- call goLabel()
- end if
-
- ! restore apply flag:
- pr_apply = save_pr_apply
- end subroutine goErr
- ! ***
-
-
- subroutine goBug
- ! --- local ----------------------------
- logical :: save_pr_apply
- ! --- begin --------------------------------
- ! store original apply flag:
- save_pr_apply = pr_apply
- ! always print bug messages:
- pr_apply = .true.
- ! write message
- write (gol,'("BUG - ",a)') trim(gol); call goPr
- ! restore apply flag:
- pr_apply = save_pr_apply
- end subroutine goBug
-
- ! ***************************************************************************
- ! ***
- ! *** routine labels
- ! ***
- ! ***************************************************************************
-
-
- subroutine goLabel( label )
-
- ! --- in/out -------------------------------
-
- character(len=*), intent(in), optional :: label
- ! --- const ----------------------------
-
- character(len=*), parameter :: rname = mname//'/goLabel'
-
- ! --- begin --------------------------------
-
- ! add new label to stack ?
- if ( present(label) ) then
- istack = istack + 1
- if ( istack > mstack ) then
- write (gol,'("BUG - stack too small; please increase mstack in go_print")'); call goPr
- else
- labels(istack) = label
- end if
- if (pr_trace) then
- write (gol,'("<",a,">")') trim(labels(istack)); call goPr
- end if
- indent = indent + dindent
- else
- indent = indent - dindent
- if (pr_trace) then
- write (gol,'("(",a,")")') trim(labels(istack)); call goPr
- end if
- istack = max( 0, istack - 1 )
- end if
-
- end subroutine goLabel
-
- end module go_print
- ! #############################################################################
- ! ###
- ! ### test program
- ! ###
- ! #############################################################################
- !
- !
- !module testmod
- !
- ! implicit none
- !
- ! public
- !
- !contains
- !
- ! subroutine subr( i, status )
- !
- ! use go_print, only : goLabel, gol, goPr, goErr
- !
- ! ! --- in/out ----------------------------------------
- !
- ! integer, intent(in) :: i
- ! integer, intent(out) :: status
- !
- ! ! --- begin -----------------------------------------
- !
- ! call goLabel( 'subr' )
- !
- ! write (gol,'("welcome to subr !")'); call goPr
- !
- ! select case ( i )
- !
- ! case ( 0 )
- ! write (gol,'("testing i : ",i2)') i; call goPr
- !
- ! case ( 1 )
- ! call subr2( 0, status )
- ! if (status/=0) then; call goErr; status=1; return; end if
- !
- ! case ( 2 )
- ! call subr2( 1, status )
- ! if (status/=0) then; call goErr; status=1; return; end if
- !
- ! case default
- ! write (gol,'("unsupported i : ",i2)') i; call goErr
- ! call goErr; status=1; return
- !
- ! end select
- !
- ! call goLabel(); status=0
- !
- ! end subroutine subr
- !
- !
- ! ! ***
- !
- !
- ! subroutine subr2( i, status )
- !
- ! use go_print, only : goLabel, gol, goPr, goErr
- !
- ! ! --- in/out ----------------------------------------
- !
- ! integer, intent(in) :: i
- ! integer, intent(out) :: status
- !
- ! ! --- begin -----------------------------------------
- !
- ! call goLabel('subr2')
- !
- ! write (gol,'("testing subr2")'); call goPr
- !
- ! select case ( i )
- ! case ( 0 )
- ! case default
- ! write (gol,'("wrong i : ",i2)') i; call goErr
- ! call goErr; status=1; return
- ! end select
- !
- ! call goLabel; status=0
- !
- ! end subroutine subr2
- !
- !
- !
- !end module testmod
- !
- !
- ! ################################################################
- !
- !
- !program test
- !
- ! use go_print
- ! use testmod
- !
- ! ! --- local -----------------------------------------
- !
- ! integer :: status
- !
- ! ! --- begin ------------------------------------------
- !
- ! call GO_Print_Init( status, trace=.false. )
- ! call goLabel('test prog')
- !
- ! write (gol,'("begin of program")'); call goPr
- !
- ! call Subr( 2, status )
- ! if (status/=0) then; call goErr; call exit(1); end if
- !
- ! write (gol,'("end of program")'); call goPr
- !
- ! call goLabel()
- ! call GO_Print_Done( status )
- !
- !end program test
- !
|