Collocation Example¶
Single Basis Functions¶
A collocation grid between a single basis and a Cartesian grid can be computed
with the gg_collocation() function. For example, we will use a grid
starting at the origin along the z axis and a S shell at the origin:
#include <stdio.h>
#include "gau2grid.h"
int main() {
// Generate grid
long int npoints = 5;
double xyz[15] = {0, 0, 0, 0, 0, // x components
0, 0, 0, 0, 0}; // y components
0, 1, 2, 3, 4}; // z components
long int xyz_stride = 1; // This is a contiguous format
// Gaussian data
int nprim = 1;
double coef[1] = {1};
double exp[1] = {1};
double center[3] = {0, 0, 0};
int order = GG_CARTESIAN_CCA; // Use cartesian components
double s_output[5] = {0};
gg_collocation(0, // The angular momentum
npoints, xyz, xyz_stride, // Grid data
nprim, coef, exp, center, order, // Gaussian data
s_output); // Output
// Print output to stdout
for (int i = 0; i < npoints; i += 1) {
printf("%lf ", s_output[i]);
}
printf("\n");
}
The resulting output should be:
1.000000 0.367879 0.018316 0.000123 0.000000
For higher angular momentum functions that output size should ncomponents x
npoints in size. Where each component is on a unique row or the X
component starts at position 0, the Y component starts at position
5, and the Z component starts at position 10 as out grid is of
length 5. See Gaussian Component Orders for more details or order output.
The xyz input shape can either be organized contiguously in each dimension like
the above or packed in a xyz, xyz, … fashion. If the xyz_stride is not 1,
the shape refers to the strides per row. For example, if the data is packed as
xyzw, xyzw, … (where w could be a DFT grid weight) the xyz_stride should
be 4.
long int xyz_stride = 3;
double xyz[15] = {0, 0, 0,
0, 0, 1,
0, 0, 2,
0, 0, 3,
0, 0, 4}; // xyz, xyz, ... format
gg_collocation(0, // The angular momentum
npoints, xyz, xyz_stride, // Grid data
nprim, coef, exp, center, order, // Gaussian data
s_output); // Output
Multiple Basis Functions¶
Often collocation matrices are computed for multiple basis functions at once. The below is an example of usage:
#include <stdio.h>
#include "gau2grid.h"
int main() {
// Generate grid
long int npoints = 5;
double xyz[15] = {0, 0, 0, 0, 0, // x components
0, 0, 0, 0, 0}; // y components
0, 1, 2, 3, 4}; // z components
long int xyz_stride = 1;
// Gaussian data
int nprim = 1;
double coef[1] = {1};
double exp[1] = {1};
double center[3] = {0, 0, 0};
int order = GG_SPHERICAL_CCA; // Use cartesian components
// Size ncomponents * npoints, (1 + 3 + 5) * 5
double output[45] = {0};
int row = 0;
for (int L = 0; L < 3; L++) {
gg_collocation(L, // The angular momentum
npoints, xyz, xyz_stride // Grid data
nprim, coef, exp, center, order, // Gaussian data
output + (row * npoints)); // Output, shift pointer
row += gg_ncomponents(L, spherical); // Increment rows skipped
}
// Print out by row
for (int i = 0; i < row; i += 1) {
for (int j = 0; j < npoints; j += 1) {
printf("%lf ", output[i * npoints + j]);
}
printf("\n");
}
}
The resulting output should be:
1.000000 0.367879 0.018316 0.000123 0.000000 // S
0.000000 0.367879 0.036631 0.000370 0.000000 // P_0
0.000000 0.000000 0.000000 0.000000 0.000000 // P^+_0
0.000000 0.000000 0.000000 0.000000 0.000000 // P^-_0
0.000000 0.367879 0.073263 0.001111 0.000002 // D_0
0.000000 0.000000 0.000000 0.000000 0.000000 // D^+_1
0.000000 0.000000 0.000000 0.000000 0.000000 // D^-_1
0.000000 0.000000 0.000000 0.000000 0.000000 // D^+_2
0.000000 0.000000 0.000000 0.000000 0.000000 // D^-_2