1 function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
2 %
function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
4 %
function performing an evaluation of the gradient of a given data
5 % field. Currently only cartesian grids are supported, i.e. the p1
function
8 % required fields of params:
10 % xnumintervals: number of intervals in x-direction
11 % ynumintervals: number of intervals in y-direction
12 % xrange: interval in x-direction;
13 % yrange: interval in y-direction;
15 % Bernard Haasdonk 18.4.2006
24 nx = params.xnumintervals;
25 ny = params.ynumintervals;
27 dx = (params.xrange(2)-params.xrange(1))/nx;
28 dy = (params.yrange(2)-params.yrange(1))/ny;
30 % determine the element indices in which the points reside (counting from
31 % left lower domain row-wise)
33 xi = floor((X-params.xrange(1))/dx)+1;
34 yi = floor((Y-params.yrange(1))/dy)+1;
35 el_ind = xi+(yi-1)*nx;
36 % set left and upper border to last element
37 i = find(abs(X-params.xrange(2))<eps);
41 i = find(abs(Y-params.yrange(2))<eps);
46 if ~isempty(find( xi>nx | xi < 1 | yi > ny | yi < 1, 1 ))
47 error('out of domain evaluation!');
50 % determine the 4 vertex indices of the elements
51 % counting right lower corner 1 then counterclockwise
52 v_ind = zeros(length(el_ind),4);
53 v_ind(:,1) = (yi-1)*(nx+1)+1 +xi;
54 v_ind(:,2) = (yi )*(nx+1)+1 +xi;
55 v_ind(:,3) = (yi )*(nx+1) +xi;
56 v_ind(:,4) = (yi-1)*(nx+1) +xi;
58 % determine the fraction of coordinates ("modulo dx, dy")
59 xfrac = X - params.xrange(1) - (xi-1)*dx;
60 yfrac = Y - params.yrange(1) - (yi-1)*dy;
62 % detAinv = (dx*dy)^-1
63 % grad phi_1 = detAinv * [dy-y, -x ]'
64 % grad phi_2 = detAinv * [ y, x ]'
65 % grad phi_3 = detAinv * [ -y, dx-x]'
66 % grad phi_4 = detAinv * [y-dy, x-dx]'
69 Gx = (dy-yfrac) .* p1data(v_ind(:,1)) ...
70 + yfrac .* p1data(v_ind(:,2)) ...
71 - yfrac .* p1data(v_ind(:,3)) ...
72 +(yfrac-dy).* p1data(v_ind(:,4));
74 Gy = - xfrac .* p1data(v_ind(:,1)) ...
75 + xfrac .* p1data(v_ind(:,2)) ...
76 +(dx - xfrac).* p1data(v_ind(:,3)) ...
77 +(xfrac-dx) .* p1data(v_ind(:,4));
84 % TO BE ADJUSTED TO NEW SYNTAX