Skip to main content

Example 04 — Generate Grids

Generates 2D, 3D, and 4D grids from a bounding box, fills them with data, and writes to NetCDF.

Source Code

program main
use fpl
implicit none

type(nc2d_double_llf) :: grid2d
type(nc3d_int_llf_ti) :: grid3d
type(nc4d_float_llf_ti_li) :: grid4d

integer(kind=intgr) :: i, j, k, l
real(kind=4) :: Xmin, Ymin, Xmax, Ymax, res
character(200) :: opath2d, opath3d, opath4d

opath2d = "database/grid2d.nc"
opath3d = "database/grid3d.nc"
opath4d = "database/grid4d.nc"

! --- 2D Grid ---
grid2d%long_name = "My Grid 1 degree"
grid2d%varname = "grid"
grid2d%lonname = "lon"
grid2d%latname = "lat"
grid2d%varunits = "dimensionless"
grid2d%lonunits = "degrees_east"
grid2d%latunits = "degrees_north"
grid2d%FillValue = -9999

Xmin = -54.7371; Ymin = -11.3437
Xmax = -34.7371; Ymax = 2.6562
res = 0.00833333

call gengrid(grid2d, Xmin, Ymin, Xmax, Ymax, res)

!$omp parallel do
do j = 1, grid2d%nlats
do i = 1, grid2d%nlons
grid2d%ncdata(i,j) = cos(grid2d%longitudes(i)) + grid2d%latitudes(j)
end do
end do
!$omp end parallel do

call writegrid(opath2d, grid2d)

! --- 3D Grid ---
grid3d%long_name = "My Grid 1 degree"
grid3d%varname = "grid"
grid3d%lonname = "lon"
grid3d%latname = "lat"
grid3d%timename = "time"
grid3d%varunits = "dimensionless"
grid3d%lonunits = "degrees_east"
grid3d%latunits = "degrees_north"
grid3d%timeunits = "hour"
grid3d%ntimes = 10
grid3d%FillValue = -9999

call gengrid(grid3d, -74.73715442059999, -34.343706397220295, -34.73715458059378, 5.6562934427799965, 1.0)

do i = 1, grid3d%ntimes
do k = 1, grid3d%nlats
do j = 1, grid3d%nlons
grid3d%ncdata(j,k,i) = int(i * (cos(real(j)) * grid3d%longitudes(j) &
+ k * grid3d%latitudes(k)))
end do
end do
end do

call writegrid(opath3d, grid3d)

! --- 4D Grid ---
grid4d%long_name = "My Grid ~ 1 degree"
grid4d%varname = "grid"
grid4d%lonname = "lon"
grid4d%latname = "lat"
grid4d%timename = "time"
grid4d%levelname = "level"
grid4d%varunits = "dimensionless"
grid4d%lonunits = "degrees_east"
grid4d%latunits = "degrees_north"
grid4d%timeunits = "hour"
grid4d%levelunits = "m"
grid4d%ntimes = 10
grid4d%nlevels = 5
grid4d%FillValue = -9999

call gengrid(grid4d, -74.73715442059999, -34.343706397220295, -34.73715458059378, 5.6562934427799965, 1.0)

do l = 1, grid4d%nlevels
do i = 1, grid4d%ntimes
do k = 1, grid4d%nlats
do j = 1, grid4d%nlons
grid4d%ncdata(j,k,i,l) = int((l**3) / i &
* (cos(real(j)) * grid4d%longitudes(j) + k * grid4d%latitudes(k)))
end do
end do
end do
end do

call writegrid(opath4d, grid4d, "database/gridHeader.txt")
end program main

Compile & Run

gfortran -fopenmp -o ex4.out ex4_gengrid.f90 -I/usr/lib64/gfortran/modules/ -lFPL
./ex4.out

Output

Example 04 result