void SBKolmogorov::SBKolmogorovImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBKolmogorov fillKValue\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKValueQuadrant(val,kx0,dkx,izero,ky0,dky,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<std::complex<double>,1,tmv::NonConj> It; kx0 *= _inv_k0; dkx *= _inv_k0; ky0 *= _inv_k0; dky *= _inv_k0; for (int j=0;j<n;++j,ky0+=dky) { double kx = kx0; double kysq = ky0*ky0; It valit = val.col(j).begin(); for (int i=0;i<m;++i,kx+=dkx) *valit++ = _flux * _info->kValue(kx*kx + kysq); } } }
void SBGaussian::SBGaussianImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBGaussian fillKValue\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKValueQuadrant(val,kx0,dkx,izero,ky0,dky,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; kx0 *= _sigma; dkx *= _sigma; ky0 *= _sigma; dky *= _sigma; tmv::Vector<double> gauss_kx(m); It kxit = gauss_kx.begin(); for (int i=0;i<m;++i,kx0+=dkx) *kxit++ = exp(-0.5 * kx0*kx0); tmv::Vector<double> gauss_ky(n); It kyit = gauss_ky.begin(); for (int j=0;j<n;++j,ky0+=dky) *kyit++ = exp(-0.5 * ky0*ky0); val = _flux * gauss_kx ^ gauss_ky; } }
void SBBox::SBBoxImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBBox fillKValue\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKValueQuadrant(val,kx0,dkx,izero,ky0,dky,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; kx0 *= _wo2pi; dkx *= _wo2pi; ky0 *= _ho2pi; dky *= _ho2pi; // The Box profile in Fourier space is separable: // val(x,y) = _flux * sinc(x * _width/2pi) * sinc(y * _height/2pi) tmv::Vector<double> sinc_kx(m); It kxit = sinc_kx.begin(); for (int i=0;i<m;++i,kx0+=dkx) *kxit++ = sinc(kx0); tmv::Vector<double> sinc_ky(n); It kyit = sinc_ky.begin(); for (int j=0;j<n;++j,ky0+=dky) *kyit++ = sinc(ky0); val = _flux * sinc_kx ^ sinc_ky; } }
void SBExponential::SBExponentialImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBExponential fillKValue\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKValueQuadrant(val,kx0,dkx,izero,ky0,dky,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<std::complex<double>,1,tmv::NonConj> It; kx0 *= _r0; dkx *= _r0; ky0 *= _r0; dky *= _r0; for (int j=0;j<n;++j,ky0+=dky) { double kx = kx0; double kysq = ky0*ky0; It valit = val.col(j).begin(); for (int i=0;i<m;++i,kx+=dkx) { double ksq = kx*kx + kysq; if (ksq > _ksq_max) { *valit++ = 0.; } else if (ksq < _ksq_min) { *valit++ = _flux * (1. - 1.5*ksq*(1. - 1.25*ksq)); } else { double temp = 1. + ksq; *valit++ = _flux/(temp*sqrt(temp)); } } } } }