Changeset 4581 for trunk/psLib/src/math/psFunctions.c
- Timestamp:
- Jul 19, 2005, 3:21:13 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psFunctions.c (modified) (30 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psFunctions.c
r4580 r4581 7 7 * polynomials. It also contains a Gaussian functions. 8 8 * 9 * @version $Revision: 1. 5$ $Name: not supported by cvs2svn $10 * @date $Date: 2005-07- 19 02:55:54$9 * @version $Revision: 1.6 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2005-07-20 01:21:13 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 50 50 static void polynomial3DFree(psPolynomial3D* poly); 51 51 static void polynomial4DFree(psPolynomial4D* poly); 52 static void dPolynomial1DFree(psDPolynomial1D* poly);53 static void dPolynomial2DFree(psDPolynomial2D* poly);54 static void dPolynomial3DFree(psDPolynomial3D* poly);55 static void dPolynomial4DFree(psDPolynomial4D* poly);56 52 static void spline1DFree(psSpline1D *tmpSpline); 57 53 static psS32 vectorBinDisectF32(psF32 *bins,psS32 numBins,psF32 x); … … 166 162 } 167 163 168 static void dPolynomial1DFree(psDPolynomial1D* poly)169 {170 psFree(poly->coeff);171 psFree(poly->coeffErr);172 psFree(poly->mask);173 }174 175 static void dPolynomial2DFree(psDPolynomial2D* poly)176 {177 for (unsigned int x = 0; x < poly->nX; x++) {178 psFree(poly->coeff[x]);179 psFree(poly->coeffErr[x]);180 psFree(poly->mask[x]);181 }182 psFree(poly->coeff);183 psFree(poly->coeffErr);184 psFree(poly->mask);185 }186 187 static void dPolynomial3DFree(psDPolynomial3D* poly)188 {189 unsigned int x = 0;190 unsigned int y = 0;191 192 for (x = 0; x < poly->nX; x++) {193 for (y = 0; y < poly->nY; y++) {194 psFree(poly->coeff[x][y]);195 psFree(poly->coeffErr[x][y]);196 psFree(poly->mask[x][y]);197 }198 psFree(poly->coeff[x]);199 psFree(poly->coeffErr[x]);200 psFree(poly->mask[x]);201 }202 203 psFree(poly->coeff);204 psFree(poly->coeffErr);205 psFree(poly->mask);206 }207 208 static void dPolynomial4DFree(psDPolynomial4D* poly)209 {210 unsigned int x = 0;211 unsigned int y = 0;212 unsigned int z = 0;213 214 for (x = 0; x < poly->nX; x++) {215 for (y = 0; y < poly->nY; y++) {216 for (z = 0; z < poly->nZ; z++) {217 psFree(poly->coeff[x][y][z]);218 psFree(poly->coeffErr[x][y][z]);219 psFree(poly->mask[x][y][z]);220 }221 psFree(poly->coeff[x][y]);222 psFree(poly->coeffErr[x][y]);223 psFree(poly->mask[x][y]);224 }225 psFree(poly->coeff[x]);226 psFree(poly->coeffErr[x]);227 psFree(poly->mask[x]);228 }229 230 psFree(poly->coeff);231 psFree(poly->coeffErr);232 psFree(poly->mask);233 }234 235 164 /***************************************************************************** 236 165 createChebyshevPolys(n): this routine takes as input the required order n, … … 283 212 { 284 213 psS32 loop_x = 0; 285 psF 32polySum = 0.0;286 psF 32xSum = 1.0;214 psF64 polySum = 0.0; 215 psF64 xSum = 1.0; 287 216 288 217 psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4, 289 "---- Calling ordPolynomial1DEval(% f)\n", x);218 "---- Calling ordPolynomial1DEval(%lf)\n", x); 290 219 psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4, 291 220 "Polynomial order is %d\n", poly->n); 292 221 for (loop_x = 0; loop_x < poly->n; loop_x++) { 293 222 psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4, 294 "Polynomial coeff[%d] is % f\n", loop_x, poly->coeff[loop_x]);223 "Polynomial coeff[%d] is %lf\n", loop_x, poly->coeff[loop_x]); 295 224 } 296 225 … … 298 227 if (poly->mask[loop_x] == 0) { 299 228 psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 10, 300 "polysum+= sum*coeff [% f+= (%f * %f)\n", polySum, xSum, poly->coeff[loop_x]);229 "polysum+= sum*coeff [%lf+= (%lf * %lf)\n", polySum, xSum, poly->coeff[loop_x]); 301 230 polySum += xSum * poly->coeff[loop_x]; 302 231 } … … 312 241 static psF64 chebPolynomial1DEval(psF64 x, const psPolynomial1D* poly) 313 242 { 314 PS_ASSERT_ FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);243 PS_ASSERT_DOUBLE_WITHIN_RANGE(x, -1.0, 1.0, 0.0); 315 244 // XXX: Create a macro for this in psConstants.h 316 245 if (poly->n < 1) { … … 321 250 psS32 n = poly->n; 322 251 psS32 i; 323 psF 32tmp = 0.0;252 psF64 tmp = 0.0; 324 253 325 254 // Special case where the Chebyshev poly is constant. … … 343 272 344 273 // General case where the Chebyshev poly has 2 or more terms. 345 d = psVectorAlloc(n, PS_TYPE_F 32);274 d = psVectorAlloc(n, PS_TYPE_F64); 346 275 if(poly->mask[n-1] == 0) { 347 d->data.F 32[n-1] = poly->coeff[n-1];276 d->data.F64[n-1] = poly->coeff[n-1]; 348 277 } else { 349 d->data.F 32[n-1] = 0.0;350 } 351 352 d->data.F 32[n-2] = (2.0 * x * d->data.F32[n-1]);278 d->data.F64[n-1] = 0.0; 279 } 280 281 d->data.F64[n-2] = (2.0 * x * d->data.F64[n-1]); 353 282 if(poly->mask[n-2] == 0) { 354 d->data.F 32[n-2] += poly->coeff[n-2];283 d->data.F64[n-2] += poly->coeff[n-2]; 355 284 } 356 285 357 286 for (i=n-3;i>=1;i--) { 358 d->data.F 32[i] = (2.0 * x * d->data.F32[i+1]) -359 (d->data.F 32[i+2]);287 d->data.F64[i] = (2.0 * x * d->data.F64[i+1]) - 288 (d->data.F64[i+2]); 360 289 if(poly->mask[i] == 0) { 361 d->data.F 32[i] += poly->coeff[i];362 } 363 } 364 365 tmp = (x * d->data.F 32[1]) -366 (d->data.F 32[2]);290 d->data.F64[i] += poly->coeff[i]; 291 } 292 } 293 294 tmp = (x * d->data.F64[1]) - 295 (d->data.F64[2]); 367 296 if(poly->mask[0] == 0) { 368 297 tmp += (0.5 * poly->coeff[0]); … … 400 329 psS32 loop_x = 0; 401 330 psS32 loop_y = 0; 402 psF 32polySum = 0.0;403 psF 32xSum = 1.0;404 psF 32ySum = 1.0;331 psF64 polySum = 0.0; 332 psF64 xSum = 1.0; 333 psF64 ySum = 1.0; 405 334 406 335 for (loop_x = 0; loop_x < poly->nX; loop_x++) { … … 420 349 static psF64 chebPolynomial2DEval(psF64 x, psF64 y, const psPolynomial2D* poly) 421 350 { 422 PS_ASSERT_ FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);423 PS_ASSERT_ FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);351 PS_ASSERT_DOUBLE_WITHIN_RANGE(x, -1.0, 1.0, 0.0); 352 PS_ASSERT_DOUBLE_WITHIN_RANGE(y, -1.0, 1.0, 0.0); 424 353 PS_ASSERT_POLY_NON_NULL(poly, NAN); 425 354 … … 427 356 psS32 loop_y = 0; 428 357 psS32 i = 0; 429 psF 32polySum = 0.0;358 psF64 polySum = 0.0; 430 359 psPolynomial1D* *chebPolys = NULL; 431 360 psS32 maxChebyPoly = 0; … … 460 389 psS32 loop_y = 0; 461 390 psS32 loop_z = 0; 462 psF 32polySum = 0.0;463 psF 32xSum = 1.0;464 psF 32ySum = 1.0;465 psF 32zSum = 1.0;391 psF64 polySum = 0.0; 392 psF64 xSum = 1.0; 393 psF64 ySum = 1.0; 394 psF64 zSum = 1.0; 466 395 467 396 for (loop_x = 0; loop_x < poly->nX; loop_x++) { … … 485 414 static psF64 chebPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psPolynomial3D* poly) 486 415 { 487 PS_ASSERT_ FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);488 PS_ASSERT_ FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);489 PS_ASSERT_ FLOAT_WITHIN_RANGE(z, -1.0, 1.0, 0.0);416 PS_ASSERT_DOUBLE_WITHIN_RANGE(x, -1.0, 1.0, 0.0); 417 PS_ASSERT_DOUBLE_WITHIN_RANGE(y, -1.0, 1.0, 0.0); 418 PS_ASSERT_DOUBLE_WITHIN_RANGE(z, -1.0, 1.0, 0.0); 490 419 psS32 loop_x = 0; 491 420 psS32 loop_y = 0; 492 421 psS32 loop_z = 0; 493 422 psS32 i = 0; 494 psF 32polySum = 0.0;423 psF64 polySum = 0.0; 495 424 psPolynomial1D* *chebPolys = NULL; 496 425 psS32 maxChebyPoly = 0; … … 533 462 psS32 loop_z = 0; 534 463 psS32 loop_t = 0; 535 psF 32polySum = 0.0;536 psF 32xSum = 1.0;537 psF 32ySum = 1.0;538 psF 32zSum = 1.0;539 psF 32tSum = 1.0;464 psF64 polySum = 0.0; 465 psF64 xSum = 1.0; 466 psF64 ySum = 1.0; 467 psF64 zSum = 1.0; 468 psF64 tSum = 1.0; 540 469 541 470 for (loop_x = 0; loop_x < poly->nX; loop_x++) { … … 563 492 static psF64 chebPolynomial4DEval(psF64 x, psF64 y, psF64 z, psF64 t, const psPolynomial4D* poly) 564 493 { 565 PS_ASSERT_ FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);566 PS_ASSERT_ FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);567 PS_ASSERT_ FLOAT_WITHIN_RANGE(z, -1.0, 1.0, 0.0);568 PS_ASSERT_ FLOAT_WITHIN_RANGE(t, -1.0, 1.0, 0.0);494 PS_ASSERT_DOUBLE_WITHIN_RANGE(x, -1.0, 1.0, 0.0); 495 PS_ASSERT_DOUBLE_WITHIN_RANGE(y, -1.0, 1.0, 0.0); 496 PS_ASSERT_DOUBLE_WITHIN_RANGE(z, -1.0, 1.0, 0.0); 497 PS_ASSERT_DOUBLE_WITHIN_RANGE(t, -1.0, 1.0, 0.0); 569 498 psS32 loop_x = 0; 570 499 psS32 loop_y = 0; … … 572 501 psS32 loop_t = 0; 573 502 psS32 i = 0; 574 psF 32polySum = 0.0;503 psF64 polySum = 0.0; 575 504 psPolynomial1D* *chebPolys = NULL; 576 505 psS32 maxChebyPoly = 0; … … 612 541 return(polySum); 613 542 } 614 615 /*****************************************************************************616 Polynomial coefficients will be accessed in [w][x][y][z] fashion.617 *****************************************************************************/618 static psF64 dOrdPolynomial1DEval(psF64 x, const psDPolynomial1D* poly)619 {620 psS32 loop_x = 0;621 psF64 polySum = 0.0;622 psF64 xSum = 1.0;623 624 for (loop_x = 0; loop_x < poly->n; loop_x++) {625 if (poly->mask[loop_x] == 0) {626 polySum += xSum * poly->coeff[loop_x];627 }628 xSum *= x;629 }630 631 return(polySum);632 }633 634 // XXX: You can do this without having to psAlloc() vector d.635 // XXX: How does the mask vector effect Crenshaw's formula?636 static psF64 dChebPolynomial1DEval(psF64 x, const psDPolynomial1D* poly)637 {638 PS_ASSERT_FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);639 psVector *d;640 psS32 n;641 psS32 i;642 psF64 tmp;643 644 n = poly->n;645 d = psVectorAlloc(n, PS_TYPE_F64);646 if(poly->mask[n-1] == 0) {647 d->data.F64[n-1] = poly->coeff[n-1];648 } else {649 d->data.F64[n-1] = 0.0;650 }651 d->data.F64[n-2] = (2.0 * x * d->data.F64[n-1]);652 if(poly->mask[n-2] == 0) {653 d->data.F64[n-2] += poly->coeff[n-2];654 }655 for (i=n-3;i>=1;i--) {656 d->data.F64[i] = (2.0 * x * d->data.F64[i+1]) -657 (d->data.F64[i+2]);658 if(poly->mask[i] == 0) {659 d->data.F64[i] += poly->coeff[i];660 }661 }662 663 tmp = (x * d->data.F64[1]) -664 (d->data.F64[2]);665 if(poly->mask[0] == 0) {666 tmp += (0.5 * poly->coeff[0]);667 }668 669 psFree(d);670 return(tmp);671 }672 673 static psF64 dOrdPolynomial2DEval(psF64 x,674 psF64 y,675 const psDPolynomial2D* poly)676 {677 psS32 loop_x = 0;678 psS32 loop_y = 0;679 psF64 polySum = 0.0;680 psF64 xSum = 1.0;681 psF64 ySum = 1.0;682 683 for (loop_x = 0; loop_x < poly->nX; loop_x++) {684 ySum = xSum;685 for (loop_y = 0; loop_y < poly->nY; loop_y++) {686 if (poly->mask[loop_x][loop_y] == 0) {687 polySum += ySum * poly->coeff[loop_x][loop_y];688 }689 ySum *= y;690 }691 xSum *= x;692 }693 694 return(polySum);695 }696 697 static psF64 dChebPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* poly)698 {699 PS_ASSERT_FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);700 PS_ASSERT_FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);701 psS32 loop_x = 0;702 psS32 loop_y = 0;703 psS32 i = 0;704 psF64 polySum = 0.0;705 psPolynomial1D* *chebPolys = NULL;706 psS32 maxChebyPoly = 0;707 708 // Determine how many Chebyshev polynomials709 // are needed, then create them.710 maxChebyPoly = poly->nX;711 if (poly->nY > maxChebyPoly) {712 maxChebyPoly = poly->nY;713 }714 chebPolys = createChebyshevPolys(maxChebyPoly);715 716 for (loop_x = 0; loop_x < poly->nX; loop_x++) {717 for (loop_y = 0; loop_y < poly->nY; loop_y++) {718 if (poly->mask[loop_x][loop_y] == 0) {719 polySum += poly->coeff[loop_x][loop_y] *720 psPolynomial1DEval(chebPolys[loop_x], x) *721 psPolynomial1DEval(chebPolys[loop_y], y);722 }723 }724 }725 726 for (i=0;i<maxChebyPoly;i++) {727 psFree(chebPolys[i]);728 }729 psFree(chebPolys);730 return(polySum);731 }732 733 static psF64 dOrdPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* poly)734 {735 psS32 loop_x = 0;736 psS32 loop_y = 0;737 psS32 loop_z = 0;738 psF64 polySum = 0.0;739 psF64 xSum = 1.0;740 psF64 ySum = 1.0;741 psF64 zSum = 1.0;742 743 for (loop_x = 0; loop_x < poly->nX; loop_x++) {744 ySum = xSum;745 for (loop_y = 0; loop_y < poly->nY; loop_y++) {746 zSum = ySum;747 for (loop_z = 0; loop_z < poly->nZ; loop_z++) {748 if (poly->mask[loop_x][loop_y][loop_z] == 0) {749 polySum += zSum * poly->coeff[loop_x][loop_y][loop_z];750 }751 zSum *= z;752 }753 ySum *= y;754 }755 xSum *= x;756 }757 758 return(polySum);759 }760 761 static psF64 dChebPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* poly)762 {763 PS_ASSERT_FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);764 PS_ASSERT_FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);765 PS_ASSERT_FLOAT_WITHIN_RANGE(z, -1.0, 1.0, 0.0);766 psS32 loop_x = 0;767 psS32 loop_y = 0;768 psS32 loop_z = 0;769 psS32 i = 0;770 psF64 polySum = 0.0;771 psPolynomial1D* *chebPolys = NULL;772 psS32 maxChebyPoly = 0;773 774 // Determine how many Chebyshev polynomials775 // are needed, then create them.776 maxChebyPoly = poly->nX;777 if (poly->nY > maxChebyPoly) {778 maxChebyPoly = poly->nY;779 }780 if (poly->nZ > maxChebyPoly) {781 maxChebyPoly = poly->nZ;782 }783 chebPolys = createChebyshevPolys(maxChebyPoly);784 785 for (loop_x = 0; loop_x < poly->nX; loop_x++) {786 for (loop_y = 0; loop_y < poly->nY; loop_y++) {787 for (loop_z = 0; loop_z < poly->nZ; loop_z++) {788 if (poly->mask[loop_x][loop_y][loop_z] == 0) {789 polySum += poly->coeff[loop_x][loop_y][loop_z] *790 psPolynomial1DEval(chebPolys[loop_x], x) *791 psPolynomial1DEval(chebPolys[loop_y], y) *792 psPolynomial1DEval(chebPolys[loop_z], z);793 }794 }795 }796 }797 798 for (i=0;i<maxChebyPoly;i++) {799 psFree(chebPolys[i]);800 }801 psFree(chebPolys);802 return(polySum);803 }804 805 static psF64 dOrdPolynomial4DEval(psF64 x, psF64 y, psF64 z, psF64 t, const psDPolynomial4D* poly)806 {807 psS32 loop_x = 0;808 psS32 loop_y = 0;809 psS32 loop_z = 0;810 psS32 loop_t = 0;811 psF64 polySum = 0.0;812 psF64 xSum = 1.0;813 psF64 ySum = 1.0;814 psF64 zSum = 1.0;815 psF64 tSum = 1.0;816 817 for (loop_x = 0; loop_x < poly->nX; loop_x++) {818 ySum = xSum;819 for (loop_y = 0; loop_y < poly->nY; loop_y++) {820 zSum = ySum;821 for (loop_z = 0; loop_z < poly->nZ; loop_z++) {822 tSum = zSum;823 for (loop_t = 0; loop_t < poly->nT; loop_t++) {824 if (poly->mask[loop_x][loop_y][loop_z][loop_t] == 0) {825 polySum += tSum * poly->coeff[loop_x][loop_y][loop_z][loop_t];826 }827 tSum *= t;828 }829 zSum *= z;830 }831 ySum *= y;832 }833 xSum *= x;834 }835 836 return(polySum);837 }838 839 static psF64 dChebPolynomial4DEval(psF64 x, psF64 y, psF64 z, psF64 t, const psDPolynomial4D* poly)840 {841 PS_ASSERT_FLOAT_WITHIN_RANGE(x, -1.0, 1.0, 0.0);842 PS_ASSERT_FLOAT_WITHIN_RANGE(y, -1.0, 1.0, 0.0);843 PS_ASSERT_FLOAT_WITHIN_RANGE(z, -1.0, 1.0, 0.0);844 PS_ASSERT_FLOAT_WITHIN_RANGE(t, -1.0, 1.0, 0.0);845 psS32 loop_x = 0;846 psS32 loop_y = 0;847 psS32 loop_z = 0;848 psS32 loop_t = 0;849 psS32 i = 0;850 psF64 polySum = 0.0;851 psPolynomial1D* *chebPolys = NULL;852 psS32 maxChebyPoly = 0;853 854 // Determine how many Chebyshev polynomials855 // are needed, then create them.856 maxChebyPoly = poly->nX;857 if (poly->nY > maxChebyPoly) {858 maxChebyPoly = poly->nY;859 }860 if (poly->nZ > maxChebyPoly) {861 maxChebyPoly = poly->nZ;862 }863 if (poly->nT > maxChebyPoly) {864 maxChebyPoly = poly->nT;865 }866 chebPolys = createChebyshevPolys(maxChebyPoly);867 868 for (loop_x = 0; loop_x < poly->nX; loop_x++) {869 for (loop_y = 0; loop_y < poly->nY; loop_y++) {870 for (loop_z = 0; loop_z < poly->nZ; loop_z++) {871 for (loop_t = 0; loop_t < poly->nT; loop_t++) {872 if (poly->mask[loop_x][loop_y][loop_z][loop_t] == 0) {873 polySum += poly->coeff[loop_x][loop_y][loop_z][loop_t] *874 psPolynomial1DEval(chebPolys[loop_x], x) *875 psPolynomial1DEval(chebPolys[loop_y], y) *876 psPolynomial1DEval(chebPolys[loop_z], z) *877 psPolynomial1DEval(chebPolys[loop_t], t);878 }879 }880 }881 }882 }883 884 for (i=0;i<maxChebyPoly;i++) {885 psFree(chebPolys[i]);886 }887 psFree(chebPolys);888 return(polySum);889 }890 891 543 892 544 /***************************************************************************** … … 1082 734 newPoly->type = type; 1083 735 newPoly->n = n; 1084 newPoly->coeff = (psF32 *)psAlloc(n * sizeof(psF32));1085 newPoly->coeffErr = (psF32 *)psAlloc(n * sizeof(psF32));736 newPoly->coeff = psAlloc(n * sizeof(psF64)); 737 newPoly->coeffErr = psAlloc(n * sizeof(psF64)); 1086 738 newPoly->mask = (char *)psAlloc(n * sizeof(char)); 1087 739 for (i = 0; i < n; i++) { … … 1111 763 newPoly->nY = nY; 1112 764 1113 newPoly->coeff = (psF32 **)psAlloc(nX * sizeof(psF32*));1114 newPoly->coeffErr = (psF32 **)psAlloc(nX * sizeof(psF32*));765 newPoly->coeff = psAlloc(nX * sizeof(psF64 *)); 766 newPoly->coeffErr = psAlloc(nX * sizeof(psF64 *)); 1115 767 newPoly->mask = (char **)psAlloc(nX * sizeof(char *)); 1116 768 for (x = 0; x < nX; x++) { 1117 newPoly->coeff[x] = (psF32 *)psAlloc(nY * sizeof(psF32));1118 newPoly->coeffErr[x] = (psF32 *)psAlloc(nY * sizeof(psF32));769 newPoly->coeff[x] = psAlloc(nY * sizeof(psF64)); 770 newPoly->coeffErr[x] = psAlloc(nY * sizeof(psF64)); 1119 771 newPoly->mask[x] = (char *)psAlloc(nY * sizeof(char)); 1120 772 } … … 1150 802 newPoly->nZ = nZ; 1151 803 1152 newPoly->coeff = (psF32 ***)psAlloc(nX * sizeof(psF32**));1153 newPoly->coeffErr = (psF32 ***)psAlloc(nX * sizeof(psF32**));804 newPoly->coeff = psAlloc(nX * sizeof(psF64 **)); 805 newPoly->coeffErr = psAlloc(nX * sizeof(psF64 **)); 1154 806 newPoly->mask = (char ***)psAlloc(nX * sizeof(char **)); 1155 807 for (x = 0; x < nX; x++) { 1156 newPoly->coeff[x] = (psF32 **)psAlloc(nY * sizeof(psF32*));1157 newPoly->coeffErr[x] = (psF32 **)psAlloc(nY * sizeof(psF32*));808 newPoly->coeff[x] = psAlloc(nY * sizeof(psF64 *)); 809 newPoly->coeffErr[x] = psAlloc(nY * sizeof(psF64 *)); 1158 810 newPoly->mask[x] = (char **)psAlloc(nY * sizeof(char *)); 1159 811 for (y = 0; y < nY; y++) { 1160 newPoly->coeff[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));1161 newPoly->coeffErr[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));812 newPoly->coeff[x][y] = psAlloc(nZ * sizeof(psF64)); 813 newPoly->coeffErr[x][y] = psAlloc(nZ * sizeof(psF64)); 1162 814 newPoly->mask[x][y] = (char *)psAlloc(nZ * sizeof(char)); 1163 815 } … … 1199 851 newPoly->nT = nT; 1200 852 1201 newPoly->coeff = (psF32 ****)psAlloc(nX * sizeof(psF32***));1202 newPoly->coeffErr = (psF32 ****)psAlloc(nX * sizeof(psF32***));853 newPoly->coeff = psAlloc(nX * sizeof(psF64 ***)); 854 newPoly->coeffErr = psAlloc(nX * sizeof(psF64 ***)); 1203 855 newPoly->mask = (char ****)psAlloc(nX * sizeof(char ***)); 1204 856 for (x = 0; x < nX; x++) { 1205 newPoly->coeff[x] = (psF32 ***)psAlloc(nY * sizeof(psF32**));1206 newPoly->coeffErr[x] = (psF32 ***)psAlloc(nY * sizeof(psF32**));857 newPoly->coeff[x] = psAlloc(nY * sizeof(psF64 **)); 858 newPoly->coeffErr[x] = psAlloc(nY * sizeof(psF64 **)); 1207 859 newPoly->mask[x] = (char ***)psAlloc(nY * sizeof(char **)); 1208 860 for (y = 0; y < nY; y++) { 1209 newPoly->coeff[x][y] = (psF32 **)psAlloc(nZ * sizeof(psF32*));1210 newPoly->coeffErr[x][y] = (psF32 **)psAlloc(nZ * sizeof(psF32*));861 newPoly->coeff[x][y] = psAlloc(nZ * sizeof(psF64 *)); 862 newPoly->coeffErr[x][y] = psAlloc(nZ * sizeof(psF64 *)); 1211 863 newPoly->mask[x][y] = (char **)psAlloc(nZ * sizeof(char *)); 1212 864 for (z = 0; z < nZ; z++) { 1213 newPoly->coeff[x][y][z] = (psF32 *)psAlloc(nT * sizeof(psF32));1214 newPoly->coeffErr[x][y][z] = (psF32 *)psAlloc(nT * sizeof(psF32));865 newPoly->coeff[x][y][z] = psAlloc(nT * sizeof(psF64)); 866 newPoly->coeffErr[x][y][z] = psAlloc(nT * sizeof(psF64)); 1215 867 newPoly->mask[x][y][z] = (char *)psAlloc(nT * sizeof(char)); 1216 868 } … … 1253 905 PS_ASSERT_POLY_NON_NULL(poly, NULL); 1254 906 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 1255 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F 32, NULL);907 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL); 1256 908 1257 909 psVector *tmp; 1258 910 1259 tmp = psVectorAlloc(x->n, PS_TYPE_F 32);911 tmp = psVectorAlloc(x->n, PS_TYPE_F64); 1260 912 for (psS32 i=0;i<x->n;i++) { 1261 tmp->data.F 32[i] = psPolynomial1DEval(poly, x->data.F32[i]);913 tmp->data.F64[i] = psPolynomial1DEval(poly, x->data.F64[i]); 1262 914 } 1263 915 … … 1288 940 PS_ASSERT_POLY_NON_NULL(poly, NULL); 1289 941 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 1290 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F 32, NULL);942 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL); 1291 943 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 1292 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F 32, NULL);944 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F64, NULL); 1293 945 1294 946 psVector *tmp; … … 1301 953 1302 954 // Create output vector to return 1303 tmp = psVectorAlloc(vecLen, PS_TYPE_F 32);955 tmp = psVectorAlloc(vecLen, PS_TYPE_F64); 1304 956 1305 957 // Evaluate the polynomial at the specified points 1306 958 for (psS32 i=0; i<vecLen; i++) { 1307 tmp->data.F 32[i] = psPolynomial2DEval(poly,x->data.F32[i],y->data.F32[i]);959 tmp->data.F64[i] = psPolynomial2DEval(poly,x->data.F64[i],y->data.F64[i]); 1308 960 } 1309 961 … … 1336 988 PS_ASSERT_POLY_NON_NULL(poly, NULL); 1337 989 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 1338 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F 32, NULL);990 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL); 1339 991 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 1340 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F 32, NULL);992 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F64, NULL); 1341 993 PS_ASSERT_VECTOR_NON_NULL(z, NULL); 1342 PS_ASSERT_VECTOR_TYPE(z, PS_TYPE_F 32, NULL);994 PS_ASSERT_VECTOR_TYPE(z, PS_TYPE_F64, NULL); 1343 995 1344 996 psVector *tmp; … … 1354 1006 1355 1007 // Allocate output vector 1356 tmp = psVectorAlloc(vecLen, PS_TYPE_F 32);1008 tmp = psVectorAlloc(vecLen, PS_TYPE_F64); 1357 1009 1358 1010 // Evaluate polynomial 1359 1011 for (psS32 i = 0; i < vecLen; i++) { 1360 tmp->data.F 32[i] = psPolynomial3DEval(poly,1361 x->data.F 32[i],1362 y->data.F 32[i],1363 z->data.F 32[i]);1012 tmp->data.F64[i] = psPolynomial3DEval(poly, 1013 x->data.F64[i], 1014 y->data.F64[i], 1015 z->data.F64[i]); 1364 1016 } 1365 1017 … … 1389 1041 const psVector *z, 1390 1042 const psVector *t) 1391 {1392 PS_ASSERT_POLY_NON_NULL(poly, NULL);1393 PS_ASSERT_VECTOR_NON_NULL(x, NULL);1394 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL);1395 PS_ASSERT_VECTOR_NON_NULL(y, NULL);1396 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL);1397 PS_ASSERT_VECTOR_NON_NULL(z, NULL);1398 PS_ASSERT_VECTOR_TYPE(z, PS_TYPE_F32, NULL);1399 PS_ASSERT_VECTOR_NON_NULL(t, NULL);1400 PS_ASSERT_VECTOR_TYPE(t, PS_TYPE_F32, NULL);1401 1402 psVector *tmp;1403 psS32 vecLen=x->n;1404 1405 // Determine output vector size from min of input vectors1406 if (z->n < vecLen) {1407 vecLen = z->n;1408 }1409 if (y->n < vecLen) {1410 vecLen = y->n;1411 }1412 if (t->n < vecLen) {1413 vecLen = t->n;1414 }1415 1416 // Allocate output vector1417 tmp = psVectorAlloc(vecLen, PS_TYPE_F32);1418 1419 // Evaluate polynomial1420 for (psS32 i = 0; i < vecLen; i++) {1421 tmp->data.F32[i] = psPolynomial4DEval(poly,1422 x->data.F32[i],1423 y->data.F32[i],1424 z->data.F32[i],1425 t->data.F32[i]);1426 }1427 1428 // Return output vector1429 return(tmp);1430 }1431 1432 1433 psDPolynomial1D* psDPolynomial1DAlloc( int n,1434 psPolynomialType type)1435 {1436 PS_ASSERT_INT_POSITIVE(n, NULL);1437 1438 unsigned int i = 0;1439 psDPolynomial1D* newPoly = NULL;1440 1441 newPoly = (psDPolynomial1D* ) psAlloc(sizeof(psDPolynomial1D));1442 psMemSetDeallocator(newPoly, (psFreeFunc) dPolynomial1DFree);1443 1444 newPoly->type = type;1445 newPoly->n = n;1446 newPoly->coeff = (psF64 *)psAlloc(n * sizeof(psF64));1447 newPoly->coeffErr = (psF64 *)psAlloc(n * sizeof(psF64));1448 newPoly->mask = (char *)psAlloc(n * sizeof(char));1449 for (i = 0; i < n; i++) {1450 newPoly->coeff[i] = 0.0;1451 newPoly->coeffErr[i] = 0.0;1452 newPoly->mask[i] = 0;1453 }1454 1455 return(newPoly);1456 }1457 1458 psDPolynomial2D* psDPolynomial2DAlloc( int nX, int nY,1459 psPolynomialType type)1460 {1461 PS_ASSERT_INT_POSITIVE(nX, NULL);1462 PS_ASSERT_INT_POSITIVE(nY, NULL);1463 1464 unsigned int x = 0;1465 unsigned int y = 0;1466 psDPolynomial2D* newPoly = NULL;1467 1468 newPoly = (psDPolynomial2D* ) psAlloc(sizeof(psDPolynomial2D));1469 psMemSetDeallocator(newPoly, (psFreeFunc) dPolynomial2DFree);1470 1471 newPoly->type = type;1472 newPoly->nX = nX;1473 newPoly->nY = nY;1474 1475 newPoly->coeff = (psF64 **)psAlloc(nX * sizeof(psF64 *));1476 newPoly->coeffErr = (psF64 **)psAlloc(nX * sizeof(psF64 *));1477 newPoly->mask = (char **)psAlloc(nX * sizeof(char *));1478 for (x = 0; x < nX; x++) {1479 newPoly->coeff[x] = (psF64 *)psAlloc(nY * sizeof(psF64));1480 newPoly->coeffErr[x] = (psF64 *)psAlloc(nY * sizeof(psF64));1481 newPoly->mask[x] = (char *)psAlloc(nY * sizeof(char));1482 }1483 for (x = 0; x < nX; x++) {1484 for (y = 0; y < nY; y++) {1485 newPoly->coeff[x][y] = 0.0;1486 newPoly->coeffErr[x][y] = 0.0;1487 newPoly->mask[x][y] = 0;1488 }1489 }1490 1491 return(newPoly);1492 }1493 1494 psDPolynomial3D* psDPolynomial3DAlloc( int nX, int nY, int nZ,1495 psPolynomialType type)1496 {1497 PS_ASSERT_INT_POSITIVE(nX, NULL);1498 PS_ASSERT_INT_POSITIVE(nY, NULL);1499 PS_ASSERT_INT_POSITIVE(nZ, NULL);1500 1501 unsigned int x = 0;1502 unsigned int y = 0;1503 unsigned int z = 0;1504 psDPolynomial3D* newPoly = NULL;1505 1506 newPoly = (psDPolynomial3D* ) psAlloc(sizeof(psDPolynomial3D));1507 psMemSetDeallocator(newPoly, (psFreeFunc) dPolynomial3DFree);1508 1509 newPoly->type = type;1510 newPoly->nX = nX;1511 newPoly->nY = nY;1512 newPoly->nZ = nZ;1513 1514 newPoly->coeff = (psF64 ***)psAlloc(nX * sizeof(psF64 **));1515 newPoly->coeffErr = (psF64 ***)psAlloc(nX * sizeof(psF64 **));1516 newPoly->mask = (char ***)psAlloc(nX * sizeof(char **));1517 for (x = 0; x < nX; x++) {1518 newPoly->coeff[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));1519 newPoly->coeffErr[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));1520 newPoly->mask[x] = (char **)psAlloc(nY * sizeof(char *));1521 for (y = 0; y < nY; y++) {1522 newPoly->coeff[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));1523 newPoly->coeffErr[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));1524 newPoly->mask[x][y] = (char *)psAlloc(nZ * sizeof(char));1525 }1526 }1527 for (x = 0; x < nX; x++) {1528 for (y = 0; y < nY; y++) {1529 for (z = 0; z < nZ; z++) {1530 newPoly->coeff[x][y][z] = 0.0;1531 newPoly->coeffErr[x][y][z] = 0.0;1532 newPoly->mask[x][y][z] = 0;1533 }1534 }1535 }1536 1537 return(newPoly);1538 }1539 1540 psDPolynomial4D* psDPolynomial4DAlloc( int nX, int nY, int nZ, int nT,1541 psPolynomialType type)1542 {1543 PS_ASSERT_INT_POSITIVE(nX, NULL);1544 PS_ASSERT_INT_POSITIVE(nY, NULL);1545 PS_ASSERT_INT_POSITIVE(nZ, NULL);1546 PS_ASSERT_INT_POSITIVE(nT, NULL);1547 1548 unsigned int x = 0;1549 unsigned int y = 0;1550 unsigned int z = 0;1551 unsigned int t = 0;1552 psDPolynomial4D* newPoly = NULL;1553 1554 newPoly = (psDPolynomial4D* ) psAlloc(sizeof(psDPolynomial4D));1555 psMemSetDeallocator(newPoly, (psFreeFunc) dPolynomial4DFree);1556 1557 newPoly->type = type;1558 newPoly->nX = nX;1559 newPoly->nY = nY;1560 newPoly->nZ = nZ;1561 newPoly->nT = nT;1562 1563 newPoly->coeff = (psF64 ****)psAlloc(nX * sizeof(psF64 ***));1564 newPoly->coeffErr = (psF64 ****)psAlloc(nX * sizeof(psF64 ***));1565 newPoly->mask = (char ****)psAlloc(nX * sizeof(char ***));1566 for (x = 0; x < nX; x++) {1567 newPoly->coeff[x] = (psF64 ***)psAlloc(nY * sizeof(psF64 **));1568 newPoly->coeffErr[x] = (psF64 ***)psAlloc(nY * sizeof(psF64 **));1569 newPoly->mask[x] = (char ***)psAlloc(nY * sizeof(char **));1570 for (y = 0; y < nY; y++) {1571 newPoly->coeff[x][y] = (psF64 **)psAlloc(nZ * sizeof(psF64 *));1572 newPoly->coeffErr[x][y] = (psF64 **)psAlloc(nZ * sizeof(psF64 *));1573 newPoly->mask[x][y] = (char **)psAlloc(nZ * sizeof(char *));1574 for (z = 0; z < nZ; z++) {1575 newPoly->coeff[x][y][z] = (psF64 *)psAlloc(nT * sizeof(psF64));1576 newPoly->coeffErr[x][y][z] = (psF64 *)psAlloc(nT * sizeof(psF64));1577 newPoly->mask[x][y][z] = (char *)psAlloc(nT * sizeof(char));1578 }1579 }1580 }1581 for (x = 0; x < nX; x++) {1582 for (y = 0; y < nY; y++) {1583 for (z = 0; z < nZ; z++) {1584 for (t = 0; t < nT; t++) {1585 newPoly->coeff[x][y][z][t] = 0.0;1586 newPoly->coeffErr[x][y][z][t] = 0.0;1587 newPoly->mask[x][y][z][t] = 0;1588 }1589 }1590 }1591 }1592 1593 return(newPoly);1594 }1595 1596 1597 psF64 psDPolynomial1DEval(const psDPolynomial1D* poly, psF64 x)1598 {1599 PS_ASSERT_POLY_NON_NULL(poly, NAN);1600 1601 if (poly->type == PS_POLYNOMIAL_ORD) {1602 return(dOrdPolynomial1DEval(x, poly));1603 } else if (poly->type == PS_POLYNOMIAL_CHEB) {1604 return(dChebPolynomial1DEval(x, poly));1605 } else {1606 psError(PS_ERR_BAD_PARAMETER_TYPE, true,1607 PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,1608 poly->type);1609 }1610 return(NAN);1611 }1612 1613 psVector *psDPolynomial1DEvalVector(const psDPolynomial1D *poly,1614 const psVector *x)1615 1616 {1617 PS_ASSERT_POLY_NON_NULL(poly, NULL);1618 PS_ASSERT_VECTOR_NON_NULL(x, NULL);1619 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL);1620 1621 psVector *tmp;1622 1623 tmp = psVectorAlloc(x->n, PS_TYPE_F64);1624 for (psS32 i=0;i<x->n;i++) {1625 tmp->data.F64[i] = psDPolynomial1DEval(poly,1626 x->data.F64[i]);1627 }1628 1629 return(tmp);1630 }1631 1632 1633 psF64 psDPolynomial2DEval(const psDPolynomial2D* poly,1634 psF64 x,1635 psF64 y)1636 {1637 PS_ASSERT_POLY_NON_NULL(poly, NAN);1638 if (poly->type == PS_POLYNOMIAL_ORD) {1639 return(dOrdPolynomial2DEval(x, y, poly));1640 } else if (poly->type == PS_POLYNOMIAL_CHEB) {1641 return(dChebPolynomial2DEval(x, y, poly));1642 } else {1643 psError(PS_ERR_BAD_PARAMETER_TYPE, true,1644 PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,1645 poly->type);1646 }1647 return(NAN);1648 }1649 1650 psVector *psDPolynomial2DEvalVector(const psDPolynomial2D *poly,1651 const psVector *x,1652 const psVector *y)1653 {1654 PS_ASSERT_POLY_NON_NULL(poly, NULL);1655 PS_ASSERT_VECTOR_NON_NULL(x, NULL);1656 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL);1657 PS_ASSERT_VECTOR_NON_NULL(y, NULL);1658 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F64, NULL);1659 1660 psVector *tmp;1661 psS32 vecLen=x->n;1662 1663 // Determine the output vector length from minimum length of input vectors1664 if (y->n < vecLen) {1665 vecLen = y->n;1666 }1667 1668 // Allocate output vector1669 tmp = psVectorAlloc(vecLen, PS_TYPE_F64);1670 1671 // Evaluate the polynomial1672 for (psS32 i = 0; i < vecLen; i++) {1673 tmp->data.F64[i] = psDPolynomial2DEval(poly,x->data.F64[i],y->data.F64[i]);1674 }1675 1676 // Return output vector1677 return(tmp);1678 }1679 1680 1681 psF64 psDPolynomial3DEval(const psDPolynomial3D* poly,1682 psF64 x,1683 psF64 y,1684 psF64 z)1685 {1686 PS_ASSERT_POLY_NON_NULL(poly, NAN);1687 1688 if (poly->type == PS_POLYNOMIAL_ORD) {1689 return(dOrdPolynomial3DEval(x, y, z, poly));1690 } else if (poly->type == PS_POLYNOMIAL_CHEB) {1691 return(dChebPolynomial3DEval(x, y, z, poly));1692 } else {1693 psError(PS_ERR_BAD_PARAMETER_TYPE, true,1694 PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,1695 poly->type);1696 }1697 return(NAN);1698 }1699 1700 psVector *psDPolynomial3DEvalVector(const psDPolynomial3D *poly,1701 const psVector *x,1702 const psVector *y,1703 const psVector *z)1704 1705 {1706 PS_ASSERT_POLY_NON_NULL(poly, NULL);1707 PS_ASSERT_VECTOR_NON_NULL(x, NULL);1708 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F64, NULL);1709 PS_ASSERT_VECTOR_NON_NULL(y, NULL);1710 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F64, NULL);1711 PS_ASSERT_VECTOR_NON_NULL(z, NULL);1712 PS_ASSERT_VECTOR_TYPE(z, PS_TYPE_F64, NULL);1713 1714 psVector *tmp;1715 psS32 vecLen=x->n;1716 1717 // Determine the size of output vector from min of input vectors1718 if (y->n < vecLen) {1719 vecLen = y->n;1720 }1721 if (z->n < vecLen) {1722 vecLen = z->n;1723 }1724 1725 // Allocate output vector1726 tmp = psVectorAlloc(vecLen, PS_TYPE_F64);1727 1728 // Evaluate polynomial1729 for (psS32 i = 0; i < vecLen; i++) {1730 tmp->data.F64[i] = psDPolynomial3DEval(poly,1731 x->data.F64[i],1732 y->data.F64[i],1733 z->data.F64[i]);1734 }1735 1736 // Return output vector1737 return(tmp);1738 }1739 1740 psF64 psDPolynomial4DEval(const psDPolynomial4D* poly,1741 psF64 x,1742 psF64 y,1743 psF64 z,1744 psF64 t)1745 {1746 PS_ASSERT_POLY_NON_NULL(poly, NAN);1747 1748 if (poly->type == PS_POLYNOMIAL_ORD) {1749 return(dOrdPolynomial4DEval(x,y,z,t, poly));1750 } else if (poly->type == PS_POLYNOMIAL_CHEB) {1751 return(dChebPolynomial4DEval(x,y,z,t, poly));1752 } else {1753 psError(PS_ERR_BAD_PARAMETER_TYPE, true,1754 PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,1755 poly->type);1756 }1757 return(NAN);1758 }1759 1760 psVector *psDPolynomial4DEvalVector(const psDPolynomial4D *poly,1761 const psVector *x,1762 const psVector *y,1763 const psVector *z,1764 const psVector *t)1765 1043 { 1766 1044 PS_ASSERT_POLY_NON_NULL(poly, NULL); … … 1777 1055 psS32 vecLen=x->n; 1778 1056 1779 // Determine theoutput vector size from min of input vectors1057 // Determine output vector size from min of input vectors 1780 1058 if (z->n < vecLen) { 1781 1059 vecLen = z->n; … … 1791 1069 tmp = psVectorAlloc(vecLen, PS_TYPE_F64); 1792 1070 1793 // Evaluate thepolynomial1071 // Evaluate polynomial 1794 1072 for (psS32 i = 0; i < vecLen; i++) { 1795 tmp->data.F64[i] = ps DPolynomial4DEval(poly,1796 x->data.F64[i],1797 y->data.F64[i],1798 z->data.F64[i],1799 t->data.F64[i]);1073 tmp->data.F64[i] = psPolynomial4DEval(poly, 1074 x->data.F64[i], 1075 y->data.F64[i], 1076 z->data.F64[i], 1077 t->data.F64[i]); 1800 1078 } 1801 1079 … … 1803 1081 return(tmp); 1804 1082 } 1805 1806 1807 1808 1083 1809 1084 //typedef struct {
Note:
See TracChangeset
for help on using the changeset viewer.
