16#define GRID_DO_COLLOCATE 1
17#include "../common/grid_common.h"
29 const bool orthorhombic,
const int border_mask,
const enum grid_func func,
30 const int la_max,
const int la_min,
const int lb_max,
const int lb_min,
31 const double zeta,
const double zetb,
const double rscale,
32 const double dh[3][3],
const double dh_inv[3][3],
const double ra[3],
33 const double rab[3],
const int npts_global[3],
const int npts_local[3],
34 const int shift_local[3],
const int border_width[3],
const double radius,
35 const int o1,
const int o2,
const int n1,
const int n2,
36 const double pab[n2][n1],
const double *
grid) {
38 static int counter = 1;
42 my_number = counter++;
45 snprintf(filename,
sizeof(filename),
"grid_collocate_%05i.task", my_number);
47 const int D = DBL_DECIMAL_DIG;
48 FILE *fp = fopen(filename,
"w+");
49 fprintf(fp,
"#Grid task v10\n");
50 fprintf(fp,
"orthorhombic %i\n", orthorhombic);
51 fprintf(fp,
"border_mask %i\n", border_mask);
52 fprintf(fp,
"func %i\n", func);
53 fprintf(fp,
"la_max %i\n", la_max);
54 fprintf(fp,
"la_min %i\n", la_min);
55 fprintf(fp,
"lb_max %i\n", lb_max);
56 fprintf(fp,
"lb_min %i\n", lb_min);
57 fprintf(fp,
"zeta %.*e\n", D, zeta);
58 fprintf(fp,
"zetb %.*e\n", D, zetb);
59 fprintf(fp,
"rscale %.*e\n", D, rscale);
60 for (
int i = 0;
i < 3;
i++)
61 fprintf(fp,
"dh %i %.*e %.*e %.*e\n",
i, D, dh[
i][0], D, dh[
i][1], D,
63 for (
int i = 0;
i < 3;
i++)
64 fprintf(fp,
"dh_inv %i %.*e %.*e %.*e\n",
i, D, dh_inv[
i][0], D,
65 dh_inv[
i][1], D, dh_inv[
i][2]);
66 fprintf(fp,
"ra %.*e %.*e %.*e\n", D, ra[0], D, ra[1], D, ra[2]);
67 fprintf(fp,
"rab %.*e %.*e %.*e\n", D, rab[0], D, rab[1], D, rab[2]);
68 fprintf(fp,
"npts_global %i %i %i\n", npts_global[0], npts_global[1],
72 fprintf(fp,
"shift_local %i %i %i\n", shift_local[0], shift_local[1],
74 fprintf(fp,
"border_width %i %i %i\n", border_width[0], border_width[1],
76 fprintf(fp,
"radius %.*e\n", D, radius);
77 fprintf(fp,
"o1 %i\n", o1);
78 fprintf(fp,
"o2 %i\n", o2);
79 fprintf(fp,
"n1 %i\n", n1);
80 fprintf(fp,
"n2 %i\n", n2);
82 for (
int i = 0;
i < n2;
i++) {
83 for (
int j = 0; j < n1; j++) {
84 fprintf(fp,
"pab %i %i %.*e\n",
i, j, D, pab[
i][j]);
90 int ngrid_nonzero = 0;
91 for (
int i = 0;
i < npts_local_total;
i++) {
96 fprintf(fp,
"ngrid_nonzero %i\n", ngrid_nonzero);
104 fprintf(fp,
"grid %i %i %i %.*e\n",
i, j, k, D, val);
111 double forces[2][3] = {0};
112 double virials[2][3][3] = {0};
113 memset(hab, 0, n2 * n1 *
sizeof(
double));
118 la_min, lb_max, lb_min, zeta, zetb, dh, dh_inv,
119 ra, rab, npts_global,
npts_local, shift_local,
120 border_width, radius, o1, o2, n1, n2,
grid,
121 hab, pab, forces, virials, NULL, NULL, NULL);
123 for (
int i = o2;
i < ncoset(lb_max) + o2;
i++) {
124 for (
int j = o1; j < ncoset(la_max) + o1; j++) {
125 fprintf(fp,
"hab %i %i %.*e\n",
i, j, D, hab[
i][j]);
128 fprintf(fp,
"force_a %.*e %.*e %.*e\n", D, forces[0][0], D, forces[0][1], D,
130 fprintf(fp,
"force_b %.*e %.*e %.*e\n", D, forces[1][0], D, forces[1][1], D,
132 for (
int i = 0;
i < 3;
i++)
133 fprintf(fp,
"virial %i %.*e %.*e %.*e\n",
i, D,
134 virials[0][
i][0] + virials[1][
i][0], D,
135 virials[0][
i][1] + virials[1][
i][1], D,
136 virials[0][
i][2] + virials[1][
i][2]);
138 fprintf(fp,
"#THE_END\n");
140 printf(
"Wrote %s\n", filename);
149 const bool orthorhombic,
const int border_mask,
const enum grid_func func,
150 const int la_max,
const int la_min,
const int lb_max,
const int lb_min,
151 const double zeta,
const double zetb,
const double rscale,
152 const double dh[3][3],
const double dh_inv[3][3],
const double ra[3],
153 const double rab[3],
const int npts_global[3],
const int npts_local[3],
154 const int shift_local[3],
const int border_width[3],
const double radius,
155 const int o1,
const int o2,
const int n1,
const int n2,
156 const double pab[n2][n1],
double *
grid) {
158 int la_min_diff, la_max_diff, lb_min_diff, lb_max_diff;
162 const int la_min_cab =
imax(la_min + la_min_diff, 0);
163 const int lb_min_cab =
imax(lb_min + lb_min_diff, 0);
164 const int la_max_cab = la_max + la_max_diff;
165 const int lb_max_cab = lb_max + lb_max_diff;
166 const int n1_cab = ncoset(la_max_cab);
167 const int n2_cab = ncoset(lb_max_cab);
169 const size_t cab_size = n2_cab * n1_cab;
170 double cab[cab_size];
171 memset(cab, 0, cab_size *
sizeof(
double));
174 n1, n2, pab, n1_cab, n2_cab, (
double(*)[n1_cab])cab);
175 cab_to_grid(orthorhombic, border_mask, la_max_cab, la_min_cab, lb_max_cab,
176 lb_min_cab, zeta, zetb, rscale, dh, dh_inv, ra, rab, npts_global,
186 const bool orthorhombic,
const int border_mask,
const enum grid_func func,
187 const int la_max,
const int la_min,
const int lb_max,
const int lb_min,
188 const double zeta,
const double zetb,
const double rscale,
189 const double dh[3][3],
const double dh_inv[3][3],
const double ra[3],
190 const double rab[3],
const int npts_global[3],
const int npts_local[3],
191 const int shift_local[3],
const int border_width[3],
const double radius,
192 const int o1,
const int o2,
const int n1,
const int n2,
193 const double pab[n2][n1],
double *
grid) {
196 const bool DUMP_TASKS =
false;
198 double *grid_before = NULL;
202 const size_t sizeof_grid =
sizeof(double) * npts_local_total;
203 grid_before = malloc(sizeof_grid);
204 assert(grid_before != NULL);
205 memcpy(grid_before,
grid, sizeof_grid);
206 memset(
grid, 0, sizeof_grid);
210 lb_min, zeta, zetb, rscale, dh, dh_inv, ra, rab,
211 npts_global,
npts_local, shift_local, border_width, radius,
212 o1, o2, n1, n2, pab,
grid);
215 write_task_file(orthorhombic, border_mask, func, la_max, la_min, lb_max,
216 lb_min, zeta, zetb, rscale, dh, dh_inv, ra, rab,
217 npts_global,
npts_local, shift_local, border_width, radius,
218 o1, o2, n1, n2, pab,
grid);
220 for (
size_t i = 0;
i < npts_local_total;
i++) {
221 grid[
i] += grid_before[
i];
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
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
static void const int const int const int const int const int const double const int const int const int npts_local[3]
static void write_task_file(const bool orthorhombic, const int border_mask, const enum grid_func func, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const double rscale, const double dh[3][3], const double dh_inv[3][3], const double ra[3], const double rab[3], const int npts_global[3], const int npts_local[3], const int shift_local[3], const int border_width[3], const double radius, const int o1, const int o2, const int n1, const int n2, const double pab[n2][n1], const double *grid)
Writes the given arguments into a .task file. See grid_replay.h for details.
static void collocate_internal(const bool orthorhombic, const int border_mask, const enum grid_func func, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const double rscale, const double dh[3][3], const double dh_inv[3][3], const double ra[3], const double rab[3], const int npts_global[3], const int npts_local[3], const int shift_local[3], const int border_width[3], const double radius, const int o1, const int o2, const int n1, const int n2, const double pab[n2][n1], double *grid)
Collocates a single product of primitiv Gaussians. See grid_cpu_collocate.h for details.
void grid_cpu_collocate_pgf_product(const bool orthorhombic, const int border_mask, const enum grid_func func, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const double rscale, const double dh[3][3], const double dh_inv[3][3], const double ra[3], const double rab[3], const int npts_global[3], const int npts_local[3], const int shift_local[3], const int border_width[3], const double radius, const int o1, const int o2, const int n1, const int n2, const double pab[n2][n1], double *grid)
Public entry point. A thin wrapper with the only purpose of calling write_task_file when DUMP_TASKS =...
void grid_cpu_integrate_pgf_product(const bool orthorhombic, const bool compute_tau, const int border_mask, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const double dh[3][3], const double dh_inv[3][3], const double ra[3], const double rab[3], const int npts_global[3], const int npts_local[3], const int shift_local[3], const int border_width[3], const double radius, const int o1, const int o2, const int n1, const int n2, const double *grid, double hab[n2][n1], const double pab[n2][n1], double forces[2][3], double virials[2][3][3], double hdab[n2][n1][3], double hadb[n2][n1][3], double a_hdab[n2][n1][3][3])
Integrates a single task. See grid_cpu_integrate.h for details.
void grid_cpu_prepare_pab(const enum grid_func func, const int o1, const int o2, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const int n1, const int n2, const double pab[n2][n1], const int n1_prep, const int n2_prep, double pab_prep[n2_prep][n1_prep])
Selects and transforms a sub-block of the given density matrix block. See grid_cpu_prepare_pab....
void grid_cpu_prepare_get_ldiffs(const enum grid_func func, int *la_min_diff, int *la_max_diff, int *lb_min_diff, int *lb_max_diff)
Returns block size changes due to transformation grid_prepare_pab.
static void cab_to_grid(const bool orthorhombic, const int border_mask, const int la_max, const int la_min, const int lb_max, const int lb_min, const double zeta, const double zetb, const double rscale, const double dh[3][3], const double dh_inv[3][3], const double ra[3], const double rab[3], const int npts_global[3], const int npts_local[3], const int shift_local[3], const int border_width[3], const double radius, GRID_CONST_WHEN_COLLOCATE double *cab, GRID_CONST_WHEN_INTEGRATE double *grid)
Collocates coefficients C_ab onto the grid.