14 use grids_io,
only : setup_grid, &
20 use utilities,
only : error_handler
24 integer,
parameter :: max_vars = 10
27 character(len=15) :: variable_list(max_vars)
28 integer :: n_vars, n_tims, extrap_levs
29 integer :: time_list(10)
30 logical :: add_time_dim
31 real(esmf_kind_r8) :: missing_value
33 type(grid_setup_type) :: grid_setup_in, grid_setup_out
35 integer :: ierr, localpet, npets
36 integer :: v, t, srcterm
38 character(100) :: fname_time
41 type(esmf_grid),
allocatable :: grid_in(:)
42 type(esmf_grid) :: grid_out
43 type(esmf_field),
allocatable :: fields_in(:,:)
44 type(esmf_field),
allocatable :: fields_out(:,:)
45 type(esmf_routehandle) :: regrid_route
46 real(esmf_kind_r8),
pointer :: ptr_out(:,:)
50 real :: t1, t2, t3, t4
51 character(len=3) :: tstr
54 namelist /config/ n_vars, variable_list, missing_value, extrap_levs, time_list, add_time_dim
63 call esmf_initialize(rc=ierr)
64 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
65 call error_handler(
"INITIALIZING ESMF", ierr)
67 call esmf_vmgetglobal(vm, rc=ierr)
68 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
69 call error_handler(
"IN VMGetGlobal", ierr)
71 call esmf_vmget(vm, localpet=localpet, petcount=npets, rc=ierr)
72 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
73 call error_handler(
"IN VMGet", ierr)
79 print*,
'** pets: local, total: ',localpet, npets
83 if (mod(npets,n_tiles) /= 0)
then 84 call error_handler(
"must run with a task count that is a multiple of 6", 1)
95 open(newunit=ut, file=
'regrid.nml', iostat=ierr)
96 if (ierr /= 0)
call error_handler(
"OPENING regrid NAMELIST.", ierr)
97 read(ut, nml=config, iostat=ierr)
98 if (ierr /= 0)
call error_handler(
"OPENING config NAMELIST.", ierr)
106 if (time_list(t) .lt. 0)
exit 110 call error_handler(
"n_tims < 1. must have at least one valid increment hour in time_list", 1)
118 if (localpet==0) print*,
'** Setting up grids' 119 allocate(grid_in(n_tims))
121 if (grid_setup_in%mask_from_input)
then 122 call setup_grid(localpet, npets, grid_setup_in, grid_in(t), time_list(t) )
124 call setup_grid(localpet, npets, grid_setup_in, grid_in(t))
127 call setup_grid(localpet, npets, grid_setup_out, grid_out )
132 if (localpet==0) print*,
'** Creating/Reading fields' 135 allocate(fields_in(n_tims,n_vars))
140 fields_in(t,v) = esmf_fieldcreate(grid_in(t), &
141 typekind=esmf_typekind_r8, &
142 staggerloc=esmf_staggerloc_center, &
143 name=
"input for regridding", &
146 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
147 call error_handler(
"in FieldCreate "//trim(variable_list(v)), ierr)
152 allocate(fields_out(n_tims,n_vars))
157 fields_out(t,v) = esmf_fieldcreate(grid_out, &
158 typekind=esmf_typekind_r8, &
159 staggerloc=esmf_staggerloc_center, &
160 name=
"output of regridding", &
162 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
163 call error_handler(
"in FieldCreate, field_out", ierr)
167 call esmf_fieldget(fields_out(t,v), &
170 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
171 call error_handler(
"IN FieldGet", ierr)
173 ptr_out=missing_value
183 write(tstr,
"(I3.3)")time_list(t)
184 fname_time = trim(grid_setup_in%fname)//tstr//
".nc" 185 write(6,*)
'reading into ', trim(fname_time)
186 call read_into_fields(localpet, grid_setup_in%ires, grid_setup_in%jres, &
187 trim(fname_time), trim(grid_setup_in%dir), &
188 grid_setup_in, n_vars, variable_list(1:n_vars), fields_in(t,:))
195 if (localpet==0) print*,
'** Performing regridding' 200 call esmf_fieldregridstore(srcfield=fields_in(1,1), srcmaskvalues=(/0/), &
201 dstfield=fields_out(1,1), dstmaskvalues=(/0/), &
203 unmappedaction=esmf_unmappedaction_ignore, &
204 polemethod=esmf_polemethod_allavg, &
206 extrapmethod=esmf_extrapmethod_creep, &
208 extrapnumlevels=extrap_levs, &
211 srctermprocessing=srcterm, &
212 routehandle=regrid_route, &
214 regridmethod=esmf_regridmethod_bilinear, rc=ierr)
215 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
216 call error_handler(
"IN FieldRegridStore", ierr)
224 call esmf_fieldregrid(fields_in(t,v), &
226 routehandle=regrid_route, &
227 zeroregion=esmf_region_select, &
228 termorderflag=esmf_termorder_srcseq, rc=ierr)
229 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
230 call error_handler(
"IN FieldRegrid", ierr)
238 if (localpet==0) print*,
'** Writing out regridded fields' 240 call write_from_fields(localpet, grid_setup_out%ires, grid_setup_out%jres, &
241 trim(grid_setup_out%fname), trim(grid_setup_out%dir), &
242 n_vars, n_tims, variable_list(1:n_vars), fields_out, add_time_dim)
247 call esmf_fieldregridrelease(routehandle=regrid_route, rc=ierr)
248 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
249 call error_handler(
"IN FieldRegridRelease", ierr)
253 call esmf_fielddestroy(fields_in(t,v),rc=ierr)
254 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
255 call error_handler(
"DESTROYING FIELD", ierr)
257 call esmf_fielddestroy(fields_out(t,v),rc=ierr)
258 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
259 call error_handler(
"DESTROYING FIELD", ierr)
262 call esmf_griddestroy(grid_in(t), rc=ierr)
263 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
264 call error_handler(
"DESTROYING GRID", ierr)
267 call esmf_griddestroy(grid_out,rc=ierr)
268 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
269 call error_handler(
"DESTROYING GRID", ierr)
275 call esmf_finalize(endflag=esmf_end_keepmpi, rc=ierr)
276 call mpi_finalize(ierr)
279 if (localpet==0) print*,
'** time in tile2tile', t4 - t1
280 if (localpet==0) print*,
'** time in RegridStore', t3 - t2
282 print*,
"** DONE.", localpet
284 end program regridstates
subroutine readin_setup(unt, namel, grid_setup)
Subroutine to read in namelists, and convert values into setupgrid.