Ejemplo n.º 1
0
        // series for L=0 for both F and G
        // this has the same convergence properties as the L != 0 series for F above

        private static void Coulomb_Zero_Series(double eta, double rho, out double F, out double FP, out double G, out double GP)
        {
            if (rho == 0.0)
            {
                double C = CoulombFactorZero(eta);
                F  = 0.0;
                FP = C;
                G  = 1.0 / C;
                GP = Double.NegativeInfinity;
                return;
            }

            double eta_rho = eta * rho;
            double rho_2   = rho * rho;

            double u0 = 0.0;
            double u1 = rho;
            double u  = u0 + u1;
            double up = u1;

            double v0 = 1.0;
            double v1 = 0.0;
            double v  = v0 + v1;

            for (int n = 2; n <= Global.SeriesMax; n++)
            {
                double u2 = (2.0 * eta_rho * u1 - rho_2 * u0) / (n * (n - 1));
                double v2 = (2.0 * eta_rho * v1 - rho_2 * v0 - 2.0 * eta * (2 * n - 1) * u2) / (n * (n - 1));

                double u_old = u;
                u  += u2;
                up += n * u2;

                double v_old = v;
                v += v2;

                if ((u == u_old) && (v == v_old))
                {
                    double C = CoulombFactorZero(eta);
                    F = C * u;

                    FP = C * up / rho;

                    double r = AdvancedComplexMath.Psi(new Complex(1.0, eta)).Re + 2.0 * AdvancedMath.EulerGamma - 1.0;
                    G = (v + 2.0 * eta * u * (Math.Log(2.0 * rho) + r)) / C;

                    GP = (FP * G - 1.0) / F;

                    return;
                }

                u0 = u1; u1 = u2; v0 = v1; v1 = v2;
            }

            throw new NonconvergenceException();
        }