32#define M_PI 3.14159265358979323846
76 int lambda1,
int lambda2,
77 double tolerance,
int *converged);
91static void calc_k_values(
int nprim,
const double *alpha,
double CA,
double *k);
99 int lambda1_max,
int lambda2_max,
int n_max,
double CA_2,
double CB_2,
109 table->
n_max = n_max;
111 (lambda1_max + 1) * (lambda2_max + 1) * (n_max + 1),
sizeof(double));
116 if (CA_2 < 1e-14 && CB_2 < 1e-14) {
119 double alpha_A = bra->
alpha[
i];
124 double alpha_B = ket->
alpha[j];
125 double coef_j = ket->
coeffs[j] *
129 double eta = potential->
alpha[k];
130 int ni = potential->
powers[k];
131 double coef_k = potential->
coeffs[k];
133 double p = alpha_A + alpha_B + eta;
134 double factor = coef_i * coef_j * coef_k;
136 for (
int n = 0; n <= n_max; n++) {
153 params.
CA = sqrt(CA_2);
154 params.
CB = sqrt(CB_2);
174 for (
int lambda_1 = 0; lambda_1 <= lambda1_max; lambda_1++) {
175 for (
int lambda_2 = 0; lambda_2 <= lambda2_max; lambda_2++) {
176 for (
int n = 0; n <= n_max; n++) {
183 int dim2 = lambda2_max + 1;
184 int dimn = n_max + 1;
214 int lambda1,
int lambda2,
int n) {
217 int n_max = table->
n_max;
219 int dim2 = lambda2_max + 1;
220 int dimn = n_max + 1;
233 int lambda1,
int lambda2,
239 double prev_sum = 0.0;
244 double *pot_values =
grid->rpp_values;
245 double *F1 =
grid->F1[lambda1];
246 double *F2 =
grid->F2[lambda2];
247 double *r_N =
grid->r_N[n];
252 double CA =
grid->params->CA;
253 double CB =
grid->params->CB;
255 double screened = 0.0;
257 lambda1, lambda2, n, CA * CA, CB * CB,
grid->params->bra,
258 grid->params->ket,
grid->params->potential, &screened);
260 if (screen_success == EXIT_SUCCESS && fabs(screened) < tolerance) {
268 for (
int i = 0;
i < nr;
i++) {
269 sum += w[
i] * pot_values[
i] * F1[
i] * F2[
i] * r_N[
i];
287 for (
int i =
idx;
i < nr;
i++) {
288 sum += w[
i] * pot_values[
i] * F1[
i] * F2[
i] * r_N[
i];
291 if (screen_success == EXIT_SUCCESS &&
292 (fabs(sum) / fabs(screened) < 0.001)) {
297 *converged = fabs(sum - prev_sum) <= tolerance;
299 }
while (!(*converged));
315 grid->lambda1_max = lambda1_max;
316 grid->lambda2_max = lambda2_max;
317 grid->params = params;
336 const double R = 5.0;
337 const double R3 = R * R * R;
339 for (
int i = 1;
i <= nr;
i++) {
340 double xi =
i / (nr + 1.0);
341 double xi3 = xi * xi * xi;
342 double ln_xi = log(1 - xi3);
343 double wi = 3 * R3 * xi * xi * ln_xi * ln_xi / ((1 - xi3) * (nr + 1.0));
344 double ri = -R * ln_xi;
348 grid->rpp_values[
i - 1] =
350 for (
int n = 0; n <= n_max; n++) {
351 grid->r_N[n][
i - 1] = pow(ri, n);
353 for (
int lambda1 = 0; lambda1 <= lambda1_max; lambda1++) {
355 ri, lambda1, bra_k, params->
CA, params->
bra);
357 for (
int lambda2 = 0; lambda2 <= lambda2_max; lambda2++) {
359 ri, lambda2, ket_k, params->
CB, params->
ket);
373 const double R = 5.0;
374 const double R3 = R * R * R;
380 if (nr <= grid->nr) {
396 for (
int i = 1;
i <= nr;
i += 2) {
397 double xi =
i / (nr + 1.0);
398 double xi3 = xi * xi * xi;
399 double ln_xi = log(1 - xi3);
400 double wi = 3 * R3 * xi * xi * ln_xi * ln_xi / ((1 - xi3) * (nr + 1.0));
401 double ri = -R * ln_xi;
408 for (
int n = 0; n <=
grid->n_max; n++) {
409 grid->r_N[n][
idx] = pow(ri, n);
412 for (
int lambda1 = 0; lambda1 <=
grid->lambda1_max; lambda1++) {
414 ri, lambda1, bra_k,
grid->params->CA, params->
bra);
416 for (
int lambda2 = 0; lambda2 <=
grid->lambda2_max; lambda2++) {
418 ri, lambda2, ket_k,
grid->params->CB, params->
ket);
436 free(
grid->rpp_values);
450 double r_CA_2 = (r - CA) * (r - CA);
453 double *alpha = gauss_fun->
alpha;
454 double *coeffs = gauss_fun->
coeffs;
456 for (
int i = 0;
i < nprim;
i++) {
457 double power = -alpha[
i] * r_CA_2;
458 F += coeffs[
i] * exp(power) *
467 for (
int i = 0;
i < nprim;
i++) {
468 k[
i] = 2.0 * alpha[
i] * CA;
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
double libgrpp_gaussian_norm_factor(int n, int l, int m, double alpha)
double libgrpp_potential_value(libgrpp_potential_t *potential, double r)
void libgrpp_delete_potential(libgrpp_potential_t *potential)
libgrpp_potential_t * libgrpp_shrink_potential(libgrpp_potential_t *src_potential)
double libgrpp_gaussian_integral(int n, double a)
static double calculate_radial_type2_integral(radial_type2_grid_t *grid, int n, int lambda1, int lambda2, double tolerance, int *converged)
static void expand_radial_type2_grid(radial_type2_grid_t *grid, int nr)
void libgrpp_delete_radial_type2_integrals(radial_type2_table_t *table)
double libgrpp_get_radial_type2_integral(radial_type2_table_t *table, int lambda1, int lambda2, int n)
radial_type2_table_t * libgrpp_tabulate_radial_type2_integrals(int lambda1_max, int lambda2_max, int n_max, double CA_2, double CB_2, libgrpp_potential_t *potential, libgrpp_shell_t *bra, libgrpp_shell_t *ket)
static void calc_k_values(int nprim, const double *alpha, double CA, double *k)
static double radial_type2_integrand_fun_contracted(double r, int lambda, double *k, double CA, libgrpp_shell_t *gauss_fun)
static radial_type2_grid_t * create_radial_type2_grid(int lambda1_max, int lambda2_max, int n_max, radial_type2_params_t *params)
static void delete_radial_type2_grid(radial_type2_grid_t *grid)
int libgrpp_screening_radial_type2(int lambda1, int lambda2, int n, double CA_2, double CB_2, libgrpp_shell_t *bra, libgrpp_shell_t *ket, libgrpp_potential_t *potential, double *screened_value)
void libgrpp_delete_shell(libgrpp_shell_t *shell)
void libgrpp_shell_mult_normcoef(libgrpp_shell_t *shell)
libgrpp_shell_t * libgrpp_shell_deep_copy(libgrpp_shell_t *src_shell)
void libgrpp_shell_shrink(libgrpp_shell_t *shell)
double libgrpp_modified_bessel_scaled(int n, double x)
void free_2d(double **array, int n)
double * alloc_zeros_1d(int n)
double ** alloc_zeros_2d(int n, int m)
radial_type2_params_t * params
libgrpp_potential_t * potential
double * radial_integrals