function fem_basis_t3_display ( node_file, element_file ) %*****************************************************************************80 % %% FEM_BASIS_T3_DISPLAY displays a finite element T3 basis. % % Discussion: % % This program reads a data file defining a set of nodes, and a % data file defining the triangulation of those nodes using 3 node triangles % (or 6 node triangles, as long as the vertices are listed first). % % The program then asks the user interactively to select one of the % nodes. It computes the basis function associated with that node % and displays it over the entire mesh. Of course, the basis function % will only be nonzero over a small number of the elements, but it % is instructive to see the entire mesh. % % The display is initially "flat", but by using the manipulator % on the graphics menu, the user can easily get some dramatic images % of the basis function. % % Usage: % % fem_basis_t3_display ( 'node_file.txt', 'element_file.txt' ) % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 26 February 2009 % % Author: % % John Burkardt % % Parameters: % % Input, string NODE_FILE, ELEMENT_FILE, the names of the files % containing the node and element information. % timestamp ( ); fprintf ( 1, '\n' ); fprintf ( 1, 'FEM_BASIS_T3_DISPLAY:\n' ); fprintf ( 1, ' MATLAB version\n' ); fprintf ( 1, ' Display basis functions associated with \n' ); fprintf ( 1, ' a finite element grid of linear triangles ("T3").\n' ); fprintf ( 1, '\n' ); fprintf ( 1, ' This program reads two files:\n' ); fprintf ( 1, '\n' ); fprintf ( 1, ' * node_file, the node file,\n' ); fprintf ( 1, ' * element_file, the element file,\n' ); fprintf ( 1, '\n' ); fprintf ( 1, ' The user specifies a basis function by node index, and\n' ); fprintf ( 1, ' the program displays a surface plot of that basis function.\n' ); fprintf ( 1, ' (Use the 3D ROTATE option to see the full picture!\n' ); % % Read the data. % node_xy = load ( node_file )'; [ dim_num, node_num ] = size ( node_xy ); element_node = load ( element_file )'; [ element_order, element_num ] = size ( element_node ); if ( element_order ~= 3 ) fprintf ( 1, '\n' ); fprintf ( 1, 'FEM_BASIS_T3_DISPLAY\n' ); fprintf ( 1, ' This program requires that the elements have order 3.\n' ); fprintf ( 1, ' Your elements have order %d\n', element_order ); error ( 'FEM_BASIS_T3_DISPLAY - Fatal error!' ); end x_min = min ( node_xy(1,:) ); x_max = max ( node_xy(1,:) ); y_min = min ( node_xy(2,:) ); y_max = max ( node_xy(2,:) ); z_min = 0.0; z_max = 1.0; node_min = min ( min ( element_node ) ); node_max = max ( max ( element_node ) ); fprintf ( 1, '\n' ); fprintf ( 1, ' Every basis function is associated with a node.\n' ); fprintf ( 1, ' To chooose a basis function, you specify a node.\n' ); fprintf ( 1, ' Nodes range in value from %d to %d.\n', node_min, node_max ); while ( 1 ) fprintf ( 1, '\n' ); prompt = sprintf ( 'Enter a node between %d and %d: ', node_min, node_max ); node_index = input ( prompt ); if ( node_index < node_min | node_max < node_index ) break end % % Clear the graphics page. % clf fprintf ( 1, '\n' ); for element = 1 : element_num local = 0; for j = 1 : element_order if ( element_node(j,element) == node_index ) fprintf ( 1, ' Node %d occurs as local node %d in element %d.\n', ... node_index, j, element ); local = j; end end z(1:2,1:2) = 0.0; if ( local == 0 ) x(1,1) = node_xy(1,element_node(1,element)); y(1,1) = node_xy(2,element_node(1,element)); x(2,1) = node_xy(1,element_node(1,element)); y(2,1) = node_xy(2,element_node(1,element)); x(1,2) = node_xy(1,element_node(2,element)); y(1,2) = node_xy(2,element_node(2,element)); x(2,2) = node_xy(1,element_node(3,element)); y(2,2) = node_xy(2,element_node(3,element)); else x(1,1) = node_xy(1,element_node(local,element)); y(1,1) = node_xy(2,element_node(local,element)); z(1,1) = 1.0; x(2,1) = node_xy(1,element_node(local,element)); y(2,1) = node_xy(2,element_node(local,element)); z(2,1) = 1.0; j = i4_wrap ( local + 1, 1, element_order ); x(1,2) = node_xy(1,element_node(j,element)); y(1,2) = node_xy(2,element_node(j,element)); j = i4_wrap ( j + 1, 1, element_order ); x(2,2) = node_xy(1,element_node(j,element)); y(2,2) = node_xy(2,element_node(j,element)); end caxis ( [ -0.4, 1.2 ] ) surface ( x, y, z, 'FaceColor', 'interp' ) end axis ( [ x_min, x_max, y_min, y_max, z_min, z_max ] ); axis equal xlabel ( '--X axis--' ); ylabel ( '--Y axis--' ); zlabel ( '--Z axis--' ); title_string = sprintf ( 'T3 basis function for node %d', node_index ); title ( title_string ); fprintf ( 1, '\n' ); fprintf ( 1, 'Press return...\n' ); pause end fprintf ( 1, '\n' ); fprintf ( 1, 'FEM_BASIS_T3_DISPLAY:\n' ); fprintf ( 1, ' Normal end of execution.\n' ); fprintf ( 1, '\n' ); timestamp ( ); return end