288 lines
9.5 KiB
Fortran
Executable File
288 lines
9.5 KiB
Fortran
Executable File
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
!
|
|
! This file converts a POP grid.dat file to a remapping grid file
|
|
! in netCDF format.
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! CVS:$Id: convert_old.f,v 1.2 2000/04/19 22:05:57 pwjones Exp $
|
|
!
|
|
! Copyright (c) 1997, 1998 the Regents of the University of
|
|
! California.
|
|
!
|
|
! Unless otherwise indicated, this software has been authored
|
|
! by an employee or employees of the University of California,
|
|
! operator of the Los Alamos National Laboratory under Contract
|
|
! No. W-7405-ENG-36 with the U.S. Department of Energy. The U.S.
|
|
! Government has rights to use, reproduce, and distribute this
|
|
! software. The public may copy and use this software without
|
|
! charge, provided that this Notice and any statement of authorship
|
|
! are reproduced on all copies. Neither the Government nor the
|
|
! University makes any warranty, express or implied, or assumes
|
|
! any liability or responsibility for the use of this software.
|
|
!
|
|
!***********************************************************************
|
|
|
|
program convertPOPT
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! This file converts a POP grid.dat file to a remapping grid file.
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
use kinds_mod
|
|
use constants
|
|
use iounits
|
|
use netcdf_mod
|
|
|
|
implicit none
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! variables that describe the grid
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
integer (kind=int_kind) ::
|
|
& grid_size, grid_rank, grid_corners
|
|
|
|
integer (kind=int_kind), dimension(2) ::
|
|
& grid_dims ! size of each dimension
|
|
|
|
character(char_len) ::
|
|
& grid_name
|
|
|
|
character(char_len), parameter ::
|
|
& grid_file_in = 'remap_grid_WWice.dat',
|
|
& grid_file_out = 'remap_grid_WWice.nc'
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! grid coordinates and masks
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
integer (kind=int_kind), dimension(:), allocatable ::
|
|
& grid_imask
|
|
|
|
real (kind=dbl_kind), dimension(:), allocatable ::
|
|
& grid_center_lat, ! lat/lon coordinates for
|
|
& grid_center_lon ! each grid center in radians
|
|
|
|
real (kind=dbl_kind), dimension(:,:), allocatable ::
|
|
& grid_corner_lat, ! lat/lon coordinates for
|
|
& grid_corner_lon ! each grid corner in radians
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! other local variables
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
integer (kind=int_kind) :: i, j, n, iunit, ocn_add, im1, jm1
|
|
|
|
integer (kind=int_kind) ::
|
|
& ncstat, ! general netCDF status variable
|
|
& nc_grid_id, ! netCDF grid dataset id
|
|
& nc_gridsize_id, ! netCDF grid size dim id
|
|
& nc_gridcorn_id, ! netCDF grid corner dim id
|
|
& nc_gridrank_id, ! netCDF grid rank dim id
|
|
& nc_griddims_id, ! netCDF grid dimensions id
|
|
& nc_grdcntrlat_id, ! netCDF grid center lat id
|
|
& nc_grdcntrlon_id, ! netCDF grid center lon id
|
|
& nc_grdimask_id, ! netCDF grid mask id
|
|
& nc_grdcrnrlat_id, ! netCDF grid corner lat id
|
|
& nc_grdcrnrlon_id ! netCDF grid corner lon id
|
|
|
|
integer (kind=int_kind), dimension(2) ::
|
|
& nc_dims2_id ! netCDF dim id array for 2-d arrays
|
|
|
|
real (kind=dbl_kind) :: tmplon
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! read in grid info
|
|
! lat/lon info is on velocity points which correspond
|
|
! to the NE corner (in logical space) of the grid cell.
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
call get_unit(iunit)
|
|
open(unit=iunit, file=grid_file_in, status='old',
|
|
& form='unformatted')
|
|
|
|
read(iunit) grid_name
|
|
read(iunit) grid_size, grid_corners, grid_rank, grid_dims
|
|
|
|
allocate( grid_center_lat(grid_size),
|
|
& grid_center_lon(grid_size),
|
|
& grid_imask (grid_size),
|
|
& grid_corner_lat(grid_corners, grid_size),
|
|
& grid_corner_lon(grid_corners, grid_size) )
|
|
|
|
read(iunit) grid_center_lat
|
|
read(iunit) grid_center_lon
|
|
read(iunit) grid_corner_lat
|
|
read(iunit) grid_corner_lon
|
|
read(iunit) grid_imask
|
|
call release_unit(iunit)
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! set up attributes for netCDF file
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
!***
|
|
!*** create netCDF dataset for this grid
|
|
!***
|
|
|
|
ncstat = nf_create (grid_file_out, NF_CLOBBER,
|
|
& nc_grid_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, NF_GLOBAL, 'title',
|
|
& len_trim(grid_name), grid_name)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid size dimension
|
|
!***
|
|
|
|
ncstat = nf_def_dim (nc_grid_id, 'grid_size', grid_size,
|
|
& nc_gridsize_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid rank dimension
|
|
!***
|
|
|
|
ncstat = nf_def_dim (nc_grid_id, 'grid_rank', grid_rank,
|
|
& nc_gridrank_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid corner dimension
|
|
!***
|
|
|
|
ncstat = nf_def_dim (nc_grid_id, 'grid_corners', grid_corners,
|
|
& nc_gridcorn_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid dim size array
|
|
!***
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_dims', NF_INT,
|
|
& 1, nc_gridrank_id, nc_griddims_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid center latitude array
|
|
!***
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_center_lat', NF_DOUBLE,
|
|
& 1, nc_gridsize_id, nc_grdcntrlat_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlat_id, 'units',
|
|
& 7, 'radians')
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid center longitude array
|
|
!***
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_center_lon', NF_DOUBLE,
|
|
& 1, nc_gridsize_id, nc_grdcntrlon_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlon_id, 'units',
|
|
& 7, 'radians')
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid mask
|
|
!***
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_imask', NF_INT,
|
|
& 1, nc_gridsize_id, nc_grdimask_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, nc_grdimask_id, 'units',
|
|
& 8, 'unitless')
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid corner latitude array
|
|
!***
|
|
|
|
nc_dims2_id(1) = nc_gridcorn_id
|
|
nc_dims2_id(2) = nc_gridsize_id
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_corner_lat', NF_DOUBLE,
|
|
& 2, nc_dims2_id, nc_grdcrnrlat_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlat_id, 'units',
|
|
& 7, 'radians')
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** define grid corner longitude array
|
|
!***
|
|
|
|
ncstat = nf_def_var (nc_grid_id, 'grid_corner_lon', NF_DOUBLE,
|
|
& 2, nc_dims2_id, nc_grdcrnrlon_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlon_id, 'units',
|
|
& 7, 'radians')
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!***
|
|
!*** end definition stage
|
|
!***
|
|
|
|
ncstat = nf_enddef(nc_grid_id)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
! write grid data
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
ncstat = nf_put_var_int(nc_grid_id, nc_griddims_id, grid_dims)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlat_id,
|
|
& grid_center_lat)
|
|
ncstat = nf_put_var_int(nc_grid_id, nc_grdimask_id, grid_imask)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlat_id,
|
|
& grid_center_lat)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlon_id,
|
|
& grid_center_lon)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlat_id,
|
|
& grid_corner_lat)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlon_id,
|
|
& grid_corner_lon)
|
|
call netcdf_error_handler(ncstat)
|
|
|
|
ncstat = nf_close(nc_grid_id)
|
|
|
|
!***********************************************************************
|
|
|
|
end program convertPOPT
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|