// triquad.java compute integration coordinates and weights for order 1..6 // Gauss Legendre over triangle // 1 <= n <=6 at this time // nn returned is n*n // integral = sum i=0 to nn-1 W[i]*f(X[i],Y[i]) public class triquad { triquad() { System.out.println("triquad ready for integration over triangles"); test(); // may be commented out, or just do not instantiate } public static int tint(int n, double T[], double X[], double Y[], double W[]) { switch(n) { case 1: return int1(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); case 2: return int2(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); case 3: return int3(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); case 4: return int4(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); case 5: return int5(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); case 6: return int6(T[0], T[1], T[2], T[3], T[4], T[5], X, Y, W); default: return 0; } } static int int1(double x1, double y1, double x2, double y2, double x3, double y3, double X[], double Y[], double W[]) { int nn; double a, area; // data for vertices = [0 0; 0 1; 1 0] final double tq[][] = { {0.333333333333333, 0.333333333333333, 1.000000000000000 }}; a = x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3; area = Math.abs(a)/2.0; nn = 1; for(int i=0; i1.0e-12) System.out.println("BAD triquad order 1, sum="+sum+" not 2.0"); nv = tint(2, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-12) System.out.println("BAD triquad order 2, sum="+sum+" not "+(59.0/12.0)); nv = tint(3, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-12) System.out.println("BAD triquad order 3, sum="+sum+" not "+(113.0/12.0)); nv = tint(4, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-11) System.out.println("BAD triquad order 4, sum="+sum+ " not "+(1867.0/120.0)); nv = tint(5, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-10) System.out.println("BAD triquad order 5, sum="+sum+ " not "+(2803.0/120.0)); nv = tint(6, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-10) System.out.println("BAD triquad order 6, sum="+sum+ " not "+(82703.0/2520.0)); T[0] = 2.0; T[1] = 3.0; // obtuse T[2] = 2.0; T[3] = 0.0; T[4] = 1.0; T[5] = 2.0; nv = tint(1, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-12) System.out.println("BAD triquad b order 1, sum="+sum+ " not "+(12.0)); nv = tint(2, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-12) System.out.println("BAD triquad b order 2, sum="+sum+ " not "+(233.0/12.0)); nv = tint(3, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-11) System.out.println("BAD triquad b order 3, sum="+sum+ " not "+(4411.0/20.0)); nv = tint(4, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-11) System.out.println("BAD triquad b order 4, sum="+sum+ " not "+(29003.0/40.0)); nv = tint(5, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-10) System.out.println("BAD triquad b order 5, sum="+sum+ " not "+(613741.0/280.0)); nv = tint(6, T, X, Y, W); sum=0.0; for(int i=0; i1.0e-9) System.out.println("BAD triquad b order 6, sum="+sum+ " not "+(252141.0/40.0)); } // end test double f1(double x, double y) { return x+2.0*y+3.0; } double f2(double x, double y) { return x*x+2.0*x*y+3.0*y*y+4.0*x+5.0*y+6.0; } double f3(double x, double y) { return x*x*x+2.0*x*x*y+3.0*x*y*y+4.0*y*y*y+ 5.0*x*x+6.0*x*y+7.0*y*y+8.0*x+9.0*y+10.0; } double f4(double x, double y) { return x*x*x*x+2.0*x*x*x*y+3.0*x*x*y*y+4.0*x*y*y*y+5.0*y*y*y*y+ 6.0*x*x*x+7.0*x*x*y+8.0*x*y*y+9.0*y*y*y+ 10.0*x*x+11.0*x*y+12.0*y*y+13.0*x+14.0*y+15.0; } double f5(double x, double y) { return x*x*x*x*x+2.0*x*x*x*x*y+3.0*x*x*x*y*y+4.0*x*x*y*y*y+ 5.0*x*y*y*y*y+6.0*y*y*y*y*y+ 7.0*x*x*x*x+8.0*x*x*x*y+9.0*x*x*y*y+10.0*x*y*y*y+11.0*y*y*y*y+ 12.0*x*x*x+13.0*x*x*y+14.0*x*y*y+15.0*y*y*y+ 16.0*x*x+17.0*x*y+18.0*y*y+19.0*x+20.0*y+21.0; } double f6(double x, double y) { return x*x*x*x*x*x+2.0*x*x*x*x*x*y+3.0*x*x*x*x*y*y+4.0*x*x*x*y*y*y+ 5.0*x*x*y*y*y*y+6.0*x*y*y*y*y*y+7.0*y*y*y*y*y*y+ 8.0*x*x*x*x*x+9.0*x*x*x*x*y+10.0*x*x*x*y*y+11.0*x*x*y*y*y+ 12.0*x*y*y*y*y+13.0*y*y*y*y*y+ 14.0*x*x*x*x+15.0*x*x*x*y+16.0*x*x*y*y+17.0*x*y*y*y+18.0*y*y*y*y+ 19.0*x*x*x+20.0*x*x*y+21.0*x*y*y+22.0*y*y*y+ 23.0*x*x+24.0*x*y+25.0*y*y+26.0*x+27.0*y+28.0; } } // end class triquad