Thanks Jon! This is very helpful.

Happy to hear that what I did is ok. I like your last example better
though, it's more readable.

I've tried the explicit statement before and unfortunately it didn't work.
FiPy didn't complain but numpy did. I use numpy.sum inside bellLinT, and
when it's called it raises the error

File "/Library/Python/2.7/site-packages/numpy/core/fromnumeric.py", line
1713, in sum
    return sum(axis=axis, dtype=dtype, out=out)
TypeError: sum() got an unexpected keyword argument 'dtype'

This doesn't happen if I define the operator variable as I described in my
previous email. I have no idea why.

Best,

Jose



2015-10-02 15:17 GMT-04:00 Guyer, Jonathan E. Dr. <[email protected]>:

> Jose -
>
> What's surprising to me is how infrequently this question has come up. I
> don't think there's anything wrong with what you've done, but understand
> your feeling that you've "hacked" FiPy. It's quite possible that you can
> just write `T = bellLinT(Sigma)`. Depending on what's in bellLinT, this
> often just works to provide an appropriate OperatorVariable.
>
> Another option, and there are several examples of this in fipy/variables/,
> is to create a subclass that does what you need. Something like:
>
> class BellLinTVariable(CellVariable):
>     def __init__(self, sigma):
>         self.sigma = self._requires(sigma)
>
>     def _calcValue(self):
>         return bellLinT(self.sigma)
>
>
> T = BellLinTVariable(Sigma)
>
> I'd try the simple, explicit statement first.
>
> I agree that this would be a good area for us to provide some examples.
>
> - Jon
>
> On Oct 2, 2015, at 1:42 PM, Jose Garmilla <[email protected]> wrote:
>
> > Dear FiPy developers and users,
> >
> > Thank you for your work! It's helped me a lot in my projects.
> >
> > I used FiPy to solve an equation that models an accretion disk in 1D. I
> wrote the equation in the form:
> >
> > transient term = convection term.
> >
> > The problem I encountered is that the velocity coefficient in the
> convection term is a complicated function of the dependent variable. The
> function can't be written in terms of the built-in FiPy functions. In fact,
> the way I calculate this function is by numerically pre-computing the
> values in a grid and then interpolate for points in between.
> >
> > I didn't find anything in the documentation to create operator variables
> with user-defined functions. To go around this, I defined an operator
> variable as follows:
> >
> > T = Sigma._UnaryOperatorVariable(lambda x: bellLinT(x))
> >
> > where `Sigma` is the dependent varible, `T.faceGrad` goes into the
> velocity coefficient, and `bellLin()` is the interpolating function that
> takes an array with the values of `Sigma` and returns the corresponding
> values for `T`.
> >
> > This seems to have worked, but I felt that I was somehow hacking FiPy
> and was never comfortable with it. Should I be concerned? Is there a proper
> way of doing this that I missed?
> >
> > If this should work in general, and is not in the documentation already.
> Wouldn't it be useful to put in there a way of building operator variables
> with user-defined functions?
> >
> > Best,
> >
> > Jose
> > _______________________________________________
> > 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 ]
>
_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to