void SBGaussian::SBGaussianImpl::fillXValue(tmv::MatrixView<double> val, double x0, double dx, int izero, double y0, double dy, int jzero) const { dbg<<"SBGaussian fillXValue\n"; dbg<<"x = "<<x0<<" + i * "<<dx<<", izero = "<<izero<<std::endl; dbg<<"y = "<<y0<<" + j * "<<dy<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillXValueQuadrant(val,x0,dx,izero,y0,dy,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<double,1,tmv::NonConj> It; x0 *= _inv_sigma; dx *= _inv_sigma; y0 *= _inv_sigma; dy *= _inv_sigma; // The Gaussian profile is separable: // val = _norm * exp(-0.5 * (x*x + y*y) // = _norm * exp(-0.5 * x*x) * exp(-0.5 * y*y) tmv::Vector<double> gauss_x(m); It xit = gauss_x.begin(); for (int i=0;i<m;++i,x0+=dx) *xit++ = exp(-0.5 * x0*x0); tmv::Vector<double> gauss_y(n); It yit = gauss_y.begin(); for (int j=0;j<n;++j,y0+=dy) *yit++ = exp(-0.5 * y0*y0); val = _norm * gauss_x ^ gauss_y; } }
void SBKolmogorov::SBKolmogorovImpl::fillXValue(tmv::MatrixView<double> val, double x0, double dx, int izero, double y0, double dy, int jzero) const { dbg<<"SBKolmogorov fillXValue\n"; dbg<<"x = "<<x0<<" + i * "<<dx<<", izero = "<<izero<<std::endl; dbg<<"y = "<<y0<<" + j * "<<dy<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillXValueQuadrant(val,x0,dx,izero,y0,dy,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<double,1,tmv::NonConj> It; x0 *= _k0; dx *= _k0; y0 *= _k0; dy *= _k0; for (int j=0;j<n;++j,y0+=dy) { double x = x0; double ysq = y0*y0; It valit = val.col(j).begin(); for (int i=0;i<m;++i,x+=dx) { double r = sqrt(x*x + ysq); *valit++ = _xnorm * _info->xValue(r); } } } }
void SBMoffat::SBMoffatImpl::fillXValue(tmv::MatrixView<double> val, double x0, double dx, int izero, double y0, double dy, int jzero) const { dbg<<"SBMoffat fillXValue\n"; dbg<<"x = "<<x0<<" + i * "<<dx<<", izero = "<<izero<<std::endl; dbg<<"y = "<<y0<<" + j * "<<dy<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillXValueQuadrant(val,x0,dx,izero,y0,dy,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<double,1,tmv::NonConj> It; x0 *= _inv_rD; dx *= _inv_rD; y0 *= _inv_rD; dy *= _inv_rD; for (int j=0;j<n;++j,y0+=dy) { double x = x0; double ysq = y0*y0; It valit = val.col(j).begin(); for (int i=0;i<m;++i,x+=dx) { double rsq = x*x + ysq; if (rsq > _maxRrD_sq) *valit++ = 0.; else *valit++ = _norm / _pow_beta(1.+rsq, _beta); } } } }