LCOV - code coverage report
Current view: top level - src/grid/dgemm - grid_dgemm_collocation_integration.c (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 99 117 84.6 %
Date: 2024-11-21 06:45:46 Functions: 4 5 80.0 %

          Line data    Source code
       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 <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"
      16             : #include "grid_dgemm_collocation_integration.h"
      17             : #include "grid_dgemm_non_orthorombic_corrections.h"
      18             : #include "grid_dgemm_tensor_local.h"
      19             : #include "grid_dgemm_utils.h"
      20             : 
      21           8 : struct collocation_integration_ *collocate_create_handle(void) {
      22           8 :   struct collocation_integration_ *handle = NULL;
      23           8 :   handle = (struct collocation_integration_ *)malloc(
      24             :       sizeof(struct collocation_integration_));
      25           8 :   assert(handle != NULL);
      26           8 :   memset(handle, 0, sizeof(struct collocation_integration_));
      27             : 
      28           8 :   handle->alpha.alloc_size_ = 8192;
      29           8 :   handle->coef.alloc_size_ = 1024;
      30           8 :   handle->pol.alloc_size_ = 1024;
      31             :   /* it is a cube of size 32 x 32 x 32 */
      32           8 :   handle->cube.alloc_size_ = 32768;
      33             : 
      34           8 :   handle->cube_alloc_size = realloc_tensor(&handle->cube);
      35           8 :   handle->alpha_alloc_size = realloc_tensor(&handle->alpha);
      36           8 :   handle->coef_alloc_size = realloc_tensor(&handle->coef);
      37           8 :   handle->pol_alloc_size = realloc_tensor(&handle->pol);
      38             : 
      39           8 :   handle->scratch = malloc(32768 * sizeof(double));
      40           8 :   assert(handle->scratch != NULL);
      41           8 :   handle->scratch_alloc_size = 32768;
      42           8 :   handle->T_alloc_size = 8192;
      43           8 :   handle->W_alloc_size = 2048;
      44           8 :   handle->blockDim[0] = 5;
      45           8 :   handle->blockDim[1] = 5;
      46           8 :   handle->blockDim[2] = 5;
      47           8 :   handle->device_id = (int *)malloc(sizeof(double) * 12);
      48           8 :   assert(handle->device_id != NULL);
      49           8 :   handle->number_of_devices = 1;
      50             : 
      51             :   /* to suppress when we remove the spherical cutoff */
      52           8 :   handle->map = (int **)malloc(3 * sizeof(int *));
      53           8 :   assert(handle->map != NULL);
      54           8 :   handle->map[0] = (int *)malloc(sizeof(int) * 512 * 3);
      55           8 :   assert(handle->map[0] != NULL);
      56           8 :   handle->map[1] = handle->map[0] + 512;
      57           8 :   handle->map[2] = handle->map[1] + 512;
      58           8 :   handle->cmax = 512 * 3;
      59           8 :   return handle;
      60             : }
      61             : 
      62           8 : void collocate_destroy_handle(void *gaussian_handle) {
      63           8 :   struct collocation_integration_ *handle =
      64             :       (struct collocation_integration_ *)gaussian_handle;
      65           8 :   if (handle->Exp.data)
      66           4 :     free(handle->Exp.data);
      67             : 
      68           8 :   if (handle->grid.data)
      69           0 :     free(handle->grid.data);
      70             : 
      71           8 :   free(handle->scratch);
      72           8 :   free(handle->pol.data);
      73           8 :   free(handle->cube.data);
      74           8 :   free(handle->alpha.data);
      75           8 :   free(handle->coef.data);
      76           8 :   free(handle->blocks_coordinates.data);
      77           8 :   handle->alpha.data = NULL;
      78           8 :   handle->coef.data = NULL;
      79           8 :   handle->blocks_coordinates.data = NULL;
      80           8 :   free(handle->device_id);
      81           8 :   free(handle->map[0]);
      82           8 :   free(handle->map);
      83           8 :   free(handle);
      84             : 
      85           8 :   handle = NULL;
      86           8 : }
      87             : 
      88       88000 : void initialize_W_and_T(collocation_integration *const handler,
      89             :                         const tensor *cube, const tensor *coef) {
      90       88000 :   size_t tmp1 = compute_memory_space_tensor_3(coef->size[0] /* alpha */,
      91       88000 :                                               coef->size[1] /* gamma */,
      92       88000 :                                               cube->size[1] /* j */);
      93             : 
      94       88000 :   size_t tmp2 = compute_memory_space_tensor_3(
      95       88000 :       coef->size[0] /* gamma */, cube->size[1] /* j */, cube->size[2] /* i */);
      96             : 
      97       88000 :   const size_t mem_alloc_size_ =
      98       88000 :       imax(imax(tmp1 + tmp2, cube->alloc_size_), coef->alloc_size_);
      99             : 
     100       88000 :   handler->T_alloc_size = tmp1;
     101       88000 :   handler->W_alloc_size = tmp2;
     102             : 
     103       88000 :   if ((mem_alloc_size_ > handler->scratch_alloc_size) ||
     104       87981 :       (handler->scratch == NULL)) {
     105          19 :     handler->scratch_alloc_size = mem_alloc_size_;
     106             : 
     107          19 :     if (handler->scratch)
     108          19 :       free(handler->scratch);
     109          19 :     handler->scratch = malloc(sizeof(double) * handler->scratch_alloc_size);
     110          19 :     assert(handler->scratch != NULL);
     111             :   }
     112       88000 : }
     113             : 
     114           0 : void initialize_W_and_T_integrate(collocation_integration *const handler,
     115             :                                   const int num_block, const tensor *coef,
     116             :                                   const tensor *block) {
     117             :   /* T */
     118           0 :   size_t tmp1 = compute_memory_space_tensor_4(num_block, block->size[0] /* k */,
     119           0 :                                               block->size[1] /* j */,
     120           0 :                                               coef->size[1] /* alpha */);
     121             : 
     122             :   /* W */
     123           0 :   size_t tmp2 = compute_memory_space_tensor_4(num_block, block->size[1] /* j */,
     124             :                                               coef->size[1] /* alpha */,
     125           0 :                                               coef->size[2] /* gamma */);
     126             : 
     127           0 :   const size_t mem_alloc_size_ = tmp1 + tmp2;
     128             : 
     129           0 :   handler->T_alloc_size = tmp1;
     130           0 :   handler->W_alloc_size = tmp2;
     131             : 
     132           0 :   if ((mem_alloc_size_ > handler->scratch_alloc_size) ||
     133           0 :       (handler->scratch == NULL)) {
     134           0 :     handler->scratch_alloc_size = mem_alloc_size_;
     135             : 
     136           0 :     if (handler->scratch)
     137           0 :       free(handler->scratch);
     138           0 :     handler->scratch = malloc(sizeof(double) * handler->scratch_alloc_size);
     139           0 :     assert(handler->scratch != NULL);
     140             :   }
     141           0 : }
     142             : 
     143        1256 : void initialize_basis_vectors(collocation_integration *const handler,
     144             :                               const double dh[3][3],
     145             :                               const double dh_inv[3][3]) {
     146        1256 :   handler->dh[0][0] = dh[0][0];
     147        1256 :   handler->dh[0][1] = dh[0][1];
     148        1256 :   handler->dh[0][2] = dh[0][2];
     149        1256 :   handler->dh[1][0] = dh[1][0];
     150        1256 :   handler->dh[1][1] = dh[1][1];
     151        1256 :   handler->dh[1][2] = dh[1][2];
     152        1256 :   handler->dh[2][0] = dh[2][0];
     153        1256 :   handler->dh[2][1] = dh[2][1];
     154        1256 :   handler->dh[2][2] = dh[2][2];
     155             : 
     156        1256 :   handler->dh_inv[0][0] = dh_inv[0][0];
     157        1256 :   handler->dh_inv[0][1] = dh_inv[0][1];
     158        1256 :   handler->dh_inv[0][2] = dh_inv[0][2];
     159        1256 :   handler->dh_inv[1][0] = dh_inv[1][0];
     160        1256 :   handler->dh_inv[1][1] = dh_inv[1][1];
     161        1256 :   handler->dh_inv[1][2] = dh_inv[1][2];
     162        1256 :   handler->dh_inv[2][0] = dh_inv[2][0];
     163        1256 :   handler->dh_inv[2][1] = dh_inv[2][1];
     164        1256 :   handler->dh_inv[2][2] = dh_inv[2][2];
     165             : 
     166             :   /* Only used when we are in the non  orthorombic case */
     167        1256 :   handler->dx[2] = handler->dh[0][0] * handler->dh[0][0] +
     168        1256 :                    handler->dh[0][1] * handler->dh[0][1] +
     169        1256 :                    handler->dh[0][2] * handler->dh[0][2];
     170        1256 :   handler->dx[1] = handler->dh[1][0] * handler->dh[1][0] +
     171        1256 :                    handler->dh[1][1] * handler->dh[1][1] +
     172        1256 :                    handler->dh[1][2] * handler->dh[1][2];
     173        1256 :   handler->dx[0] = handler->dh[2][0] * handler->dh[2][0] +
     174        1256 :                    handler->dh[2][1] * handler->dh[2][1] +
     175        1256 :                    handler->dh[2][2] * handler->dh[2][2];
     176        1256 : }

Generated by: LCOV version 1.15