1 | function [gradx, grady]=computeGrad(index,x,y,field)
|
---|
2 | %COMPUTEGRAD - compute the gradient from a field
|
---|
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;
|
---|