function [nx,ny,xn,yn,Nx,Ny] = CalcEdgeAndNodalNormals(connectivity,coordinates,Edges)

[nx,ny,xn,yn] = EdgeNormals(connectivity,coordinates,Edges) calculates edge and (optionally) nodal normals

nx, ny : x, y components of the edge normals
xn, yn : x, y coordinates of the edge normals (centre of the edge)
Nx,Ny  : nodal normals

Edges are defined by listing the nodes along each edge in the array `Edges'. The format is Edges=[node1 node2 ; node1 node2 ; etc ] for a 3-node element Edges=[node1 node2 node3 ; node1 node2 node3 ; etc ] for a 6-node element Edges=[node1 node2 node3 node4 ; node1 node2 node3 node4 ; etc ] for a 10-node element

For 6 and 10 node elemetns, each edge therefore consists of 2 and 3, respectivily, sub-edges.

MUA.Boundary.Edges is in this format

Note that since for higher order elements MUA.Boundary.Edges returns edges and sub-edges nx, ny, xn, and yn are returned as #Edges x #NumSubEdges

Nx and Ny are optional outputs. These are arrays with equal elements as the total number of nodes in mesh. For nodes not in Edges, Nx and Ny are not calculated and NaN is returned Nodal normals are defined as the average of the edge normals on both the sides of the node. Although nodal normals can be calculated for all nodes, it generally only makes sense to calculate them for (free) boundary nodes.

Examples:

To calculate and plot normals to all free edges: [nx,ny,xn,yn] = CalcEdgeAndNodalNormals(MUA.connectivity,MUA.coordinates,MUA.Boundary.Edges); figure ; QuiverColorGHG(nx,ny,xn,yn);

To calculate and plot nodal normals for boundary nodes: [nx,ny,xn,yn,Nx,Ny] = CalcEdgeAndNodalNormals(MUA.connectivity,MUA.coordinates,MUA.Boundary.Edges); QuiverColorGHG(MUA.coordinates(MUA.Boundary.Nodes,1),MUA.coordinates(MUA.Boundary.Nodes,2),... Nx(MUA.Boundary.Nodes),Ny(MUA.Boundary.Nodes),CtrlVar);

[nEdges,nod]=size(Edges); nSubEdges=nod-1 ;
Ax=zeros(nEdges,nSubEdges) ;  Ay=zeros(nEdges,nSubEdges) ;
Bx=zeros(nEdges,nSubEdges) ;  By=zeros(nEdges,nSubEdges) ;



for I=1:nSubEdges
    Ax(:,I)=coordinates(Edges(:,I),1);  Ay(:,I)=coordinates(Edges(:,I),2);
    Bx(:,I)=coordinates(Edges(:,I+1),1);  By(:,I)=coordinates(Edges(:,I+1),2);
end

dx=Bx-Ax ; dy=By-Ay;
nx=-dy ; ny=dx ;
l=sqrt(nx.*nx+ny.*ny);
nx=nx./l ; ny=ny./l ;

xn=(Ax+Bx)/2; yn=(Ay+By)/2;


if nargout> 4  % calculate normals for nodes
    Nx=zeros(length(coordinates),1); Ny=zeros(length(coordinates),1);
    Nx(Edges(:,1))=nx(:,1) ; Ny(Edges(:,1))=ny(:,1) ;


    Nx(Edges(:,nod))=Nx(Edges(:,nod))+ nx(:,nSubEdges) ;
    Ny(Edges(:,nod))=Ny(Edges(:,nod))+ ny(:,nSubEdges) ;

    for I=2:nSubEdges

        Nx(Edges(:,I))=Nx(Edges(:,I))+ ( nx(:,I-1) + nx(:,I))/2 ;
        Ny(Edges(:,I))=Ny(Edges(:,I))+ ( ny(:,I-1) + ny(:,I))/2 ;

    end

    l=sqrt(Nx.*Nx+Ny.*Ny);
    Nx=Nx./l ; Ny=Ny./l ;

end
end