# HG changeset patch # User John W. Eaton # Date 1621173824 14400 # Node ID 25246c1a1645f728ea2c2cbfce860c19ea61a2b7 # Parent e8a8ae9f512dcb419fd520905a258bbc8b15dfe9 move CollocWt class inside octave namespace * CollocWt.h, CollocWt.cc: Move CollocWt and supporting functions inside octave namespace. Provide deprecated typedef for old global name. * colloc.cc (Fcolloc): Use octave::CollocWt. diff -r e8a8ae9f512d -r 25246c1a1645 libinterp/corefcn/colloc.cc --- a/libinterp/corefcn/colloc.cc Sun May 16 09:52:37 2021 -0400 +++ b/libinterp/corefcn/colloc.cc Sun May 16 10:03:44 2021 -0400 @@ -85,7 +85,7 @@ if (ntot < 1) error (R"("colloc: the total number of roots (N + "left" + "right") must be >= 1)"); - CollocWt wts (ncol, left, right); + octave::CollocWt wts (ncol, left, right); ColumnVector r = wts.roots (); Matrix A = wts.first (); diff -r e8a8ae9f512d -r 25246c1a1645 liboctave/numeric/CollocWt.cc --- a/liboctave/numeric/CollocWt.cc Sun May 16 09:52:37 2021 -0400 +++ b/liboctave/numeric/CollocWt.cc Sun May 16 10:03:44 2021 -0400 @@ -45,462 +45,460 @@ // // Translated to C++ by jwe. -// Compute the first three derivatives of the node polynomial. -// -// n0 (alpha,beta) n1 -// p (x) = (x) * p (x) * (1 - x) -// nt n -// -// at the interpolation points. Each of the parameters n0 and n1 -// may be given the value 0 or 1. The total number of points -// nt = n + n0 + n1 -// -// The values of root must be known before a call to dif is possible. -// They may be computed using jcobi. - -static void -dif (octave_idx_type nt, double *root, double *dif1, double *dif2, - double *dif3) -{ - // Evaluate derivatives of node polynomial using recursion formulas. - - for (octave_idx_type i = 0; i < nt; i++) - { - double x = root[i]; - - dif1[i] = 1.0; - dif2[i] = 0.0; - dif3[i] = 0.0; - - for (octave_idx_type j = 0; j < nt; j++) - { - if (j != i) - { - double y = x - root[j]; - - dif3[i] = y * dif3[i] + 3.0 * dif2[i]; - dif2[i] = y * dif2[i] + 2.0 * dif1[i]; - dif1[i] = y * dif1[i]; - } - } - } -} - -// Compute the zeros of the Jacobi polynomial. -// -// (alpha,beta) -// p (x) -// n -// -// Use dif to compute the derivatives of the node -// polynomial -// -// n0 (alpha,beta) n1 -// p (x) = (x) * p (x) * (1 - x) -// nt n -// -// at the interpolation points. -// -// See Villadsen and Michelsen, pages 131-132 and 418. -// -// Input parameters: -// -// nd : the dimension of the vectors dif1, dif2, dif3, and root -// -// n : the degree of the jacobi polynomial, (i.e., the number -// of interior interpolation points) -// -// n0 : determines whether x = 0 is included as an -// interpolation point -// -// n0 = 0 ==> x = 0 is not included -// n0 = 1 ==> x = 0 is included -// -// n1 : determines whether x = 1 is included as an -// interpolation point -// -// n1 = 0 ==> x = 1 is not included -// n1 = 1 ==> x = 1 is included -// -// alpha : the value of alpha in the description of the jacobi -// polynomial -// -// beta : the value of beta in the description of the jacobi -// polynomial -// -// For a more complete explanation of alpha an beta, see Villadsen -// and Michelsen, pages 57 to 59. -// -// Output parameters: -// -// root : one dimensional vector containing on exit the -// n + n0 + n1 zeros of the node polynomial used in the -// interpolation routine -// -// dif1 : one dimensional vector containing the first derivative -// of the node polynomial at the zeros -// -// dif2 : one dimensional vector containing the second derivative -// of the node polynomial at the zeros -// -// dif3 : one dimensional vector containing the third derivative -// of the node polynomial at the zeros - -static bool -jcobi (octave_idx_type n, octave_idx_type n0, octave_idx_type n1, - double alpha, double beta, double *dif1, double *dif2, - double *dif3, double *root) +namespace octave { - assert (n0 == 0 || n0 == 1); - assert (n1 == 0 || n1 == 1); - - octave_idx_type nt = n + n0 + n1; + // Compute the first three derivatives of the node polynomial. + // + // n0 (alpha,beta) n1 + // p (x) = (x) * p (x) * (1 - x) + // nt n + // + // at the interpolation points. Each of the parameters n0 and n1 + // may be given the value 0 or 1. The total number of points + // nt = n + n0 + n1 + // + // The values of root must be known before a call to dif is possible. + // They may be computed using jcobi. - assert (nt >= 1); - -// -- first evaluation of coefficients in recursion formulas. -// -- recursion coefficients are stored in dif1 and dif2. + static void dif (octave_idx_type nt, double *root, double *dif1, + double *dif2, double *dif3) + { + // Evaluate derivatives of node polynomial using recursion formulas. - double ab = alpha + beta; - double ad = beta - alpha; - double ap = beta * alpha; + for (octave_idx_type i = 0; i < nt; i++) + { + double x = root[i]; - dif1[0] = (ad / (ab + 2.0) + 1.0) / 2.0; - dif2[0] = 0.0; + dif1[i] = 1.0; + dif2[i] = 0.0; + dif3[i] = 0.0; - if (n >= 2) - { - for (octave_idx_type i = 1; i < n; i++) - { - double z1 = i; - double z = ab + 2 * z1; + for (octave_idx_type j = 0; j < nt; j++) + { + if (j != i) + { + double y = x - root[j]; + + dif3[i] = y * dif3[i] + 3.0 * dif2[i]; + dif2[i] = y * dif2[i] + 2.0 * dif1[i]; + dif1[i] = y * dif1[i]; + } + } + } + } - dif1[i] = (ab * ad / z / (z + 2.0) + 1.0) / 2.0; + // Compute the zeros of the Jacobi polynomial. + // + // (alpha,beta) + // p (x) + // n + // + // Use dif to compute the derivatives of the node + // polynomial + // + // n0 (alpha,beta) n1 + // p (x) = (x) * p (x) * (1 - x) + // nt n + // + // at the interpolation points. + // + // See Villadsen and Michelsen, pages 131-132 and 418. + // + // Input parameters: + // + // nd : the dimension of the vectors dif1, dif2, dif3, and root + // + // n : the degree of the jacobi polynomial, (i.e., the number + // of interior interpolation points) + // + // n0 : determines whether x = 0 is included as an + // interpolation point + // + // n0 = 0 ==> x = 0 is not included + // n0 = 1 ==> x = 0 is included + // + // n1 : determines whether x = 1 is included as an + // interpolation point + // + // n1 = 0 ==> x = 1 is not included + // n1 = 1 ==> x = 1 is included + // + // alpha : the value of alpha in the description of the jacobi + // polynomial + // + // beta : the value of beta in the description of the jacobi + // polynomial + // + // For a more complete explanation of alpha an beta, see Villadsen + // and Michelsen, pages 57 to 59. + // + // Output parameters: + // + // root : one dimensional vector containing on exit the + // n + n0 + n1 zeros of the node polynomial used in the + // interpolation routine + // + // dif1 : one dimensional vector containing the first derivative + // of the node polynomial at the zeros + // + // dif2 : one dimensional vector containing the second derivative + // of the node polynomial at the zeros + // + // dif3 : one dimensional vector containing the third derivative + // of the node polynomial at the zeros - if (i == 1) - dif2[i] = (ab + ap + z1) / z / z / (z + 1.0); - else - { - z *= z; - double y = z1 * (ab + z1); - y *= (ap + y); - dif2[i] = y / z / (z - 1.0); - } - } - } - - // Root determination by Newton method with suppression of previously - // determined roots. - - double x = 0.0; - - for (octave_idx_type i = 0; i < n; i++) - { - bool done = false; - - int k = 0; + static bool jcobi (octave_idx_type n, octave_idx_type n0, octave_idx_type n1, + double alpha, double beta, double *dif1, double *dif2, + double *dif3, double *root) + { + assert (n0 == 0 || n0 == 1); + assert (n1 == 0 || n1 == 1); - while (! done) - { - double xd = 0.0; - double xn = 1.0; - double xd1 = 0.0; - double xn1 = 0.0; + octave_idx_type nt = n + n0 + n1; + + assert (nt >= 1); + + // -- first evaluation of coefficients in recursion formulas. + // -- recursion coefficients are stored in dif1 and dif2. + + double ab = alpha + beta; + double ad = beta - alpha; + double ap = beta * alpha; - for (octave_idx_type j = 0; j < n; j++) - { - double xp = (dif1[j] - x) * xn - dif2[j] * xd; - double xp1 = (dif1[j] - x) * xn1 - dif2[j] * xd1 - xn; + dif1[0] = (ad / (ab + 2.0) + 1.0) / 2.0; + dif2[0] = 0.0; + + if (n >= 2) + { + for (octave_idx_type i = 1; i < n; i++) + { + double z1 = i; + double z = ab + 2 * z1; + + dif1[i] = (ab * ad / z / (z + 2.0) + 1.0) / 2.0; - xd = xn; - xd1 = xn1; - xn = xp; - xn1 = xp1; - } + if (i == 1) + dif2[i] = (ab + ap + z1) / z / z / (z + 1.0); + else + { + z *= z; + double y = z1 * (ab + z1); + y *= (ap + y); + dif2[i] = y / z / (z - 1.0); + } + } + } - double zc = 1.0; - double z = xn / xn1; + // Root determination by Newton method with suppression of previously + // determined roots. - if (i != 0) - { - for (octave_idx_type j = 1; j <= i; j++) - zc -= z / (x - root[j-1]); - } + double x = 0.0; + + for (octave_idx_type i = 0; i < n; i++) + { + bool done = false; - z /= zc; - x -= z; + int k = 0; + + while (! done) + { + double xd = 0.0; + double xn = 1.0; + double xd1 = 0.0; + double xn1 = 0.0; - // Famous last words: 100 iterations should be more than - // enough in all cases. + for (octave_idx_type j = 0; j < n; j++) + { + double xp = (dif1[j] - x) * xn - dif2[j] * xd; + double xp1 = (dif1[j] - x) * xn1 - dif2[j] * xd1 - xn; - if (++k > 100 || octave::math::isnan (z)) - return false; + xd = xn; + xd1 = xn1; + xn = xp; + xn1 = xp1; + } - if (std::abs (z) <= 100 * std::numeric_limits::epsilon ()) - done = true; - } + double zc = 1.0; + double z = xn / xn1; - root[i] = x; - x += std::sqrt (std::numeric_limits::epsilon ()); - } + if (i != 0) + { + for (octave_idx_type j = 1; j <= i; j++) + zc -= z / (x - root[j-1]); + } - // Add interpolation points at x = 0 and/or x = 1. + z /= zc; + x -= z; + + // Famous last words: 100 iterations should be more than + // enough in all cases. - if (n0 != 0) - { - for (octave_idx_type i = n; i > 0; i--) - root[i] = root[i-1]; + if (++k > 100 || octave::math::isnan (z)) + return false; - root[0] = 0.0; - } + if (std::abs (z) <= 100 * std::numeric_limits::epsilon ()) + done = true; + } + + root[i] = x; + x += std::sqrt (std::numeric_limits::epsilon ()); + } + + // Add interpolation points at x = 0 and/or x = 1. - if (n1 != 0) - root[nt-1] = 1.0; + if (n0 != 0) + { + for (octave_idx_type i = n; i > 0; i--) + root[i] = root[i-1]; + + root[0] = 0.0; + } - dif (nt, root, dif1, dif2, dif3); + if (n1 != 0) + root[nt-1] = 1.0; - return true; -} + dif (nt, root, dif1, dif2, dif3); + + return true; + } -// Compute derivative weights for orthogonal collocation. -// -// See Villadsen and Michelsen, pages 133-134, 419. -// -// Input parameters: -// -// nd : the dimension of the vectors dif1, dif2, dif3, and root -// -// n : the degree of the jacobi polynomial, (i.e., the number -// of interior interpolation points) -// -// n0 : determines whether x = 0 is included as an -// interpolation point -// -// n0 = 0 ==> x = 0 is not included -// n0 = 1 ==> x = 0 is included -// -// n1 : determines whether x = 1 is included as an -// interpolation point -// -// n1 = 0 ==> x = 1 is not included -// n1 = 1 ==> x = 1 is included -// -// i : the index of the node for which the weights are to be -// calculated -// -// id : indicator -// -// id = 1 ==> first derivative weights are computed -// id = 2 ==> second derivative weights are computed -// id = 3 ==> gaussian weights are computed (in this -// case, the value of i is irrelevant) -// -// Output parameters: -// -// dif1 : one dimensional vector containing the first derivative -// of the node polynomial at the zeros -// -// dif2 : one dimensional vector containing the second derivative -// of the node polynomial at the zeros -// -// dif3 : one dimensional vector containing the third derivative -// of the node polynomial at the zeros -// -// vect : one dimensional vector of computed weights + // Compute derivative weights for orthogonal collocation. + // + // See Villadsen and Michelsen, pages 133-134, 419. + // + // Input parameters: + // + // nd : the dimension of the vectors dif1, dif2, dif3, and root + // + // n : the degree of the jacobi polynomial, (i.e., the number + // of interior interpolation points) + // + // n0 : determines whether x = 0 is included as an + // interpolation point + // + // n0 = 0 ==> x = 0 is not included + // n0 = 1 ==> x = 0 is included + // + // n1 : determines whether x = 1 is included as an + // interpolation point + // + // n1 = 0 ==> x = 1 is not included + // n1 = 1 ==> x = 1 is included + // + // i : the index of the node for which the weights are to be + // calculated + // + // id : indicator + // + // id = 1 ==> first derivative weights are computed + // id = 2 ==> second derivative weights are computed + // id = 3 ==> gaussian weights are computed (in this + // case, the value of i is irrelevant) + // + // Output parameters: + // + // dif1 : one dimensional vector containing the first derivative + // of the node polynomial at the zeros + // + // dif2 : one dimensional vector containing the second derivative + // of the node polynomial at the zeros + // + // dif3 : one dimensional vector containing the third derivative + // of the node polynomial at the zeros + // + // vect : one dimensional vector of computed weights + + static void dfopr (octave_idx_type n, octave_idx_type n0, octave_idx_type n1, + octave_idx_type i, octave_idx_type id, double *dif1, + double *dif2, double *dif3, double *root, double *vect) + { + assert (n0 == 0 || n0 == 1); + assert (n1 == 0 || n1 == 1); + + octave_idx_type nt = n + n0 + n1; + + assert (nt >= 1); + + assert (id == 1 || id == 2 || id == 3); -static void -dfopr (octave_idx_type n, octave_idx_type n0, octave_idx_type n1, - octave_idx_type i, octave_idx_type id, double *dif1, - double *dif2, double *dif3, double *root, double *vect) -{ - assert (n0 == 0 || n0 == 1); - assert (n1 == 0 || n1 == 1); + if (id != 3) + assert (i >= 0 && i < nt); + + // Evaluate discretization matrices and Gaussian quadrature weights. + // Quadrature weights are normalized to sum to one. + + if (id != 3) + { + for (octave_idx_type j = 0; j < nt; j++) + { + if (j == i) + { + if (id == 1) + vect[i] = dif2[i] / dif1[i] / 2.0; + else + vect[i] = dif3[i] / dif1[i] / 3.0; + } + else + { + double y = root[i] - root[j]; + + vect[j] = dif1[i] / dif1[j] / y; - octave_idx_type nt = n + n0 + n1; + if (id == 2) + vect[j] = vect[j] * (dif2[i] / dif1[i] - 2.0 / y); + } + } + } + else + { + double y = 0.0; + + for (octave_idx_type j = 0; j < nt; j++) + { + double x = root[j]; + + double ax = x * (1.0 - x); + + if (n0 == 0) + ax = ax / x / x; - assert (nt >= 1); + if (n1 == 0) + ax = ax / (1.0 - x) / (1.0 - x); + + vect[j] = ax / (dif1[j] * dif1[j]); + + y += vect[j]; + } - assert (id == 1 || id == 2 || id == 3); + for (octave_idx_type j = 0; j < nt; j++) + vect[j] = vect[j] / y; + } + } + + // Error handling. + + void CollocWt::error (const char *msg) + { + (*current_liboctave_error_handler) ("CollocWt: fatal error '%s'", msg); + } - if (id != 3) - assert (i >= 0 && i < nt); + CollocWt& CollocWt::set_left (double val) + { + if (val >= m_rb) + error ("CollocWt: left bound greater than right bound"); + + m_lb = val; + m_initialized = 0; + return *this; + } - // Evaluate discretization matrices and Gaussian quadrature weights. - // Quadrature weights are normalized to sum to one. + CollocWt& CollocWt::set_right (double val) + { + if (val <= m_lb) + error ("CollocWt: right bound less than left bound"); + + m_rb = val; + m_initialized = 0; + return *this; + } + + void CollocWt::init (void) + { + // Check for possible errors. - if (id != 3) - { - for (octave_idx_type j = 0; j < nt; j++) - { - if (j == i) - { - if (id == 1) - vect[i] = dif2[i] / dif1[i] / 2.0; - else - vect[i] = dif3[i] / dif1[i] / 3.0; - } - else - { - double y = root[i] - root[j]; + double wid = m_rb - m_lb; + if (wid <= 0.0) + { + error ("CollocWt: width less than or equal to zero"); + } + + octave_idx_type nt = m_n + m_inc_left + m_inc_right; + + if (nt < 0) + error ("CollocWt: total number of collocation points less than zero"); + else if (nt == 0) + return; + + Array dif1 (dim_vector (nt, 1)); + double *pdif1 = dif1.fortran_vec (); - vect[j] = dif1[i] / dif1[j] / y; + Array dif2 (dim_vector (nt, 1)); + double *pdif2 = dif2.fortran_vec (); + + Array dif3 (dim_vector (nt, 1)); + double *pdif3 = dif3.fortran_vec (); + + Array vect (dim_vector (nt, 1)); + double *pvect = vect.fortran_vec (); + + m_r.resize (nt, 1); + m_q.resize (nt, 1); + m_A.resize (nt, nt); + m_B.resize (nt, nt); + + double *pr = m_r.fortran_vec (); + + // Compute roots. - if (id == 2) - vect[j] = vect[j] * (dif2[i] / dif1[i] - 2.0 / y); - } - } - } - else - { - double y = 0.0; + if (! jcobi (m_n, m_inc_left, m_inc_right, m_alpha, m_beta, pdif1, + pdif2, pdif3, pr)) + error ("jcobi: newton iteration failed"); + + octave_idx_type id; + + // First derivative weights. + + id = 1; + for (octave_idx_type i = 0; i < nt; i++) + { + dfopr (m_n, m_inc_left, m_inc_right, i, id, pdif1, pdif2, pdif3, + pr, pvect); - for (octave_idx_type j = 0; j < nt; j++) - { - double x = root[j]; + for (octave_idx_type j = 0; j < nt; j++) + m_A(i,j) = vect(j); + } + + // Second derivative weights. - double ax = x * (1.0 - x); + id = 2; + for (octave_idx_type i = 0; i < nt; i++) + { + dfopr (m_n, m_inc_left, m_inc_right, i, id, pdif1, pdif2, pdif3, + pr, pvect); - if (n0 == 0) - ax = ax / x / x; + for (octave_idx_type j = 0; j < nt; j++) + m_B(i,j) = vect(j); + } - if (n1 == 0) - ax = ax / (1.0 - x) / (1.0 - x); + // Gaussian quadrature weights. + + id = 3; + double *pq = m_q.fortran_vec (); + dfopr (m_n, m_inc_left, m_inc_right, id, id, pdif1, pdif2, pdif3, pr, pq); - vect[j] = ax / (dif1[j] * dif1[j]); + m_initialized = 1; + } - y += vect[j]; - } + std::ostream& operator << (std::ostream& os, const CollocWt& a) + { + if (a.left_included ()) + os << "left boundary is included\n"; + else + os << "left boundary is not included\n"; - for (octave_idx_type j = 0; j < nt; j++) - vect[j] = vect[j] / y; - } -} + if (a.right_included ()) + os << "right boundary is included\n"; + else + os << "right boundary is not included\n"; + + os << "\n"; -// Error handling. + os << a.m_alpha << ' ' << a.m_beta << "\n\n" + << a.m_r << "\n\n" + << a.m_q << "\n\n" + << a.m_A << "\n" + << a.m_B << "\n"; -void -CollocWt::error (const char *msg) -{ - (*current_liboctave_error_handler) ("CollocWt: fatal error '%s'", msg); + return os; + } } - -CollocWt& -CollocWt::set_left (double val) -{ - if (val >= m_rb) - error ("CollocWt: left bound greater than right bound"); - - m_lb = val; - m_initialized = 0; - return *this; -} - -CollocWt& -CollocWt::set_right (double val) -{ - if (val <= m_lb) - error ("CollocWt: right bound less than left bound"); - - m_rb = val; - m_initialized = 0; - return *this; -} - -void -CollocWt::init (void) -{ - // Check for possible errors. - - double wid = m_rb - m_lb; - if (wid <= 0.0) - { - error ("CollocWt: width less than or equal to zero"); - } - - octave_idx_type nt = m_n + m_inc_left + m_inc_right; - - if (nt < 0) - error ("CollocWt: total number of collocation points less than zero"); - else if (nt == 0) - return; - - Array dif1 (dim_vector (nt, 1)); - double *pdif1 = dif1.fortran_vec (); - - Array dif2 (dim_vector (nt, 1)); - double *pdif2 = dif2.fortran_vec (); - - Array dif3 (dim_vector (nt, 1)); - double *pdif3 = dif3.fortran_vec (); - - Array vect (dim_vector (nt, 1)); - double *pvect = vect.fortran_vec (); - - m_r.resize (nt, 1); - m_q.resize (nt, 1); - m_A.resize (nt, nt); - m_B.resize (nt, nt); - - double *pr = m_r.fortran_vec (); - - // Compute roots. - - if (! jcobi (m_n, m_inc_left, m_inc_right, m_alpha, m_beta, pdif1, pdif2, pdif3, pr)) - error ("jcobi: newton iteration failed"); - - octave_idx_type id; - - // First derivative weights. - - id = 1; - for (octave_idx_type i = 0; i < nt; i++) - { - dfopr (m_n, m_inc_left, m_inc_right, i, id, pdif1, pdif2, pdif3, pr, pvect); - - for (octave_idx_type j = 0; j < nt; j++) - m_A(i,j) = vect(j); - } - - // Second derivative weights. - - id = 2; - for (octave_idx_type i = 0; i < nt; i++) - { - dfopr (m_n, m_inc_left, m_inc_right, i, id, pdif1, pdif2, pdif3, pr, pvect); - - for (octave_idx_type j = 0; j < nt; j++) - m_B(i,j) = vect(j); - } - - // Gaussian quadrature weights. - - id = 3; - double *pq = m_q.fortran_vec (); - dfopr (m_n, m_inc_left, m_inc_right, id, id, pdif1, pdif2, pdif3, pr, pq); - - m_initialized = 1; -} - -std::ostream& -operator << (std::ostream& os, const CollocWt& a) -{ - if (a.left_included ()) - os << "left boundary is included\n"; - else - os << "left boundary is not included\n"; - - if (a.right_included ()) - os << "right boundary is included\n"; - else - os << "right boundary is not included\n"; - - os << "\n"; - - os << a.m_alpha << ' ' << a.m_beta << "\n\n" - << a.m_r << "\n\n" - << a.m_q << "\n\n" - << a.m_A << "\n" - << a.m_B << "\n"; - - return os; -} diff -r e8a8ae9f512d -r 25246c1a1645 liboctave/numeric/CollocWt.h --- a/liboctave/numeric/CollocWt.h Sun May 16 09:52:37 2021 -0400 +++ b/liboctave/numeric/CollocWt.h Sun May 16 10:03:44 2021 -0400 @@ -33,153 +33,182 @@ #include "dMatrix.h" #include "dColVector.h" -class -OCTAVE_API -CollocWt +namespace octave { -public: - - CollocWt (void) - : m_n (0), m_inc_left (0), m_inc_right (0), m_lb (0.0), m_rb (1.0), - m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), - m_initialized (false) - { } - - CollocWt (octave_idx_type nc, octave_idx_type il, octave_idx_type ir) - : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (0.0), m_rb (1.0), - m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), - m_initialized (false) - { } - - CollocWt (octave_idx_type nc, octave_idx_type il, octave_idx_type ir, - double l, double rr) - : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (l), m_rb (rr), - m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), - m_initialized (false) - { } - - CollocWt (octave_idx_type nc, double a, double b, octave_idx_type il, - octave_idx_type ir) - : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (0.0), m_rb (1.0), - m_alpha (a), m_beta (b), m_r (), m_q (), m_A (), m_B (), - m_initialized (false) - { } - - CollocWt (octave_idx_type nc, double a, double b, octave_idx_type il, - octave_idx_type ir, - double ll, double rr) - : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (ll), m_rb (rr), - m_alpha (a), m_beta (b), m_r (), m_q (), m_A (), m_B (), - m_initialized (false) - { } - - CollocWt (const CollocWt& a) = default; - - CollocWt& operator = (const CollocWt& a) = default; - - ~CollocWt (void) = default; - - CollocWt& resize (octave_idx_type nc) - { - m_n = nc; - m_initialized = false; - return *this; - } - - CollocWt& add_left (void) - { - m_inc_left = 1; - m_initialized = false; - return *this; - } - - CollocWt& delete_left (void) - { - m_inc_left = 0; - m_initialized = false; - return *this; - } - - CollocWt& set_left (double val); - - CollocWt& add_right (void) + class OCTAVE_API CollocWt { - m_inc_right = 1; - m_initialized = false; - return *this; - } + public: + + CollocWt (void) + : m_n (0), m_inc_left (0), m_inc_right (0), m_lb (0.0), m_rb (1.0), + m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), + m_initialized (false) + { } + + CollocWt (octave_idx_type nc, octave_idx_type il, octave_idx_type ir) + : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (0.0), m_rb (1.0), + m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), + m_initialized (false) + { } - CollocWt& delete_right (void) - { - m_inc_right = 0; - m_initialized = false; - return *this; - } + CollocWt (octave_idx_type nc, octave_idx_type il, octave_idx_type ir, + double l, double rr) + : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (l), m_rb (rr), + m_alpha (0.0), m_beta (0.0), m_r (), m_q (), m_A (), m_B (), + m_initialized (false) + { } - CollocWt& set_right (double val); + CollocWt (octave_idx_type nc, double a, double b, octave_idx_type il, + octave_idx_type ir) + : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (0.0), m_rb (1.0), + m_alpha (a), m_beta (b), m_r (), m_q (), m_A (), m_B (), + m_initialized (false) + { } + + CollocWt (octave_idx_type nc, double a, double b, octave_idx_type il, + octave_idx_type ir, + double ll, double rr) + : m_n (nc), m_inc_left (il), m_inc_right (ir), m_lb (ll), m_rb (rr), + m_alpha (a), m_beta (b), m_r (), m_q (), m_A (), m_B (), + m_initialized (false) + { } + + CollocWt (const CollocWt& a) = default; + + CollocWt& operator = (const CollocWt& a) = default; - CollocWt& set_alpha (double val) - { - m_alpha = val; - m_initialized = false; - return *this; - } + ~CollocWt (void) = default; + + CollocWt& resize (octave_idx_type nc) + { + m_n = nc; + m_initialized = false; + return *this; + } + + CollocWt& add_left (void) + { + m_inc_left = 1; + m_initialized = false; + return *this; + } - CollocWt& set_beta (double val) - { - m_beta = val; - m_initialized = false; - return *this; - } + CollocWt& delete_left (void) + { + m_inc_left = 0; + m_initialized = false; + return *this; + } + + CollocWt& set_left (double val); - octave_idx_type ncol (void) const { return m_n; } - - octave_idx_type left_included (void) const { return m_inc_left; } - octave_idx_type right_included (void) const { return m_inc_right; } + CollocWt& add_right (void) + { + m_inc_right = 1; + m_initialized = false; + return *this; + } - double left (void) const { return m_lb; } - double right (void) const { return m_rb; } + CollocWt& delete_right (void) + { + m_inc_right = 0; + m_initialized = false; + return *this; + } - double width (void) const { return m_rb - m_lb; } + CollocWt& set_right (double val); - double alpha (void) const { return m_alpha; } - double beta (void) const { return m_beta; } + CollocWt& set_alpha (double val) + { + m_alpha = val; + m_initialized = false; + return *this; + } - ColumnVector roots (void) { if (! m_initialized) init (); return m_r; } - ColumnVector quad (void) { if (! m_initialized) init (); return m_q; } + CollocWt& set_beta (double val) + { + m_beta = val; + m_initialized = false; + return *this; + } - ColumnVector quad_weights (void) { return quad (); } + octave_idx_type ncol (void) const { return m_n; } + + octave_idx_type left_included (void) const { return m_inc_left; } + octave_idx_type right_included (void) const { return m_inc_right; } + + double left (void) const { return m_lb; } + double right (void) const { return m_rb; } - Matrix first (void) { if (! m_initialized) init (); return m_A; } + double width (void) const { return m_rb - m_lb; } + + double alpha (void) const { return m_alpha; } + double beta (void) const { return m_beta; } - Matrix second (void) { if (! m_initialized) init (); return m_B; } + ColumnVector roots (void) + { + if (! m_initialized) + init (); - friend std::ostream& operator << (std::ostream&, const CollocWt&); + return m_r; + } -protected: + ColumnVector quad (void) + { + if (! m_initialized) + init (); - octave_idx_type m_n; + return m_q; + } + + ColumnVector quad_weights (void) { return quad (); } - octave_idx_type m_inc_left; - octave_idx_type m_inc_right; + Matrix first (void) + { + if (! m_initialized) + init (); + + return m_A; + } - double m_lb; - double m_rb; + Matrix second (void) + { + if (! m_initialized) + init (); - double m_alpha; - double m_beta; + return m_B; + } + + friend std::ostream& operator << (std::ostream&, const CollocWt&); + + protected: + + octave_idx_type m_n; - ColumnVector m_r; - ColumnVector m_q; + octave_idx_type m_inc_left; + octave_idx_type m_inc_right; + + double m_lb; + double m_rb; - Matrix m_A; - Matrix m_B; + double m_alpha; + double m_beta; + + ColumnVector m_r; + ColumnVector m_q; - bool m_initialized; + Matrix m_A; + Matrix m_B; + + bool m_initialized; + + void init (void); - void init (void); + void error (const char *msg); + }; +} - void error (const char *msg); -}; +OCTAVE_DEPRECATED (7, "use 'octave::CollocWt' instead") +typedef octave::CollocWt CollocWt; #endif