Anders Logg wrote:
> There seems to be more than one problem here...
>
> 1. You need to allocate the array as
>
> real* xx = new real[3*mesh.numVertices()];
>
> 2. Yes indeed, the size is never computed and it needs to be computed
> correctly or otherwise you'll most likely get a segmentation fault.
>
> For this to work, a user-defined function must know the dimensions of
> the value type and it currently has no idea... I suggest we make the
> two functions dim() and rank() in Function virtual so that it is
> possible to compute this. Any further thoughts?
>
> /Anders
>
>
> Jake Ostien wrote:
>> Hi,
>>
>> I may have found a bug in the interpolation method for the
>> UserFunction. In the private data there is a uint size that gets
>> initialized to 1 in the constructor, but, as near as I can tell, does
>> not get set anywhere else. When I try and do something like
>>
>>
>> <f is a member of a BodyForce class that returns a 3D force vector
>> and is derived from Function, thus its a UserFunction>
>>
>> real* xx = new real[mesh.numVertices];
>> f.interpolate(xx);
>>
>>
>> I get a memory error from glibc. To make a long (painful) story
>> short(er), I realized that in the interpolation function, local_values
>> was of size 1 and needed to be of size 3. So I hard coded in a 3 in
>> place of size, and things magically got better. Unfortunately, it is
>> not clear to me how to fix this in the general case. If anyone has a
>> suggestion, I'd be happy to try it out.
>>
>> -Jake
>> _______________________________________________
>> DOLFIN-dev mailing list
>> [email protected]
>> http://www.fenics.org/mailman/listinfo/dolfin-dev
> _______________________________________________
> DOLFIN-dev mailing list
> [email protected]
> http://www.fenics.org/mailman/listinfo/dolfin-dev
This should be fixed now. rank() and dim() may now be overloaded.
Here's an example:
from dolfin import *
class MyFunction(Function):
def __init__(self, mesh):
Function.__init__(self, mesh)
def rank(self):
return 1
def dim(self, i):
return 2
def eval(self, values, x):
values[0] = -x[1]
values[1] = x[0]
mesh = UnitSquare(16, 16)
f = MyFunction(mesh)
plot(f)
/Anders
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev