(git:97501a3)
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-2025 CP2K developers group <https://cp2k.org> */
4/* */
5/* SPDX-License-Identifier: BSD-3-Clause */
6/*----------------------------------------------------------------------------*/
7
8#include <assert.h>
9#include <stdbool.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <unistd.h>
14
15#include "../common/grid_common.h"
19#include "grid_dgemm_utils.h"
20
22 struct collocation_integration_ *handle =
23 malloc(sizeof(struct collocation_integration_));
24 assert(handle != NULL);
25 memset(handle, 0, sizeof(struct collocation_integration_));
26
27 handle->alpha.alloc_size_ = 8192;
28 handle->coef.alloc_size_ = 1024;
29 handle->pol.alloc_size_ = 1024;
30 /* it is a cube of size 32 x 32 x 32 */
31 handle->cube.alloc_size_ = 32768;
32
33 handle->cube_alloc_size = realloc_tensor(&handle->cube);
34 handle->alpha_alloc_size = realloc_tensor(&handle->alpha);
35 handle->coef_alloc_size = realloc_tensor(&handle->coef);
36 handle->pol_alloc_size = realloc_tensor(&handle->pol);
37
38 handle->scratch = malloc(32768 * sizeof(double));
39 assert(handle->scratch != NULL);
40 handle->scratch_alloc_size = 32768;
41 handle->T_alloc_size = 8192;
42 handle->W_alloc_size = 2048;
43 handle->blockDim[0] = 5;
44 handle->blockDim[1] = 5;
45 handle->blockDim[2] = 5;
46 handle->device_id = (int *)malloc(sizeof(double) * 12);
47 assert(handle->device_id != NULL);
48 handle->number_of_devices = 1;
49
50 /* to suppress when we remove the spherical cutoff */
51 handle->map = (int **)malloc(3 * sizeof(int *));
52 assert(handle->map != NULL);
53 handle->map[0] = (int *)malloc(sizeof(int) * 512 * 3);
54 assert(handle->map[0] != NULL);
55 handle->map[1] = handle->map[0] + 512;
56 handle->map[2] = handle->map[1] + 512;
57 handle->cmax = 512 * 3;
58 return handle;
59}
60
61void collocate_destroy_handle(void *gaussian_handle) {
62 struct collocation_integration_ *handle =
63 (struct collocation_integration_ *)gaussian_handle;
64 if (handle->Exp.data)
65 free(handle->Exp.data);
66
67 if (handle->grid.data)
68 free(handle->grid.data);
69
70 free(handle->scratch);
71 free(handle->pol.data);
72 free(handle->cube.data);
73 free(handle->alpha.data);
74 free(handle->coef.data);
75 free(handle->blocks_coordinates.data);
76 handle->alpha.data = NULL;
77 handle->coef.data = NULL;
78 handle->blocks_coordinates.data = NULL;
79 free(handle->device_id);
80 free(handle->map[0]);
81 free(handle->map);
82 free(handle);
83
84 handle = NULL;
85}
86
88 const tensor *cube, const tensor *coef) {
89 size_t tmp1 = compute_memory_space_tensor_3(coef->size[0] /* alpha */,
90 coef->size[1] /* gamma */,
91 cube->size[1] /* j */);
92
94 coef->size[0] /* gamma */, cube->size[1] /* j */, cube->size[2] /* i */);
95
96 const size_t mem_alloc_size_ =
97 imax(imax(tmp1 + tmp2, cube->alloc_size_), coef->alloc_size_);
98
99 handler->T_alloc_size = tmp1;
100 handler->W_alloc_size = tmp2;
101
102 if ((mem_alloc_size_ > handler->scratch_alloc_size) ||
103 (handler->scratch == NULL)) {
104 handler->scratch_alloc_size = mem_alloc_size_;
105
106 if (handler->scratch)
107 free(handler->scratch);
108 handler->scratch = malloc(sizeof(double) * handler->scratch_alloc_size);
109 assert(handler->scratch != NULL);
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 assert(handler->scratch != NULL);
139 }
140}
141
143 const double dh[3][3],
144 const double dh_inv[3][3]) {
145 handler->dh[0][0] = dh[0][0];
146 handler->dh[0][1] = dh[0][1];
147 handler->dh[0][2] = dh[0][2];
148 handler->dh[1][0] = dh[1][0];
149 handler->dh[1][1] = dh[1][1];
150 handler->dh[1][2] = dh[1][2];
151 handler->dh[2][0] = dh[2][0];
152 handler->dh[2][1] = dh[2][1];
153 handler->dh[2][2] = dh[2][2];
154
155 handler->dh_inv[0][0] = dh_inv[0][0];
156 handler->dh_inv[0][1] = dh_inv[0][1];
157 handler->dh_inv[0][2] = dh_inv[0][2];
158 handler->dh_inv[1][0] = dh_inv[1][0];
159 handler->dh_inv[1][1] = dh_inv[1][1];
160 handler->dh_inv[1][2] = dh_inv[1][2];
161 handler->dh_inv[2][0] = dh_inv[2][0];
162 handler->dh_inv[2][1] = dh_inv[2][1];
163 handler->dh_inv[2][2] = dh_inv[2][2];
164
165 /* Only used when we are in the non orthorombic case */
166 handler->dx[2] = handler->dh[0][0] * handler->dh[0][0] +
167 handler->dh[0][1] * handler->dh[0][1] +
168 handler->dh[0][2] * handler->dh[0][2];
169 handler->dx[1] = handler->dh[1][0] * handler->dh[1][0] +
170 handler->dh[1][1] * handler->dh[1][1] +
171 handler->dh[1][2] * handler->dh[1][2];
172 handler->dx[0] = handler->dh[2][0] * handler->dh[2][0] +
173 handler->dh[2][1] * handler->dh[2][1] +
174 handler->dh[2][2] * handler->dh[2][2];
175}
static int imax(int x, int y)
Returns the larger of two given integers (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)