Changeset 2642 for trunk

Show
Ignore:
Timestamp:
07/08/2008 04:44:52 PM (6 months ago)
Author:
wd15
Message:

enabled interpolation of a CellVariable? to multiple points, added special methods for locating nearest cell for UniformGrids?, added first order interpolation

Location:
trunk/fipy
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/fipy/meshes/common/mesh.py

    r2571 r2642  
    611611        return self._getCellsByID([self._getNearestCellID(point)])[0] 
    612612 
    613     def _getNearestCellID(self, point): 
     613    def _getNearestCellID(self, points): 
     614        """ 
     615        Test cases 
     616 
     617           >>> from fipy import * 
     618           >>> m0 = Grid2D(dx=(.1, 1., 10.), dy=(.1, 1., 10.)) 
     619           >>> m1 = Grid2D(nx=2, ny=2, dx=5., dy=5.) 
     620           >>> print m0._getNearestCellID(m1.getCellCenters()) 
     621           [4 5 7 8] 
     622            
     623        """ 
     624        points = numerix.resize(points, (self.getNumberOfCells(), len(points), len(points[0]))).swapaxes(0,1) 
     625 
    614626        try: 
    615             tmp = self.getCellCenters() - point 
     627            tmp = self.getCellCenters()[...,numerix.newaxis] - points 
    616628        except TypeError: 
    617             tmp = self.getCellCenters() - PhysicalField(point) 
    618         i = numerix.argmin(numerix.add.reduce((tmp * tmp), axis = 0)) 
    619         return i     
     629            tmp = self.getCellCenters()[...,numerix.newaxis] - PhysicalField(points) 
     630 
     631        return numerix.argmin(numerix.dot(tmp, tmp, axis = 0), axis=0) 
    620632 
    621633## pickling 
  • trunk/fipy/meshes/numMesh/uniformGrid1D.py

    r2565 r2642  
    259259        pass 
    260260 
     261    def _getNearestCellID(self, points): 
     262        """ 
     263        Test cases 
     264 
     265           >>> from fipy import * 
     266           >>> m = Grid1D(nx=3) 
     267           >>> print m._getNearestCellID(([0., .9, 3.],)) 
     268           [0 0 2] 
     269           >>> print m._getNearestCellID(([1.1],)) 
     270           [1] 
     271           >>> m0 = Grid1D(nx=2, dx=1.) 
     272           >>> m1 = Grid1D(nx=4, dx=.5) 
     273           >>> print m0._getNearestCellID(m1.getCellCenters()) 
     274           [0 0 1 1] 
     275            
     276        """ 
     277        x0, = self.getCellCenters()[...,0]         
     278        xi, = points 
     279        nx, = self.getShape() 
     280        dx = self.dx 
     281         
     282        i = numerix.array(numerix.rint(((xi - x0) / dx)), 'l') 
     283        i[i < 0] = 0 
     284        i[i > nx - 1] = nx - 1 
     285 
     286        return i 
     287 
    261288    def _test(self): 
    262289        """ 
  • trunk/fipy/meshes/numMesh/uniformGrid2D.py

    r2565 r2642  
    531531        pass 
    532532 
     533    def _getNearestCellID(self, points): 
     534        """ 
     535        Test cases 
     536 
     537           >>> from fipy import * 
     538           >>> m = Grid2D(nx=3, ny=2) 
     539           >>> eps = numerix.array([[1e-5, 1e-5]]) 
     540           >>> print m._getNearestCellID(((0., .9, 3.), (0., 2., 2.))) 
     541           [0 3 5] 
     542           >>> print m._getNearestCellID(([1.1], [1.5])) 
     543           [4] 
     544           >>> m0 = Grid2D(nx=2, ny=2, dx=1., dy=1.) 
     545           >>> m1 = Grid2D(nx=4, ny=4, dx=.5, dy=.5) 
     546           >>> print m0._getNearestCellID(m1.getCellCenters()) 
     547           [0 0 1 1 0 0 1 1 2 2 3 3 2 2 3 3] 
     548            
     549        """ 
     550        x0, y0 = self.getCellCenters()[...,0]         
     551        xi, yi = points 
     552        nx, ny = self.getShape() 
     553        dx, dy = self.dx, self.dy 
     554         
     555        i = numerix.array(numerix.rint(((xi - x0) / dx)), 'l') 
     556        i[i < 0] = 0 
     557        i[i > nx - 1] = nx - 1 
     558 
     559        j = numerix.array(numerix.rint(((yi - y0) / dy)), 'l') 
     560        j[j < 0] = 0 
     561        j[j > ny - 1]  = ny - 1 
     562 
     563        return j * nx + i 
     564 
     565         
    533566    def _test(self): 
    534567        """ 
  • trunk/fipy/meshes/numMesh/uniformGrid3D.py

    r2565 r2642  
    469469    def _calcScaledGeometry(self): 
    470470        pass 
     471     
     472    def _getNearestCellID(self, points): 
     473        x0, y0, z0 = self.getCellCenters()[...,0]         
     474        xi, yi, zi = points 
     475        nx, ny, nz = self.getShape() 
     476        dx, dy, dz = self.dx, self.dy, self.dz 
     477         
     478        i = numerix.array(numerix.rint(((xi - x0) / dx)), 'l') 
     479        i[i < 0] = 0 
     480        i[i > nx - 1] = nx - 1 
     481 
     482        j = numerix.array(numerix.rint(((yi - y0) / dy)), 'l') 
     483        j[j < 0] = 0 
     484        j[j > ny - 1]  = ny - 1 
     485 
     486        k = numerix.array(numerix.rint(((zi - z0) / dz)), 'l') 
     487        k[k < 0] = 0 
     488        k[k > nz - 1]  = nz - 1 
     489         
     490        return k * ny * nx + j * nx + i 
    471491         
    472492    def _test(self): 
  • trunk/fipy/variables/cellVariable.py

    r2572 r2642  
    139139            hasOld = 0) 
    140140             
    141     def __call__(self, point=None): 
    142         if point is not None: 
    143             return self[...,self.getMesh()._getNearestCellID(point)] 
     141    def __call__(self, points=None, order=0): 
     142        r""" 
     143        Interpolates the CellVariable to a set of points using a 
     144        method that has a memory requirement on the order of Ncells by 
     145        Npoints in general, but uses only Ncells when the 
     146        CellVariable's mesh is a UniformGrid object. 
     147 
     148        :Parameters: 
     149 
     150           - `points`: A point or set of points in the format (X, Y, Z) 
     151           - `order`: The order of interpolation, 0 or 1, default is 0 
     152 
     153        Tests 
     154 
     155            >>> from fipy import * 
     156            >>> m = Grid2D(nx=3, ny=2) 
     157            >>> v = CellVariable(mesh=m, value=m.getCellCenters()[0]) 
     158            >>> print v(((0., 1.1, 1.2), (0., 1., 1.))) 
     159            [ 0.5  1.5  1.5] 
     160            >>> print v(((0., 1.1, 1.2), (0., 1., 1.)), order=1) 
     161            [ 0.25  1.1   1.2 ] 
     162            >>> m0 = Grid2D(nx=2, ny=2, dx=1., dy=1.) 
     163            >>> m1 = Grid2D(nx=4, ny=4, dx=.5, dy=.5) 
     164            >>> x, y = m0.getCellCenters() 
     165            >>> v0 = CellVariable(mesh=m0, value=x * y) 
     166            >>> print v0(m1.getCellCenters()) 
     167            [ 0.25  0.25  0.75  0.75  0.25  0.25  0.75  0.75  0.75  0.75  2.25  2.25 
     168              0.75  0.75  2.25  2.25] 
     169            >>> print v0(m1.getCellCenters(), order=1) 
     170            [ 0.125  0.25   0.5    0.625  0.25   0.375  0.875  1.     0.5    0.875 
     171              1.875  2.25   0.625  1.     2.25   2.625] 
     172 
     173        """            
     174        if points is not None: 
     175 
     176            if order == 0: 
     177                return self[...,self.getMesh()._getNearestCellID(points)] 
     178 
     179            elif order == 1: 
     180                cellID = self.getMesh()._getNearestCellID(points) 
     181                return self[...,self.getMesh()._getNearestCellID(points)] + numerix.dot(points - self.getMesh().getCellCenters()[...,cellID], self.getGrad()[...,cellID]) 
     182 
     183            else: 
     184                raise ValueError, 'order should be either 0 or 1' 
     185 
    144186        else: 
    145187            return _MeshVariable.__call__(self) 
    146  
     188         
    147189    def getCellVolumeAverage(self): 
    148190        r""" 
     
    476518            self.old.setValue(dict['old'].getValue()) 
    477519 
    478  
    479520class _ReMeshedCellVariable(CellVariable): 
    480521    def __init__(self, oldVar, newMesh):