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 character(len=2) :: time_list(9)
29 integer :: n_vars, n_tims, extrap_levs
30 real(esmf_kind_r8) :: missing_value
34 integer :: ierr, localpet, npets
35 integer :: v, t, srcterm
37 character(100) :: fname_time
40 type(esmf_grid) :: grid_in, grid_out
41 type(esmf_field),
allocatable :: fields_in(:,:)
42 type(esmf_field),
allocatable :: fields_out(:,:)
43 type(esmf_routehandle) :: regrid_route
44 real(esmf_kind_r8),
pointer :: ptr_out(:,:)
48 real :: t1, t2, t3, t4
51 namelist /config/ n_vars, n_tims, time_list, variable_list, missing_value, extrap_levs
60 call esmf_initialize(rc=ierr)
61 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
62 call error_handler(
"INITIALIZING ESMF", ierr)
64 call esmf_vmgetglobal(vm, rc=ierr)
65 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
66 call error_handler(
"IN VMGetGlobal", ierr)
68 call esmf_vmget(vm, localpet=localpet, petcount=npets, rc=ierr)
69 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
70 call error_handler(
"IN VMGet", ierr)
76 print*,
'** pets: local, total: ',localpet, npets
80 if (mod(npets,n_tiles) /= 0)
then 81 call error_handler(
"must run with a task count that is a multiple of 6", 1)
92 open(newunit=ut, file=
'regrid.nml', iostat=ierr)
93 if (ierr /= 0)
call error_handler(
"OPENING regrid NAMELIST.", ierr)
94 read(ut, nml=config, iostat=ierr)
95 if (ierr /= 0)
call error_handler(
"OPENING config NAMELIST.", ierr)
106 if (localpet==0) print*,
'** Setting up grids' 107 call setup_grid(localpet, npets, grid_setup_in, grid_in )
109 call setup_grid(localpet, npets, grid_setup_out, grid_out )
114 if (localpet==0) print*,
'** Creating/Reading fields' 117 allocate(fields_in(n_tims,n_vars))
122 fields_in(t,v) = esmf_fieldcreate(grid_in, &
123 typekind=esmf_typekind_r8, &
124 staggerloc=esmf_staggerloc_center, &
125 name=
"input for regridding", &
128 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
129 call error_handler(
"in FieldCreate "//trim(variable_list(v)), ierr)
134 allocate(fields_out(n_tims,n_vars))
139 fields_out(t,v) = esmf_fieldcreate(grid_out, &
140 typekind=esmf_typekind_r8, &
141 staggerloc=esmf_staggerloc_center, &
142 name=
"output of regridding", &
144 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
145 call error_handler(
"in FieldCreate, field_out", ierr)
149 call esmf_fieldget(fields_out(t,v), &
152 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
153 call error_handler(
"IN FieldGet", ierr)
155 ptr_out=missing_value
166 fname_time = trim(grid_setup_in%fname)//
"."//time_list(t)
168 fname_time = trim(grid_setup_in%fname)
170 write(6,*)
'reading into ', trim(fname_time)
171 call read_into_fields(localpet, grid_setup_in%ires, grid_setup_in%jres, &
172 trim(fname_time), trim(grid_setup_in%dir), &
173 grid_setup_in, n_vars, variable_list(1:n_vars), fields_in(t,:))
180 if (localpet==0) print*,
'** Performing regridding' 185 call esmf_fieldregridstore(srcfield=fields_in(1,1), srcmaskvalues=(/0/), &
186 dstfield=fields_out(1,1), dstmaskvalues=(/0/), &
188 unmappedaction=esmf_unmappedaction_ignore, &
189 polemethod=esmf_polemethod_allavg, &
191 extrapmethod=esmf_extrapmethod_creep, &
193 extrapnumlevels=extrap_levs, &
196 srctermprocessing=srcterm, &
197 routehandle=regrid_route, &
199 regridmethod=esmf_regridmethod_bilinear, rc=ierr)
200 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
201 call error_handler(
"IN FieldRegridStore", ierr)
209 call esmf_fieldregrid(fields_in(t,v), &
211 routehandle=regrid_route, &
212 zeroregion=esmf_region_select, &
213 termorderflag=esmf_termorder_srcseq, rc=ierr)
214 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
215 call error_handler(
"IN FieldRegrid", ierr)
223 if (localpet==0) print*,
'** Writing out regridded fields' 225 call write_from_fields(localpet, grid_setup_out%ires, grid_setup_out%jres, &
226 trim(grid_setup_out%fname), trim(grid_setup_out%dir), &
227 n_vars, n_tims, variable_list(1:n_vars), fields_out)
232 call esmf_fieldregridrelease(routehandle=regrid_route, rc=ierr)
233 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
234 call error_handler(
"IN FieldRegridRelease", ierr)
238 call esmf_fielddestroy(fields_in(t,v),rc=ierr)
239 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
240 call error_handler(
"DESTROYING FIELD", ierr)
242 call esmf_fielddestroy(fields_out(t,v),rc=ierr)
243 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
244 call error_handler(
"DESTROYING FIELD", ierr)
248 call esmf_griddestroy(grid_in,rc=ierr)
249 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
250 call error_handler(
"DESTROYING GRID", ierr)
252 call esmf_griddestroy(grid_out,rc=ierr)
253 if(esmf_logfounderror(rctocheck=ierr,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
254 call error_handler(
"DESTROYING GRID", ierr)
260 call esmf_finalize(endflag=esmf_end_keepmpi, rc=ierr)
261 call mpi_finalize(ierr)
264 if (localpet==0) print*,
'** time in tile2tile', t4 - t1
265 if (localpet==0) print*,
'** time in RegridStore', t3 - t2
267 print*,
"** DONE.", localpet
subroutine readin_setup(unt, namel, grid_setup)
Subroutine to read in namelists, and convert values into setupgrid.
program regridstates
Program to re-grid a list of FV3 variables.