Hi Daniel

Thanks for the very quick reply.

I looked at the skfmm code again and unfortunately I think the array 
nature of dx in the travel_time() function is just to pass different 
grid sizes in the (dx, dy, dz) directions when you have a 
multidimensional grid.  I don't believe it allows the grid to change 
spacing along any given direction.  The most relevant section of the 
code to demonstrate that comes in the pre_process function within 
pffm.py, where it rearranges the input parameters before passing them to 
the c code.  It takes the input dx and does the following:

     if type(dx) is float or type(dx) is int:
         dx = [dx for x in range(len(phi.shape))]
     dx = np.array(dx)

If I understand that right, if you have for example a 3D grid, so 
len(phi.shape) = 3, but you pass for example a single dx, for example 
dx=0.1, then it turns that into (0.1, 0.1, 0.1) and feeds that to the C 
code.  However, you have the option of passing something like [0.1, 0.2, 
0.3] if you want your dx, dy, and dz spacings to be different.

Regarding a very simple example to demonstrate the problem, take the
"examples.levelSet.distanceFunction.mesh1D" code and just replace the 
two lines
        dx = 0.5
        nx = 10
with
        nx = 25
        dx = 0.05 * (1.1 ** numerix.arange(nx))

and replace the var initialization statement with
        var.setValue(1, where=x > x[12])

When you call var.calcDistanceFunction() you get the error message:
ValueError:  dx must be a 1D array of doubles.  Using lsmlib produces a 
slightly different error also complaining about the nature of dx.

Thanks again for your help.  I've appended a full listing of the test below.

Thanks again.

Bob Howell

-------Here's a full listing of the test------------------------------
# IPython log file

# Testing FiPy 3.1 with skfmm and non-uniform grid
# Before starting iPython, do following to use skfmm rather than lsmlib:
# export FIPY_LSM=skfmm
# Started iPthon with:  ipython qtconsole --pylab  --colors lightBG&
# logstart -o 2014_07_22a.pjr
from fipy import *
nx = 25
dx = 0.05 * (1.1 ** numerix.arange(nx))
dx
# Edited the following [OUT] slightly to avoid mailer line wrap
#[Out]# array([ 0.05  ,  0.055 ,  0.060 ,  0.066 ,  0.073 ,
#[Out]#         0.080 ,  0.088 ,  0.097 ,  0.107 ,  0.117 ,
#[Out]#         0.129 ,  0.142 ,  0.156 ,  0.172 ,  0.189 ,
#[Out]#         0.208 ,  0.229 ,  0.252 ,  0.277 ,  0.305 ,
#[Out]#         0.336 ,  0.370 ,  0.407 ,  0.447 ,  0.492 ])
from fipy.tools import serialComm
mesh = Grid1D(dx=dx, nx=nx, communicator=serialComm)
var = DistanceVariable(name='level set variable', mesh=mesh, value=-1.,
                        hasOld=1)
x = mesh.cellCenters[0]
var.setValue(1, where=x > x[12])
var.calcDistanceFunction()
# Just got:   ValueError: dx must be a 1D array of doubles
exit()
_______________________________________________
fipy mailing list
fipy@nist.gov
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to