- Timestamp:
- Apr 19, 2006, 4:38:34 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/rel10_ifa/psModules/src/objects/models/pmModel_QGAUSS.c
r6899 r6916 26 26 psF32 py = PAR[5]*Y; 27 27 psF32 z = 0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[6]*X*Y; 28 if (z <= 0) { 29 if (deriv) { 30 psF32 *dPAR = deriv->data.F32; 31 dPAR[0] = 0.0; 32 dPAR[1] = 0.0; 33 dPAR[2] = 0.0; 34 dPAR[3] = 0.0; 35 dPAR[4] = 0.0; 36 dPAR[5] = 0.0; 37 dPAR[6] = 0.0; 38 dPAR[7] = 0.0; 39 } 40 return(0.0); 41 } 28 if (z < 0) 29 z = 0; 42 30 43 31 psF32 zp = pow(z,1.25); 44 if (isnan(zp))45 psAbort ("psMinLMM", "nan in zp");46 47 32 psF32 r = 1.0 / (1 + PAR[7]*z + z*zp); 48 if (isnan(r)) 49 psAbort ("psMinLMM", "nan in r"); 50 51 // test: psF32 r = 1.0 / (1 + PAR[7]*z + PS_SQR(z)); 33 52 34 psF32 r1 = PAR[1]*r; 53 35 psF32 f = r1 + PAR[0]; … … 59 41 psF32 t = r1*r; 60 42 psF32 q = t*(PAR[7] + 2.25*zp); 61 // test: psF32 q = t*(PAR[7] + 2*z);62 43 63 44 dPAR[0] = +1.0; … … 146 127 norm = 0.0; 147 128 148 # define DZ 0. 1129 # define DZ 0.25 149 130 150 131 # if 0 151 132 152 133 float f; 134 float zp; 153 135 for (z = 0.5*DZ; z < 50; z += DZ) { 154 f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25));155 // test: f = 1.0 / (1 + PAR[7]*z + PS_SQR(z));136 zp = pow(z,2.25); 137 f = 1.0 / (1 + PAR[7]*z + zp); 156 138 norm += f; 157 139 } … … 182 164 psF64 z, f; 183 165 psF32 *PAR = params->data.F32; 166 int Nstep = 0; 184 167 185 168 if (flux <= 0) … … 192 175 // if Sx == Sy, sigma = Sx == Sy 193 176 psF64 sigma = hypot (1.0 / PAR[4], 1.0 / PAR[5]) / sqrt(2.0); 177 psF64 limit = flux / PAR[1]; 178 179 # if 0 180 /* test example will just use both, printing both */ 194 181 psF64 dz = 1.0 / (2.0 * sigma*sigma); 195 psF64 limit = flux / PAR[1];196 182 197 183 // we can do this much better with intelligent choices here 198 184 for (z = 0.0; z < 30.0; z += dz) { 185 Nstep ++; 199 186 f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25)); 200 187 // test: f = 1.0 / (1 + PAR[7]*z + PS_SQR(z)); … … 202 189 break; 203 190 } 191 // fprintf (stderr, "rad 1: %f, want: %f, got: %f (%d steps)\n", z, limit, f, Nstep); 192 193 # else 194 195 /* use the fact that f is monotonically decreasing */ 196 Nstep = 0; 197 198 // choose a z value guaranteed to be beyond our limit 199 float z0 = pow((1.0 / limit), (1.0 / 2.25)); 200 float z1 = (1.0 / limit) / PAR[7]; 201 z1 = PS_MAX (z0, z1); 202 z0 = 0.0; 203 204 float f0 = 1.0 / (1 + PAR[7]*z0 + pow(z0, 2.25)); 205 float f1 = 1.0 / (1 + PAR[7]*z1 + pow(z1, 2.25)); 206 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 207 z = 0.5*(z0 + z1); 208 f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25)); 209 // fprintf (stderr, "%f %f %f : %f %f %f\n", f0, f, f1, z0, z, z1); 210 if (f > limit) { 211 z0 = z; 212 f0 = f; 213 } else { 214 z1 = z; 215 f1 = f; 216 } 217 Nstep ++; 218 } 219 // fprintf (stderr, "rad 2: %f, want: %f, got: %f (%d steps)\n", z, limit, f, Nstep); 220 # endif 221 204 222 psF64 radius = sigma * sqrt (2.0 * z); 205 223 if (isnan(radius)) {
Note:
See TracChangeset
for help on using the changeset viewer.
