IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 19, 2006, 4:38:34 PM (20 years ago)
Author:
magnier
Message:

fixed error in z limits (neg goes to 0); better radius search

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/rel10_ifa/psModules/src/objects/models/pmModel_QGAUSS.c

    r6899 r6916  
    2626    psF32 py = PAR[5]*Y;
    2727    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;
    4230
    4331    psF32 zp = pow(z,1.25);
    44     if (isnan(zp))
    45         psAbort ("psMinLMM", "nan in zp");
    46 
    4732    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
    5234    psF32 r1 = PAR[1]*r;
    5335    psF32 f  = r1 + PAR[0];
     
    5941        psF32 t = r1*r;
    6042        psF32 q = t*(PAR[7] + 2.25*zp);
    61         // test: psF32 q = t*(PAR[7] + 2*z);
    6243
    6344        dPAR[0] = +1.0;
     
    146127    norm = 0.0;
    147128
    148     # define DZ 0.1
     129    # define DZ 0.25
    149130
    150131    # if 0
    151132
    152133    float f;
     134float zp;
    153135for (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);
    156138        norm += f;
    157139    }
     
    182164    psF64 z, f;
    183165    psF32 *PAR = params->data.F32;
     166    int Nstep = 0;
    184167
    185168    if (flux <= 0)
     
    192175    // if Sx == Sy, sigma = Sx == Sy
    193176    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 */
    194181    psF64 dz = 1.0 / (2.0 * sigma*sigma);
    195     psF64 limit = flux / PAR[1];
    196182
    197183    // we can do this much better with intelligent choices here
    198184    for (z = 0.0; z < 30.0; z += dz) {
     185        Nstep ++;
    199186        f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25));
    200187        // test: f = 1.0 / (1 + PAR[7]*z + PS_SQR(z));
     
    202189            break;
    203190    }
     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
    204222    psF64 radius = sigma * sqrt (2.0 * z);
    205223    if (isnan(radius)) {
Note: See TracChangeset for help on using the changeset viewer.