[26975] | 1 | function [gradx, grady]=computeGrad(index,x,y,field)
|
---|
[27694] | 2 | %COMPUTEGRAD - compute the gradient from a field
|
---|
[26975] | 3 |
|
---|
| 4 | %some variables
|
---|
| 5 | numberofnodes=length(x);
|
---|
| 6 | numberofelements=size(index,1);
|
---|
| 7 | numberoftime = size(field, 2);
|
---|
| 8 |
|
---|
| 9 | %some checks
|
---|
| 10 | if (length(field)~=numberofnodes) && (length(field)~=numberofelements)
|
---|
| 11 | error('ComputeHessian error message: the given field size not supported yet');
|
---|
| 12 | end
|
---|
| 13 | %initialization
|
---|
| 14 | line=index(:);
|
---|
| 15 | linesize=3*numberofelements;
|
---|
| 16 |
|
---|
| 17 | %get areas and nodal functions coefficients N(x,y)=alpha x + beta y + gamma
|
---|
| 18 | [alpha, beta]=GetNodalFunctionsCoeff(index,x,y);
|
---|
| 19 | areas=GetAreas(index,x,y);
|
---|
| 20 |
|
---|
| 21 | %compute weights that hold the volume of all the element holding the node i
|
---|
| 22 | weights=sparse(line,ones(linesize,1),repmat(areas,3,1),numberofnodes,1);
|
---|
| 23 |
|
---|
| 24 | %compute field on nodes if on elements
|
---|
| 25 | if length(field)==numberofelements
|
---|
| 26 | field=sparse(line,ones(linesize,1),repmat(areas.*field,3,1),numberofnodes,1)./weights ;
|
---|
| 27 | end
|
---|
| 28 |
|
---|
| 29 | %Compute gradient for each element
|
---|
| 30 | if numberoftime == 1
|
---|
| 31 | grad_elx=sum(field(index).*alpha,2);
|
---|
| 32 | grad_ely=sum(field(index).*beta,2);
|
---|
| 33 | else
|
---|
| 34 | grad_elx = zeros(numberofelements,numberoftime);
|
---|
| 35 | grad_ely = zeros(numberofelements,numberoftime);
|
---|
| 36 | for i = 1:3
|
---|
| 37 | grad_elx = grad_elx + field(index(:,i), :).*alpha(:,i);
|
---|
| 38 | grad_ely = grad_ely + field(index(:,i), :).*beta(:,i);
|
---|
| 39 | end
|
---|
| 40 | end
|
---|
| 41 | %Compute gradient for each node (average of the elements around)
|
---|
| 42 | gradx=sparse(repmat(line,1,numberoftime),cumsum(ones(linesize,numberoftime),2),repmat(areas.*grad_elx,3,1),numberofnodes,numberoftime);
|
---|
| 43 | grady=sparse(repmat(line,1,numberoftime),cumsum(ones(linesize,numberoftime),2),repmat(areas.*grad_ely,3,1),numberofnodes,numberoftime);
|
---|
| 44 | gradx=gradx./weights;
|
---|
| 45 | grady=grady./weights;
|
---|