23void return_dh(
void *
const ptr,
const int level,
double *
const dh) {
27 dh[0] = ctx->
grid[level].
dh[0][0];
28 dh[1] = ctx->
grid[level].
dh[0][1];
29 dh[2] = ctx->
grid[level].
dh[0][2];
30 dh[3] = ctx->
grid[level].
dh[1][0];
31 dh[4] = ctx->
grid[level].
dh[1][1];
32 dh[5] = ctx->
grid[level].
dh[1][2];
33 dh[6] = ctx->
grid[level].
dh[2][0];
34 dh[7] = ctx->
grid[level].
dh[2][1];
35 dh[8] = ctx->
grid[level].
dh[2][2];
38void return_dh_inv(
void *
const ptr,
const int level,
double *
const dh_inv) {
80 const double atoms_positions[natoms][3],
90 if (natoms > data->
natoms) {
100 for (
int i = 0;
i < natoms;
i++) {
110 assert(data != NULL);
117 data->
atom_kinds = malloc(natoms *
sizeof(
int));
126 memcpy(data->
atom_kinds, atoms_kinds,
sizeof(
int) * natoms);
128 for (
int i = 0;
i < natoms;
i++) {
135 assert(data != NULL);
152 memcpy(data->
block_offsets, block_offsets, nblocks *
sizeof(
int));
172 const int *
const level_list,
const int *
const iatom_list,
173 const int *
const jatom_list,
const int *
const iset_list,
174 const int *
const jset_list,
const int *
const ipgf_list,
175 const int *
const jpgf_list,
176 const int *
const border_mask_list,
177 const int *block_num_list,
178 const double *
const radius_list,
188 size_t size = nlevels *
sizeof(int);
190 ctx->
tasks = malloc(nlevels *
sizeof(
_task *));
193 ctx->
tasks[0] = malloc(ntasks *
sizeof(
_task));
195 ctx->
tasks[0] = NULL;
200 assert(ctx->
tasks != NULL);
204 assert(ctx->
tasks[0] != NULL);
214 for (
int i = 0;
i < ntasks;
i++) {
216 assert(
i == 0 || level_list[
i] >= level_list[
i - 1]);
224#pragma omp parallel for schedule(static) if (ntasks > GRID_OMP_MIN_ITERATIONS)
225 for (
int i = 0;
i < ntasks;
i++) {
226 _task *
const task = &tasks[
i];
227 task->
level = level_list[
i] - 1;
228 task->
iatom = iatom_list[
i] - 1;
229 task->
jatom = jatom_list[
i] - 1;
230 task->
iset = iset_list[
i] - 1;
231 task->
jset = jset_list[
i] - 1;
232 task->
ipgf = ipgf_list[
i] - 1;
233 task->
jpgf = jpgf_list[
i] - 1;
237 task->
rab[0] = rab_list[
i][0];
238 task->
rab[1] = rab_list[
i][1];
239 task->
rab[2] = rab_list[
i][2];
240 const int iatom = task->
iatom;
241 const int jatom = task->
jatom;
242 const int iset = task->
iset;
243 const int jset = task->
jset;
244 const int ipgf = task->
ipgf;
245 const int jpgf = task->
jpgf;
250 const int ncoseta =
ncoset(ibasis->
lmax[iset]);
251 const int ncosetb =
ncoset(jbasis->
lmax[jset]);
257 const double zetp = task->
zeta[0] + task->
zeta[1];
258 const double f = task->
zeta[1] / zetp;
259 const double rab2 = task->
rab[0] * task->
rab[0] +
260 task->
rab[1] * task->
rab[1] +
261 task->
rab[2] * task->
rab[2];
266 for (
int i = 0;
i < 3;
i++) {
268 task->
rp[
i] = ra[
i] + f * task->
rab[
i];
278 block_num_list[
i] != block_num_list[
i - 1] ||
279 iset_list[
i] != iset_list[
i - 1] ||
280 jset_list[
i] != jset_list[
i - 1];
282 task->
offset[0] = ipgf * ncoseta;
283 task->
offset[1] = jpgf * ncosetb;
295 const int shift_local[nlevels][3],
296 const int border_width[nlevels][3],
297 const double dh[nlevels][3][3],
298 const double dh_inv[nlevels][3][3],
grid_context *ctx) {
309 for (
int level = 0; level < nlevels; level++) {
310 for (
int i = 0;
i < 3;
i++) {
315 for (
int j = 0; j < 3; j++) {
330 if (ctx->
grid == NULL) {
337 assert(ctx->
grid != NULL);
344 const bool orthorhombic,
const int ntasks,
const int nlevels,
345 const int natoms,
const int nkinds,
const int nblocks,
346 const int *block_offsets,
const double atom_positions[natoms][3],
347 const int *
const atom_kinds,
const grid_basis_set **
const basis_sets,
348 const int *
const level_list,
const int *
const iatom_list,
349 const int *jatom_list,
const int *
const iset_list,
350 const int *
const jset_list,
const int *
const ipgf_list,
351 const int *
const jpgf_list,
const int *
const border_mask_list,
352 const int *block_num_list,
const double *
const radius_list,
353 const double rab_list[ntasks][3],
const int npts_global[nlevels][3],
354 const int npts_local[nlevels][3],
const int shift_local[nlevels][3],
355 const int border_width[nlevels][3],
const double dh[nlevels][3][3],
356 const double dh_inv[nlevels][3][3]) {
369 iset_list, jset_list, ipgf_list, jpgf_list,
370 border_mask_list, block_num_list, radius_list, rab_list,
391 const bool orthorhombic,
const int ntasks,
const int nlevels,
392 const int natoms,
const int nkinds,
const int nblocks,
393 const int *block_offsets,
const double atom_positions[natoms][3],
394 const int *
const atom_kinds,
const grid_basis_set **
const basis_sets,
395 const int *
const level_list,
const int *
const iatom_list,
396 const int *jatom_list,
const int *
const iset_list,
397 const int *
const jset_list,
const int *
const ipgf_list,
398 const int *
const jpgf_list,
const int *
const border_mask_list,
399 const int *block_num_list,
const double *
const radius_list,
400 const double rab_list[ntasks][3],
const int npts_global[nlevels][3],
401 const int npts_local[nlevels][3],
const int shift_local[nlevels][3],
402 const int border_width[nlevels][3],
const double dh[nlevels][3][3],
403 const double dh_inv[nlevels][3][3],
void *ptr) {
415 iset_list, jset_list, ipgf_list, jpgf_list,
416 border_mask_list, block_num_list, radius_list, rab_list,
424 for (
int i = 0;
i < nkinds;
i++) {
430 const int *device_id) {
435 if (number_of_devices <= 0) {
442 ctx->
device_id = malloc(
sizeof(
int) * number_of_devices);
448 memcpy(ctx->
device_id, device_id,
sizeof(
int) * number_of_devices);
486 const int grid_full_size[3],
487 const int grid_local_size[3],
488 const int shift_local[3],
490 const int border_width[3],
493 const double dh_inv[3][3],
500 grid->ld_ = grid_local_size[0];
505 if ((grid_local_size[0] != grid_full_size[0]) ||
506 (grid_local_size[1] != grid_full_size[1]) ||
507 (grid_local_size[2] != grid_full_size[2])) {
510 grid->window_shift[0] = 0;
511 grid->window_shift[1] = 0;
512 grid->window_shift[2] = 0;
514 grid->window_size[0] =
grid->size[0];
515 grid->window_size[1] =
grid->size[1];
516 grid->window_size[2] =
grid->size[2];
519 grid->dh[0][0] = dh[0][0];
520 grid->dh[0][1] = dh[0][1];
521 grid->dh[0][2] = dh[0][2];
522 grid->dh[1][0] = dh[1][0];
523 grid->dh[1][1] = dh[1][1];
524 grid->dh[1][2] = dh[1][2];
525 grid->dh[2][0] = dh[2][0];
526 grid->dh[2][1] = dh[2][1];
527 grid->dh[2][2] = dh[2][2];
529 grid->dh_inv[0][0] = dh_inv[0][0];
530 grid->dh_inv[0][1] = dh_inv[0][1];
531 grid->dh_inv[0][2] = dh_inv[0][2];
532 grid->dh_inv[1][0] = dh_inv[1][0];
533 grid->dh_inv[1][1] = dh_inv[1][1];
534 grid->dh_inv[1][2] = dh_inv[1][2];
535 grid->dh_inv[2][0] = dh_inv[2][0];
536 grid->dh_inv[2][1] = dh_inv[2][1];
537 grid->dh_inv[2][2] = dh_inv[2][2];
542 grid->orthogonal[0] =
true;
543 grid->orthogonal[1] =
true;
544 grid->orthogonal[2] =
true;
553 const bool orthorhombic,
const int ntasks,
const int nlevels,
554 const int natoms,
const int nkinds,
const int nblocks,
555 const int block_offsets[nblocks],
const double atom_positions[natoms][3],
556 const int atom_kinds[natoms],
const grid_basis_set *basis_sets[nkinds],
557 const int level_list[ntasks],
const int iatom_list[ntasks],
558 const int jatom_list[ntasks],
const int iset_list[ntasks],
559 const int jset_list[ntasks],
const int ipgf_list[ntasks],
560 const int jpgf_list[ntasks],
const int border_mask_list[ntasks],
561 const int block_num_list[ntasks],
const double radius_list[ntasks],
562 const double rab_list[ntasks][3],
const int npts_global[nlevels][3],
563 const int npts_local[nlevels][3],
const int shift_local[nlevels][3],
564 const int border_width[nlevels][3],
const double dh[nlevels][3][3],
567 if (*task_list == NULL) {
569 orthorhombic, ntasks, nlevels, natoms, nkinds, nblocks, block_offsets,
570 atom_positions, atom_kinds, basis_sets, level_list, iatom_list,
571 jatom_list, iset_list, jset_list, ipgf_list, jpgf_list,
572 border_mask_list, block_num_list, radius_list, rab_list, npts_global,
573 npts_local, shift_local, border_width, dh, dh_inv);
576 orthorhombic, ntasks, nlevels, natoms, nkinds, nblocks, block_offsets,
577 atom_positions, atom_kinds, basis_sets, level_list, iatom_list,
578 jatom_list, iset_list, jset_list, ipgf_list, jpgf_list,
579 border_mask_list, block_num_list, radius_list, rab_list, npts_global,
580 npts_local, shift_local, border_width, dh, dh_inv, *task_list);
584 if (
config.apply_cutoff) {
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard).
static GRID_HOST_DEVICE int ncoset(const int l)
Number of Cartesian orbitals up to given angular momentum quantum.
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]
void collocate_destroy_handle(void *gaussian_handle)
struct collocation_integration_ * collocate_create_handle(void)
void update_layouts(const int nlevels, const int npts_global[nlevels][3], const int npts_local[nlevels][3], const int shift_local[nlevels][3], const int border_width[nlevels][3], const double dh[nlevels][3][3], const double dh_inv[nlevels][3][3], grid_context *ctx)
void update_grid(const int nlevels, grid_context *ctx)
void update_atoms_kinds(const int natoms, const int *atoms_kinds, grid_context *data)
void update_grid_context_dgemm(const bool orthorhombic, const int ntasks, const int nlevels, const int natoms, const int nkinds, const int nblocks, const int *block_offsets, const double atom_positions[natoms][3], const int *const atom_kinds, const grid_basis_set **const basis_sets, const int *const level_list, const int *const iatom_list, const int *jatom_list, const int *const iset_list, const int *const jset_list, const int *const ipgf_list, const int *const jpgf_list, const int *const border_mask_list, const int *block_num_list, const double *const radius_list, const double rab_list[ntasks][3], const int npts_global[nlevels][3], const int npts_local[nlevels][3], const int shift_local[nlevels][3], const int border_width[nlevels][3], const double dh[nlevels][3][3], const double dh_inv[nlevels][3][3], void *ptr)
void * create_grid_context_dgemm(const bool orthorhombic, const int ntasks, const int nlevels, const int natoms, const int nkinds, const int nblocks, const int *block_offsets, const double atom_positions[natoms][3], const int *const atom_kinds, const grid_basis_set **const basis_sets, const int *const level_list, const int *const iatom_list, const int *jatom_list, const int *const iset_list, const int *const jset_list, const int *const ipgf_list, const int *const jpgf_list, const int *const border_mask_list, const int *block_num_list, const double *const radius_list, const double rab_list[ntasks][3], const int npts_global[nlevels][3], const int npts_local[nlevels][3], const int shift_local[nlevels][3], const int border_width[nlevels][3], const double dh[nlevels][3][3], const double dh_inv[nlevels][3][3])
int is_grid_orthorhombic(void *const ptr)
void update_block_offsets(const int nblocks, const int *const block_offsets, grid_context *data)
int return_device_id(void *const ptr, const int device)
void destroy_grid_context_dgemm(void *ptr)
void return_dh(void *const ptr, const int level, double *const dh)
void update_task_lists(const int nlevels, const int ntasks, const int *const level_list, const int *const iatom_list, const int *const jatom_list, const int *const iset_list, const int *const jset_list, const int *const ipgf_list, const int *const jpgf_list, const int *const border_mask_list, const int *block_num_list, const double *const radius_list, const double rab_list[ntasks][3], grid_context *ctx)
void apply_cutoff(void *ptr)
int return_num_devs(void *const ptr)
void return_dh_inv(void *const ptr, const int level, double *const dh_inv)
void update_basis_set(const int nkinds, const grid_basis_set **const basis_sets, grid_context *data)
void grid_dgemm_create_task_list(const bool orthorhombic, const int ntasks, const int nlevels, const int natoms, const int nkinds, const int nblocks, const int block_offsets[nblocks], const double atom_positions[natoms][3], const int atom_kinds[natoms], const grid_basis_set *basis_sets[nkinds], const int level_list[ntasks], const int iatom_list[ntasks], const int jatom_list[ntasks], const int iset_list[ntasks], const int jset_list[ntasks], const int ipgf_list[ntasks], const int jpgf_list[ntasks], const int border_mask_list[ntasks], const int block_num_list[ntasks], const double radius_list[ntasks], const double rab_list[ntasks][3], const int npts_global[nlevels][3], const int npts_local[nlevels][3], const int shift_local[nlevels][3], const int border_width[nlevels][3], const double dh[nlevels][3][3], const double dh_inv[nlevels][3][3], grid_dgemm_task_list **task_list)
Allocates a task list for the dgemm backend. See grid_task_list.h for details.
void update_atoms_position(const int natoms, const double atoms_positions[natoms][3], grid_context *data)
void grid_dgemm_free_task_list(grid_dgemm_task_list *task_list)
Deallocates given task list, basis_sets have to be freed separately.
void update_queue_length(void *const ptr, const int queue_length)
void set_grid_parameters(tensor *grid, const bool orthorhombic, const int grid_full_size[3], const int grid_local_size[3], const int shift_local[3], const int border_width[3], const double dh[3][3], const double dh_inv[3][3], offload_buffer *grid_)
void initialize_grid_context_on_gpu(void *ptr, const int number_of_devices, const int *device_id)
void grid_dgemm_task_list
opaque pointer hidding the internal representation of the structure. It is not needed to know what ex...
static void setup_grid_window(tensor *const grid, const int *const shift_local, const int *const border_width, const int border_mask)
static void setup_global_grid_size(tensor *const grid, const int *const full_size)
static void initialize_tensor_3(struct tensor_ *a, int n1, int n2, int n3)
void verify_orthogonality(const double dh[3][3], bool orthogonal[3])
static grid_library_config config
grid_library_config grid_library_get_config(void)
Returns the library config.
Internal representation of a basis set.
grid_basis_set ** basis_sets
struct collocation_integration_ ** handler
Configuration of the grid library.
Internal representation of a buffer.