(git:374b731)
Loading...
Searching...
No Matches
grid_dgemm_collocation_integration.c
Go to the documentation of this file.
1/*----------------------------------------------------------------------------*/
2/* CP2K: A general program to perform molecular dynamics simulations */
3/* Copyright 2000-2024 CP2K developers group <https://cp2k.org> */
4/* */
5/* SPDX-License-Identifier: BSD-3-Clause */
6/*----------------------------------------------------------------------------*/
7
8#include <stdbool.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include <unistd.h>
13
14#include "../common/grid_common.h"
18#include "grid_dgemm_utils.h"
19
21 struct collocation_integration_ *handle = NULL;
22 handle = (struct collocation_integration_ *)malloc(
23 sizeof(struct collocation_integration_));
24
25 if (handle == NULL) {
26 abort();
27 }
28 memset(handle, 0, sizeof(struct collocation_integration_));
29
30 handle->alpha.alloc_size_ = 8192;
31 handle->coef.alloc_size_ = 1024;
32 handle->pol.alloc_size_ = 1024;
33 /* it is a cube of size 32 x 32 x 32 */
34 handle->cube.alloc_size_ = 32768;
35
36 handle->cube_alloc_size = realloc_tensor(&handle->cube);
37 handle->alpha_alloc_size = realloc_tensor(&handle->alpha);
38 handle->coef_alloc_size = realloc_tensor(&handle->coef);
39 handle->pol_alloc_size = realloc_tensor(&handle->pol);
40
41 handle->scratch = malloc(32768 * sizeof(double));
42 handle->scratch_alloc_size = 32768;
43 handle->T_alloc_size = 8192;
44 handle->W_alloc_size = 2048;
45 handle->blockDim[0] = 5;
46 handle->blockDim[1] = 5;
47 handle->blockDim[2] = 5;
48 handle->device_id = (int *)malloc(sizeof(double) * 12);
49 handle->number_of_devices = 1;
50
51 /* to suppress when we remove the spherical cutoff */
52 handle->map = (int **)malloc(3 * sizeof(int *));
53 handle->map[0] = (int *)malloc(sizeof(int) * 512 * 3);
54 handle->map[1] = handle->map[0] + 512;
55 handle->map[2] = handle->map[1] + 512;
56 handle->cmax = 512 * 3;
57 return handle;
58}
59
60void collocate_destroy_handle(void *gaussian_handle) {
61 struct collocation_integration_ *handle =
62 (struct collocation_integration_ *)gaussian_handle;
63 if (handle->Exp.data)
64 free(handle->Exp.data);
65
66 if (handle->grid.data)
67 free(handle->grid.data);
68
69 free(handle->scratch);
70 free(handle->pol.data);
71 free(handle->cube.data);
72 free(handle->alpha.data);
73 free(handle->coef.data);
74 free(handle->blocks_coordinates.data);
75 handle->alpha.data = NULL;
76 handle->coef.data = NULL;
77 handle->blocks_coordinates.data = NULL;
78 free(handle->device_id);
79 free(handle->map[0]);
80 free(handle->map);
81 free(handle);
82
83 handle = NULL;
84}
85
87 const tensor *cube, const tensor *coef) {
88 size_t tmp1 = compute_memory_space_tensor_3(coef->size[0] /* alpha */,
89 coef->size[1] /* gamma */,
90 cube->size[1] /* j */);
91
93 coef->size[0] /* gamma */, cube->size[1] /* j */, cube->size[2] /* i */);
94
95 const size_t mem_alloc_size_ =
96 imax(imax(tmp1 + tmp2, cube->alloc_size_), coef->alloc_size_);
97
98 handler->T_alloc_size = tmp1;
99 handler->W_alloc_size = tmp2;
100
101 if ((mem_alloc_size_ > handler->scratch_alloc_size) ||
102 (handler->scratch == NULL)) {
103 handler->scratch_alloc_size = mem_alloc_size_;
104
105 if (handler->scratch)
106 free(handler->scratch);
107 handler->scratch = malloc(sizeof(double) * handler->scratch_alloc_size);
108 if (handler->scratch == NULL)
109 abort();
110 }
111}
112
114 const int num_block, const tensor *coef,
115 const tensor *block) {
116 /* T */
117 size_t tmp1 = compute_memory_space_tensor_4(num_block, block->size[0] /* k */,
118 block->size[1] /* j */,
119 coef->size[1] /* alpha */);
120
121 /* W */
122 size_t tmp2 = compute_memory_space_tensor_4(num_block, block->size[1] /* j */,
123 coef->size[1] /* alpha */,
124 coef->size[2] /* gamma */);
125
126 const size_t mem_alloc_size_ = tmp1 + tmp2;
127
128 handler->T_alloc_size = tmp1;
129 handler->W_alloc_size = tmp2;
130
131 if ((mem_alloc_size_ > handler->scratch_alloc_size) ||
132 (handler->scratch == NULL)) {
133 handler->scratch_alloc_size = mem_alloc_size_;
134
135 if (handler->scratch)
136 free(handler->scratch);
137 handler->scratch = malloc(sizeof(double) * handler->scratch_alloc_size);
138 if (handler->scratch == NULL)
139 abort();
140 }
141}
142
144 const double dh[3][3],
145 const double dh_inv[3][3]) {
146 handler->dh[0][0] = dh[0][0];
147 handler->dh[0][1] = dh[0][1];
148 handler->dh[0][2] = dh[0][2];
149 handler->dh[1][0] = dh[1][0];
150 handler->dh[1][1] = dh[1][1];
151 handler->dh[1][2] = dh[1][2];
152 handler->dh[2][0] = dh[2][0];
153 handler->dh[2][1] = dh[2][1];
154 handler->dh[2][2] = dh[2][2];
155
156 handler->dh_inv[0][0] = dh_inv[0][0];
157 handler->dh_inv[0][1] = dh_inv[0][1];
158 handler->dh_inv[0][2] = dh_inv[0][2];
159 handler->dh_inv[1][0] = dh_inv[1][0];
160 handler->dh_inv[1][1] = dh_inv[1][1];
161 handler->dh_inv[1][2] = dh_inv[1][2];
162 handler->dh_inv[2][0] = dh_inv[2][0];
163 handler->dh_inv[2][1] = dh_inv[2][1];
164 handler->dh_inv[2][2] = dh_inv[2][2];
165
166 /* Only used when we are in the non orthorombic case */
167 handler->dx[2] = handler->dh[0][0] * handler->dh[0][0] +
168 handler->dh[0][1] * handler->dh[0][1] +
169 handler->dh[0][2] * handler->dh[0][2];
170 handler->dx[1] = handler->dh[1][0] * handler->dh[1][0] +
171 handler->dh[1][1] * handler->dh[1][1] +
172 handler->dh[1][2] * handler->dh[1][2];
173 handler->dx[0] = handler->dh[2][0] * handler->dh[2][0] +
174 handler->dh[2][1] * handler->dh[2][1] +
175 handler->dh[2][2] * handler->dh[2][2];
176}
static int imax(int x, int y)
Returns the larger of two given integer (missing from the C standard)
void initialize_basis_vectors(collocation_integration *const handler, const double dh[3][3], const double dh_inv[3][3])
void initialize_W_and_T_integrate(collocation_integration *const handler, const int num_block, const tensor *coef, const tensor *block)
void collocate_destroy_handle(void *gaussian_handle)
void initialize_W_and_T(collocation_integration *const handler, const tensor *cube, const tensor *coef)
struct collocation_integration_ * collocate_create_handle(void)
size_t realloc_tensor(tensor *t)
static size_t compute_memory_space_tensor_4(const int n1, const int n2, const int n3, const int n4)
static size_t compute_memory_space_tensor_3(const int n1, const int n2, const int n3)