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
