SBGaussian::SBGaussianImpl::SBGaussianImpl(double sigma, double flux) : _flux(flux), _sigma(sigma), _sigma_sq(sigma*sigma) { // For large k, we clip the result of kValue to 0. // We do this when the correct answer is less than kvalue_accuracy. // exp(-k^2*sigma^2/2) = kvalue_accuracy _ksq_max = -2. * std::log(sbp::kvalue_accuracy) / _sigma_sq; // For small k, we can use up to quartic in the taylor expansion to avoid the exp. // This is acceptable when the next term is less than kvalue_accuracy. // 1/48 (k^2 r0^2)^3 = kvalue_accuracy _ksq_min = std::pow(sbp::kvalue_accuracy * 48., 1./3.) / _sigma_sq; _norm = _flux / (_sigma_sq * 2. * M_PI); dbg<<"Gaussian:\n"; dbg<<"_flux = "<<_flux<<std::endl; dbg<<"_sigma = "<<_sigma<<std::endl; dbg<<"_sigma_sq = "<<_sigma_sq<<std::endl; dbg<<"_ksq_max = "<<_ksq_max<<std::endl; dbg<<"_ksq_min = "<<_ksq_min<<std::endl; dbg<<"_norm = "<<_norm<<std::endl; dbg<<"maxK() = "<<maxK()<<std::endl; dbg<<"stepK() = "<<stepK()<<std::endl; }
SBGaussian::SBGaussianImpl::SBGaussianImpl(double sigma, double flux, const GSParamsPtr& gsparams) : SBProfileImpl(gsparams), _flux(flux), _sigma(sigma), _sigma_sq(_sigma*_sigma), _inv_sigma(1./_sigma), _inv_sigma_sq(_inv_sigma*_inv_sigma) { // For large k, we clip the result of kValue to 0. // We do this when the correct answer is less than kvalue_accuracy. // exp(-k^2*sigma^2/2) = kvalue_accuracy _ksq_max = -2. * std::log(this->gsparams->kvalue_accuracy); // For small k, we can use up to quartic in the taylor expansion to avoid the exp. // This is acceptable when the next term is less than kvalue_accuracy. // 1/48 (k^2 r0^2)^3 = kvalue_accuracy _ksq_min = std::pow(this->gsparams->kvalue_accuracy * 48., 1./3.); _norm = _flux * _inv_sigma_sq / (2. * M_PI); dbg<<"Gaussian:\n"; dbg<<"_flux = "<<_flux<<std::endl; dbg<<"_sigma = "<<_sigma<<std::endl; dbg<<"_ksq_max = "<<_ksq_max<<std::endl; dbg<<"_ksq_min = "<<_ksq_min<<std::endl; dbg<<"_norm = "<<_norm<<std::endl; dbg<<"maxK() = "<<maxK()<<std::endl; dbg<<"stepK() = "<<stepK()<<std::endl; }
SBExponential::SBExponentialImpl::SBExponentialImpl( double r0, double flux, const GSParamsPtr& gsparams) : SBProfileImpl(gsparams), _flux(flux), _r0(r0), _r0_sq(_r0*_r0), _inv_r0(1./r0), _inv_r0_sq(_inv_r0*_inv_r0), _info(cache.get(this->gsparams.duplicate())) { // For large k, we clip the result of kValue to 0. // We do this when the correct answer is less than kvalue_accuracy. // (1+k^2 r0^2)^-1.5 = kvalue_accuracy _ksq_max = (std::pow(this->gsparams->kvalue_accuracy,-1./1.5)-1.); // For small k, we can use up to quartic in the taylor expansion to avoid the sqrt. // This is acceptable when the next term is less than kvalue_accuracy. // 35/16 (k^2 r0^2)^3 = kvalue_accuracy _ksq_min = std::pow(this->gsparams->kvalue_accuracy * 16./35., 1./3.); _flux_over_2pi = _flux / (2. * M_PI); _norm = _flux_over_2pi * _inv_r0_sq; dbg<<"Exponential:\n"; dbg<<"_flux = "<<_flux<<std::endl; dbg<<"_r0 = "<<_r0<<std::endl; dbg<<"_ksq_max = "<<_ksq_max<<std::endl; dbg<<"_ksq_min = "<<_ksq_min<<std::endl; dbg<<"_norm = "<<_norm<<std::endl; dbg<<"maxK() = "<<maxK()<<std::endl; dbg<<"stepK() = "<<stepK()<<std::endl; }