subroutine verifyResults(humidity, rc)
type(ESMF_Field), intent(inout) :: humidity
integer, intent(out) :: rc
! Local variables
integer :: status, i, j, k, myDE, counts(2)
type(ESMF_RelLoc) :: relloc
type(ESMF_IGrid) :: igrid
real(ESMF_KIND_R8) :: pi, error, maxError, maxPerError
real(ESMF_KIND_R8) :: minCValue, maxCValue, minDValue, maxDValue
real(ESMF_KIND_R8), dimension(:,:), pointer :: calc, coordX, coordY
real(ESMF_KIND_R8), dimension(:,:,:), pointer :: data
print *, "User verifyResults starting"
pi = 3.14159
! get the igrid and coordinates
call ESMF_FieldGet(humidity, igrid=igrid, horzRelloc=relloc, rc=status)
call ESMF_IGridGetDELocalInfo(igrid, myDE=myDE, &
localCellCountPerDim=counts, &
horzRelloc=ESMF_CELL_CENTER, rc=status)
call ESMF_IGridGetCoord(igrid, dim=1, horzRelloc=relloc, &
centerCoord=coordX, rc=status)
call ESMF_IGridGetCoord(igrid, dim=2, horzRelloc=relloc, &
centerCoord=coordY, rc=status)
! update field values here
! Get a pointer to the start of the data
call ESMF_FieldGetDataPointer(humidity, data, ESMF_DATACOPY_REFERENCE, rc=rc)
! allocate array for computed results and fill it
allocate(calc(counts(1), counts(2)))
do j = 1,counts(2)
do i = 1,counts(1)
calc(i,j) = 10.0 + 5.0*sin(coordX(i,j)/60.0*pi) &
+ 2.0*sin(coordY(i,j)/50.0*pi)
enddo
enddo
! calculate data error from computed results
maxError = 0.0
maxPerError = 0.0
maxCValue = 0.0
minCValue = 1000.0
maxDValue = 0.0
minDValue = 1000.0
do k = 1,size(data,1)
do j = 1,counts(2)
do i = 1,counts(1)
error = abs(data(k,i,j)) - abs(calc(i,j))
minCValue = min(minCValue, abs(calc(i,j)))
maxCValue = max(maxCValue, abs(calc(i,j)))
minDValue = min(minDValue, abs(data(k,i,j)))
maxDValue = max(maxDValue, abs(data(k,i,j)))
maxError = max(maxError, abs(error))
maxPerError = max(maxPerError, 100.*abs(error)/abs(calc(i,j)))
enddo
enddo
enddo
write(*,*) "Results for DE #", myDE, ":"
write(*,*) " minimum regridded value = ", minDValue
write(*,*) " maximum regridded value = ", maxDValue
write(*,*) " minimum computed value = ", minCValue
write(*,*) " maximum computed value = ", maxCValue
write(*,*) " maximum error = ", maxError
write(*,*) " maximum percent error = ", maxPerError
print *, "User verifyResults returning"
! only accept this test as successful if the max percent
! error is below 2%
if (maxPerError .gt. 2.0) then
write(*,*) "Test Failing because percentage error too large"
rc = ESMF_FAILURE
else
rc = ESMF_SUCCESS
endif
end subroutine verifyResults