I think you want diffDecay = numerix.exp(-varD)
not diffDecay = numerix.exp(-varD.value) `varD.value` returns a NumPy array that holds the values in varD at that moment; it has the same shape as varD, but FiPy doesn't recognize it as a CellVariable. In contrast, `varD.faceValue` returns the FaceVariable interpolated from the CellVariable varD. On Nov 17, 2015, at 4:36 PM, Yun Tao <[email protected]> wrote: > Hi Jon, > > I have a question somewhat related to my previous inquiries. I'm trying to > define 2D diffusion coefficients that vary spatially according to a separate > variable. In particular, I want the diffusion strength to exponentially > decrease from D0 as a function of local values of varD: > > m = Grid2D(nx=nxy, ny=nxy, dx=dxy, dy=dxy) > varD = CellVariable(mesh=m, value=someValue) > > D0 = 5. > diffDecay = numerix.exp(-varD.value) > > eq = (TransientTerm() == DiffusionTerm(coeff=D0*diffDecay)) > > Solving the equation based on the above script however returns error message: > ValueError: operands could not be broadcast together with shapes (nxy**2,) > (2,2) > > ​Earlier, I was able to implement state-dependent convection coefficient by > combining m.faceCenters and someVar.faceValue, but somehow I've been > unsuccessful trying to resolve the dimensionality issue for the supposedly > simpler diffusion coefficients. > > Any suggestion? > > Thanks, > Yun > > > > On Tue, Oct 27, 2015 at 4:55 PM, Yun Tao <[email protected]> wrote: > Aha! That solved it!! Thanks so much, Jon! I'll be sure to look into the > subclass declaration of `CellVariable'. > > Cheers, > Yun > > On Tue, Oct 27, 2015 at 4:46 PM, Guyer, Jonathan E. > Dr.<[email protected]> wrote: > Yun - > > The problem with `update_signal()` is that you overwrite varS each time you > call it, but eq is defined in terms of the first declaration of varS. > > You should get a better result from changing `update_signal()` to > > def update_signal(rate): > ido = np.random.multivariate_normal([55,35+rate], [[0,0],[0,0]], 100) > ido = np.floor(ido).astype(int) > og = np.zeros((nxy, nxy)) > np.add.at(og, (ido[:,0], ido[:,1]), 1) > dd = fftconvolve(og, ker, mode='same') > return dd.flat > > and then writing in your iteration loop: > > varS.value = update_signal(time*50) > > You could further automate the dependency by declaring a subclass of > `CellVariable` that provides a `_calcValue()` method that performs the work > of `update_signal()`. See fipy/variables/noiseVariable.py for an example. > > > You might get some insight from how we declare a Langevin noise term in > > http://www.ctcms.nist.gov/fipy/fipy/generated/fipy.variables.html#module-fipy.variables.gaussianNoiseVariable > > > - Jon > > > > On Oct 27, 2015, at 3:48 PM, Yun Tao <[email protected]> wrote: > > > Hi Jonathan, > > > > I finally got a chance to test out the solution. However, it still doesn't > > work and I suspect I'm overlooking something relatively. I have made the > > following changes: > > > > - inserted time=Variable(): line 25 > > - updated the time-dependent variable varS using time in the while loop: > > line 101 > > - updated time.value during the iterations: line 103 > > > > I still do not see changes in either var or varS. My modified code is > > attached below -- note that the time-dependency doesn't operate according > > to a source term but rather relates to the component inside the convection > > term: varS.faceValue. > > > > Is my use of an embedded function update_signal inside the iteration loop > > messing things up? > > > > Thanks, > > Yun > > > > On Mon, Oct 19, 2015 at 4:35 PM, Guyer, Jonathan E. Dr. > > <[email protected]> wrote: > > You would do this in a similar way to how time-dependent boundary > > conditions are illustrated in examples/diffusion/mesh1D.py: > > > > >>> phi = CellVariable(mesh=..., value=...) > > >>> time = Variable() > > >>> source1 = phi * time > > > > or, e.g., > > > > >>> source2 = mesh.x * time > > > > > > Then as you iterate in timesteps, you would update time with: > > > > >>> time.value = time.value + dt > > > > source1 and source2 will automatically reflect the new value of time. > > > > On Oct 12, 2015, at 4:15 PM, Yun Tao <[email protected]> wrote: > > > > > Hi FiPy community, > > > > > > This is a potentially helpful update to a recent question I submitted, > > > where my goal was to spatially vary the convection strength of a > > > Fokker-Planck equation for random variable var(x,t) as a simple function > > > of local signal distribution varS(x,t). Specifically, I wanted to solve > > > for the transient dynamics of var(x,t), given that, at each location x, > > > its probability surface is pulled towards a fixed, central > > > point-attractor to a degree that is proportional to the estimated value > > > of varS(x,t). > > > > > > I like to thank Jon for his tremendous amount of help, from which I was > > > able to generate a working script on the condition that varS(x,t) is > > > time-invariant. The code is attached here as signals_static.py. var(x,t) > > > is plotted over time in the left panel of the animation, and varS(x) is > > > on the right. The increasing topological distortion shown in the > > > simulation is consistent with how we expect var(x,t) to behave. > > > > > > My current goal is to solve for var(x,t) on the condition that varS(x,t) > > > also varies, partially stochastically, over time. Note that this doesn't > > > involve coupling the Fokker-Plank equation with another differential > > > equation. I've attempted to do this in the attached script: > > > signals_dynamic.py. The only addition from the previous script is a > > > "signal updating function', through which we force the spatial > > > distribution of varS(x,t) to shift rightward every time step. However, > > > for some reason, var(x,t) is unresponsive to these changes. > > > > > > Therefore, my question is: how can I base the convection term on a > > > CellVariable that gets temporally updated outside of the equation > > > definition? > > > > > > Thanks, > > > Yun > > > > > > On Wed, Aug 26, 2015 at 2:47 PM, Guyer, Jonathan E. Dr. > > > <[email protected]> wrote: > > > Yun - > > > > > > I've gotten your script to "work" and posted the changes to: > > > > > > https://gist.github.com/guyer/caca956463dfc3835722/revisions > > > > > > The main changes I made were: > > > > > > * to get rid of the intrep2d, as it wasn't working properly > > > [signal_fct(xf, yf) generates a result of shape > > > (len(xf), len(xf)) instead of (len(xf),).] I was able to get it working > > > a bit better, but not completely, and I > > > realized that it doesn't really do anything for you that simply placing > > > your signals in a CellVariable and then > > > letting it calculate its .faceValue doesn't accomplish. > > > > > > * simplify the calculation of faceVelocity (m.faceValues is already a > > > rank-1 FaceVariable) > > > > > > Although this script functions, I suspect it's not really what you're > > > looking for. The signals are all extremely localized and faceVelocity is > > > really not responsive to the density of signals, but just discretely to > > > whether there's a signal in a given cell. If that's so, I think you'll > > > want to calculate a density field for the signals, rather than placing > > > them in discrete locations. > > > > > > - Jon > > > > > > On Aug 19, 2015, at 8:00 PM, Yun Tao <[email protected]> wrote: > > > > > > > Hi FiPy community, > > > > > > > > I'm currently trying to combine the powerful tool of FiPy with > > > > agent-based modeling. The problem I'm trying to solve is this: > > > > > > > > In a 2D landscape scattered with "deterrent point signals", I want to > > > > solve for the transient solution of a convection-diffusion > > > > (Fokker-Planck) equation that increases its advection towards its > > > > central attractor in a way that is proportional to the interpolated > > > > density of local signals. I therefore expect to see gradual > > > > deformation, and slowing down of spread, in the solution boundary as > > > > diffusion brings it closer to clustered signals. > > > > > > > > However, since the point signals are located on mesh cell centers and > > > > the convection coefficient in FiPy requires FaceVariable inputs, there > > > > is a problem with dimensionality I cannot quite understand. How should > > > > I integrate these two processes? > > > > > > > > I've attached my current script, which has the convection term > > > > commented out for now. Left figure is the PDE solution; right figure is > > > > the locations of the signal points. > > > > > > > > Any help would be greatly appreciated. > > > > > > > > Thanks, > > > > Yun > > > > > > > > > > > > -- > > > > Yun Tao > > > > PhD > > > > University of California, Davis > > > > Department of Environmental Science and Policy > > > > One Shields Avenue > > > > Davis, CA 95616 > > > > <fipy-ibm2_test_forum.py>_______________________________________________ > > > > fipy mailing list > > > > [email protected] > > > > http://www.ctcms.nist.gov/fipy > > > > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy] > > > > > > > > > _______________________________________________ > > > fipy mailing list > > > [email protected] > > > http://www.ctcms.nist.gov/fipy > > > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy] > > > > > > > > > > > > -- > > > Yun Tao > > > PhD > > > University of California, Davis > > > Department of Environmental Science and Policy > > > One Shields Avenue > > > Davis, CA 95616 > > > <signals_static.py><signals_dynamic.py>_______________________________________________ > > > fipy mailing list > > > [email protected] > > > http://www.ctcms.nist.gov/fipy > > > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > > > > > > _______________________________________________ > > fipy mailing list > > [email protected] > > http://www.ctcms.nist.gov/fipy > > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > > > > > > > > -- > > Yun Tao > > PhD > > University of California, Davis > > Department of Environmental Science and Policy > > One Shields Avenue > > Davis, CA 95616 > > <signals_dynamic2.py>_______________________________________________ > > fipy mailing list > > [email protected] > > http://www.ctcms.nist.gov/fipy > > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > > > _______________________________________________ > fipy mailing list > [email protected] > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > > > > -- > Yun Tao > PhD > University of California, Davis > Department of Environmental Science and Policy > One Shields Avenue > Davis, CA 95616 > > > > -- > Yun Tao > PhD > University of California, Davis > Department of Environmental Science and Policy > One Shields Avenue > Davis, CA 95616 > _______________________________________________ > fipy mailing list > [email protected] > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] _______________________________________________ fipy mailing list [email protected] http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
