41#define M_PI 3.14159265358979323846
60 double (*potential)(
double r,
void *params);
86 int lambda,
double tolerance,
90 int lambda_max,
int n_max,
double CA_2,
double CB_2,
double alpha_A,
91 double alpha_B,
double k,
double prefactor,
92 double (*potential)(
double r,
void *params),
void *potential_params) {
100 (
double *)calloc((lambda_max + 1) * (n_max + 1),
sizeof(
double));
105 params.alpha_A = alpha_A;
106 params.alpha_B = alpha_B;
108 params.prefactor = prefactor;
109 params.potential = potential;
110 params.potential_params = potential_params;
115 for (
int lambda = 0; lambda <= lambda_max; lambda++) {
116 for (
int n = 0; n <= n_max; n++) {
144 double alpha_A = params->
alpha_A;
145 double alpha_B = params->
alpha_B;
146 double k = params->
k;
147 double CA_2 = params->
CA_2;
148 double CB_2 = params->
CB_2;
151 double power = k * r - (alpha_A + alpha_B) * r * r - alpha_A * CA_2 -
154 return prefactor * exp(power);
165 grid->lambda_max = lambda_max;
166 grid->params = params;
170 grid->pot_values = (
double *)calloc(
MAX_GRID,
sizeof(
double));
171 grid->gto_values = (
double *)calloc(
MAX_GRID,
sizeof(
double));
177 const double R = 5.0;
178 const double R3 = R * R * R;
180 for (
int i = 1;
i <= nr;
i++) {
181 double xi =
i / (nr + 1.0);
182 double xi3 = xi * xi * xi;
183 double ln_xi = log(1 - xi3);
184 double wi = 3 * R3 * xi * xi * ln_xi * ln_xi / ((1 - xi3) * (nr + 1.0));
185 double ri = -R * ln_xi;
192 for (
int lambda = 0; lambda <= lambda_max; lambda++) {
193 grid->mod_bessel[lambda][
i - 1] =
197 for (
int n = 0; n <= n_max; n++) {
198 grid->r_N[n][
i - 1] = pow(ri, n);
208 free(
grid->pot_values);
209 free(
grid->gto_values);
216 const double R = 5.0;
217 const double R3 = R * R * R;
223 if (nr <= grid->nr) {
228 for (
int i = 1;
i <= nr;
i += 2) {
229 double xi =
i / (nr + 1.0);
230 double xi3 = xi * xi * xi;
231 double ln_xi = log(1 - xi3);
232 double wi = 3 * R3 * xi * xi * ln_xi * ln_xi / ((1 - xi3) * (nr + 1.0));
233 double ri = -R * ln_xi;
238 grid->params->potential(ri,
grid->params->potential_params);
241 for (
int lambda = 0; lambda <=
grid->lambda_max; lambda++) {
242 double kr =
grid->params->k * ri;
244 grid->mod_bessel[lambda][
idx] = bessel;
247 for (
int n = 0; n <=
grid->n_max; n++) {
248 grid->r_N[n][
idx] = pow(ri, n);
257 int lambda,
double tolerance,
262 double prev_sum = 0.0;
267 double *pot_values =
grid->pot_values;
268 double *gto_values =
grid->gto_values;
269 double *r_N =
grid->r_N[n];
270 double *mod_bessel =
grid->mod_bessel[lambda];
297 for (
int i = 0;
i < nr;
i++) {
298 sum += w[
i] * pot_values[
i] * gto_values[
i] * r_N[
i] * mod_bessel[
i];
317 for (
int i =
idx;
i < nr;
i++) {
318 sum += w[
i] * pot_values[
i] * gto_values[
i] * r_N[
i] * mod_bessel[
i];
325 *converged = fabs(sum - prev_sum) <= tolerance;
327 }
while (!(*converged));
static GRID_HOST_DEVICE int idx(const orbital a)
Return coset index of given orbital angular momentum.
static void const int const int const int const int const int const double const int const int const int int GRID_CONST_WHEN_COLLOCATE double GRID_CONST_WHEN_INTEGRATE double * grid
static void const int const int i
libgrpp_parameters_t libgrpp_params
double libgrpp_get_radial_type1_integral(radial_type1_table_t *table, int lambda, int n)
static void delete_radial_type1_grid(radial_type1_grid_t *grid)
static double calculate_radial_type1_integral(radial_type1_grid_t *grid, int n, int lambda, double tolerance, int *converged)
static radial_type1_grid_t * create_radial_type1_grid(int lambda_max, int n_max, radial_type1_params_t *params)
radial_type1_table_t * libgrpp_tabulate_radial_type1_integrals(int lambda_max, int n_max, double CA_2, double CB_2, double alpha_A, double alpha_B, double k, double prefactor, double(*potential)(double r, void *params), void *potential_params)
static double radial_type1_integrand_fun(double r, radial_type1_params_t *params)
static void expand_radial_type1_grid(radial_type1_grid_t *grid, int nr)
void libgrpp_delete_radial_type1_integrals(radial_type1_table_t *table)
double libgrpp_modified_bessel_scaled(int n, double x)
void free_2d(double **array, int n)
double ** alloc_zeros_2d(int n, int m)
radial_type1_params_t * params
double(* potential)(double r, void *params)
double * radial_integrals