#pragma once
class RadialWaveFunction
{
private:
static double Factorial(int n);
static double Laguerre(double rho, int n, int l);
public:
static double R(double r, int Z, int n, int l);
};
#include <math.h>
#include "RadialWaveFunction.h"
double RadialWaveFunction::Factorial(int n)
{
double factorial = 1.0;
for (int i = 2; i <= n; i++)
factorial *= i;
return factorial;
}
double RadialWaveFunction::Laguerre(double rho, int n, int l)
{
double sum = 0.0;
for (int k = 0; k <= n - l - 1; k++)
{
double factor1 = pow(-1, k + 2 * l + 1);
double factor2 = pow(Factorial(n + l), 2.0);
double factor3 = pow(rho, k);
double numer = factor1 * factor2 * factor3;
double factor4 = Factorial(n - l - 1 - k);
double factor5 = Factorial(2 * l + 1 + k);
double factor6 = Factorial(k);
double denom = factor4 * factor5 * factor6;
sum += numer / denom;
}
return sum;
}
double RadialWaveFunction::R(double r, int Z, int n, int l)
{
double rho = 2.0 * Z * r / n;
double numer1 = pow(2.0 * Z / n, 3.0);
double numer2 = Factorial(n - l - 1);
double denom1 = Factorial(n + n);
double denom2 = pow(Factorial(n + l), 3.0);
double numer3 = -sqrt(numer1 * numer2 /
(denom1 * denom2));
double exp2 = exp(-0.5 * rho);
double rhol = pow(rho, l);
return numer3 * exp2 * rhol * Laguerre(rho, n, l);
}