function node_boundary = triangulation_order6_boundary_node ( node_num, ... triangle_num, triangle_node ) %% TRIANGULATION_ORDER6_BOUNDARY_NODE indicates which nodes are on the boundary. % % Discussion: % % This routine is given an order 6 triangulation, an abstract list of sets % of six nodes. The vertices are listed clockwise, then the % midside nodes. % % It is assumed that each edge of the triangulation is either % * an INTERIOR edge, which is listed twice, once with positive % orientation and once with negative orientation, or; % * a BOUNDARY edge, which will occur only once. % % This routine should work even if the region has holes - as long % as the boundary of the hole comprises more than 3 edges! % % Modified: % % 13 June 2005 % % Author: % % John Burkardt % % Parameters: % % Input, integer NODE_NUM, the number of nodes. % % Input, integer TRIANGLE_NUM, the number of triangles. % % Input, integer TRIANGLE_NODE(6,TRIANGLE_NUM), the nodes that make up the % triangles. % % Output, logical NODE_BOUNDARY(NODE_NUM), is TRUE if the node % is on a boundary edge. % m = 3; n = 3 * triangle_num; % % Set up the edge array. The midside node is listed last, as % it is not needed for the sorting process. % edge(1, 1: triangle_num) = triangle_node(1,1:triangle_num); edge(2, 1: triangle_num) = triangle_node(4,1:triangle_num); edge(3, 1: triangle_num) = triangle_node(2,1:triangle_num); edge(1, triangle_num+1:2*triangle_num) = triangle_node(2,1:triangle_num); edge(2, triangle_num+1:2*triangle_num) = triangle_node(5,1:triangle_num); edge(3, triangle_num+1:2*triangle_num) = triangle_node(3,1:triangle_num); edge(1,2*triangle_num+1:3*triangle_num) = triangle_node(3,1:triangle_num); edge(2,2*triangle_num+1:3*triangle_num) = triangle_node(6,1:triangle_num); edge(3,2*triangle_num+1:3*triangle_num) = triangle_node(1,1:triangle_num); % % In each column, force the smaller of the two vertices to appear first. % e1(1:n) = min ( edge(1:2:3,1:n) ); e2(1:n) = max ( edge(1:2:3,1:n) ); edge(1,1:n) = e1(1:n); edge(3,1:n) = e2(1:n); % % Ascending sort the column array. % edge = i4col_sort_a ( m, n, edge ); % % Records which appear twice are internal edges and can be ignored. % node_boundary(1:node_num) = 0; i = 0; while ( i < 3 * triangle_num ) i = i + 1; if ( i == 3 * triangle_num ) node_boundary(edge(1:m,i)) = 1; elseif ( all ( edge(1:m,i) == edge(1:m,i+1) ) ) i = i + 1; else node_boundary(edge(1:m,i)) = 1; end end