function [ quad_w, quad_xy ] = quad_rule ( quad_num ) %*****************************************************************************80 % %% QUAD_RULE sets the quadrature rule for assembly. % % Discussion: % % The quadrature rule is given for a reference element, points (X,Y) such that % % 0 <= X, % 0 <= Y, and % X + Y <= 1. % % ^ % 1 | * % | |\ % Y | | \ % | | \ % 0 | *---* % +-------> % 0 X 1 % % The rules have the following precision: % % QUAD_NUM Precision % % 1 1 % 3 2 % 4 3 % 6 4 % 7 5 % 9 6 % 13 7 % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 17 July 2005 % % Author: % % John Burkardt % % Parameters: % % Input, integer QUAD_NUM, the number of quadrature nodes. % Legal values are 1, 3, 4, 6, 7, 9, 13. % % Output, real QUAD_W(QUAD_NUM), the quadrature weights. % % Output, real QUAD_XY(2,QUAD_NUM), the quadrature nodes. % if ( quad_num == 1 ) quad_xy(1:2,1:quad_num) = [ 1.0 / 3.0, 1.0 / 3.0 ]'; quad_w(1:quad_num) = 1.0; elseif ( quad_num == 3 ) quad_xy(1:2,1:quad_num) = [ ... 0.5, 0.0; ... 0.5, 0.5; ... 0.0, 0.5 ]'; quad_w(1:quad_num) = 1.0 / 3.0; elseif ( quad_num == 4 ) a = 6.0; b = 10.0; c = 18.0; d = 25.0; e = -27.0; f = 30.0; g = 48.0; quad_xy(1:2,1:quad_num) = [ ... b, b; ... c, a; ... a, c; ... a, a ]' / f; quad_w(1:quad_num) = [ e, d, d, d ] / g; elseif ( quad_num == 6 ) a = 0.816847572980459; b = 0.091576213509771; c = 0.108103018168070; d = 0.445948490915965; v = 0.109951743655322; w = 0.223381589678011; quad_xy(1:2,1:quad_num) = [ a, b; ... b, a; ... b, b; ... c, d; ... d, c; ... d, d ]'; quad_w(1:6) = [ v, v, v, w, w, w ]; elseif ( quad_num == 7 ) a = 1.0 / 3.0; b = ( 9.0 + 2.0 * sqrt ( 15.0 ) ) / 21.0; c = ( 6.0 - sqrt ( 15.0 ) ) / 21.0; d = ( 9.0 - 2.0 * sqrt ( 15.0 ) ) / 21.0; e = ( 6.0 + sqrt ( 15.0 ) ) / 21.0; u = 0.225; v = ( 155.0 - sqrt ( 15.0 ) ) / 1200.0; w = ( 155.0 + sqrt ( 15.0 ) ) / 1200.0; quad_xy(1:2,1:quad_num) = [ ... a, a; ... b, c; ... c, b; ... c, c; ... d, e; ... e, d; ... e, e ]'; quad_w(1:quad_num) = [ u, v, v, v, w, w, w ]; elseif ( quad_num == 9 ) a = 0.124949503233232; b = 0.437525248383384; c = 0.797112651860071; d = 0.165409927389841; e = 0.037477420750088; u = 0.205950504760887; v = 0.063691414286223; quad_xy(1:2,1:quad_num) = [ ... a, b; ... b, a; ... b, b; ... c, d; ... c, e; ... d, c; ... d, e; ... e, c; ... e, d ]'; quad_w(1:quad_num) = [ u, u, u, v, v, v, v, v, v ]; elseif ( quad_num == 13 ) h = 1.0 / 3.0; a = 0.479308067841923; b = 0.260345966079038; c = 0.869739794195568; d = 0.065130102902216; e = 0.638444188569809; f = 0.312865496004875; g = 0.048690315425316; w = -0.149570044467670; t = 0.175615257433204; u = 0.053347235608839; v = 0.077113760890257; quad_xy(1:2,1:quad_num) = [ h, h; ... a, b; ... b, a; ... b, b; ... c, d; ... d, c; ... d, d; ... e, f; ... e, g; ... f, e; ... f, g; ... g, e; ... g, f ]'; quad_w(1:quad_num) = [ w, t, t, t, u, u, u, v, v, v, v, v, v ]; else fprintf ( 1, '\n' ); fprintf ( 1, 'QUAD_RULE - Fatal error!\n' ); fprintf ( 1, ' No rule is available of order QUAD_NUM = %d\n', ... quad_num ); error ( 'QUAD_RULE - Fatal error!\n' ); end return end