public static double[] ortho2eva0(int mmax, double[] z) //****************************************************************************80 // // Purpose: // // ORTHO2EVA0 evaluates the orthonormal polynomials on the triangle. // // Licensing: // // This code is distributed under the GNU GPL license. // // Modified: // // 30 June 2014 // // Author: // // Original FORTRAN77 version by Hong Xiao, Zydrunas Gimbutas. // C++ version by John Burkardt. // // Reference: // // Hong Xiao, Zydrunas Gimbutas, // A numerical algorithm for the construction of efficient quadrature // rules in two and higher dimensions, // Computers and Mathematics with Applications, // Volume 59, 2010, pages 663-676. // // Parameters: // // Input, int MMAX, the maximum order to which the polynomials are // to be evaluated. // // Input, double Z[2], the coordinates of the evaluation point. // // Output, double ORTHO2EVA0[(mmax+1)*(mmax+2)/2], the orthogonal // polynomials evaluated at the point Z. // { int m; int npols = (mmax + 1) * (mmax + 2) / 2; double[] pols = new double[npols]; const double zero = 0.0; double sqrt3 = Math.Sqrt(3.0); const double r11 = -1.0 / 3.0; double r12 = -1.0 / sqrt3; const double r21 = -1.0 / 3.0; double r22 = 2.0 / sqrt3; double a = z[0]; double b = z[1]; // // Map the reference triangle to the right // triangle with the vertices (-1,-1), (1,-1), (-1,1) // double x = r11 + r12 * b + a; double y = r21 + r22 * b; // // Evaluate the Koornwinder's polynomials via the three term recursion. // double par1 = (2.0 * x + 1.0 + y) / 2.0; double par2 = (1.0 - y) / 2.0; double[] f1 = LegendreScaled.klegeypols(par1, par2, mmax); double[] f2 = new double[(mmax + 1) * (mmax + 1)]; for (m = 0; m <= mmax; m++) { par1 = 2 * m + 1; Jacobi.kjacopols(y, par1, zero, mmax - m, ref f2, polsIndex: +m * (mmax + 1)); } int kk = 0; for (m = 0; m <= mmax; m++) { int n; for (n = 0; n <= m; n++) { // // Evaluate the polynomial (m-n, n) // pols[kk] = f1[m - n] * f2[n + (m - n) * (mmax + 1)]; // // Normalize. // double scale = Math.Sqrt ((1 + (m - n) + n) * (1 + (m - n) + (m - n)) / sqrt3 ); pols[kk] *= scale; kk += 1; } } return(pols); }