Changeset 37632
- Timestamp:
- Nov 19, 2014, 6:46:03 AM (12 years ago)
- Location:
- branches/eam_branches/ipp-20140904/Ohana/src
- Files:
-
- 3 edited
-
libohana/src/gaussj.c (modified) (6 diffs)
-
libohana/src/ohana_allocate.c (modified) (1 diff)
-
opihi/cmd.data/shfit.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20140904/Ohana/src/libohana/src/gaussj.c
r36084 r37632 1 1 # include <ohana.h> 2 # define GROWTHTEST 02 # define GROWTHTEST 1 3 3 # define MAX_RANGE 1.0e9 4 4 … … 48 48 // search for the next pivot 49 49 for (row = 0; row < N; row++) { 50 if (!finite(A[row][diag])) goto escape; 50 if (!finite(A[row][diag])) { 51 fprintf (stderr, "infinity\n"); 52 goto escape; 53 } 51 54 52 55 // if we have already operated on this row (pivot[row] is true), skip it … … 65 68 # if (GROWTHTEST) 66 69 fprintf (stderr, "maxcol: %d\n", maxcol); 67 fprintf (stderr, "full A matrix:\n");68 for (row = 0; row < N; row++) {69 for (col = 0; col < N; col++) {70 fprintf (stderr, "%10.3e ", A[row][col]);71 }72 fprintf (stderr, "\n");73 }74 fprintf (stderr, "\n");70 // fprintf (stderr, "full A matrix:\n"); 71 // for (row = 0; row < N; row++) { 72 // for (col = 0; col < N; col++) { 73 // fprintf (stderr, "%10.3e ", A[row][col]); 74 // } 75 // fprintf (stderr, "\n"); 76 // } 77 // fprintf (stderr, "\n"); 75 78 # endif 76 79 77 80 // if pivot[maxcol] is set, we have already done this row: this implies a singular matrix 78 if (pivot[maxcol]) goto escape; 81 if (pivot[maxcol]) { 82 fprintf (stderr, "singular\n"); 83 goto escape; 84 } 79 85 pivot[maxcol] = TRUE; 80 86 … … 86 92 rowIndex[diag] = maxrow; 87 93 colIndex[diag] = maxcol; 88 if (A[maxcol][maxcol] == 0.0) goto escape; 94 if (A[maxcol][maxcol] == 0.0) { 95 fprintf (stderr, "zero pivot\n"); 96 goto escape; 97 } 98 89 99 // XXX Kahan replaces the 0.0 pivot with epsilon*(largest element in column) + underFlow 90 100 … … 102 112 # if (GROWTHTEST) 103 113 fprintf (stderr, "column: %d, maxval : %f, growth: %e, epsilon: %e\n", maxcol, tmpval, growth, epsilon); 104 fprintf (stderr, "A diagonal: "); 105 for (col = 0; col < N; col++) fprintf (stderr, "%f ", A[col][col]); 106 fprintf (stderr, "\n"); 107 # endif 108 109 if (fabs(growth) > MAX_RANGE) goto escape; 114 // fprintf (stderr, "A diagonal: "); 115 // for (col = 0; col < N; col++) fprintf (stderr, "%f ", A[col][col]); 116 // fprintf (stderr, "\n"); 117 # endif 118 119 if (fabs(growth) > MAX_RANGE) { 120 fprintf (stderr, "max range\n"); 121 goto escape; 122 } 110 123 111 124 /* adjust the elements above the pivot */ … … 120 133 121 134 # if (GROWTHTEST) 122 fprintf (stderr, "final A matrix:\n");123 for (row = 0; row < N; row++) {124 for (col = 0; col < N; col++) {125 fprintf (stderr, "%10.3e ", A[row][col]);126 }127 fprintf (stderr, "\n");128 }129 fprintf (stderr, "\n");135 fprintf (stderr, "final A matrix:\n"); 136 // for (row = 0; row < N; row++) { 137 // for (col = 0; col < N; col++) { 138 // fprintf (stderr, "%10.3e ", A[row][col]); 139 // } 140 // fprintf (stderr, "\n"); 141 // } 142 // fprintf (stderr, "\n"); 130 143 # endif 131 144 -
branches/eam_branches/ipp-20140904/Ohana/src/libohana/src/ohana_allocate.c
r37547 r37632 181 181 182 182 ref = (Memblock *) in - 1; 183 184 // fprintf (stderr, " file: %s, line: %d, func: %s, size: %zd, addr: %zx\n", 185 // ref->file, ref->line, ref->func, ref->size, (size_t) ref); 183 186 184 187 pthread_mutex_lock(&memBlockListMutex); -
branches/eam_branches/ipp-20140904/Ohana/src/opihi/cmd.data/shfit.c
r37630 r37632 34 34 ResetVector (Mvec, OPIHI_FLT, terms->Nterms); 35 35 36 double **Ar, **br, **Ai, **bi; 37 ALLOCATE (Ar, double *, terms->Nterms); 38 ALLOCATE (Ai, double *, terms->Nterms); 39 ALLOCATE (br, double *, terms->Nterms); 40 ALLOCATE (bi, double *, terms->Nterms); 36 // we only fit the linearlly independent terms: Re(m >= 0), Im(m > 0) 37 int Nre = 0; 38 int Nim = 0; 41 39 for (i = 0; i < terms->Nterms; i++) { 42 ALLOCATE_ZERO (Ar[i], double, terms->Nterms); 43 ALLOCATE_ZERO (Ai[i], double, terms->Nterms); 44 ALLOCATE_ZERO (br[i], double, 1); 45 ALLOCATE_ZERO (bi[i], double, 1); 40 if (terms->m[i] >= 0) Nre ++; 41 if (terms->m[i] > 0) Nim ++; 42 } 43 int *Jre = NULL; 44 int *Jim = NULL; 45 ALLOCATE (Jre, int, Nre); 46 ALLOCATE (Jim, int, Nim); 47 48 Nre = Nim = 0; 49 for (i = 0; i < terms->Nterms; i++) { 50 if (terms->m[i] >= 0) { 51 Jre[Nre] = i; 52 Nre ++; 53 } 54 if (terms->m[i] > 0) { 55 Jim[Nim] = i; 56 Nim ++; 57 } 58 } 59 60 double **Are, **bre, **Aim, **bim; 61 ALLOCATE (Are, double *, Nre); 62 ALLOCATE (bre, double *, Nre); 63 ALLOCATE (Aim, double *, Nim); 64 ALLOCATE (bim, double *, Nim); 65 for (i = 0; i < Nre; i++) { 66 ALLOCATE_ZERO (Are[i], double, Nre); 67 ALLOCATE_ZERO (bre[i], double, 1); 68 } 69 for (i = 0; i < Nim; i++) { 70 ALLOCATE_ZERO (Aim[i], double, Nim); 71 ALLOCATE_ZERO (bim[i], double, 1); 46 72 } 47 73 … … 53 79 double Fv = Fvec->elements.Flt[i]; 54 80 55 for (j = 0; j < terms->Nterms; j++) { 56 br[j][0] += Fv * terms->Fr[j]; 57 bi[j][0] += Fv * terms->Fi[j]; 81 for (j = 0; j < Nre; j++) { 82 int jre = Jre[j]; 83 bre[j][0] += Fv * terms->Fr[jre]; 84 } 85 for (j = 0; j < Nim; j++) { 86 int jim = Jim[j]; 87 bim[j][0] += Fv * terms->Fi[jim]; 58 88 } 59 89 60 for (j = 0; j < terms->Nterms; j++) { 61 for (k = j; k < terms->Nterms; k++) { 62 Ar[j][k] += terms->Fr[j] * terms->Fr[k]; 63 Ai[j][k] += terms->Fi[j] * terms->Fi[k]; 64 } 90 for (j = 0; j < Nre; j++) { 91 int jre = Jre[j]; 92 for (k = j; k < Nre; k++) { 93 int kre = Jre[k]; 94 Are[j][k] += terms->Fr[jre] * terms->Fr[kre]; 95 } 65 96 } 66 }67 97 68 for (j = 1; j < terms->Nterms; j++) { 69 for (k = 0; k < j; k++) { 70 Ar[j][k] = Ar[k][j]; 71 Ai[j][k] = Ai[k][j]; 72 } 73 } 74 75 for (j = 0; j < terms->Nterms; j++) { 76 if (terms->m[j] == 0) { 77 Ai[j][j] = 1.0; // Im(Y_l0) == 0.0 78 bi[j][0] = 0.0; 79 } else { 80 if (terms->m[j] < 0) { 81 for (k = 0; k < terms->Nterms; k++) { 82 Ar[j][k] = 0.0; 83 Ar[k][j] = 0.0; 84 Ai[j][k] = 0.0; 85 Ai[k][j] = 0.0; 86 } 87 Ar[j][j] = 1.0; 88 Ai[j][j] = 1.0; 89 br[j][0] = 0.0; 90 bi[j][0] = 0.0; 91 // Re(Y_lm) = Re(Y_l(-m)) [m even], Re(Y_lm) = Re(-Y_l(-m)) [m odd] 98 for (j = 0; j < Nim; j++) { 99 int jim = Jim[j]; 100 for (k = j; k < Nim; k++) { 101 int kim = Jim[k]; 102 Aim[j][k] += terms->Fi[jim] * terms->Fi[kim]; 92 103 } 93 104 } 94 105 } 95 106 96 if (0) { 97 fprintf (stderr, "--- Ar --- : br \n"); 98 for (i = 0; i < terms->Nterms; i++) { 99 for (j = 0; j < terms->Nterms; j++) { 100 fprintf (stderr, "%10.6f ", Ar[i][j]); 101 } 102 fprintf (stderr, " : %10.6f\n", br[i][0]); 103 } 104 105 fprintf (stderr, "--- Ai --- : bi \n"); 106 for (i = 0; i < terms->Nterms; i++) { 107 for (j = 0; j < terms->Nterms; j++) { 108 fprintf (stderr, "%10.6f ", Ai[i][j]); 109 } 110 fprintf (stderr, " : %10.6f\n", bi[i][0]); 111 } 107 for (j = 1; j < Nre; j++) { 108 for (k = 0; k < j; k++) { 109 Are[j][k] = Are[k][j]; 110 } 111 } 112 for (j = 1; j < Nim; j++) { 113 for (k = 0; k < j; k++) { 114 Aim[j][k] = Aim[k][j]; 115 } 112 116 } 113 117 114 fprintf (stderr, "--- Ar --- : br\n");115 for (j = 0; j < terms->Nterms; j++) {116 fprintf (stderr, "%10.6f ", Ar [j][j]);117 fprintf (stderr, " : %10.6f\n", br [j][0]);118 fprintf (stderr, "--- Are --- : bre \n"); 119 for (j = 0; j < Nre; j++) { 120 fprintf (stderr, "%10.6f ", Are[j][j]); 121 fprintf (stderr, " : %10.6f\n", bre[j][0]); 118 122 } 119 123 120 fprintf (stderr, "--- Ai --- : bi\n");121 for (i = 0; i < terms->Nterms; i++) {122 fprintf (stderr, "%10.6f : ", Ai [i][i]);123 fprintf (stderr, " : %10.6f\n", bi [i][0]);124 fprintf (stderr, "--- Aim --- : bim \n"); 125 for (i = 0; i < Nim; i++) { 126 fprintf (stderr, "%10.6f : ", Aim[i][i]); 127 fprintf (stderr, " : %10.6f\n", bim[i][0]); 124 128 } 125 129 126 if (!dgaussjordan (Ar , br, terms->Nterms, 1)) {130 if (!dgaussjordan (Are, bre, Nre, 1)) { 127 131 gprint (GP_ERR, "failed to fit data : ill-conditioned matrix\n"); 128 132 return FALSE; 129 133 } 130 if (!dgaussjordan (Ai , bi, terms->Nterms, 1)) {134 if (!dgaussjordan (Aim, bim, Nim, 1)) { 131 135 gprint (GP_ERR, "failed to fit data : ill-conditioned matrix\n"); 132 136 return FALSE; 133 137 } 134 138 135 for (j = 0; j < terms->Nterms; j++) { 136 Fr[j] = br[j][0] / (float) Frvec[0].Nelements; 137 Fi[j] = bi[j][0] / (float) Fivec[0].Nelements; 139 // XXX EAM : why is this factor needed? 140 for (j = 0; j < terms->Nterms; j++) { 141 Fr[j] = 0.0; 142 Fi[i] = 0.0; 143 } 144 for (j = 0; j < Nre; j++) { 145 int jre = Jre[j]; 146 Fr[jre] = bre[j][0] * terms->Nterms / (float) Frvec[0].Nelements; 147 } 148 for (j = 0; j < Nim; j++) { 149 int jim = Jim[j]; 150 Fi[jim] = bim[j][0] * terms->Nterms / (float) Frvec[0].Nelements; 138 151 } 139 152 … … 142 155 Lvec[0].elements.Flt[j] = terms->l[j]; 143 156 Mvec[0].elements.Flt[j] = terms->m[j]; 144 Frvec[0].elements.Flt[j] = 4*M_PI*Fr[j];145 Fivec[0].elements.Flt[j] = 4*M_PI*Fi[j];157 Frvec[0].elements.Flt[j] = Fr[j]; 158 Fivec[0].elements.Flt[j] = Fi[j]; 146 159 } 147 160
Note:
See TracChangeset
for help on using the changeset viewer.
