rbmatlab 0.10.01
discfunc/fem/evaluate_gradient.m
00001 function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
00002 %function [Gx, Gy] = evaluate_gradient(X,Y,p1data, params)
00003 %
00004 % function performing an evaluation of the gradient of a given data
00005 % field. Currently only cartesian grids are supported, i.e. the p1 function
00006 % is bilinear. 
00007 %
00008 % required fields of params:
00009 %
00010 % xnumintervals: number of intervals in x-direction
00011 % ynumintervals: number of intervals in y-direction
00012 % xrange: interval in x-direction;
00013 % yrange: interval in y-direction;
00014   
00015 % Bernard Haasdonk 18.4.2006
00016  
00017   X = X(:);
00018   Y = Y(:);
00019   p1data = p1data(:);
00020   
00021   %Gx = zeros(size(X));  
00022   %Gy = zeros(size(X));  
00023   
00024   nx = params.xnumintervals;
00025   ny = params.ynumintervals;
00026   
00027   dx = (params.xrange(2)-params.xrange(1))/nx;
00028   dy = (params.yrange(2)-params.yrange(1))/ny;
00029   
00030   % determine the element indices in which the points reside (counting from
00031   % left lower domain row-wise)
00032   
00033   xi = floor((X-params.xrange(1))/dx)+1;
00034   yi = floor((Y-params.yrange(1))/dy)+1;
00035   el_ind = xi+(yi-1)*nx;
00036   % set left and upper border to last element
00037   i = find(abs(X-params.xrange(2))<eps);
00038   if ~isempty(i)
00039     xi(i) = nx;
00040   end;
00041   i = find(abs(Y-params.yrange(2))<eps);
00042   if ~isempty(i)
00043     yi(i) = ny;
00044   end;
00045   % check out of range
00046   if ~isempty(find( xi>nx | xi < 1 | yi > ny | yi < 1, 1 ))
00047     error('out of domain evaluation!');
00048   end;
00049   
00050   % determine the 4 vertex indices of the elements 
00051   % counting right lower corner 1 then counterclockwise
00052   v_ind = zeros(length(el_ind),4);
00053   v_ind(:,1) = (yi-1)*(nx+1)+1 +xi;
00054   v_ind(:,2) = (yi  )*(nx+1)+1 +xi;
00055   v_ind(:,3) = (yi  )*(nx+1)   +xi;
00056   v_ind(:,4) = (yi-1)*(nx+1)   +xi;
00057   
00058   % determine the fraction of coordinates ("modulo dx, dy")
00059   xfrac = X - params.xrange(1) - (xi-1)*dx;
00060   yfrac = Y - params.yrange(1) - (yi-1)*dy;
00061   
00062   % detAinv = (dx*dy)^-1
00063   % grad phi_1 = detAinv * [dy-y, -x   ]' 
00064   % grad phi_2 = detAinv * [   y,  x   ]' 
00065   % grad phi_3 = detAinv * [  -y,  dx-x]' 
00066   % grad phi_4 = detAinv * [y-dy,  x-dx]' 
00067 
00068   
00069   Gx = (dy-yfrac) .* p1data(v_ind(:,1)) ...
00070        + yfrac    .* p1data(v_ind(:,2)) ...
00071        - yfrac    .* p1data(v_ind(:,3)) ...
00072        +(yfrac-dy).* p1data(v_ind(:,4));
00073   
00074   Gy = - xfrac      .* p1data(v_ind(:,1)) ...
00075        + xfrac      .* p1data(v_ind(:,2)) ...
00076        +(dx - xfrac).* p1data(v_ind(:,3)) ...
00077        +(xfrac-dx)  .* p1data(v_ind(:,4));
00078   
00079   detAinv = (dx*dy)^-1;
00080   Gx = Gx * detAinv;
00081   Gy = Gy * detAinv;
00082   
00083   
00084 % TO BE ADJUSTED TO NEW SYNTAX
00085 %| \docupdate 
 All Classes Namespaces Files Functions Variables