! $Id: ESMF_TestHarnessReportMod.F90,v 1.20 2011/02/23 20:19:38 w6ws Exp $ ! ! Earth System Modeling Framework ! Copyright 2002-2011, University Corporation for Atmospheric Research, ! Massachusetts Institute of Technology, Geophysical Fluid Dynamics ! Laboratory, University of Michigan, National Centers for Environmental ! Prediction, Los Alamos National Laboratory, Argonne National Laboratory, ! NASA Goddard Space Flight Center. ! Licensed under the University of Illinois-NCSA License. ! !=============================================================================== #define ESMF_FILENAME "ESMF_TestHarnessReportMod" ! ! ESMF Test Harness Report Module module ESMF_TestHarnessReportMod ! !=============================================================================== ! ! This file contains functions/subroutines for the Testing Harness. ! These methods are used only by the test harness driver ESMF_TestHarnessUTest.F90 ! !------------------------------------------------------------------------------- ! INCLUDES #include "ESMF.h" !=============================================================================== !BOPI ! !MODULE: ESMF_TestHarnessReportMod ! ! !DESCRIPTION: ! ! The code in this file contains Modules for reporting the test harness ! results. ! ! In addition, This module will print a summary report describing the the ! tests that will be run for a harness suite. ! !------------------------------------------------------------------------------- ! !USES: use ESMF_TestHarnessTypesMod use ESMF_TestHarnessUtilMod implicit none !------------------------------------------------------------------------------- ! PUBLIC METHODS: !------------------------------------------------------------------------------- public report_descriptor_string, construct_descriptor_string public summary_report_generate !=============================================================================== contains !=============================================================================== !------------------------------------------------------------------------------ ! Routines to Report Test Results !------------------------------------------------------------------------------ !----------------------------------------------------------------------------- subroutine construct_descriptor_string(PDS, nstatus, localPet, localrc) !----------------------------------------------------------------------------- ! routine constructs the test repost string and prints the test configurations ! before the test commences. ! report string takes the form: ! {status}: {source string} {action} {destination string} !----------------------------------------------------------------------------- ! arguments type(problem_descriptor_strings), intent(inout) :: PDS integer, intent(in ) :: nstatus, localPet integer, intent( out) :: localrc ! local character strings character(THARN_MAXSTR) :: src_string, dst_string character(THARN_MAXSTR) :: lstatus, laction, lgrid, ldist, lsuffix, ltmp character(7) :: lsize, lorder, ltmpL, ltmpR, l1, l2, l3, l4 ! local integer variables integer :: iDfile, iGfile, irank, iirank, igrid, idist, istatus ! initialize return flag localrc = ESMF_RC_NOT_IMPL !----------------------------------------------------------------------------- ! set action string !----------------------------------------------------------------------------- select case( PDS%process%tag ) case( Harness_Redist ) laction = "-->" case( Harness_BilinearRegrid ) laction = "=B=>" case( Harness_PatchRegrid ) laction = "=P=>" case( Harness_ConservRegrid ) laction = "=C=>" case( Harness_2ndConservRegrid ) laction = "=S=>" case( Harness_NearNeighRegrid ) laction = "=N=>" case( Harness_Error ) ! error case default ! error end select ! print out result string if codes match if( localPet == Harness_rootPet .and. nstatus > 0 ) then print*,'Problem Descriptor String ',trim(adjustL(PDS%pds)) print*,'( grid config, distribution config, Grid file, Distribution file)' endif do iDfile=1, PDS%nDfiles ! loop through each of the dist specifier files do iGfile=1, PDS%nGfiles ! loop through each of the grid specifier files !--------------------------------------------------------------------------- ! print specifier filenames !--------------------------------------------------------------------------- do idist=1, PDS%Dfiles(iDfile)%nDspecs ! loop thru all dist and grid do igrid=1, PDS%Gfiles(iGfile)%nGspecs ! specifiers in a file !------------------------------------------------------------------------ ! set STATUS string !------------------------------------------------------------------------ if( PDS%test_record(iDfile,iGfile)%test_status(idist,igrid) == & HarnessTest_SUCCESS ) then lstatus = "SUCCESS:" istatus = 1 elseif( PDS%test_record(iDfile,iGfile)%test_status(idist,igrid) == & HarnessTest_FAILURE ) then lstatus = "FAILURE:" istatus = 0 elseif( PDS%test_record(iDfile,iGfile)%test_status(idist,igrid) == & HarnessTest_UNDEFINED ) then lstatus = "" istatus =-1 else ! error call ESMF_LogSetError( ESMF_FAILURE, msg="invalid test status value ", & rcToReturn=localrc) return endif !------------------------------------------------------------------------- ! set source string !------------------------------------------------------------------------- src_string = '[' do irank=1,PDS%SrcMem%memRank ! after the first dimension add separaters to the string if( irank > 1 ) src_string = trim(adjustL(src_string)) // '; ' ! for each dimension of the rank check if there is an associated ! distribution and/or grid dimension. If not, insert place holder if( PDS%SrcMem%DistOrder(irank) /= 0 ) then iirank = PDS%SrcMem%DistOrder(irank) write(lsize,"(i6)" ) PDS%Dfiles(iDfile)%src_dist(idist)%dsize(iirank) write(lorder,"(i1)") PDS%SrcMem%DistOrder(irank) ldist = trim(adjustL(PDS%SrcMem%DistType(irank)%string)) // & trim(adjustL(lorder))// '{' // trim(adjustL(lsize)) // '}' else ldist = '*{}' endif ! now do the grid part if( PDS%SrcMem%GridOrder(irank) /= 0 ) then iirank = PDS%SrcMem%GridOrder(irank) write(lsize,"(i6)" ) PDS%Gfiles(iGfile)%src_grid(igrid)%gsize(iirank) write(lorder,"(i1)") PDS%SrcMem%GridOrder(irank) lgrid = trim(adjustL(PDS%SrcMem%GridType(irank)%string)) // & trim(adjustL(lorder)) // '{' // trim(adjustL(lsize)) // '}' else lgrid = '*{}' endif ! now add the suffix indicating periodicity and/or a halo lsuffix = '' ! check if the grid type is periodic if( pattern_query( & PDS%Gfiles(iGfile)%src_grid(igrid)%gtype(irank)%string, & "_periodic") /= 0 .or. pattern_query( & PDS%Gfiles(iGfile)%src_grid(igrid)%gtype(irank)%string, & "_PERIODIC") /= 0 ) lsuffix = '+P' ! check for nonzero halos if( PDS%SrcMem%HaloL(irank) /= 0 .or. PDS%SrcMem%HaloR(irank) /= 0 ) then write(ltmpL,"(i6)") PDS%SrcMem%HaloL(irank) write(ltmpR,"(i6)") PDS%SrcMem%HaloR(irank) ltmp = '+H{'//trim(adjustL(ltmpL))// ':' //trim(adjustL(ltmpR))// '}' lsuffix = trim(adjustL(lsuffix)) // trim(adjustL(ltmp)) endif ! concatenate the distribution and grid strings to the previous part of ! the source string src_string = trim(adjustL(src_string)) // trim(adjustL(ldist)) // & trim(adjustL(lgrid)) // trim(adjustL(lsuffix)) enddo ! irank ! terminate the string with a close bracket and a stagger specification src_string = trim(adjustL(src_string)) // ']' !------------------------------------------------------------------------- ! set destination string !------------------------------------------------------------------------- dst_string = '[' do irank=1,PDS%DstMem%memRank ! after the first dimension add separaters to the string if( irank > 1 ) dst_string = trim(adjustL(dst_string)) // ';' ! for each dimension of the rank check if there is an associated ! distribution and/or grid dimension. If not, insert place holder if( PDS%DstMem%DistOrder(irank) /= 0 ) then iirank = PDS%DstMem%DistOrder(irank) write(lsize,"(i6)" ) PDS%Dfiles(iDfile)%dst_dist(idist)%dsize(iirank) write(lorder,"(i1)") PDS%DstMem%DistOrder(irank) ldist = trim(adjustL(PDS%DstMem%DistType(irank)%string)) // & trim(adjustL(lorder)) // '{' // trim(adjustL(lsize)) // '}' else ldist = '*{}' endif ! now do the grid part if( PDS%DstMem%GridOrder(irank) /= 0 ) then iirank = PDS%DstMem%GridOrder(irank) write(lsize,"(i6)" ) PDS%Gfiles(iGfile)%dst_grid(igrid)%gsize(iirank) write(lorder,"(i1)") PDS%DstMem%GridOrder(irank) lgrid = trim(adjustL(PDS%DstMem%GridType(irank)%string)) // & trim(adjustL(lorder)) // '{' // trim(adjustL(lsize)) // '}' else lgrid = '*{}' endif ! now add the suffix indicating periodicity and/or a halo lsuffix = ' ' ! check if the grid type is periodic if( pattern_query( & PDS%Gfiles(iGfile)%dst_grid(igrid)%gtype(irank)%string, & "_periodic") /= 0 .or. pattern_query( & PDS%Gfiles(iGfile)%dst_grid(igrid)%gtype(irank)%string, & "_PERIODIC") /= 0 ) lsuffix = '+P' ! check for nonzero halos if( PDS%DstMem%HaloL(irank) /= 0 .or. PDS%DstMem%HaloR(irank) /= 0 ) then write(ltmpL,"(i6)") PDS%DstMem%HaloL(irank) write(ltmpR,"(i6)") PDS%DstMem%HaloR(irank) ltmp = '+H{'//trim(adjustL(ltmpL))// ':' //trim(adjustL(ltmpR))// '}' lsuffix = trim(adjustL(lsuffix)) // trim(adjustL(ltmp)) endif ! concatenate the distribution and grid strings to the previous part of ! the source string dst_string = trim(adjustL(dst_string)) // trim(adjustL(ldist)) // & trim(adjustL(lgrid)) // trim(adjustL(lsuffix)) enddo ! irank ! terminate the string with a close bracket and a stagger specification dst_string = trim(adjustL(dst_string)) // ']' ! save result string to character array for later use PDS%test_record(iDfile,iGfile)%test_string(idist,igrid)%string = & trim(adjustL(src_string)) // trim(adjustL(laction)) // & trim(adjustL(dst_string)) !------------------------------------------------------------------------- ! print out result string if codes match !------------------------------------------------------------------------- if( localPet == Harness_rootPet .and. nstatus > 0 ) then write(l1,"(i6)") igrid write(l2,"(i6)") idist write(l3,"(i6)") iDfile write(l4,"(i6)") iGfile ltmp = '(' // trim(adjustL(l1)) // ',' // trim(adjustL(l2)) // ',' & // trim(adjustL(l3)) // ',' // trim(adjustL(l4)) // & ') string=' // & trim(PDS%test_record(iDfile,iGfile)%test_string(idist,igrid)%string) write(*,*) trim( ltmp ) endif enddo ! idist enddo ! igrid enddo ! iGfile enddo ! iDfile print*,' ' !----------------------------------------------------------------------------- ! if I've gotten this far without an error, then the routine has succeeded. !----------------------------------------------------------------------------- localrc = ESMF_SUCCESS !----------------------------------------------------------------------------- end subroutine construct_descriptor_string !----------------------------------------------------------------------------- !------------------------------------------------------------------------------- !----------------------------------------------------------------------------- subroutine report_descriptor_string(PDS, iG, iD, iGfile, iDfile, & reportType, localPET, localrc) !----------------------------------------------------------------------------- ! routine displays the test result, followed by the problem descriptor string, ! followed by the entry number and file names for the grid and distribution ! specifiers. ! ! report string takes the form: ! {status}: {source string} {action} {destination string} !----------------------------------------------------------------------------- ! arguments type(problem_descriptor_strings), intent(inout) :: PDS integer, intent(in ) :: iG, iD, iDfile, iGfile character(THARN_MAXSTR), intent(in ) :: reportType integer, intent(in ) :: localPET integer, intent( out) :: localrc ! local character strings character(THARN_MAXSTR) :: lstatus, lout, test_string character(7) :: l1, l2, lpet ! local integer variables integer :: test_status ! initialize return flag localrc = ESMF_RC_NOT_IMPL !----------------------------------------------------------------------------- ! extract variables !----------------------------------------------------------------------------- test_string = PDS%test_record(iDfile,iGfile)%test_string(iD,iG)%string test_status = PDS%test_record(iDfile,iGfile)%test_status(iD,iG) !----------------------------------------------------------------------------- ! output format !----------------------------------------------------------------------------- write(l1,"(i6)") iG write(l2,"(i6)") iD write(lpet,"(i6)") localPET 10 format('PET(',a,') ', a, /,' > element=', a,' of grid file= ', a, & /,' > element=', a,' of dist file= ', a) !----------------------------------------------------------------------------- ! set STATUS string !----------------------------------------------------------------------------- select case (trim(adjustL(reportType))) case("FULL") !-------------------------------------------------------------------------- ! report both successes and failures !-------------------------------------------------------------------------- if( test_status == HarnessTest_SUCCESS ) then lstatus = "SUCCESS:" lout = trim(adjustL(lstatus)) // trim(adjustL(test_string)) write(*,10) trim(adjustL(lpet)), trim(adjustL(lout)), & trim(adjustL(l1)), trim(adjustL(PDS%Gfiles(iGfile)%filename)), & trim(adjustL(l2)), trim(adjustL(PDS%Dfiles(iDfile)%filename)) elseif( test_status == HarnessTest_FAILURE ) then lstatus = "FAILURE:" lout = trim(adjustL(lstatus)) // trim(adjustL(test_string)) write(*,10) trim(adjustL(lpet)), trim(adjustL(lout)), & trim(adjustL(l1)), trim(adjustL(PDS%Gfiles(iGfile)%filename)), & trim(adjustL(l2)), trim(adjustL(PDS%Dfiles(iDfile)%filename)) else ! error call ESMF_LogSetError( ESMF_FAILURE,msg="invalid test status value ", & rcToReturn=localrc) return endif case("FAILURE") !-------------------------------------------------------------------------- ! only report failures !-------------------------------------------------------------------------- if( test_status == HarnessTest_FAILURE ) then lstatus = "FAILURE:" lout = trim(adjustL(lstatus)) // trim(adjustL(test_string)) write(*,10) trim(adjustL(lpet)), trim(adjustL(lout)), & trim(adjustL(l1)), trim(adjustL(PDS%Gfiles(iGfile)%filename)), & trim(adjustL(l2)), trim(adjustL(PDS%Dfiles(iDfile)%filename)) endif case("SUCCESS") !-------------------------------------------------------------------------- ! only report success !-------------------------------------------------------------------------- if( test_status == HarnessTest_SUCCESS ) then lstatus = "SUCCESS:" lout = trim(adjustL(lstatus)) // trim(adjustL(test_string)) write(*,10) trim(adjustL(lpet)), trim(adjustL(lout)), & trim(adjustL(l1)), trim(adjustL(PDS%Gfiles(iGfile)%filename)), & trim(adjustL(l2)), trim(adjustL(PDS%Dfiles(iDfile)%filename)) endif case("NONE") !-------------------------------------------------------------------------- ! no report !-------------------------------------------------------------------------- case default ! error print*,"error, report flag improperly set" call ESMF_LogSetError( ESMF_FAILURE, msg=" report flag improperly set", & rcToReturn=localrc) return end select ! case of report flag !----------------------------------------------------------------------------- ! if I've gotten this far without an error, then the routine has succeeded. !----------------------------------------------------------------------------- localrc = ESMF_SUCCESS !----------------------------------------------------------------------------- end subroutine report_descriptor_string !----------------------------------------------------------------------------- !------------------------------------------------------------------------------ !------------------------------------------------------------------------------ !----------------------------------------------------------------------------- subroutine summ_rpt_write_detail_line (DSpecNo, GSpecNo, & srcDist, dstDist, srcGrid, dstGrid, rptLun, localrc) integer, intent(in) :: DSpecNo integer, intent(in) :: GSpecNo type(dist_specification_record), intent(in) :: srcDist type(dist_specification_record), intent(in) :: dstDist type(grid_specification_record), intent(in) :: srcGrid type(grid_specification_record), intent(in) :: dstGrid integer, intent(in) :: rptLun integer, intent(out) :: localrc integer :: RankNo localrc = ESMF_SUCCESS write (rptLun, 9001) write (rptLun, 9005) DSpecNo write (rptLun, 9006) GSpecNo ! make sure distribution rank is consistent if (srcDist%drank .NE. dstDist%drank) then write (rptLun, '("source distribution rank does not match destination rank", I4, 2x, I4)') & srcDist%drank, dstDist%drank end if ! make sure grid rank is consistent if (srcGrid%grank .NE. dstGrid%grank) then write (rptLun, '("source grid rank does not match destination rank", I4, 2x, I4)') & srcGrid%grank, dstGrid%grank end if ! make sure distribution and grid are consistent if (srcDist%drank .NE. srcGrid%grank) then write (rptLun, '("distribution rank does not match grid rank", I4, 2x, I4)') & srcDist%drank, srcGrid%grank end if write (rptLun, 9007) srcDist%drank write (rptLun, 9008) srcGrid%grank ! write source distribution do RankNo = 1, srcDist%drank write (rptLun, 9012) RankNo, srcDist%dsize(RankNo), RankNo end do ! write destination distribution do RankNo = 1, dstDist%drank write (rptLun, 9013) RankNo, dstDist%dsize(RankNo), RankNo end do ! write source grid do RankNo = 1, srcGrid%grank write (rptLun, 9020) RankNo, srcGrid%gsize(RankNo), RankNo write (rptLun, 9021) RankNo, srcGrid%grange(RankNo, 1), RankNo write (rptLun, 9022) RankNo, srcGrid%grange(RankNo, 2), RankNo write (rptLun, 9023) RankNo, trim(srcGrid%gtype(RankNo)%string), RankNo write (rptLun, 9024) RankNo, trim(srcGrid%gunits(RankNo)%string), RankNo end do ! write destination grid do RankNo = 1, dstGrid%grank write (rptLun, 9030) RankNo, dstGrid%gsize(RankNo), RankNo write (rptLun, 9031) RankNo, dstGrid%grange(RankNo, 1), RankNo write (rptLun, 9032) RankNo, dstGrid%grange(RankNo, 2), RankNo write (rptLun, 9033) RankNo, trim(dstGrid%gtype(RankNo)%string), RankNo write (rptLun, 9034) RankNo, trim(dstGrid%gunits(RankNo)%string), RankNo end do write (rptLun, 9002) 9001 FORMAT (' ') 9002 FORMAT (' ') 9005 FORMAT (' ', I3, '') 9006 FORMAT (' ', I3, '') 9007 FORMAT (' ', I1, '') 9008 FORMAT (' ', I1, '') 9012 FORMAT (' ', I5, '') 9013 FORMAT (' ', I5, '') ! EN format specifier displays real in engineering format (ISO 1539-1:2004 sect. 10.6.1.2.3) 9020 FORMAT (' ', I5, '') 9021 FORMAT (' ', EN17.6, '') 9022 FORMAT (' ', EN17.6, '') 9023 FORMAT (' ', A16, '') 9024 FORMAT (' ', A16, '') 9030 FORMAT (' ', I5, '') 9031 FORMAT (' ', EN17.6, '') 9032 FORMAT (' ', EN17.6, '') 9033 FORMAT (' ', A16, '') 9034 FORMAT (' ', A16, '') end subroutine summ_rpt_write_detail_line !----------------------------------------------------------------------------- subroutine summ_rpt_proc_dist_grid_files (DfileNo, GfileNo, DRec, GRec, rptLun, localrc) integer, intent(in) :: DFileNo integer, intent(in) :: GfileNo type(dist_record), intent(in) :: DRec type(grid_record), intent(in) :: GRec integer, intent(in) :: rptLun integer, intent(out) :: localrc integer :: DSpecCnt integer :: DSpecNo integer :: GSpecCnt integer :: GSpecNo localrc = ESMF_SUCCESS write (rptLun, 9001) write (rptLun, 9012) DfileNo write (rptLun, 9013) GfileNo DSpecCnt = DRec%nDspecs write (rptLun, 9010) DSpecCnt GSpecCnt = GRec%nGspecs write (rptLun, 9011) GSpecCnt ! process all dist records do DSpecNo = 1,DSpecCnt ! process all grid records do GSpecNo = 1, GSpecCnt ! display distribution/grid call summ_rpt_write_detail_line (DSpecNo, GSpecNo, & DRec%src_dist(DSpecNo), DRec%dst_dist(DSpecNo), & GRec%src_grid(GSpecNo), GRec%dst_grid(GSpecNo), rptLun, localrc) end do end do write (rptLun, 9002) 9001 FORMAT (' ') 9002 FORMAT (' ') 9010 FORMAT (' ', I3, '') 9011 FORMAT (' ', I3, '') 9012 FORMAT (' ', I3, '') 9013 FORMAT (' ', I3, '') end subroutine summ_rpt_proc_dist_grid_files !----------------------------------------------------------------------------- subroutine summ_rpt_proc_prob_descr_string (pdsNo, probDescrStr, rptLun, localrc) integer, intent(in) :: pdsNo type(problem_descriptor_strings), intent(in) :: probDescrStr integer, intent(in) :: rptLun integer, intent(out) :: localrc !integer :: PdsCnt !integer :: PdsNo integer :: DfileCnt integer :: DfileNo integer :: GfileCnt integer :: GfileNo write (rptLun, 9001) write (rptLun, 9015) pdsNo write (rptLun, 9010) trim(probDescrStr%pds) write (rptLun, 9011) trim(probDescrStr%process%string) write (rptLun, 9012) probDescrStr%process%tag DfileCnt = probDescrStr%nDFiles write (rptLun, 9013) DfileCnt GfileCnt = probDescrStr%nGFiles write (rptLun, 9014) GfileCnt ! for each distribution file do DfileNo = 1, DfileCnt ! for each grid file do GfileNo = 1, GfileCnt ! display dist file and grid file entry call summ_rpt_proc_dist_grid_files (DfileNo, GfileNo, & probDescrStr%Dfiles(DfileNo), probDescrStr%Gfiles(GfileNo), rptLun, localrc) end do end do write (rptLun, 9002) localrc = ESMF_SUCCESS 90 continue 9001 FORMAT (' ') 9002 FORMAT (' ') 9010 FORMAT (' ', A, '') 9011 FORMAT (' ', A, '') 9012 FORMAT (' ', I3, '') 9013 FORMAT (' ', I3, '') 9014 FORMAT (' ', I3, '') 9015 FORMAT (' ', I3, '') end subroutine summ_rpt_proc_prob_descr_string !----------------------------------------------------------------------------- subroutine summ_rpt_proc_prob_descr_rec (pdrNo, probDescrRec, rptLun, localrc) integer, intent(in) :: pdrNo type(problem_descriptor_records), intent(in) :: probDescrRec integer, intent(in) :: rptLun integer, intent(out) :: localrc integer :: PdsCnt integer :: PdsNo write (rptLun, 9001) write (rptLun, 9012) pdrNo write (rptLun, 9010) trim(probDescrRec%filename) PdsCnt = probDescrRec%numStrings write (rptLun, 9011) PdsCnt do PdsNo = 1, PdsCnt call summ_rpt_proc_prob_descr_string (PdsNo, probDescrRec%str(PdsNo), rptLun, localrc) end do write (rptLun, 9002) localrc = ESMF_SUCCESS 90 continue 9001 FORMAT (' ') 9002 FORMAT (' ') 9010 FORMAT (' ', A, '') 9011 FORMAT (' ', I3, '') 9012 FORMAT (' ', I4, '') end subroutine summ_rpt_proc_prob_descr_rec !----------------------------------------------------------------------------- subroutine summary_report_generate (harnDesc, reportFname, localrc) type (harness_descriptor), intent(in) :: harnDesc character(len=*), intent(in) :: reportFname integer, intent(out) :: localrc integer, parameter :: rptLun = 50 integer :: iostat logical :: openstat integer :: PdrNo integer :: PdrCnt integer :: timeStamp(8) ! initialize return status localrc = ESMF_FAILURE ! open report file open (unit=rptLun, file=reportFname, status='REPLACE', iostat=iostat, action='WRITE') if (iostat .NE. 0) then print '("error in summ_rpt_generate, unable to open report file - filename = ", A)', & reportFname go to 90 end if ! get timestamp call date_and_time (values=timeStamp) ! write top level structure write (rptLun, 9000) !write (rptLun, 9001) write (rptLun, 9005) write (rptLun, 9010) timeStamp(1:3), timeStamp(5:7) write (rptLun, 9011) adjustL(trim(harnDesc%configPath)) write (rptLun, 9012) adjustL(trim(harnDesc%topFname)) write (rptLun, 9013) adjustL(trim(harnDesc%testClass)) write (rptLun, 9014) trim(harnDesc%reportType) write (rptLun, 9015) trim(harnDesc%setupReportType) write (rptLun, 9016) harnDesc%numRecords ! problem_descriptor_records PdrCnt = harnDesc%numRecords do PdrNo = 1, PdrCnt call summ_rpt_proc_prob_descr_rec (PdrNo, harnDesc%rcrd(PdrNo), rptLun, localrc) end do ! write trailer write (rptLun, 9006) localrc = ESMF_SUCCESS ! return status & exit 90 continue ! close report file inquire (rptLun, opened=openstat) if (openstat) then close (rptLun) end if 9000 FORMAT ('') !9001 FORMAT ('') 9005 FORMAT ('') 9006 FORMAT ('') 9010 FORMAT (' ', I4, '/', I2, '/', I2, 2x, I2, ':', I2, ':', I2, '') 9011 FORMAT (' ', A, '') 9012 FORMAT (' ', A, '') 9013 FORMAT (' ', A, '') 9014 FORMAT (' ', A, '') 9015 FORMAT (' ', A, '') 9016 FORMAT (' ', I3, '') end subroutine summary_report_generate !----------------------------------------------------------------------------- !=============================================================================== end module ESMF_TestHarnessReportMod !===============================================================================