20 integer,
parameter :: kdbl=selected_real_kind(p=13,r=200)
21 character(len=255) :: filename_full
22 character(len=255) :: filename_shaved
23 integer :: idim_compute,jdim_compute,halo
24 integer :: i_count_compute,j_count_compute &
25 ,i_count_super,j_count_super
34 integer :: n,na,ncid_in,ncid_out,nd,ndims,ngatts &
38 integer :: dim_id,len_dim,len_x,len_y,var_id,xdim_id,xdim_id_out &
41 integer,
dimension(1:2) :: dimids=(/0,0/)
42 real,
dimension(:) ,
allocatable :: var_1d_with_halo
43 real,
dimension(:,:),
allocatable :: var_2d_with_halo
44 real(kind=kdbl),
dimension(:,:),
allocatable :: var_2d_dbl_with_halo
46 character(len=50) :: file,name_dim,name_xdim,name_ydim &
48 character(len=50) :: name_att
49 character(len=50) :: name_var
50 character(len=255) :: att=
' ' 51 character(len=255),
dimension(:),
allocatable :: var_1d_char
56 read(5,*)idim_compute,jdim_compute,halo,filename_full,filename_shaved
57 write(6,*)
' id ',idim_compute,
' jd ',jdim_compute,
' halo ',halo
58 write(6,*)
' fn_f ',trim(filename_full)
59 write(6,*)
' fn_s ',trim(filename_shaved)
60 i_count_compute=idim_compute+2*halo
61 j_count_compute=jdim_compute+2*halo
62 i_count_super =2*i_count_compute
63 j_count_super =2*j_count_compute
68 call check(nf90_open(filename_full,nf90_nowrite,ncid_in))
69 call check(nf90_inquire(ncid_in,ndims,nvars,ngatts,unlimdimid))
75 call check(nf90_create(filename_shaved &
76 ,or(nf90_classic_model,nf90_netcdf4) &
89 call check(nf90_inquire_dimension(ncid_in,nd,name_dim,len_dim))
90 select case (name_dim)
96 len_dim=i_count_super+1
101 len_dim=j_count_super+1
103 len_dim=i_count_compute
107 len_dim=j_count_compute
111 call check(nf90_def_dim(ncid_out,name_dim,len_dim,dim_id))
121 call check(nf90_inquire_variable(ncid_in,var_id,name_var,nctype &
122 ,ndims,dimids,natts))
124 call check(nf90_def_var(ncid_out,name_var,nctype,dimids(1),var_id))
126 call check(nf90_def_var(ncid_out,name_var,nctype,dimids,var_id))
134 call check(nf90_inq_attname(ncid_in,var_id,na,name_att))
135 call check(nf90_copy_att(ncid_in,var_id,name_att,ncid_out,var_id))
144 call check(nf90_inq_attname(ncid_in,nf90_global,n,name_att))
145 call check(nf90_copy_att(ncid_in,nf90_global,name_att,ncid_out,nf90_global))
147 call check(nf90_enddef(ncid_out))
153 call check(nf90_inq_dimid(ncid_in,xdim,xdim_id))
154 call check(nf90_inq_dimid(ncid_in,ydim,ydim_id))
155 call check(nf90_inquire_dimension(ncid_in,xdim_id,name_xdim,len_x))
156 call check(nf90_inquire_dimension(ncid_in,ydim_id,name_ydim,len_y))
157 if(trim(file)==
'orog_file')
then 158 i_start=(len_x-idim_compute)/2-halo+1
159 j_start=(len_y-jdim_compute)/2-halo+1
161 elseif(trim(file)==
'grid_file')
then 162 i_start=(len_x-2*idim_compute)/2-2*halo+1
163 j_start=(len_y-2*jdim_compute)/2-2*halo+1
179 var_loop:
do n=1,nvars
181 call check(nf90_inquire_variable(ncid_in,var_id,name_var,nctype &
182 ,ndims,dimids,natts))
183 call check(nf90_inquire_dimension(ncid_in,dimids(1),name_xdim,len_x))
185 call check(nf90_inquire_dimension(ncid_in,dimids(2),name_ydim,len_y))
196 if(nctype==nf90_char)
then 199 allocate(var_1d_char(1:n_count),stat=istat)
200 call check(nf90_get_var(ncid_in,var_id,var_1d_char(:) &
203 call check(nf90_put_var(ncid_out,var_id,var_1d_char))
204 deallocate(var_1d_char)
211 n_count=len_dim-2*n_shave
212 allocate(var_1d_with_halo(1:n_count),stat=istat)
213 call check(nf90_get_var(ncid_in,var_id,var_1d_with_halo(:) &
216 call check(nf90_put_var(ncid_out,var_id,var_1d_with_halo))
217 deallocate(var_1d_with_halo)
224 if(trim(file)==
'orog_file')
then 225 i_start=(len_x-idim_compute)/2-halo+1
226 j_start=(len_y-jdim_compute)/2-halo+1
227 i_count=i_count_compute
228 j_count=j_count_compute
229 elseif(trim(file)==
'grid_file')
then 230 i_start=(len_x-2*idim_compute)/2-2*halo+1
231 j_start=(len_y-2*jdim_compute)/2-2*halo+1
232 i_count=i_count_super
233 j_count=j_count_super
234 if(trim(name_xdim)==
'nxp')
then 237 if(trim(name_ydim)==
'nyp')
then 241 if(nctype==nf90_float)
then 242 allocate(var_2d_with_halo(i_count,j_count),stat=istat)
243 call check(nf90_get_var(ncid_in,var_id,var_2d_with_halo(:,:) &
244 ,start=(/i_start,j_start/) &
245 ,count=(/i_count,j_count/)))
246 call check(nf90_put_var(ncid_out,var_id,var_2d_with_halo))
247 deallocate(var_2d_with_halo)
248 elseif(nctype==nf90_double)
then 249 allocate(var_2d_dbl_with_halo(i_count,j_count),stat=istat)
250 call check(nf90_get_var(ncid_in,var_id,var_2d_dbl_with_halo(:,:) &
251 ,start=(/i_start,j_start/) &
252 ,count=(/i_count,j_count/)))
253 call check(nf90_put_var(ncid_out,var_id,var_2d_dbl_with_halo))
254 deallocate(var_2d_dbl_with_halo)
258 call check(nf90_close(ncid_out))
259 call check(nf90_close(ncid_in))
266 subroutine check(status)
267 integer,
intent(in) :: status
268 if(status /= nf90_noerr)
then 269 print *, trim(nf90_strerror(status))
program shave_nc
The grid driver step in FV3 preprocessing generates a grid_tile file and an oro_tile file for the reg...
subroutine check(status)
Check results of netCDF call.