9 use utilities,
only : error_handler, netcdf_err
15 integer,
public,
parameter :: n_tiles=6
17 integer,
public,
parameter :: vtype_water=0, & !< non-land
20 integer,
public,
parameter :: mtype_water=0, & !< water
23 character(7) :: descriptor
24 character(100) :: fname
26 character(15) :: mask_variable(1)
27 character(100) :: fname_mask
28 character(100) :: dir_mask
29 character(100) :: fname_coord
30 character(100) :: dir_coord
35 public :: setup_grid, &
47 subroutine setup_grid(localpet, npets, grid_setup, mod_grid )
53 integer,
intent(in) :: localpet, npets
56 type(esmf_grid),
intent(out) :: mod_grid
59 type(esmf_field) :: mask_field(1,1)
60 real(esmf_kind_r8),
pointer :: ptr_maskvar(:,:)
61 integer(esmf_kind_i4),
pointer :: ptr_mask(:,:)
63 integer :: ierr, ncid, tile
68 select case (grid_setup%descriptor)
70 call create_grid_fv3(grid_setup%ires, trim(grid_setup%dir_coord), npets, localpet ,mod_grid)
72 call create_grid_gauss(grid_setup, npets, localpet, mod_grid)
74 call error_handler(
"unknown grid_setup%descriptor in setup_grid", 1)
80 mask_field(1,1) = esmf_fieldcreate(mod_grid, &
81 typekind=esmf_typekind_r8, &
82 staggerloc=esmf_staggerloc_center, &
83 name=
"input variable for mask", &
85 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
86 call error_handler(
"IN FieldCreate, mask_variable", ierr)
88 call read_into_fields(localpet, grid_setup%ires, grid_setup%jres, trim(grid_setup%fname_mask), &
89 trim(grid_setup%dir_mask), grid_setup, 1, &
90 grid_setup%mask_variable(1), mask_field(1,1))
93 call esmf_fieldget(mask_field(1,1), &
94 farrayptr=ptr_maskvar, &
96 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
97 call error_handler(
"IN FieldGet", ierr)
100 call esmf_gridadditem(mod_grid, &
101 itemflag=esmf_griditem_mask, &
102 staggerloc=esmf_staggerloc_center, &
104 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
105 call error_handler(
"in GridAddItem mask", ierr)
107 call esmf_gridgetitem(mod_grid, &
108 itemflag=esmf_griditem_mask, &
109 farrayptr=ptr_mask, &
111 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
112 call error_handler(
"in GridGetItem mask", ierr)
116 select case (trim(grid_setup%mask_variable(1)))
117 case(
"vegetation_type")
118 where (nint(ptr_maskvar) == vtype_water ) ptr_mask = 0
119 where (nint(ptr_maskvar) == vtype_landice ) ptr_mask = 0
120 case(
"soilsnow_mask")
121 where (nint(ptr_maskvar) == mtype_water ) ptr_mask = 0
122 where (nint(ptr_maskvar) == mtype_snow ) ptr_mask = 0
124 call error_handler(
"unknown mask_variable", 1)
128 call esmf_fielddestroy(mask_field(1,1),rc=ierr)
129 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
130 call error_handler(
"DESTROYING FIELD", ierr)
132 end subroutine setup_grid
145 subroutine read_into_fields(localpet, i_dim, j_dim , fname_read, dir_read, &
146 grid_setup, n_vars, variable_list, fields)
151 integer,
intent(in) :: localpet, i_dim, j_dim, n_vars
152 character(*),
intent(in) :: fname_read
153 character(*),
intent(in) :: dir_read
156 character(len=15),
dimension(n_vars),
intent(in) :: variable_list
159 type(esmf_field),
dimension(1,n_vars),
intent(inout) :: fields
162 integer :: tt, id_var, ncid, ierr, v, j
164 character(len=1) :: tchar
165 character(len=500) :: fname
166 real(esmf_kind_r8),
allocatable :: array2d(:,:)
167 real(esmf_kind_r8),
allocatable :: array_in(:,:,:)
168 real(esmf_kind_r8),
allocatable :: temp_array(:,:,:)
170 allocate(array_in(n_vars,i_dim, j_dim))
171 allocate(array2d(i_dim, j_dim))
173 select case (grid_setup%descriptor)
179 call error_handler(
"unknown grid_setup%descriptor in read into fields", 1)
185 if (localpet == 0)
then 187 if ( n_files > 1)
then 188 write(tchar,
'(i1)') tt
189 fname = dir_read//
"/"//fname_read//
".tile"//tchar//
".nc" 191 fname = dir_read//
"/"//fname_read
194 print *,
'Reading ', trim(fname)
196 ierr=nf90_open(trim(fname),nf90_nowrite,ncid)
197 call netcdf_err(ierr,
'opening: '//trim(fname) )
200 print *,
'Reading ', trim(variable_list(v))
201 ierr=nf90_inq_varid(ncid, trim(variable_list(v)), id_var)
202 call netcdf_err(ierr,
'reading variable id' )
204 ierr=nf90_get_var(ncid, id_var, array_in(v,:,:))
205 call netcdf_err(ierr,
'reading variable' )
207 ierr = nf90_close(ncid)
210 if ( grid_setup%descriptor ==
'gau_inc')
then 211 allocate(temp_array(n_vars,i_dim, j_dim))
212 temp_array = array_in
214 array_in(:,:,j) = temp_array(:,:,j_dim-j+1)
216 deallocate(temp_array)
222 array2d=array_in(v,:,:)
223 call esmf_fieldscatter(fields(1,v), array2d, rootpet=0, tile=tt, rc=ierr)
224 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
225 call error_handler(
"IN FieldScatter", ierr)
235 end subroutine read_into_fields
248 subroutine write_from_fields(localpet, i_dim, j_dim , fname_out, dir_out, &
249 n_vars, n_tims, variable_list, fields)
254 integer,
intent(in) :: localpet, i_dim, j_dim, n_vars, n_tims
255 character(*),
intent(in) :: fname_out
256 character(*),
intent(in) :: dir_out
257 character(15),
dimension(n_vars),
intent(in) :: variable_list
258 type(esmf_field),
dimension(n_tims,n_vars),
intent(in) :: fields
261 integer :: tt, id_var, ncid, ierr, &
262 id_x, id_y, id_t, v, t
263 character(len=1) :: tchar
264 character(len=500) :: fname
265 real(esmf_kind_r8),
allocatable :: array2d(:,:)
266 real(esmf_kind_r8),
allocatable :: array_out(:,:,:,:)
269 if (localpet == 0) print *,
'Writing ', trim(variable_list(v)),
' into field' 272 if (localpet==0)
then 273 allocate(array_out(n_vars, i_dim, j_dim, n_tims))
274 allocate(array2d(i_dim, j_dim))
276 allocate(array_out(0,0,0,0))
277 allocate(array2d(0,0))
285 call esmf_fieldgather(fields(t,v), array2d, rootpet=0, tile=tt, rc=ierr)
286 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
287 call error_handler(
"IN FieldGather", ierr)
288 array_out(v,:,:,t) = array2d
293 if (localpet == 0)
then 296 write(tchar,
'(i1)') tt
297 fname = dir_out//
"/"//fname_out//
".tile"//tchar//
".nc" 299 ierr = nf90_create(trim(fname), nf90_netcdf4, ncid)
300 call netcdf_err(ierr,
'creating file='//trim(fname) )
305 ierr = nf90_def_dim(ncid,
'Time', n_tims, id_t)
306 call netcdf_err(ierr,
'defining taxis dimension' )
309 ierr = nf90_def_dim(ncid,
'xaxis_1', i_dim, id_x)
310 call netcdf_err(ierr,
'defining xaxis dimension' )
312 ierr = nf90_def_dim(ncid,
'yaxis_1', j_dim, id_y)
313 call netcdf_err(ierr,
'defining yaxis dimension' )
322 ierr = nf90_def_var(ncid, trim(variable_list(v)), nf90_double, &
323 (/id_x, id_y, id_t/) , id_var)
325 call netcdf_err(ierr,
'defining '//variable_list(v) )
327 ierr = nf90_def_var(ncid, trim(variable_list(v)), nf90_double, &
328 (/id_x, id_y/) , id_var)
331 call netcdf_err(ierr,
'defining '//variable_list(v) )
333 ierr = nf90_put_var( ncid, id_var, array_out(v,:,:,:) )
334 call netcdf_err(ierr,
'writing '//variable_list(v) )
338 ierr = nf90_close(ncid)
345 deallocate(array_out)
347 end subroutine write_from_fields
358 subroutine create_grid_fv3(res_atm, dir_fix, npets, localpet, fv3_grid)
361 integer,
intent(in) :: npets, localpet
362 integer,
intent(in) :: res_atm
363 character(*),
intent(in) :: dir_fix
366 type(esmf_grid),
intent(out) :: fv3_grid
368 integer :: ierr, extra, tile
369 integer :: decomptile(2,n_tiles)
371 character(len=5) :: rchar
372 character(len=200) :: fname
374 if (localpet == 0) print*,
" creating fv3 grid for ", res_atm
377 extra = npets / n_tiles
379 decomptile(:,tile)=(/1,extra/)
383 write(rchar,
'(i5)') res_atm
384 fname = trim(dir_fix)//
"/C"//trim(adjustl(rchar))//
"_mosaic.nc" 387 fv3_grid = esmf_gridcreatemosaic(filename=trim(fname), &
388 regdecompptile=decomptile, &
389 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
390 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
391 indexflag=esmf_index_global, &
392 tilefilepath=trim(dir_fix), &
394 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
395 call error_handler(
"IN GridCreateMosaic", ierr)
397 end subroutine create_grid_fv3
406 subroutine create_grid_gauss(grid_setup, npets, localpet, gauss_grid)
409 type(grid_setup_type),
intent(in) :: grid_setup
410 integer,
intent(in) :: npets, localpet
413 type(esmf_grid) :: gauss_grid
416 character(len=200) :: fname
418 fname = trim(grid_setup%dir_coord)//trim(grid_setup%fname_coord)
420 if (localpet == 0) print*,
" creating gauss grid for ", trim(fname)
422 fac = npets / n_tiles
423 gauss_grid = esmf_gridcreate(filename=trim(fname), &
424 fileformat=esmf_fileformat_scrip, &
425 regdecomp=(/n_tiles,fac/), addcornerstagger=.true., rc=ierr)
426 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
427 call error_handler(
"IN Gauss GridCreate", ierr)
429 end subroutine create_grid_gauss