50 subroutine setup_grid(localpet, npets, grid_setup, mod_grid, timestamp )
56 integer,
intent(in) :: localpet, npets
57 integer,
intent(in),
optional :: timestamp
60 type(esmf_grid),
intent(out) :: mod_grid
64 type(esmf_field) :: mask_field(1,1)
65 real(esmf_kind_r8),
pointer :: ptr_maskvar(:,:)
66 integer(esmf_kind_i4),
pointer :: ptr_mask(:,:)
68 integer :: ierr, ncid, tile
69 character(len=128) :: fname_mask
70 character(len=3) :: tstr
75 select case (grid_setup%descriptor)
77 call create_grid_fv3(grid_setup%ires, trim(grid_setup%dir_coord), npets, localpet ,mod_grid)
79 call create_grid_gauss(grid_setup, npets, localpet, mod_grid)
81 call error_handler(
"unknown grid_setup%descriptor in setup_grid", 1)
87 mask_field(1,1) = esmf_fieldcreate(mod_grid, &
88 typekind=esmf_typekind_r8, &
89 staggerloc=esmf_staggerloc_center, &
90 name=
"input variable for mask", &
92 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
93 call error_handler(
"IN FieldCreate, mask_variable", ierr)
95 if (
present(timestamp))
then
96 write(tstr,
"(I3.3)") timestamp
97 fname_mask = trim(grid_setup%fname_mask)//tstr//
".nc"
99 fname_mask = trim(grid_setup%fname_mask)
102 call read_into_fields(localpet, grid_setup%ires, grid_setup%jres, trim(fname_mask), &
103 trim(grid_setup%dir_mask), grid_setup, 1, &
104 grid_setup%mask_variable(1), mask_field(1,1))
107 call esmf_fieldget(mask_field(1,1), &
108 farrayptr=ptr_maskvar, &
110 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
111 call error_handler(
"IN FieldGet", ierr)
114 call esmf_gridadditem(mod_grid, &
115 itemflag=esmf_griditem_mask, &
116 staggerloc=esmf_staggerloc_center, &
118 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
119 call error_handler(
"in GridAddItem mask", ierr)
121 call esmf_gridgetitem(mod_grid, &
122 itemflag=esmf_griditem_mask, &
123 farrayptr=ptr_mask, &
125 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
126 call error_handler(
"in GridGetItem mask", ierr)
130 select case (trim(grid_setup%mask_variable(1)))
131 case(
"vegetation_type")
132 where (nint(ptr_maskvar) == vtype_nonland) ptr_mask = 0
133 where (nint(ptr_maskvar) == vtype_water ) ptr_mask = 0
134 where (nint(ptr_maskvar) == vtype_landice ) ptr_mask = 0
135 case(
"soilsnow_mask")
136 where (nint(ptr_maskvar) == mtype_water ) ptr_mask = 0
137 where (nint(ptr_maskvar) == mtype_snow ) ptr_mask = 0
139 call error_handler(
"unknown mask_variable", 1)
143 call esmf_fielddestroy(mask_field(1,1),rc=ierr)
144 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
145 call error_handler(
"DESTROYING FIELD", ierr)
160 subroutine read_into_fields(localpet, i_dim, j_dim , fname_read, dir_read, &
161 grid_setup, n_vars, variable_list, fields)
166 integer,
intent(in) :: localpet, i_dim, j_dim, n_vars
167 character(*),
intent(in) :: fname_read
168 character(*),
intent(in) :: dir_read
171 character(len=15),
dimension(n_vars),
intent(in) :: variable_list
174 type(esmf_field),
dimension(1,n_vars),
intent(inout) :: fields
177 integer :: tt, id_var, ncid, ierr, v, j
179 character(len=1) :: tchar
180 character(len=500) :: fname
181 real(esmf_kind_r8),
allocatable :: array2d(:,:)
182 real(esmf_kind_r8),
allocatable :: array_in(:,:,:)
183 real(esmf_kind_r8),
allocatable :: temp_array(:,:,:)
185 allocate(array_in(n_vars,i_dim, j_dim))
186 allocate(array2d(i_dim, j_dim))
188 select case (grid_setup%descriptor)
194 call error_handler(
"unknown grid_setup%descriptor in read into fields", 1)
200 if (localpet == 0)
then
202 if ( n_files > 1)
then
203 write(tchar,
'(i1)') tt
204 fname = dir_read//
"/"//fname_read//
".tile"//tchar//
".nc"
206 fname = dir_read//
"/"//fname_read
209 print *,
'Reading ', trim(fname)
211 ierr=nf90_open(trim(fname),nf90_nowrite,ncid)
212 call netcdf_err(ierr,
'opening: '//trim(fname) )
215 print *,
'Reading ', trim(variable_list(v))
216 ierr=nf90_inq_varid(ncid, trim(variable_list(v)), id_var)
217 call netcdf_err(ierr,
'reading variable id' )
219 ierr=nf90_get_var(ncid, id_var, array_in(v,:,:))
220 call netcdf_err(ierr,
'reading variable' )
222 ierr = nf90_close(ncid)
225 if ( grid_setup%descriptor ==
'gau_inc')
then
226 allocate(temp_array(n_vars,i_dim, j_dim))
227 temp_array = array_in
229 array_in(:,:,j) = temp_array(:,:,j_dim-j+1)
231 deallocate(temp_array)
237 array2d=array_in(v,:,:)
238 call esmf_fieldscatter(fields(1,v), array2d, rootpet=0, tile=tt, rc=ierr)
239 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
240 call error_handler(
"IN FieldScatter", ierr)
264 subroutine write_from_fields(localpet, i_dim, j_dim , fname_out, dir_out, &
265 n_vars, n_tims, variable_list, fields, add_time_dim)
270 integer,
intent(in) :: localpet, i_dim, j_dim, n_vars, n_tims
271 character(*),
intent(in) :: fname_out
272 character(*),
intent(in) :: dir_out
273 character(15),
dimension(n_vars),
intent(in) :: variable_list
274 type(esmf_field),
dimension(n_tims,n_vars),
intent(in) :: fields
275 logical,
intent(in) :: add_time_dim
278 integer :: tt, id_var, ncid, ierr, &
279 id_x, id_y, id_t, v, t
280 character(len=1) :: tchar
281 character(len=500) :: fname
282 real(esmf_kind_r8),
allocatable :: array2d(:,:)
283 real(esmf_kind_r8),
allocatable :: array_out(:,:,:,:)
286 if (localpet == 0) print *,
'Writing ', trim(variable_list(v)),
' into field'
289 if (localpet==0)
then
290 allocate(array_out(n_vars, i_dim, j_dim, n_tims))
291 allocate(array2d(i_dim, j_dim))
293 allocate(array_out(0,0,0,0))
294 allocate(array2d(0,0))
302 call esmf_fieldgather(fields(t,v), array2d, rootpet=0, tile=tt, rc=ierr)
303 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
304 call error_handler(
"IN FieldGather", ierr)
305 array_out(v,:,:,t) = array2d
310 if (localpet == 0)
then
313 write(tchar,
'(i1)') tt
314 fname = dir_out//
"/"//fname_out//
".tile"//tchar//
".nc"
316 ierr = nf90_create(trim(fname), nf90_netcdf4, ncid)
317 call netcdf_err(ierr,
'creating file='//trim(fname) )
319 if (add_time_dim)
then
322 ierr = nf90_def_dim(ncid,
'Time', n_tims, id_t)
323 call netcdf_err(ierr,
'defining taxis dimension' )
326 ierr = nf90_def_dim(ncid,
'xaxis_1', i_dim, id_x)
327 call netcdf_err(ierr,
'defining xaxis dimension' )
329 ierr = nf90_def_dim(ncid,
'yaxis_1', j_dim, id_y)
330 call netcdf_err(ierr,
'defining yaxis dimension' )
335 if (add_time_dim)
then
339 ierr = nf90_def_var(ncid, trim(variable_list(v)), nf90_double, &
340 (/id_x, id_y, id_t/) , id_var)
342 call netcdf_err(ierr,
'defining '//variable_list(v) )
344 ierr = nf90_def_var(ncid, trim(variable_list(v)), nf90_double, &
345 (/id_x, id_y/) , id_var)
348 call netcdf_err(ierr,
'defining '//variable_list(v) )
350 ierr = nf90_put_var( ncid, id_var, array_out(v,:,:,:) )
351 call netcdf_err(ierr,
'writing '//variable_list(v) )
355 ierr = nf90_close(ncid)
362 deallocate(array_out)
375 subroutine create_grid_fv3(res_atm, dir_fix, npets, localpet, fv3_grid)
378 integer,
intent(in) :: npets, localpet
379 integer,
intent(in) :: res_atm
380 character(*),
intent(in) :: dir_fix
383 type(esmf_grid),
intent(out) :: fv3_grid
385 integer :: ierr, extra, tile
386 integer :: decomptile(2,n_tiles)
388 character(len=5) :: rchar
389 character(len=200) :: fname
391 if (localpet == 0) print*,
" creating fv3 grid for ", res_atm
394 extra = npets / n_tiles
396 decomptile(:,tile)=(/1,extra/)
400 write(rchar,
'(i5)') res_atm
401 fname = trim(dir_fix)//
"/C"//trim(adjustl(rchar))//
"_mosaic.nc"
404 fv3_grid = esmf_gridcreatemosaic(filename=trim(fname), &
405 regdecompptile=decomptile, &
406 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
407 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
408 indexflag=esmf_index_global, &
409 tilefilepath=trim(dir_fix), &
411 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
412 call error_handler(
"IN GridCreateMosaic", ierr)
423 subroutine create_grid_gauss(grid_setup, npets, localpet, gauss_grid)
427 integer,
intent(in) :: npets, localpet
430 type(esmf_grid) :: gauss_grid
433 character(len=200) :: fname
435 fname = trim(grid_setup%dir_coord)//trim(grid_setup%fname_coord)
437 if (localpet == 0) print*,
" creating gauss grid for ", trim(fname)
439 fac = npets / n_tiles
440 gauss_grid = esmf_gridcreate(filename=trim(fname), &
441 fileformat=esmf_fileformat_scrip, &
442 regdecomp=(/n_tiles,fac/), addcornerstagger=.true., rc=ierr)
443 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
444 call error_handler(
"IN Gauss GridCreate", ierr)