I have been looking at FLASH data today, which suffers from a particular oddity which will impact users of every other code; however, block structured AMR will bring it out more often.
In the covering_grid code, we have this routine:
def _get_list_of_grids(self, buffer = 0.0): import pdb;pdb.set_trace() if self._grids is not None: return if na.any(self.left_edge - buffer < self.pf.domain_left_edge) or \ na.any(self.right_edge + buffer > self.pf.domain_right_edge): grids,ind = self.pf.hierarchy.get_periodic_box_grids( self.left_edge - buffer, self.right_edge + buffer) ind = slice(None) else: grids,ind = self.pf.hierarchy.get_box_grids( self.left_edge - buffer, self.right_edge + buffer) level_ind = (self.pf.hierarchy.grid_levels.ravel()[ind] <= self.level) sort_ind = na.argsort(self.pf.h.grid_levels.ravel()[ind][level_ind]) self._grids = self.pf.hierarchy.grids[ind][level_ind][(sort_ind,)][::-1]
This is used to identify grids that overlap with a given region in space. As you can see, if the grid abuts the domain boundary, yt will look for grids assuming a period.
But then that information is basically completely discarded, and all grids are selected. This absolutely *kills* performance. I looked into it, and this dates back several years.
Can anyone -- Stephen, Britton, Sam, you have all looked at periodic grids -- think of a reason why we should err on the side of not following the results of get_periodic_box_grids? Or is it safe to remove that line, and improve performance by a factor of tons?