Changeset 5808 for branches/eam_rel9_b1/psLib/src/math/psMinimize.c
- Timestamp:
- Dec 18, 2005, 8:52:55 AM (21 years ago)
- File:
-
- 1 edited
-
branches/eam_rel9_b1/psLib/src/math/psMinimize.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_rel9_b1/psLib/src/math/psMinimize.c
r5801 r5808 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1.147.4.1.2. 1$ $Name: not supported by cvs2svn $13 * @date $Date: 2005-12-1 7 20:26:29$12 * @version $Revision: 1.147.4.1.2.2 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2005-12-18 18:52:55 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 1775 1775 // XXX EAM : use temp pointers eg vB = B->data.F64 to save redirects 1776 1776 // XXX EAM : this function is only valid for data vectors of F64 1777 1777 1778 for (int k = 0; k < f->n; k++) { 1778 1779 if ((mask != NULL) && (mask->data.U8[k] && maskValue)) { … … 1792 1793 } 1793 1794 for (int i = 0; i < nTerm; i++) { 1795 if (myPoly->mask[i]) 1796 continue; 1794 1797 B->data.F64[i] += f->data.F64[k] * xSums->data.F64[i] * wt; 1795 1798 } 1796 1799 1797 1800 // we could skip half of the array and assign at the end 1798 // we must handle masked orders1801 // skip the masked orders, they get assigned (0 or 1) below 1799 1802 for (int i = 0; i < nTerm; i++) { 1803 if (myPoly->mask[i]) 1804 continue; 1800 1805 for (int j = 0; j < nTerm; j++) { 1806 if (myPoly->mask[j]) 1807 continue; 1801 1808 A->data.F64[i][j] += xSums->data.F64[i + j] * wt; 1802 1809 } 1803 1810 } 1804 1811 } 1812 1813 // set masked elements in A,B appropriately 1814 for (int i = 0; i < nTerm; i++) { 1815 if (!myPoly->mask[i]) 1816 continue; 1817 B->data.F64[i] = 0; 1818 for (int j = 0; j < nTerm; j++) { 1819 A->data.F64[i][j] = (i == j) ? 1 : 0; 1820 } 1821 } 1822 1805 1823 1806 1824 // GaussJordan version … … 1813 1831 for (int k = 0; k < nTerm; k++) { 1814 1832 myPoly->coeff[k] = B->data.F64[k]; 1833 myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]); 1815 1834 } 1816 1835 } else { … … 1825 1844 for (int k = 0; k < nTerm; k++) { 1826 1845 myPoly->coeff[k] = coeffs->data.F64[k]; 1846 // XXX EAM : LUD does not provide inverse(A) 1847 // myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]); 1827 1848 } 1828 1849 psFree(ALUD); … … 2137 2158 for (int n = 0; n < nXterm; n++) { 2138 2159 for (int m = 0; m < nYterm; m++) { 2160 if (myPoly->mask[n][m]) 2161 continue; 2139 2162 B->data.F64[n+m*nXterm] += f->data.F64[k] * Sums->data.F64[n][m] * wt; 2140 2163 } … … 2143 2166 for (int i = 0; i < nXterm; i++) { 2144 2167 for (int j = 0; j < nYterm; j++) { 2168 if (myPoly->mask[i][j]) 2169 continue; 2145 2170 for (int n = 0; n < nXterm; n++) { 2146 2171 for (int m = 0; m < nYterm; m++) { 2172 if (myPoly->mask[n][m]) 2173 continue; 2147 2174 A->data.F64[i+j*nXterm][n+m*nXterm] += Sums->data.F64[i+n][j+m] * wt; 2148 2175 } 2176 } 2177 } 2178 } 2179 } 2180 2181 for (int i = 0; i < nXterm; i++) { 2182 for (int j = 0; j < nYterm; j++) { 2183 if (!myPoly->mask[i][j]) 2184 continue; 2185 ix = i+j*nXterm; 2186 B->data.F64[ix] = 0; 2187 for (int n = 0; n < nXterm; n++) { 2188 for (int m = 0; m < nYterm; m++) { 2189 iy = n+m*nXterm; 2190 A->data.F64[ix][iy] = (ix == iy) ? 1 : 0; 2149 2191 } 2150 2192 } … … 2159 2201 for (int m = 0; m < nYterm; m++) { 2160 2202 myPoly->coeff[n][m] = B->data.F64[n+m*nXterm]; 2203 myPoly->coeffErr[n][m] = sqrt(A->data.F64[n+m*nXterm][n+m*nXterm]); 2161 2204 } 2162 2205 } … … 2619 2662 for (int iy = 0; iy < nYterm; iy++) { 2620 2663 for (int iz = 0; iz < nZterm; iz++) { 2664 if (myPoly->mask[ix][iy][iz]) 2665 continue; 2621 2666 B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm] += f->data.F64[k] * Sums[ix][iy][iz] * wt; 2622 2667 } … … 2627 2672 for (int iy = 0; iy < nYterm; iy++) { 2628 2673 for (int iz = 0; iz < nZterm; iz++) { 2674 if (myPoly->mask[ix][iy][iz]) 2675 continue; 2629 2676 for (int jx = 0; jx < nXterm; jx++) { 2630 2677 for (int jy = 0; jy < nYterm; jy++) { 2631 2678 for (int jz = 0; jz < nZterm; jz++) { 2679 if (myPoly->mask[jx][jy][jz]) 2680 continue; 2632 2681 A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm][ix+iy*nXterm+iz*nXterm*nYterm] += Sums[ix+jx][iy+jy][iz+jz] * wt; 2633 2682 } … … 2639 2688 } 2640 2689 2690 for (int ix = 0; ix < nXterm; ix++) { 2691 for (int iy = 0; iy < nYterm; iy++) { 2692 for (int iz = 0; iz < nZterm; iz++) { 2693 if (!myPoly->mask[ix][iy][iz]) 2694 continue; 2695 nx = ix+iy*nXterm+iz*nXterm*nYterm; 2696 B->data.F64[nx] = 0; 2697 for (int jx = 0; jx < nXterm; jx++) { 2698 for (int jy = 0; jy < nYterm; jy++) { 2699 for (int jz = 0; jz < nZterm; jz++) { 2700 ny = jx+jy*nXterm+jz*nXterm*nYterm; 2701 A->data.F64[nx][ny] = (nx == ny) ? 1 : 0; 2702 } 2703 } 2704 } 2705 } 2706 } 2707 } 2708 2641 2709 // does the solution in place 2642 2710 psGaussJordan (A, B); … … 2647 2715 for (int iz = 0; iz < nZterm; iz++) { 2648 2716 myPoly->coeff[ix][iy][iz] = B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm]; 2717 myPoly->coeffErr[ix][iy][iz] = sqrt(B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm][ix+iy*nXterm+iz*nXterm*nYterm]); 2649 2718 } 2650 2719 } … … 3040 3109 for (int iz = 0; iz < nZterm; iz++) { 3041 3110 for (int it = 0; it < nTterm; it++) { 3111 if (myPoly->mask[ix][iy][iz][it]) 3112 continue; 3042 3113 B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm] += f->data.F64[k] * Sums[ix][iy][iz][it] * wt; 3043 3114 } … … 3050 3121 for (int iz = 0; iz < nZterm; iz++) { 3051 3122 for (int it = 0; it < nTterm; it++) { 3123 if (myPoly->mask[ix][iy][iz][it]) 3124 continue; 3052 3125 for (int jx = 0; jx < nXterm; jx++) { 3053 3126 for (int jy = 0; jy < nYterm; jy++) { 3054 3127 for (int jz = 0; jz < nZterm; jz++) { 3055 3128 for (int jt = 0; jt < nTterm; jt++) { 3056 A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm][ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm] 3129 if (myPoly->mask[jx][jy][jz][jt]) 3130 continue; 3131 A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm][jx+jy*nXterm+jz*nXterm*nYterm+jt*nXterm*nYterm*nZterm] 3057 3132 += Sums[ix+jx][iy+jy][iz+jz][it+jt] * wt; 3058 3133 } 3134 } 3135 } 3136 } 3137 } 3138 } 3139 } 3140 } 3141 } 3142 3143 for (int ix = 0; ix < nXterm; ix++) { 3144 for (int iy = 0; iy < nYterm; iy++) { 3145 for (int iz = 0; iz < nZterm; iz++) { 3146 for (int it = 0; it < nTterm; it++) { 3147 if (!myPoly->mask[ix][iy][iz][it]) 3148 continue; 3149 nx = ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm; 3150 B->data.F64[nx] = 0; 3151 for (int jx = 0; jx < nXterm; jx++) { 3152 for (int jy = 0; jy < nYterm; jy++) { 3153 for (int jz = 0; jz < nZterm; jz++) { 3154 for (int jt = 0; jt < nTterm; jt++) { 3155 ny = jx+jy*nXterm+jz*nXterm*nYterm+jt*nXterm*nYterm*nZterm; 3156 A->data.F64[nx][ny] = (nx == ny) ? 1 : 0; 3059 3157 } 3060 3158 }
Note:
See TracChangeset
for help on using the changeset viewer.
