IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6908


Ignore:
Timestamp:
Apr 19, 2006, 10:33:06 AM (20 years ago)
Author:
magnier
Message:

added simpsons rule for flux integral

File:
1 edited

Legend:

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

    r6872 r6908  
    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        z = 0;
     30
    2831    psF32 zp = pow(z,1.25);
    29 
    3032    psF32 r  = 1.0 / (1 + PAR[7]*z + z*zp);
    31     // test: psF32 r  = 1.0 / (1 + PAR[7]*z + PS_SQR(z));
     33
    3234    psF32 r1 = PAR[1]*r;
    3335    psF32 f  = r1 + PAR[0];
     
    3941        psF32 t = r1*r;
    4042        psF32 q = t*(PAR[7] + 2.25*zp);
    41         // test: psF32 q = t*(PAR[7] + 2*z);
    4243
    4344        dPAR[0] = +1.0;
     
    9394}
    9495
     96// make an initial guess for parameters
     97// XXX we could probably do better with params[6] and params[7]
    9598bool pmModelGuess_QGAUSS (pmModel *model, pmSource *source)
    9699{
     
    114117psF64 pmModelFlux_QGAUSS(const psVector *params)
    115118{
    116     float f, norm, z;
     119    float z;
     120    float norm;
    117121
    118122    psF32 *PAR = params->data.F32;
     
    125129
    126130    // the area needs to be multiplied by the integral of f(z)
     131    // XXX this integral can be done faster and more accurately
    127132    norm = 0.0;
    128     for (z = 0.05; z < 50; z += 0.1) {
     133
     134    # define DZ 0.1
     135
     136    # if 1
     137
     138    float f;
     139for (z = 0.5*DZ; z < 50; z += DZ) {
    129140        f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25));
    130141        // test: f = 1.0 / (1 + PAR[7]*z + PS_SQR(z));
    131142        norm += f;
    132143    }
    133     norm *= 0.1;
     144    norm *= DZ;
     145    # else
     146
     147        float f0 = 1.0;
     148    float f1, f2;
     149    for (z = DZ; z < 50; z += DZ) {
     150        f1 = 1.0 / (1 + PAR[7]*z + pow(z, 2.25));
     151        z += DZ;
     152        f2 = 1.0 / (1 + PAR[7]*z + pow(z, 2.25));
     153        norm += f0 + 4*f1 + f2;
     154        f0 = f2;
     155    }
     156    norm *= DZ / 3.0;
     157    # endif
    134158
    135159    psF64 Flux = PAR[1] * Area * norm;
     
    153177
    154178    // if Sx == Sy, sigma = Sx == Sy
     179    // XXX we should return the major axis length...??
    155180    psF64 sigma = hypot (1.0 / PAR[4], 1.0 / PAR[5]) / sqrt(2.0);
    156181    psF64 dz = 1.0 / (2.0 * sigma*sigma);
     
    164189            break;
    165190    }
     191
    166192    psF64 radius = sigma * sqrt (2.0 * z);
    167193    if (isnan(radius)) {
Note: See TracChangeset for help on using the changeset viewer.