File: nodesurfnorm.m

package info (click to toggle)
octave-iso2mesh 1.9.8%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 11,128 kB
  • sloc: cpp: 11,982; ansic: 10,158; sh: 365; makefile: 59
file content (44 lines) | stat: -rw-r--r-- 1,364 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function nv = nodesurfnorm(node, elem)
%  nv=nodesurfnorm(node,elem)
%
%  calculate a nodal norm for each vertix on a surface mesh (surface
%   can only be triangular or cubic)
%
%  author: Qianqian Fang <q.fang at neu.edu>
%  date: 12/12/2008
%
% parameters:
%      node: node coordinate of the surface mesh (nn x 3)
%      elem: element list of the surface mesh (3 columns for
%            triangular mesh, 4 columns for cubic surface mesh)
%      pt: points to be projected, 3 columns for x,y and z respectively
%
% outputs:
%      nv: nodal norms (vector) calculated from nodesurfnorm.m
%          with dimensions of (size(v,1),3)
%
% Please find more information at http://iso2mesh.sf.net/cgi-bin/index.cgi?metch
%
% this function is part of "metch" toobox, see COPYING for license

nn = size(node, 1);
ne = size(elem, 1);
nedim = size(elem, 2);

ev = surfacenorm(node, elem);

nv = zeros(nn, 3);
ev2 = repmat(ev, 1, 3);
for i = 1:ne
    nv(elem(i, :), :) = nv(elem(i, :), :) + reshape(ev2(i, :), 3, 3)';
end
nvnorm = sqrt(sum(nv .* nv, 2));
idx = find(nvnorm > 0);
if (length(idx) < nn)
    warning(['found interior nodes, their norms will be set to zeros; to remove ', ...
             'them, please use removeisolatednodes.m from iso2mesh toolbox']);

    nv(idx, :) = nv(idx, :) ./ repmat(nvnorm(idx), 1, 3);
else
    nv = nv ./ repmat(nvnorm, 1, 3);
end