create_latlon.f 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2. !
  3. ! This program creates a remapping grid file for a lat/lon grid.
  4. !
  5. !-----------------------------------------------------------------------
  6. !
  7. ! CVS:$Id: create_latlon.f,v 1.1 2000/04/19 22:05:58 pwjones Exp $
  8. !
  9. ! Copyright (c) 1997, 1998 the Regents of the University of
  10. ! California.
  11. !
  12. ! Unless otherwise indicated, this software has been authored
  13. ! by an employee or employees of the University of California,
  14. ! operator of the Los Alamos National Laboratory under Contract
  15. ! No. W-7405-ENG-36 with the U.S. Department of Energy. The U.S.
  16. ! Government has rights to use, reproduce, and distribute this
  17. ! software. The public may copy and use this software without
  18. ! charge, provided that this Notice and any statement of authorship
  19. ! are reproduced on all copies. Neither the Government nor the
  20. ! University makes any warranty, express or implied, or assumes
  21. ! any liability or responsibility for the use of this software.
  22. !
  23. !***********************************************************************
  24. program create_latlon
  25. !-----------------------------------------------------------------------
  26. !
  27. ! This file creates a remapping grid file for a Gaussian grid
  28. !
  29. !-----------------------------------------------------------------------
  30. use kinds_mod
  31. use constants
  32. use iounits
  33. use netcdf_mod
  34. implicit none
  35. !-----------------------------------------------------------------------
  36. !
  37. ! variables that describe the grid
  38. !
  39. !-----------------------------------------------------------------------
  40. integer (kind=int_kind), parameter ::
  41. & nx = 360, ny = 180,
  42. & grid_size = nx*ny,
  43. & grid_rank = 2,
  44. & grid_corners = 4
  45. character(char_len), parameter ::
  46. & grid_name = 'Lat/lon 1 degree Grid',
  47. & grid_file_out = 'll1deg_grid.nc'
  48. integer (kind=int_kind), dimension(grid_rank) ::
  49. & grid_dims
  50. !-----------------------------------------------------------------------
  51. !
  52. ! grid coordinates and masks
  53. !
  54. !-----------------------------------------------------------------------
  55. integer (kind=int_kind), dimension(grid_size) ::
  56. & grid_imask
  57. real (kind=dbl_kind), dimension(grid_size) ::
  58. & grid_center_lat, ! lat/lon coordinates for
  59. & grid_center_lon ! each grid center in degrees
  60. real (kind=dbl_kind), dimension(grid_corners,grid_size) ::
  61. & grid_corner_lat, ! lat/lon coordinates for
  62. & grid_corner_lon ! each grid corner in degrees
  63. !-----------------------------------------------------------------------
  64. !
  65. ! other local variables
  66. !
  67. !-----------------------------------------------------------------------
  68. integer (kind=int_kind) :: i, j, iunit, atm_add
  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 dimension size 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) :: dlon, minlon, maxlon, centerlon,
  84. & dlat, minlat, maxlat, centerlat
  85. !-----------------------------------------------------------------------
  86. !
  87. ! compute longitudes and latitudes of cell centers and corners.
  88. !
  89. !-----------------------------------------------------------------------
  90. grid_dims(1) = nx
  91. grid_dims(2) = ny
  92. dlon = 360./nx
  93. dlat = 180./ny
  94. do j=1,ny
  95. minlat = -90._dbl_kind + (j-1)*dlat
  96. maxlat = -90._dbl_kind + j *dlat
  97. centerlat = minlat + half*dlat
  98. do i=1,nx
  99. centerlon = (i-1)*dlon
  100. minlon = centerlon - half*dlon
  101. maxlon = centerlon + half*dlon
  102. atm_add = (j-1)*nx + i
  103. grid_center_lat(atm_add ) = centerlat
  104. grid_corner_lat(1,atm_add) = minlat
  105. grid_corner_lat(2,atm_add) = minlat
  106. grid_corner_lat(3,atm_add) = maxlat
  107. grid_corner_lat(4,atm_add) = maxlat
  108. grid_center_lon(atm_add ) = centerlon
  109. grid_corner_lon(1,atm_add) = minlon
  110. grid_corner_lon(2,atm_add) = maxlon
  111. grid_corner_lon(3,atm_add) = maxlon
  112. grid_corner_lon(4,atm_add) = minlon
  113. end do
  114. end do
  115. !-----------------------------------------------------------------------
  116. !
  117. ! define mask
  118. !
  119. !-----------------------------------------------------------------------
  120. grid_imask = 1
  121. !-----------------------------------------------------------------------
  122. !
  123. ! set up attributes for netCDF file
  124. !
  125. !-----------------------------------------------------------------------
  126. !***
  127. !*** create netCDF dataset for this grid
  128. !***
  129. ncstat = nf_create (grid_file_out, NF_CLOBBER,
  130. & nc_grid_id)
  131. call netcdf_error_handler(ncstat)
  132. ncstat = nf_put_att_text (nc_grid_id, NF_GLOBAL, 'title',
  133. & len_trim(grid_name), grid_name)
  134. call netcdf_error_handler(ncstat)
  135. !***
  136. !*** define grid size dimension
  137. !***
  138. ncstat = nf_def_dim (nc_grid_id, 'grid_size', grid_size,
  139. & nc_gridsize_id)
  140. call netcdf_error_handler(ncstat)
  141. !***
  142. !*** define grid corner dimension
  143. !***
  144. ncstat = nf_def_dim (nc_grid_id, 'grid_corners', grid_corners,
  145. & nc_gridcorn_id)
  146. call netcdf_error_handler(ncstat)
  147. !***
  148. !*** define grid rank dimension
  149. !***
  150. ncstat = nf_def_dim (nc_grid_id, 'grid_rank', grid_rank,
  151. & nc_gridrank_id)
  152. call netcdf_error_handler(ncstat)
  153. !***
  154. !*** define grid dimension size array
  155. !***
  156. ncstat = nf_def_var (nc_grid_id, 'grid_dims', NF_INT,
  157. & 1, nc_gridrank_id, nc_griddims_id)
  158. call netcdf_error_handler(ncstat)
  159. !***
  160. !*** define grid center latitude array
  161. !***
  162. ncstat = nf_def_var (nc_grid_id, 'grid_center_lat', NF_DOUBLE,
  163. & 1, nc_gridsize_id, nc_grdcntrlat_id)
  164. call netcdf_error_handler(ncstat)
  165. ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlat_id, 'units',
  166. & 7, 'degrees')
  167. call netcdf_error_handler(ncstat)
  168. !***
  169. !*** define grid center longitude array
  170. !***
  171. ncstat = nf_def_var (nc_grid_id, 'grid_center_lon', NF_DOUBLE,
  172. & 1, nc_gridsize_id, nc_grdcntrlon_id)
  173. call netcdf_error_handler(ncstat)
  174. ncstat = nf_put_att_text (nc_grid_id, nc_grdcntrlon_id, 'units',
  175. & 7, 'degrees')
  176. call netcdf_error_handler(ncstat)
  177. !***
  178. !*** define grid mask
  179. !***
  180. ncstat = nf_def_var (nc_grid_id, 'grid_imask', NF_INT,
  181. & 1, nc_gridsize_id, nc_grdimask_id)
  182. call netcdf_error_handler(ncstat)
  183. ncstat = nf_put_att_text (nc_grid_id, nc_grdimask_id, 'units',
  184. & 8, 'unitless')
  185. call netcdf_error_handler(ncstat)
  186. !***
  187. !*** define grid corner latitude array
  188. !***
  189. nc_dims2_id(1) = nc_gridcorn_id
  190. nc_dims2_id(2) = nc_gridsize_id
  191. ncstat = nf_def_var (nc_grid_id, 'grid_corner_lat', NF_DOUBLE,
  192. & 2, nc_dims2_id, nc_grdcrnrlat_id)
  193. call netcdf_error_handler(ncstat)
  194. ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlat_id, 'units',
  195. & 7, 'degrees')
  196. call netcdf_error_handler(ncstat)
  197. !***
  198. !*** define grid corner longitude array
  199. !***
  200. ncstat = nf_def_var (nc_grid_id, 'grid_corner_lon', NF_DOUBLE,
  201. & 2, nc_dims2_id, nc_grdcrnrlon_id)
  202. call netcdf_error_handler(ncstat)
  203. ncstat = nf_put_att_text (nc_grid_id, nc_grdcrnrlon_id, 'units',
  204. & 7, 'degrees')
  205. call netcdf_error_handler(ncstat)
  206. !***
  207. !*** end definition stage
  208. !***
  209. ncstat = nf_enddef(nc_grid_id)
  210. call netcdf_error_handler(ncstat)
  211. !-----------------------------------------------------------------------
  212. !
  213. ! write grid data
  214. !
  215. !-----------------------------------------------------------------------
  216. ncstat = nf_put_var_int(nc_grid_id, nc_griddims_id, grid_dims)
  217. call netcdf_error_handler(ncstat)
  218. ncstat = nf_put_var_int(nc_grid_id, nc_grdimask_id, grid_imask)
  219. call netcdf_error_handler(ncstat)
  220. ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlat_id,
  221. & grid_center_lat)
  222. call netcdf_error_handler(ncstat)
  223. ncstat = nf_put_var_double(nc_grid_id, nc_grdcntrlon_id,
  224. & grid_center_lon)
  225. call netcdf_error_handler(ncstat)
  226. ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlat_id,
  227. & grid_corner_lat)
  228. call netcdf_error_handler(ncstat)
  229. ncstat = nf_put_var_double(nc_grid_id, nc_grdcrnrlon_id,
  230. & grid_corner_lon)
  231. call netcdf_error_handler(ncstat)
  232. ncstat = nf_close(nc_grid_id)
  233. call netcdf_error_handler(ncstat)
  234. !-----------------------------------------------------------------------
  235. end program create_latlon
  236. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!