Changeset 27531 for trunk/psModules/src/objects/models/pmModel_RGAUSS.c
- Timestamp:
- Mar 30, 2010, 1:29:50 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_RGAUSS.c
r26916 r27531 257 257 psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux) 258 258 { 259 psF64 z , f;259 psF64 z; 260 260 int Nstep = 0; 261 261 psEllipseShape shape; … … 291 291 z0 = 0.0; 292 292 293 // perform a type of bisection to find the value 294 float f0 = 1.0 / (1 + z0 + pow(z0, PAR[PM_PAR_7])); 295 float f1 = 1.0 / (1 + z1 + pow(z1, PAR[PM_PAR_7])); 296 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 297 z = 0.5*(z0 + z1); 298 f = 1.0 / (1 + z + pow(z, PAR[PM_PAR_7])); 299 if (f > limit) { 300 z0 = z; 301 f0 = f; 302 } else { 303 z1 = z; 304 f1 = f; 305 } 306 Nstep ++; 307 } 293 // starting guess: 294 z = 0.5*(z0 + z1); 295 float dz = 1.0; 296 297 for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) { 298 // use Newton-Raphson to minimize f(z) - limit = 0 299 float q = (1 + z + pow(z,PAR[PM_PAR_7])); 300 float dqdz = (1.0 + PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0)); 301 302 float f = 1.0 / q; 303 float dfdz = -dqdz * f / q; 304 305 dz = (f - limit) / dfdz; 306 307 // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q); 308 z -= dz; 309 } 310 308 311 psF64 radius = sigma * sqrt (2.0 * z); 309 312
Note:
See TracChangeset
for help on using the changeset viewer.
