Hello,
after much trying I figured I need your help. I managed to calculate the scalar field variable using sfepy
field = Field.from_args('fu', np.float64, 'scalar', omega, space='H1', poly_space_base='lagrange', approx_order=2) u = FieldVariable('u', 'unknown', field) ...
I can evaluate it at arbitrary points using probes or directly:
p = zeros((500,2)) p[:,0] = linspace(-10,10,500) u.evaluate_at(p)
Now I need the gradient, I don't want the average cell value as I am using it to integrate particle path through the field.
This is what I tried:
vecfield = Field.from_args('fgradu', field.dtype, 'vector', field.region, space=field.space, poly_space_base=field.poly_space_base, approx_order=field.approx_order) gradu = FieldVariable('gradu', 'parameter', vecfield, primary_var_name='(set-to-None)')
from sfepy.discrete.fem.geometry_element import geometry_data gdata = geometry_data['2_3'] nc = len(gdata.coors) ivn = Integral('ivn', 'custom', gdata.coors, [gdata.volume / nc] * nc) d = u.evaluate('grad', integral=i) gradu.set_data_from_qp(d, i)
Now I can use gradu.evaluate_at(p), however it is not precise. Even (u.evaluate_at(x+dx)-u.evaluate_at(x))/dx is better.
I suspect some interpolation is still going on. I thought the special Integral I got from one of the examples was supposed to eliminate the interpolation. Where is the catch?
Thanks for help
Jozef