test_Reduce_sum Subroutine

public subroutine test_Reduce_sum()

Arguments

None

Source Code

      subroutine test_Reduce_sum

      ! Tolerance for floating point equality tests
      real(ESMF_KIND_R4), parameter :: fuzz4 = 1.0e-7
      real(ESMF_KIND_R8), parameter :: fuzz8 = 1.0d-15

      logical :: passflg

! This subroutine tests all the overloaded versions of the ESMF global sum.

      ! Test with integer arguments
      !=============================
      !EX_UTest
      array4 = (/50,50/)
      ! Set expected results
      if (npets == 1) then
        array5 = (/1,2/)
      else
        array5 = (/604,608/)
      end if
      write(failMsg, *) "Did not return ESMF_SUCCESS"
      write(name, *) "VM Reduce ESMF_REDUCE_SUM Test: integer"
      call ESMF_VMReduce(vm, sendData=array1, recvData=array4, &
        count=nsize, reduceflag=ESMF_REDUCE_SUM, rootPet=rootPet, rc=rc)
      call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

      ! print the result
      print *, 'Global sum:' 
      print *, localPet,' array4(1): ', array4(1), &
                        ' array4(2):', array4(2) 

      print *, localPet,' array1(1): ', array1(1), &
                        ' array1(2):', array1(2) 
      !------------------------------------------------------------------------
      !EX_UTest
      write(failMsg, *) "Returned wrong results"
      write(name, *) "Verify Reduce ESMF_REDUCE_SUM Test: integer"
      if (localPet == rootPet) then
        passflg = array4(1)==array5(1) .and. array4(2)==array5(2)
      else
        passflg = .true.  ! Values are undefined after MPI_Reduce
      end if
      call ESMF_Test(passflg, name, failMsg, result, ESMF_SRCLINE)
      !------------------------------------------------------------------------

      !Test with ESMF_KIND_R8 arguments
      !=================================
      !EX_UTest
      farray4 = (/50.0,50.0/)
      ! Set expected results
      if (npets == 1) then
        farray5 = (/1.0,2.0/)
      else
        farray5 = (/604.0,608.0/)
      end if
      write(failMsg, *) "Did not return ESMF_SUCCESS"
      write(name, *) "VM Reduce ESMF_REDUCE_SUM Test: ESMF_KIND_R8"
      call ESMF_VMReduce(vm, sendData=farray1, recvData=farray4, &
        count=nsize, reduceflag=ESMF_REDUCE_SUM, rootPet=rootPet, rc=rc)
      call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

      ! print the result
      print *, 'Global sum:'
      print *, localPet,' farray4(1): ', farray4(1), &
                        ' farray4(2):', farray4(2)

       print *, localPet,' farray1(1): ', farray1(1), &
                        ' farray1(2):', farray1(2)


      !------------------------------------------------------------------------
      !EX_UTest
      write(failMsg, *) "Returned wrong results"
      write(name, *) "Verify Reduce ESMF_REDUCE_SUM Results Test: ESMF_KIND_R8"
      if (localPet == rootPet) then
        passflg = abs (farray4(1)-farray5(1)) < fuzz8 .and. abs (farray4(2)-farray5(2)) < fuzz8
      else
        passflg = .true.  ! Values are undefined after MPI_Reduce
      end if
      call ESMF_Test(passflg, name, failMsg, result, ESMF_SRCLINE)

      !------------------------------------------------------------------------

      !Test with ESMF_KIND_R4 arguments
      !=================================
      !EX_UTest
      f4array4 = (/50.0,50.0/)
      ! Set expected results
      if (npets == 1) then
        f4array5 = (/1.0,2.0/)
      else
        f4array5 = (/604.0,608.0/)
      end if

      write(failMsg, *) "Did not return ESMF_SUCCESS"
      write(name, *) "VM Reduce ESMF_REDUCE_SUM Test: ESMF_KIND_R4"
      call ESMF_VMReduce(vm, sendData=f4array1, recvData=f4array4, &
        count=nsize, reduceflag=ESMF_REDUCE_SUM, rootPet=rootPet, rc=rc)
      call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

      ! print the result
      print *, 'Global sum:'
      print *, localPet,' f4array4(1): ', f4array4(1), &
                        ' f4array4(2):', f4array4(2)

       print *, localPet,' f4array1(1): ', f4array1(1), &
                        ' f4array1(2):', f4array1(2)



      !------------------------------------------------------------------------
      !EX_UTest
      write(failMsg, *) "Returned wrong results"
      write(name, *) "Verify Reduce ESMF_REDUCE_SUM Results Test: ESMF_KIND_R4"
      if (localPet == rootPet) then
        passflg = abs (f4array4(1)-f4array5(1)) < fuzz4 .and. abs (f4array4(2)-f4array5(2)) < fuzz4
      else
        passflg = .true.  ! Values are undefined after MPI_Reduce
      end if
      call ESMF_Test(passflg, name, failMsg, result, ESMF_SRCLINE)

      !------------------------------------------------------------------------


      end subroutine test_Reduce_sum