subroutine compute_flux1D(vm, flux_density, area, fraction, allsum, rc)
type(ESMF_VM), intent(in) :: vm
real(ESMF_KIND_R8), pointer :: flux_density(:)
real(ESMF_KIND_R8), pointer :: area(:)
real(ESMF_KIND_R8), pointer :: fraction(:)
real(ESMF_KIND_R8), intent(out) :: allsum(3)
integer, intent(out), optional :: rc
real(ESMF_KIND_R8) :: sum(3)
integer :: i,j, localrc
if(present(rc)) rc = ESMF_SUCCESS
sum = 0.
do i = lbound(flux_density, 1), ubound(flux_density, 1)
sum(1) = sum(1) + flux_density(i)*area(i)*fraction(i)
sum(2) = sum(2) + area(i)*fraction(i)
sum(3) = sum(3) + area(i)
enddo
call ESMF_VMAllReduce(vm, sum, allsum, 3, ESMF_REDUCE_SUM, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
end subroutine compute_flux1D