Changeset 27531 for trunk/psModules/src/objects/models/pmModel_PGAUSS.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_PGAUSS.c
r26916 r27531 236 236 psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux) 237 237 { 238 psF64 z , f;238 psF64 z; 239 239 int Nstep = 0; 240 240 psEllipseShape shape; … … 271 271 z0 = 0.0; 272 272 273 // perform a type of bisection to find the value 274 float f0 = 1.0 / (1 + z0 + z0*z0/2.0 + z0*z0*z0/6.0); 275 float f1 = 1.0 / (1 + z1 + z1*z1/2.0 + z1*z1*z1/6.0); 276 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 277 z = 0.5*(z0 + z1); 278 f = 1.0 / (1 + z + z*z/2.0 + z*z*z/6.0); 279 if (f > limit) { 280 z0 = z; 281 f0 = f; 282 } else { 283 z1 = z; 284 f1 = f; 285 } 286 Nstep ++; 287 } 273 // starting guess: 274 z = 0.5*(z0 + z1); 275 float dz = 1.0; 276 277 for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) { 278 // use Newton-Raphson to minimize f(z) - limit = 0 279 float dqdz = (1.0 + z + z*z/2.0); 280 float q = (dqdz + z*z*z/6.0); 281 282 float f = 1.0 / q; 283 float dfdz = -dqdz * f / q; 284 285 dz = (f - limit) / dfdz; 286 287 // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q); 288 z -= dz; 289 } 290 288 291 psF64 radius = sigma * sqrt (2.0 * z); 289 292
Note:
See TracChangeset
for help on using the changeset viewer.
