diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/physpack/nbody_simulator/axilrod_teller.h b/fastlib/trunk/contrib/dongryel/thesis_research/physpack/nbody_simulator/axilrod_teller.h index c2f6d63a18..7e86cfbc5f 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/physpack/nbody_simulator/axilrod_teller.h +++ b/fastlib/trunk/contrib/dongryel/thesis_research/physpack/nbody_simulator/axilrod_teller.h @@ -26,101 +26,34 @@ class AxilrodTeller { const core::gnp::TripleRangeDistanceSq &range_in) const { const arma::mat &min_distance_sq = range_in.min_distance_sq(); - const arma::mat &max_distance_sq = range_in.max_distance_sq(); - double numerator_first_part = - -3.0 * core::math::Pow<3, 1>(max_distance_sq.at(0, 1)); - double max_diff = - std::max( - fabs( - max_distance_sq.at(0, 2) - min_distance_sq.at(1, 2)), - fabs( - min_distance_sq.at(0, 2) - max_distance_sq.at(1, 2))); - double numerator_second_part = - -3.0 * core::math::Sqr(max_diff) * - (max_distance_sq.at(0, 2) + max_distance_sq.at(1, 2)); - - double denominator = 8.0 * pow( - min_distance_sq.at(0, 1) * - min_distance_sq.at(0, 2) * - min_distance_sq.at(1, 2), 2.5); - - return (numerator_first_part + numerator_second_part) / denominator / - normalizing_constant_; + return -2 / pow( + min_distance_sq.at(0, 1) * + min_distance_sq.at(0, 2) * + min_distance_sq.at(1, 2), 1.5) / normalizing_constant_; } double maximum_negative_contribution( const core::gnp::TripleRangeDistanceSq &range_in) const { - const arma::mat &min_distance_sq = range_in.min_distance_sq(); - const arma::mat &max_distance_sq = range_in.max_distance_sq(); - double numerator_first_part = - -3.0 * core::math::Pow<3, 1>(min_distance_sq.at(0, 1)); - double numerator_second_part = 0; - if(max_distance_sq.at(0, 2) <= min_distance_sq.at(1, 2) || - max_distance_sq.at(1, 2) <= min_distance_sq.at(0, 2)) { - double difference = - std::min( - fabs(min_distance_sq.at(1, 2) - max_distance_sq.at(0, 2)), - fabs(min_distance_sq.at(0, 2) - max_distance_sq.at(1, 2))); - numerator_second_part = - -3.0 * core::math::Sqr(difference) * - (min_distance_sq.at(0, 2) + min_distance_sq.at(1, 2)); - } - - double denominator = 8.0 * pow( - max_distance_sq.at(0, 1) * - max_distance_sq.at(0, 2) * - max_distance_sq.at(1, 2), 2.5); - - return (numerator_first_part + numerator_second_part) / denominator / - normalizing_constant_; + return 0; } double minimum_positive_contribution( const core::gnp::TripleRangeDistanceSq &range_in) const { - const arma::mat &min_distance_sq = range_in.min_distance_sq(); - const arma::mat &max_distance_sq = range_in.max_distance_sq(); - double numerator_first_part = - 3.0 * core::math::Sqr(min_distance_sq.at(0, 1)) * - (min_distance_sq.at(0, 2) + min_distance_sq.at(1, 2)); - double numerator_second_part = - min_distance_sq.at(0, 1) * ( - 3.0 * core::math::Sqr(min_distance_sq.at(0, 2)) + - 2.0 * min_distance_sq.at(0, 2) * min_distance_sq.at(1, 2) + - 3.0 * core::math::Sqr(min_distance_sq.at(1, 2))); - - double denominator = 8.0 * pow( - max_distance_sq.at(0, 1) * - max_distance_sq.at(0, 2) * - max_distance_sq.at(1, 2), 2.5); - - return (numerator_first_part + numerator_second_part) / denominator / - normalizing_constant_; + return 0; } double maximum_positive_contribution( const core::gnp::TripleRangeDistanceSq &range_in) const { const arma::mat &min_distance_sq = range_in.min_distance_sq(); - const arma::mat &max_distance_sq = range_in.max_distance_sq(); - double numerator_first_part = - 3.0 * core::math::Sqr(max_distance_sq.at(0, 1)) * - (max_distance_sq.at(0, 2) + max_distance_sq.at(1, 2)); - double numerator_second_part = - max_distance_sq.at(0, 1) * ( - 3.0 * core::math::Sqr(max_distance_sq.at(0, 2)) + - 2.0 * max_distance_sq.at(0, 2) * max_distance_sq.at(1, 2) + - 3.0 * core::math::Sqr(max_distance_sq.at(1, 2))); - double denominator = 8.0 * pow( - min_distance_sq.at(0, 1) * - min_distance_sq.at(0, 2) * - min_distance_sq.at(1, 2), 2.5); - - return (numerator_first_part + numerator_second_part) / denominator / - normalizing_constant_; + return 1.375 / pow( + min_distance_sq.at(0, 1) * + min_distance_sq.at(0, 2) * + min_distance_sq.at(1, 2), 1.5) / normalizing_constant_; } core::math::Range RangeUnnormOnSq(