Changeset 6908
- Timestamp:
- Apr 19, 2006, 10:33:06 AM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r6872 r6908 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 z = 0; 30 28 31 psF32 zp = pow(z,1.25); 29 30 32 psF32 r = 1.0 / (1 + PAR[7]*z + z*zp); 31 // test: psF32 r = 1.0 / (1 + PAR[7]*z + PS_SQR(z)); 33 32 34 psF32 r1 = PAR[1]*r; 33 35 psF32 f = r1 + PAR[0]; … … 39 41 psF32 t = r1*r; 40 42 psF32 q = t*(PAR[7] + 2.25*zp); 41 // test: psF32 q = t*(PAR[7] + 2*z);42 43 43 44 dPAR[0] = +1.0; … … 93 94 } 94 95 96 // make an initial guess for parameters 97 // XXX we could probably do better with params[6] and params[7] 95 98 bool pmModelGuess_QGAUSS (pmModel *model, pmSource *source) 96 99 { … … 114 117 psF64 pmModelFlux_QGAUSS(const psVector *params) 115 118 { 116 float f, norm, z; 119 float z; 120 float norm; 117 121 118 122 psF32 *PAR = params->data.F32; … … 125 129 126 130 // the area needs to be multiplied by the integral of f(z) 131 // XXX this integral can be done faster and more accurately 127 132 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; 139 for (z = 0.5*DZ; z < 50; z += DZ) { 129 140 f = 1.0 / (1 + PAR[7]*z + pow(z, 2.25)); 130 141 // test: f = 1.0 / (1 + PAR[7]*z + PS_SQR(z)); 131 142 norm += f; 132 143 } 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 134 158 135 159 psF64 Flux = PAR[1] * Area * norm; … … 153 177 154 178 // if Sx == Sy, sigma = Sx == Sy 179 // XXX we should return the major axis length...?? 155 180 psF64 sigma = hypot (1.0 / PAR[4], 1.0 / PAR[5]) / sqrt(2.0); 156 181 psF64 dz = 1.0 / (2.0 * sigma*sigma); … … 164 189 break; 165 190 } 191 166 192 psF64 radius = sigma * sqrt (2.0 * z); 167 193 if (isnan(radius)) {
Note:
See TracChangeset
for help on using the changeset viewer.
