rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
evaluate_gradient.m
1 function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
2 %function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
3 %
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
6 % is bilinear.
7 %
8 % required fields of params:
9 %
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;
14 
15 % Bernard Haasdonk 18.4.2006
16 
17  X = X(:);
18  Y = Y(:);
19  p1data = p1data(:);
20 
21  %Gx = zeros(size(X));
22  %Gy = zeros(size(X));
23 
24  nx = params.xnumintervals;
25  ny = params.ynumintervals;
26 
27  dx = (params.xrange(2)-params.xrange(1))/nx;
28  dy = (params.yrange(2)-params.yrange(1))/ny;
29 
30  % determine the element indices in which the points reside (counting from
31  % left lower domain row-wise)
32 
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);
38  if ~isempty(i)
39  xi(i) = nx;
40  end;
41  i = find(abs(Y-params.yrange(2))<eps);
42  if ~isempty(i)
43  yi(i) = ny;
44  end;
45  % check out of range
46  if ~isempty(find( xi>nx | xi < 1 | yi > ny | yi < 1, 1 ))
47  error('out of domain evaluation!');
48  end;
49 
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;
57 
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;
61 
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]'
67 
68 
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));
73 
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));
78 
79  detAinv = (dx*dy)^-1;
80  Gx = Gx * detAinv;
81  Gy = Gy * detAinv;
82 
83 
84 % TO BE ADJUSTED TO NEW SYNTAX
85 %| \docupdate