Skip to main content

Example 08 — Zonal Statistics (3D)

Computes cattle density statistics grouped by Brazilian state (UF) with temporal evolution from 1990 to 2012, and saves results to CSV.

Source Code

program main
use fpl
implicit none

type(nc2d_byte_lld) :: zones
type(nc3d_double_lld_ti) :: cattle

integer(kind=intgr), parameter :: nzones = 28
integer(kind=intgr), allocatable :: zcount(:,:)
real(kind=double), allocatable :: zmean(:,:), zmin(:,:), zmax(:,:), zsum(:,:), zvar(:,:)

character(len=20) :: uf_name(28)
integer(kind=intgr) :: z, k
character(len=100) :: ofile

uf_name = ""
uf_name(18) = "Minas Gerais"
! ... (other states)

zones%varname = "UF"
zones%lonname = "lon"
zones%latname = "lat"
zones%varunits = "class"
call readgrid("database/brazil_UF.nc", zones)

cattle%varname = "Cattle"
cattle%lonname = "lon"
cattle%latname = "lat"
cattle%timename = "time"
call readgrid("database/CATTLE19902012.nc", cattle)

allocate(zcount(nzones, cattle%ntimes))
allocate(zmean(nzones, cattle%ntimes))
allocate(zmin(nzones, cattle%ntimes))
allocate(zmax(nzones, cattle%ntimes))
allocate(zsum(nzones, cattle%ntimes))
allocate(zvar(nzones, cattle%ntimes))

call zonalStats(zones, cattle, nzones, zcount, zmean, zmin, zmax, zsum, zvar)

! Save to CSV
ofile = "database/zonalstats_cattle_1990_2012.csv"
open(unit=10, file=trim(ofile), status='replace', action='write')
write(10,'(a)') "state,year,pixels,mean,min,max,sum,var"

do z = 1, nzones
if (len_trim(uf_name(z)) == 0 .or. zcount(z,1) == 0) cycle
do k = 1, cattle%ntimes
write(10,'(a,",",i0,",",i0,",",es14.6,",",es14.6,",",es14.6,",",es14.6,",",es14.6)') &
trim(uf_name(z)), int(cattle%times(k)), zcount(z,k), &
zmean(z,k), zmin(z,k), zmax(z,k), zsum(z,k), zvar(z,k)
end do
end do
close(10)

deallocate(zcount, zmean, zmin, zmax, zsum, zvar)
call dealloc(zones)
call dealloc(cattle)
end program main

Compile & Run

gfortran -fopenmp -o ex8.out ex8_zonalstats_3d.f90 -I/usr/lib64/gfortran/modules/ -lFPL
./ex8.out

Figure

Example 08

Output (excerpt — Minas Gerais)

  State: Minas Gerais
Year Pixels Mean Min Max Total
--------------------------------------------------------------------
1990 722848 0.7255 0.0000 1.4670 524449.24
2000 722848 0.8844 0.0000 1.9470 639275.11
2012 722848 1.6883 0.0000 6.5430 1220352.83

Results saved to: database/zonalstats_cattle_1990_2012.csv