convert_old.f 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2. !
  3. ! This file converts a POP grid.dat file to a remapping grid file
  4. ! in netCDF format.
  5. !
  6. !-----------------------------------------------------------------------
  7. !
  8. ! CVS:$Id: convert_old.f,v 1.2 2000/04/19 22:05:57 pwjones Exp $
  9. !
  10. ! Copyright (c) 1997, 1998 the Regents of the University of
  11. ! California.
  12. !
  13. ! Unless otherwise indicated, this software has been authored
  14. ! by an employee or employees of the University of California,
  15. ! operator of the Los Alamos National Laboratory under Contract
  16. ! No. W-7405-ENG-36 with the U.S. Department of Energy. The U.S.
  17. ! Government has rights to use, reproduce, and distribute this
  18. ! software. The public may copy and use this software without
  19. ! charge, provided that this Notice and any statement of authorship
  20. ! are reproduced on all copies. Neither the Government nor the
  21. ! University makes any warranty, express or implied, or assumes
  22. ! any liability or responsibility for the use of this software.
  23. !
  24. !***********************************************************************
  25. program convertPOPT
  26. !-----------------------------------------------------------------------
  27. !
  28. ! This file converts a POP grid.dat file to a remapping grid file.
  29. !
  30. !-----------------------------------------------------------------------
  31. use kinds_mod
  32. use constants
  33. use iounits
  34. use netcdf_mod
  35. implicit none
  36. !-----------------------------------------------------------------------
  37. !
  38. ! variables that describe the grid
  39. !
  40. !-----------------------------------------------------------------------
  41. integer (kind=int_kind) ::
  42. & grid_size, grid_rank, grid_corners
  43. integer (kind=int_kind), dimension(2) ::
  44. & grid_dims ! size of each dimension
  45. character(char_len) ::
  46. & grid_name
  47. character(char_len), parameter ::
  48. & grid_file_in = 'remap_grid_WWice.dat',
  49. & grid_file_out = 'remap_grid_WWice.nc'
  50. !-----------------------------------------------------------------------
  51. !
  52. ! grid coordinates and masks
  53. !
  54. !-----------------------------------------------------------------------
  55. integer (kind=int_kind), dimension(:), allocatable ::
  56. & grid_imask
  57. real (kind=dbl_kind), dimension(:), allocatable ::
  58. & grid_center_lat, ! lat/lon coordinates for
  59. & grid_center_lon ! each grid center in radians
  60. real (kind=dbl_kind), dimension(:,:), allocatable ::
  61. & grid_corner_lat, ! lat/lon coordinates for
  62. & grid_corner_lon ! each grid corner in radians
  63. !-----------------------------------------------------------------------
  64. !
  65. ! other local variables
  66. !
  67. !-----------------------------------------------------------------------
  68. integer (kind=int_kind) :: i, j, n, iunit, ocn_add, im1, jm1
  69. integer (kind=int_kind) ::
  70. & ncstat, ! general netCDF status variable
  71. & nc_grid_id, ! netCDF grid dataset id
  72. & nc_gridsize_id, ! netCDF grid size dim id
  73. & nc_gridcorn_id, ! netCDF grid corner dim id
  74. & nc_gridrank_id, ! netCDF grid rank dim id
  75. & nc_griddims_id, ! netCDF grid dimensions id
  76. & nc_grdcntrlat_id, ! netCDF grid center lat id
  77. & nc_grdcntrlon_id, ! netCDF grid center lon id
  78. & nc_grdimask_id, ! netCDF grid mask id
  79. & nc_grdcrnrlat_id, ! netCDF grid corner lat id
  80. & nc_grdcrnrlon_id ! netCDF grid corner lon id
  81. integer (kind=int_kind), dimension(2) ::
  82. & nc_dims2_id ! netCDF dim id array for 2-d arrays
  83. real (kind=dbl_kind) :: tmplon
  84. !-----------------------------------------------------------------------
  85. !
  86. ! read in grid info
  87. ! lat/lon info is on velocity points which correspond
  88. ! to the NE corner (in logical space) of the grid cell.
  89. !
  90. !-----------------------------------------------------------------------
  91. call get_unit(iunit)
  92. open(unit=iunit, file=grid_file_in, status='old',
  93. & form='unformatted')
  94. read(iunit) grid_name
  95. read(iunit) grid_size, grid_corners, grid_rank, grid_dims
  96. allocate( grid_center_lat(grid_size),
  97. & grid_center_lon(grid_size),
  98. & grid_imask (grid_size),
  99. & grid_corner_lat(grid_corners, grid_size),
  100. & grid_corner_lon(grid_corners, grid_size) )
  101. read(iunit) grid_center_lat
  102. read(iunit) grid_center_lon
  103. read(iunit) grid_corner_lat
  104. read(iunit) grid_corner_lon
  105. read(iunit) grid_imask
  106. call release_unit(iunit)
  107. !-----------------------------------------------------------------------
  108. !
  109. ! set up attributes for netCDF file
  110. !
  111. !-----------------------------------------------------------------------
  112. !***
  113. !*** create netCDF dataset for this grid
  114. !***
  115. ncstat = nf_create (grid_file_out, NF_CLOBBER,
  116. & nc_grid_id)
  117. call netcdf_error_handler(ncstat)
  118. ncstat = nf_put_att_text (nc_grid_id, NF_GLOBAL, 'title',
  119. & len_trim(grid_name), grid_name)
  120. call netcdf_error_handler(ncstat)
  121. !***
  122. !*** define grid size dimension
  123. !***
  124. ncstat = nf_def_dim (nc_grid_id, 'grid_size', grid_size,
  125. & nc_gridsize_id)
  126. call netcdf_error_handler(ncstat)
  127. !***
  128. !*** define grid rank dimension
  129. !***
  130. ncstat = nf_def_dim (nc_grid_id, 'grid_rank', grid_rank,
  131. & nc_gridrank_id)
  132. call netcdf_error_handler(ncstat)
  133. !***
  134. !*** define grid corner dimension
  135. !***
  136. ncstat = nf_def_dim (nc_grid_id, 'grid_corners', grid_corners,
  137. & nc_gridcorn_id)
  138. call netcdf_error_handler(ncstat)
  139. !***
  140. !*** define grid dim size array
  141. !***
  142. ncstat = nf_def_var (nc_grid_id, 'grid_dims', NF_INT,
  143. & 1, nc_gridrank_id, nc_griddims_id)
  144. call netcdf_error_handler(ncstat)
  145. !***
  146. !*** define grid center latitude array
  147. !***
  148. ncstat = nf_def_var (nc_grid_id, 'grid_center_lat', NF_DOUBLE,
  149. & 1, nc_gridsize_id, nc_grdcntrlat_id)
  150. call netcdf_error_handler(ncstat)
  151. ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlat_id, 'units',
  152. & 7, 'radians')
  153. call netcdf_error_handler(ncstat)
  154. !***
  155. !*** define grid center longitude array
  156. !***
  157. ncstat = nf_def_var (nc_grid_id, 'grid_center_lon', NF_DOUBLE,
  158. & 1, nc_gridsize_id, nc_grdcntrlon_id)
  159. call netcdf_error_handler(ncstat)
  160. ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlon_id, 'units',
  161. & 7, 'radians')
  162. call netcdf_error_handler(ncstat)
  163. !***
  164. !*** define grid mask
  165. !***
  166. ncstat = nf_def_var (nc_grid_id, 'grid_imask', NF_INT,
  167. & 1, nc_gridsize_id, nc_grdimask_id)
  168. call netcdf_error_handler(ncstat)
  169. ncstat = nf_put_att_text (nc_grid_id, nc_grdimask_id, 'units',
  170. & 8, 'unitless')
  171. call netcdf_error_handler(ncstat)
  172. !***
  173. !*** define grid corner latitude array
  174. !***
  175. nc_dims2_id(1) = nc_gridcorn_id
  176. nc_dims2_id(2) = nc_gridsize_id
  177. ncstat = nf_def_var (nc_grid_id, 'grid_corner_lat', NF_DOUBLE,
  178. & 2, nc_dims2_id, nc_grdcrnrlat_id)
  179. call netcdf_error_handler(ncstat)
  180. ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlat_id, 'units',
  181. & 7, 'radians')
  182. call netcdf_error_handler(ncstat)
  183. !***
  184. !*** define grid corner longitude array
  185. !***
  186. ncstat = nf_def_var (nc_grid_id, 'grid_corner_lon', NF_DOUBLE,
  187. & 2, nc_dims2_id, nc_grdcrnrlon_id)
  188. call netcdf_error_handler(ncstat)
  189. ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlon_id, 'units',
  190. & 7, 'radians')
  191. call netcdf_error_handler(ncstat)
  192. !***
  193. !*** end definition stage
  194. !***
  195. ncstat = nf_enddef(nc_grid_id)
  196. call netcdf_error_handler(ncstat)
  197. !-----------------------------------------------------------------------
  198. !
  199. ! write grid data
  200. !
  201. !-----------------------------------------------------------------------
  202. ncstat = nf_put_var_int(nc_grid_id, nc_griddims_id, grid_dims)
  203. call netcdf_error_handler(ncstat)
  204. ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlat_id,
  205. & grid_center_lat)
  206. ncstat = nf_put_var_int(nc_grid_id, nc_grdimask_id, grid_imask)
  207. call netcdf_error_handler(ncstat)
  208. ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlat_id,
  209. & grid_center_lat)
  210. call netcdf_error_handler(ncstat)
  211. ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlon_id,
  212. & grid_center_lon)
  213. call netcdf_error_handler(ncstat)
  214. ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlat_id,
  215. & grid_corner_lat)
  216. call netcdf_error_handler(ncstat)
  217. ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlon_id,
  218. & grid_corner_lon)
  219. call netcdf_error_handler(ncstat)
  220. ncstat = nf_close(nc_grid_id)
  221. !***********************************************************************
  222. end program convertPOPT
  223. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!