rbmatlab 0.10.01
|
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