grid_tools 1.14.0
Loading...
Searching...
No Matches
regional_esg_grid.f90
Go to the documentation of this file.
1
5
19
20 use pkind, only: dp
21 use pietc, only: dtor,rtod
22 use pesg
23 use netcdf
24
25 implicit none
26
27 ! namelist variables
28 real(dp) :: plat,plon,pazi=0.0
29 real(dp) :: delx,dely
30 integer :: lx,ly
31 namelist /regional_grid_nml/ plat,plon,pazi,delx,dely,lx,ly
32
33 real(dp),parameter :: re=6371200.0
34 real(dp),parameter :: lam=0.8
35
36 integer :: nxh,nyh, nx,ny, nxm,nym
37 logical :: ff
38
39 real(dp),dimension(:,:),allocatable:: glat,glon
40 real(dp),dimension(:,:),allocatable:: garea
41 real(dp),dimension(:,:),allocatable:: dx,dy,angle_dx,angle_dy
42
43 character(len=256) :: nml_fname
44
45 ! netcdf
46 integer :: ncid
47 integer :: string_dimid, nxp_dimid, nyp_dimid, nx_dimid, ny_dimid
48 integer :: tile_varid, x_varid, y_varid, area_varid
49 integer :: dx_varid, dy_varid, angle_dx_varid, angle_dy_varid
50 integer, dimension(2) :: dimids
51
52 real(dp) :: a,k,m_arcx,m_arcy,q
53 real(dp) :: m_delx,m_dely, delxre,delyre
54 real(dp) :: arcx,arcy
55
56!=============================================================================
57
58 if (command_argument_count() == 1) then
59 call get_command_argument(1, nml_fname)
60 else
61 nml_fname = "regional_grid.nml"
62 end if
63
64 open(10,file=trim(nml_fname),status="old",action="read")
65 read(10,nml=regional_grid_nml)
66 close(10)
67
68 nxh=-lx
69 nyh=-ly
70 nx=2*nxh
71 ny=2*nyh
72 nxm=nx-1
73 nym=ny-1
74
75 allocate(glat(0:nx,0:ny))
76 allocate(glon(0:nx,0:ny))
77 allocate(garea(0:nxm,0:nym))
78
79 allocate(dx(0:nxm,0:ny))
80 allocate(dy(0:nx,0:nym))
81 allocate(angle_dx(0:nx,0:ny))
82 allocate(angle_dy(0:nx,0:ny))
83
84 arcx=delx*nxh
85 arcy=dely*nyh
86 print'("arcx, arcy ",f8.4,f8.4)',arcx,arcy
87 call bestesg_geo(lam,arcx,arcy, a,k,m_arcx,m_arcy,q,ff)
88 if(ff)stop 'Failure flag returned from get_bestesg'
89 print'("For lam=",f8.2," the best [smallest possible]")',lam
90 print'("optimality criterion, Q, for this domain: ",e13.6 )',q
91 print'("The corresponding optimal A and K:",2(1x,f8.4))',a,k
92 print'("The corresponding m_arcx,y:",2(1x,e20.13))',m_arcx,m_arcy
93
94 m_delx=m_arcx/nxh ! Map-space grid steps in x
95 m_dely=m_arcy/nyh ! Map-space grid steps in y
96 print'("x and y central grid resolution in map units:",2(1x,e12.5))',m_delx,m_dely
97
98 print'("Get additional diagnostics from hgrid_ak_rr")'
99
100 delxre=m_delx*re
101 delyre=m_dely*re
102
103 call hgrid_ak(lx,ly, nx,ny, a,k, plat*dtor,plon*dtor,pazi*dtor, re,delxre,delyre, &
104 glat,glon,garea, dx,dy,angle_dx,angle_dy, ff)
105 if(ff)stop 'Failure flag raised in hgrid routine'
106
107 glon = glon*rtod
108 glat = glat*rtod
109 where (glon < 0.0) glon = glon + 360.0
110
111 call check( nf90_create("regional_grid.nc", ior(nf90_netcdf4,nf90_classic_model), ncid) )
112 call check( nf90_def_dim(ncid, "string", 255, string_dimid) )
113 call check( nf90_def_dim(ncid, "nx", nx, nx_dimid) )
114 call check( nf90_def_dim(ncid, "ny", ny, ny_dimid) )
115 call check( nf90_def_dim(ncid, "nxp", nx+1, nxp_dimid) )
116 call check( nf90_def_dim(ncid, "nyp", ny+1, nyp_dimid) )
117
118 call check( nf90_def_var(ncid, "tile", nf90_char, [string_dimid], tile_varid) )
119 call check( nf90_put_att(ncid, tile_varid, "standard_name", "grid_tile_spec") )
120
121 dimids = (/ nxp_dimid, nyp_dimid /)
122 call check( nf90_def_var(ncid, "x", nf90_double, dimids, x_varid) )
123 call check( nf90_put_att(ncid, x_varid, "standard_name", "geographic_longitude") )
124 call check( nf90_put_att(ncid, x_varid, "units", "degree_east") )
125 call check( nf90_put_att(ncid, x_varid, "hstagger", "C") )
126 call check( nf90_def_var(ncid, "y", nf90_double, dimids, y_varid) )
127 call check( nf90_put_att(ncid, y_varid, "standard_name", "geographic_latitude") )
128 call check( nf90_put_att(ncid, y_varid, "units", "degree_north") )
129 call check( nf90_put_att(ncid, y_varid, "hstagger", "C") )
130 dimids = (/ nx_dimid, ny_dimid /)
131 call check( nf90_def_var(ncid, "area", nf90_double, dimids, area_varid) )
132 call check( nf90_put_att(ncid, area_varid, "standard_name", "grid_cell_area") )
133 call check( nf90_put_att(ncid, area_varid, "units", "m2") )
134 call check( nf90_put_att(ncid, area_varid, "hstagger", "H") )
135
136 dimids = (/ nx_dimid, nyp_dimid /)
137 call check( nf90_def_var(ncid, "dx", nf90_double, dimids, dx_varid) )
138 call check( nf90_put_att(ncid, dx_varid, "standard_name", "dx") )
139 call check( nf90_put_att(ncid, dx_varid, "units", "m") )
140 call check( nf90_put_att(ncid, dx_varid, "hstagger", "H") )
141
142 dimids = (/ nxp_dimid, ny_dimid /)
143 call check( nf90_def_var(ncid, "dy", nf90_double, dimids, dy_varid) )
144 call check( nf90_put_att(ncid, dy_varid, "standard_name", "dy") )
145 call check( nf90_put_att(ncid, dy_varid, "units", "m") )
146 call check( nf90_put_att(ncid, dy_varid, "hstagger", "H") )
147
148 dimids = (/ nxp_dimid, nyp_dimid /)
149 call check( nf90_def_var(ncid, "angle_dx", nf90_double, dimids, angle_dx_varid) )
150 call check( nf90_put_att(ncid, angle_dx_varid, "standard_name", "angle_dx") )
151 call check( nf90_put_att(ncid, angle_dx_varid, "units", "deg") )
152 call check( nf90_put_att(ncid, angle_dx_varid, "hstagger", "C") )
153 call check( nf90_def_var(ncid, "angle_dy", nf90_double, dimids, angle_dy_varid) )
154 call check( nf90_put_att(ncid, angle_dy_varid, "standard_name", "angle_dy") )
155 call check( nf90_put_att(ncid, angle_dy_varid, "units", "deg") )
156 call check( nf90_put_att(ncid, angle_dy_varid, "hstagger", "C") )
157
158 call check( nf90_put_att(ncid, nf90_global, "history", "gnomonic_ed") )
159 call check( nf90_put_att(ncid, nf90_global, "source", "FV3GFS") )
160 call check( nf90_put_att(ncid, nf90_global, "grid", "akappa") )
161 call check( nf90_put_att(ncid, nf90_global, "plat", plat) )
162 call check( nf90_put_att(ncid, nf90_global, "plon", plon) )
163 call check( nf90_put_att(ncid, nf90_global, "pazi", pazi) )
164 call check( nf90_put_att(ncid, nf90_global, "delx", m_delx*rtod) )
165 call check( nf90_put_att(ncid, nf90_global, "dely", m_dely*rtod) )
166 call check( nf90_put_att(ncid, nf90_global, "lx", lx) )
167 call check( nf90_put_att(ncid, nf90_global, "ly", ly) )
168 call check( nf90_put_att(ncid, nf90_global, "a", a) )
169 call check( nf90_put_att(ncid, nf90_global, "k", k) )
170
171 call check( nf90_enddef(ncid) )
172
173 call check( nf90_put_var(ncid, tile_varid, "tile7") )
174 call check( nf90_put_var(ncid, x_varid, glon) )
175 call check( nf90_put_var(ncid, y_varid, glat) )
176 call check( nf90_put_var(ncid, area_varid, garea) )
177 call check( nf90_put_var(ncid, dx_varid, dx) )
178 call check( nf90_put_var(ncid, dy_varid, dy) )
179 call check( nf90_put_var(ncid, angle_dx_varid, angle_dx) )
180 call check( nf90_put_var(ncid, angle_dy_varid, angle_dy) )
181
182 call check( nf90_close(ncid) )
183
184end program regional_grid
185
190subroutine check(status)
191use netcdf
192integer,intent(in) :: status
193!
194if(status /= nf90_noerr) then
195 write(0,*)' check netcdf status=',status
196 write(0,'("error ", a)')trim(nf90_strerror(status))
197 stop "Stopped"
198endif
199end subroutine check
subroutine check(status)
Check results of netCDF call.
Suite of routines to perform the 2-parameter family of Extended Schmidt Gnomonic (ESG) regional grid ...
Definition pesg.f90:15
Some of the commonly used constants (pi etc) mainly for double-precision subroutines.
Definition pietc.f90:14
real(dp), parameter dtor
Degrees to radians.
Definition pietc.f90:54
real(dp), parameter rtod
radians to degrees
Definition pietc.f90:55
Standard integer, real, and complex single and double precision kinds.
Definition pkind.f90:7
integer, parameter dp
Double precision real kind.
Definition pkind.f90:11
program regional_grid
Driver routine to compute geo-referencing parameters for the Extended Schmidt Gnomonic (ESG) regional...