subroutine triend(runid, gdp) !----- GPL --------------------------------------------------------------------- ! ! Copyright (C) Stichting Deltares, 2011-2014. ! ! This program is free software: you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation version 3. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! ! contact: delft3d.support@deltares.nl ! Stichting Deltares ! P.O. Box 177 ! 2600 MH Delft, The Netherlands ! ! All indications and logos of, and references to, "Delft3D" and "Deltares" ! are registered trademarks of Stichting Deltares, and remain the property of ! Stichting Deltares. All rights reserved. ! !------------------------------------------------------------------------------- ! $Id$ ! $HeadURL$ !!--description----------------------------------------------------------------- ! ! Function: Ends the FLOW program in a structured way by: ! - Counts the errors and warnings in the DIAGNOSTIC ! file ! - Shows the counted errors/warnings on screen ! - Closes the diagnostic file ! Method used: ! !!--pseudo code and references-------------------------------------------------- ! NONE !!--declarations---------------------------------------------------------------- use precision use globaldata use string_module use dfparall ! implicit none ! type(globdat),target :: gdp ! ! The following list of pointer parameters is used to point inside the gdp structure ! integer , pointer :: lundia integer , pointer :: lunprt integer , pointer :: lunscr integer , pointer :: iphisi integer , dimension(:) , pointer :: ipmap ! ! Global variables ! character(*) :: runid !! Run identification code for the current simulation ! ! Local variables ! integer :: icount ! help var.; counter integer :: itis integer :: lkw ! Length of char. str (usually the KEYWRD or RECNAM) integer :: lrid ! Lenght of runid integer :: lridmx ! LRID max. for prt-file integer :: merr ! Total number of errors found in the diagnostic file integer :: mwarn ! Total number of warnings found in the diagnostic file integer :: n integer :: nrrec ! Pointer to the record number in the MD-file integer :: ntel ! Total number of errors and warnings found in the diagnostic file integer :: ntrec ! Help. var to keep track of NRREC integer :: reclen ! Help var.; length of recdia logical :: found ! FOUND=TRUE if recnam in the MD-file was found logical :: lerror ! Help logical dummy var. logical :: newkw ! Logical var. specifying whether a new recnam should be read from the MD-file or just new data in the continuation line logical :: opend ! Help logical var. to determine whether each of the output file was opened character(10) :: date ! Date to be filled in the header character(20) :: rundat ! Current date and time containing a combination of DATE and TIME character(300) :: recdia ! Help var. to store the records read from the diagnostic file 300 = 256 + a bit (field, =, ##, etc.) character(78) :: txtfil character(9) :: keyw ! Name of record to look for in the MD-file (usually KEYWRD or RECNAM) integer :: itag ! help variable to synchronise errors/warnings summaries to screen integer :: itrig ! help variable to synchronise errors/warnings summaries to screen ! !! executable statements ------------------------------------------------------- ! lundia => gdp%gdinout%lundia lunprt => gdp%gdinout%lunprt lunscr => gdp%gdinout%lunscr iphisi => gdp%gdinttim%iphisi ipmap => gdp%gdinttim%ipmap ! txtfil(1:40) = '----------------------------------------' txtfil(41:78) = '--------------------------------------' ! ! define lenght of RUNID ! call remove_leading_spaces(runid ,lrid ) ! ! if NUERR = 1 then error occurred in TRIPOI part ! if (gdp%errorcode /= 1) then ! ! Writing of CPU-time and performance is replaced by timers ! See libsrc/flow_modsrc/timers.f90 ! else ! ! Test if LUNDIA is an opened file ! NUERR = 1 then error occurred in SYSINI, DECARR or CHKLOC ! if occured in SYSINI LUNDIA may not be defined. ! inquire (lundia, opened = opend) if (.not.opend) goto 9999 endif ! ! Date and time ! call dattim(rundat ) date(1:4) = rundat(1:4) date(5:5) = '-' date(6:7) = rundat(6:7) date(8:8) = '-' date(9:10) = rundat(9:10) ! ! put end date and time LUNDIA ! write (lundia, '(a)') write (lundia, '(80a1)') ('*', n = 1, 80) write (lundia, '(a)') '***' write (lundia, '(a)') '*** FINISHED Delft3D-FLOW' write (lundia, '(2a)') '*** runid : ', trim(runid) write (lundia, '(4a)') '*** date, time : ', date, ',', rundat(11:19) write (lundia, '(a)') '***' write (lundia, '(80a1)') ('*', n = 1, 80) write (lundia, '(a)') ! if (iphisi > 0 .or. ipmap(1) > 0) then ! ! put end date and time LUNPRT ! lridmx = min(lrid, 97) write (lunprt, '(a)') write (lunprt, '(a,t129,a,t32,a)') '*** End of flow for model:', '***', & & runid(:lridmx) write (lunprt, '(a,t11,a,a,a,t129,a)') '*** ', date, ' ', rundat(11:19), '***' endif ! ! put date and time on screen ! if (.not.parll .or. (parll .and. inode == master)) then write (lunscr, *) write (lunscr, '(a)') txtfil write (lunscr, '(a)') ' FINISHED Delft3D-FLOW' write (lunscr, '(2a)') ' runid : ', runid(:lrid) write (lunscr, '(4a)') ' date, time : ', date, ',', rundat(11:19) endif ! ! count errors in lundia ! itag = 2 ! NB value is not relevant anyway itrig = 0 if (parll .and. inode>1) then ! ! blocks until triggered by lower ranked proc. ! call dfrecvnb(itrig,1,dfint,inode-1,itag,gdp) endif if (parll) then write(lunscr,'(a,i3)')'SUMMARY FOR PARTITION :',inode endif ntel = 0 ! keyw = '*** ERROR' nrrec = 1 ntrec = 1 itis = 20 newkw = .false. lkw = 9 merr = 0 ! rewind (lundia) ! --> 1000 continue call search(lundia ,lerror ,newkw ,nrrec ,found , & & ntrec ,recdia ,itis ,keyw ,lkw , & & 'NOPR' ) if (found) then merr = merr + 1 ntel = ntel + 1 if (ntel<=10) then call remove_leading_spaces(recdia ,reclen ) if (reclen<=79) then write (lunscr, '(a)') recdia(:reclen) else write (lunscr, '(a)') recdia(1:79) icount = 0 1100 continue icount = icount + 1 if (reclen<=(79 + icount*67)) then write (lunscr, '(a3,9X,a)') & & '***', recdia((13 + icount*67):reclen) else write (lunscr, '(a3,9X,a)') & & '***', recdia((13 + icount*67):(79 + icount *67)) goto 1100 endif endif endif goto 1000 ! <-- endif ! ! count warnings in lundia ! keyw = '*** WARNI' nrrec = 1 ntrec = 1 lkw = 9 mwarn = 0 ! rewind (lundia) ! --> 2000 continue call search(lundia ,lerror ,newkw ,nrrec ,found , & & ntrec ,recdia ,itis ,keyw ,lkw , & & 'NOPR' ) if (found) then mwarn = mwarn + 1 ntel = ntel + 1 if (ntel<=10) then call remove_leading_spaces(recdia ,reclen ) if (reclen<=79) then write (lunscr, '(a)') recdia(:reclen) else write (lunscr, '(a)') recdia(1:79) icount = 0 2100 continue icount = icount + 1 if (reclen<=(79 + icount*67)) then write (lunscr, '(a3,9X,a)') & & '***', recdia((13 + icount*67):reclen) else write (lunscr, '(a3,9X,a)') & & '***', recdia((13 + icount*67):(79 + icount *67)) goto 2100 endif endif endif goto 2000 ! <-- endif ! if (ntel>10) then write (lunscr, *) ' *** Too many errors and warnings', & & ' to write to screen !! ' endif write (lunscr, '(i5,a,i5,a)') merr, ' errors and ', mwarn, ' warnings' write (lunscr, '(2a)') 'returning to main program from domain ', & & runid(1:lrid) write (lunscr, '(a)') txtfil if (parll .and. inode