/* test_nuderiv3dg.c test nuderiv3dg with max 37 points */ /* order 1 minimum independent points 4 */ /* order 2 minimum independent points 10 */ /* order 3 minimum independent points 20 */ /* order 4 minimum independent points 35 */ /* going beyond minimum points does not help much */ /* except points must be linearly independent */ /* (automatically selected from extra points) */ #include #include #include "nuderiv3dg.h" #include "inverse.h" #undef abs #define abs(x) ((x)<0.0?(-(x)):(x)) #undef max #define max(x,y) ((x)>(y)?(x):(y)) /* 1st order test case */ static double f1(double x, double y, double z) { return x + 2.0*y + 3.0*z + 4.0; } static double f1x(double x, double y, double z) /* df1/dx */ { return 1.0; } static double f1y(double x, double y, double z) /* df1/dy */ { return 2.0; } static double f1z(double x, double y, double z) /* df1/dz */ { return 3.0; } /* 2nd order test case */ static double f2(double x, double y, double z) { return x*x + 2.0*x*y + 3.0*x*z + 4.0*y*y + 5.0*y*z + 6.0*z*z + 7.0*x + 8.0*y + 9.0*z + 10.0; } static double f2x(double x, double y, double z) /* df2/dx */ { return 2.0*x + 2.0*y + 3.0*z + 7.0; } static double f2y(double x, double y, double z) { return 2.0*x + 8.0*y + 5.0*z + 8.0; } static double f2z(double x, double y, double z) { return 3.0*x + 5.0*y + 12.0*z + 9.0; } static double f2xx(double x, double y, double z) /* df2^2/dx^2 */ { return 2.0; } static double f2xy(double x, double y, double z) /* df2^2/dxdy */ { return 2.0; } static double f2xz(double x, double y, double z) { return 3.0; } static double f2yy(double x, double y, double z) { return 8.0; } static double f2yz(double x, double y, double z) { return 5.0; } static double f2zz(double x, double y, double z) { return 12.0; } /* 3rd order test case */ static double f3(double x, double y, double z) { return x*x*x + 2.0*x*x*y + 3.0*x*x*z + 4.0*x*y*y + 5.0*x*y*z + 6.0*x*z*z + 7.0*y*y*y + 8.0*y*y*z + 9.0*y*z*z + 10.0*z*z*z + 11.0*x*x + 12.0*x*y + 13.0*x*z + 14.0*y*y + 15.0*y*z + 16.0*z*z + 17.0*x + 18.0*y + 19.0*z + 20.0; } static double f3x(double x, double y, double z) { return 3.0*x*x + 4.0*x*y + 6.0*x*z + 4.0*y*y + 5.0*y*z + 6.0*z*z + 22.0*x + 12.0*y + 13.0*z + 17.0; } static double f3y(double x, double y, double z) { return 2.0*x*x + 8.0*x*y + 5.0*x*z + 21.0*y*y + 16.0*y*z + 9.0*z*z + 12.0*x + 28.0*y + 15.0*z + 18.0; } static double f3z(double x, double y, double z) { return 3.0*x*x + 5.0*x*y + 12.0*x*z + 8.0*y*y + 18.0*y*z + 30*z*z + 13.0*x + 15.0*y + 32.0*z + 19.0; } static double f3xx(double x, double y, double z) { return 6.0*x + 4.0*y + 6.0*z + 22.0; } static double f3xy(double x, double y, double z) { return 4.0*x + 8.0*y + 5.0*z + 12.0 ; } static double f3xz(double x, double y, double z) { return 6.0*x + 5.0*y + 12.0*z + 13.0; } static double f3yy(double x, double y, double z) { return 8.0*x + 42.0*y + 16.0*z + 28.0; } static double f3yz(double x, double y, double z) { return 5.0*x + 16.0*y + 18.0*z + 15.0; } static double f3zz(double x, double y, double z) { return 12.0*x + 18.0*y + 60.0*z + 32.0; } static double f3xxx(double x, double y, double z) { return 6.0; } static double f3xxy(double x, double y, double z) { return 4.0; } static double f3xxz(double x, double y, double z) { return 6.0; } static double f3xyy(double x, double y, double z) { return 8.0; } static double f3xyz(double x, double y, double z) { return 5.0; } static double f3xzz(double x, double y, double z) { return 12.0; } static double f3yyy(double x, double y, double z) { return 42.0; } static double f3yyz(double x, double y, double z) { return 16.0; } static double f3yzz(double x, double y, double z) { return 18.0; } static double f3zzz(double x, double y, double z) { return 60.0; } /* 4th order test case */ static double f4(double x, double y, double z) { return x*x*x*x + 2.0*x*x*x*y + 3.0*x*x*x*z + 4.0*x*x*y*y + 5.0*x*x*y*z + 6.0*x*x*z*z + 7.0*x*y*y*y + 8.0*x*y*y*z + 9.0*x*y*z*z + 10.0*x*z*z*z + 11.0*y*y*y*y + 12.0*y*y*y*z + 13.0*y*y*z*z + 14.0*y*z*z*z + 15.0*z*z*z*z + 16.0*x*x*x + 17.0*x*x*y + 18.0*x*x*z + 19.0*x*y*y + 20.0*x*y*z + 21.0*x*z*z + 22.0*y*y*y + 23.0*y*y*z + 24.0*y*z*z + 25.0*z*z*z + 26.0*x*x + 27.0*x*y + 28.0*x*z + 29.0*y*y + 30.0*y*z + 31.0*z*z + 32.0*x + 33.0*y + 34.0*z + 35.0; } static double f4x(double x, double y, double z) /* df4/dx */ { return 4.0*x*x*x + 6.0*x*x*y + 9.0*x*x*z + 8.0*x*y*y + 10.0*x*y*z + 12.0*x*z*z + 7.0*y*y*y + 8.0*y*y*z + 9.0*y*z*z + 10.0*z*z*z + 48.0*x*x + 34.0*x*y + 36.0*x*z + 19.0*y*y + 20.0*y*z + 21.0*z*z + 52.0*x + 27.0*y + 28.0*z + 32.0; } static double f4y(double x, double y, double z) /* df4/dx */ { return 2.0*x*x*x + 8.0*x*x*y + 5.0*x*x*z + 21.0*x*y*y + 16.0*x*y*z + 9.0*x*z*z + 44.0*y*y*y + 36.0*y*y*z + 26.0*y*z*z + 14.0*z*z*z + 17.0*x*x + 38.0*x*y + 20.0*x*z + 66.0*y*y + 46.0*y*z + 24.0*z*z + 27.0*x + 58.0*y + 30.0*z + 33.0; } static double f4z(double x, double y, double z) { return 3.0*x*x*x + 5.0*x*x*y + 12.0*x*x*z + 8.0*x*y*y + 18.0*x*y*z + 30.0*x*z*z + 12.0*y*y*y + 26.0*y*y*z + 42.0*y*z*z + 60.0*z*z*z + 18.0*x*x + 20.0*x*y + 42.0*x*z + 23.0*y*y + 48.0*y*z + 75.0*z*z + 28.0*x + 30.0*y + 62.0*z + 34.0; } static double f4xx(double x, double y, double z) /* df4/dxx */ { return 12.0*x*x + 12.0*x*y + 18.0*x*z + 8.0*y*y + 10.0*y*z + 12.0*z*z + 96.0*x + 34.0*y + 36.0*z + 52.0; } static double f4xy(double x, double y, double z) /* df4/dxy */ { return 6.0*x*x + 16.0*x*y + 10.0*x*z + 21.0*y*y + 16.0*y*z + 9.0*z*z + 34.0*x + 38.0*y + 20.0*z + 27.0; } static double f4xz(double x, double y, double z) /* df4/dxz */ { return 9.0*x*x + 10.0*x*y + 24.0*x*z + 8.0*y*y + 18.0*y*z + 30.0*z*z + 36.0*x + 20.0*y + 42.0*z + 28.0; } static double f4yy(double x, double y, double z) /* df4/dyy */ { return 8.0*x*x + 42.0*x*y + 16.0*x*z + 132.0*y*y + 72.0*y*z + 26.0*z*z + 38.0*x + 132.0*y + 46.0*z + 58.0; } static double f4yz(double x, double y, double z) /* df4/dyz */ { return 5.0*x*x + 16.0*x*y + 18.0*x*z + 36.0*y*y + 52.0*y*z + 42.0*z*z + 20.0*x + 46.0*y + 48.0*z + 30.0; } static double f4zz(double x, double y, double z) { return 12.0*x*x + 18.0*x*y + 60.0*x*z + 26.0*y*y + 84.0*y*z + 180.0*z*z + 42.0*x + 48.0*y + 150.0*z + 62.0; } static double f4xxx(double x, double y, double z) /* df4/dxxx */ { return 24.0*x + 12.0*y + 18.0*z + 96.0; } static double f4xxy(double x, double y, double z) /* df4/dxxy */ { return 12.0*x + 16.0*y + 10.0*z + 34.0; } static double f4xxz(double x, double y, double z) /* df4/dxxz */ { return 18.0*x + 10.0*y + 24.0*z + 36.0; } static double f4xyy(double x, double y, double z) /* df4/dxyy */ { return 16.0*x + 42.0*y + 16.0*z + 38.0; } static double f4xyz(double x, double y, double z) /* df4/dxyz */ { return 10.0*x + 16.0*y + 18.0*z + 20.0; } static double f4xzz(double x, double y, double z) /* df4/dxzz */ { return 24.0*x + 18.0*y + 60.0*z + 42.0; } static double f4yyy(double x, double y, double z) /* df4/dyyy */ { return 42.0*x + 264.0*y + 72.0*z + 132.0; } static double f4yyz(double x, double y, double z) /* df4/dyyz */ { return 16.0*x + 72.0*y + 52.0*z + 46.0; } static double f4yzz(double x, double y, double z) /* df4/dyzz */ { return 18.0*x + 52.0*y + 84.0*z + 48.0; } static double f4zzz(double x, double y, double z) /* df4/dzzz */ { return 60.0*x + 84.0*y + 360.0*z + 150.0; } static double f4xxxx(double x, double y, double z) /* df4/dxxxx */ { return 24.0; } static double f4xxxy(double x, double y, double z) /* df4/dxxxy */ { return 12.0; } static double f4xxxz(double x, double y, double z) /* df4/dxxxz */ { return 18.0; } static double f4xxyy(double x, double y, double z) /* df4/dxxyy */ { return 16.0; } static double f4xxyz(double x, double y, double z) /* df4/dxxyz */ { return 10.0; } static double f4xxzz(double x, double y, double z) /* df4/dxxzz */ { return 24.0; } static double f4xyyy(double x, double y, double z) /* df4/dxyyy */ { return 42.0; } static double f4xyyz(double x, double y, double z) /* df4/dxyyz */ { return 16.0; } static double f4xyzz(double x, double y, double z) /* df4/dxyzz */ { return 18.0; } static double f4xzzz(double x, double y, double z) /* df4/dxzzz */ { return 60.0; } static double f4yyyy(double x, double y, double z) /* df4/dyyyy */ { return 264.0; } static double f4yyyz(double x, double y, double z) /* df4/dyyyz */ { return 72.0; } static double f4yyzz(double x, double y, double z) /* df4/dyyzz */ { return 52.0; } static double f4yzzz(double x, double y, double z) /* df4/dyzzz */ { return 84.0; } static double f4zzzz(double x, double y, double z)/* df4/dzzzz */ { return 360.0; } int main(int argc, char *argv[]) { int i, j; int debug = 0; int n, npoint; int order; // minimum independent npoints 1, 4, 10, 20, 35 double x[38] = {0.05, 0.14, 0.27, 0.42, 0.57, 0.71, 0.86, 0.04, 0.18, 0.31, 0.43, 0.63, 0.82, 0.95, 0.07, 0.16, 0.33, 0.41, 0.59, 0.82, 0.99, 0.11, 0.21, 0.35, 0.45, 0.65, 0.75, 0.97, 0.06, 0.17, 0.32, 0.46, 0.61, 0.79, 0.83, 0.87, 0.93, 0.98}; double y[38] = {0.06, 0.05, 0.07, 0.10, 0.13, 0.15, 0.17, 0.30, 0.33, 0.36, 0.39, 0.31, 0.32, 0.37, 0.48, 0.49, 0.52, 0.51, 0.47, 0.50, 0.53, 0.65, 0.77, 0.71, 0.67, 0.67, 0.75, 0.76, 0.92, 0.97, 0.93, 0.98, 0.87, 0.91, 0.94, 0.88, 0.77, 0.65}; double z[38] = {0.07, 0.28, 0.47, 0.69, 0.91, 0.15, 0.45, 0.68, 0.93, 0.05, 0.26, 0.50, 0.97, 0.08, 0.14, 0.39, 0.65, 0.76, 0.93, 0.27, 0.56, 0.82, 0.99, 0.11, 0.33, 0.72, 0.94, 0.09, 0.22, 0.65, 0.95, 0.10, 0.24, 0.42, 0.51, 0.82, 0.93, 0.99}; double U[38]; int ip[38]; double est, actual, dx, dy, dz; double cx[38], cy[38], cz[38], cxx[38], cxy[38], cxz[38]; double cyy[38], cyz[38], czz[38], cxxx[38], cxxy[38]; double cxxz[38], cxyy[38], cxyz[38], cxzz[38], cyyy[38], cyyz[38]; double cyzz[38], czzz[38], cxxxx[38], cxxxy[38], cxxxz[38]; double cxxyy[38], cxxyz[38], cxxzz[38], cxyyy[38], cxyyz[38]; double cxyzz[38], cxzzz[38], cyyyy[38], cyyyz[38], cyyzz[38]; double cyzzz[38], czzzz[38]; double error, maxerr; int point; int m = 0; printf("test_nuderiv3dg.c running \n"); self_test(); /* nuderiv3dg.c */ n = 36; // minimum for order=4, can use 36 or 37 npoint = 6; // minimum 4 independent for order 1 for(i=0; i