2025-09-05 09:42:21 +02:00

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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!