1 /* Ergo, version 3.8, a program for linear scaling electronic structure 2 * calculations. 3 * Copyright (C) 2019 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, 4 * and Anastasia Kruchinina. 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 * 19 * Primary academic reference: 20 * Ergo: An open-source program for linear-scaling electronic structure 21 * calculations, 22 * Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia 23 * Kruchinina, 24 * SoftwareX 7, 107 (2018), 25 * <http://dx.doi.org/10.1016/j.softx.2018.03.005> 26 * 27 * For further information about Ergo, see <http://www.ergoscf.org>. 28 */ 29 30 /** @file multipole_prep.h 31 32 @brief This file contains preparatory stuff for computing 33 multipole moments and related things. 34 35 @author: Elias Rudberg <em>responsible</em> 36 */ 37 38 #ifndef MULTIPOLE_PREP_HEADER 39 #define MULTIPOLE_PREP_HEADER 40 41 #include "realtype.h" 42 #include "polydegree.h" 43 #include <cstddef> /* size_t */ 44 45 #define MAX_MULTIPOLE_DEGREE 15 46 #define MAX_NO_OF_MOMENTS_PER_MULTIPOLE ((MAX_MULTIPOLE_DEGREE+1)*(MAX_MULTIPOLE_DEGREE+1)) 47 48 #define MAX_MULTIPOLE_DEGREE_BASIC BASIS_FUNC_POLY_MAX_DEGREE 49 #define MAX_NO_OF_MOMENTS_PER_MULTIPOLE_BASIC ((MAX_MULTIPOLE_DEGREE_BASIC+1)*(MAX_MULTIPOLE_DEGREE_BASIC+1)) 50 51 typedef struct 52 { 53 ergo_real centerCoords[3]; 54 int degree; 55 int noOfMoments; 56 ergo_real momentList[MAX_NO_OF_MOMENTS_PER_MULTIPOLE]; 57 ergo_real maxAbsMomentList[MAX_MULTIPOLE_DEGREE+1]; 58 ergo_real euclideanNormList[MAX_MULTIPOLE_DEGREE+1]; 59 } multipole_struct_large; 60 61 typedef struct 62 { 63 ergo_real centerCoords[3]; 64 int degree; 65 int noOfMoments; 66 ergo_real momentList[MAX_NO_OF_MOMENTS_PER_MULTIPOLE_BASIC]; 67 } multipole_struct_small; 68 69 class MultipolePrepManager { 70 public: 71 typedef struct { 72 int l; 73 int m; 74 } l_m_struct; 75 private: 76 int initialized_flag; 77 ergo_real prepared_lm_factor_list[MAX_MULTIPOLE_DEGREE+1][MAX_MULTIPOLE_DEGREE+1]; 78 l_m_struct prepared_l_m_list[MAX_NO_OF_MOMENTS_PER_MULTIPOLE]; 79 public: 80 MultipolePrepManager(); 81 void init(); 82 bool is_initialized() const; get_l_m_list_ptr()83 const l_m_struct* get_l_m_list_ptr() const { return prepared_l_m_list; } 84 ergo_real get_lm_factor(int l, int m) const; 85 // Stuff needed for Chunks&Tasks usage 86 void write_to_buffer ( char * dataBuffer, size_t const bufferSize ) const; 87 size_t get_size() const; 88 void assign_from_buffer ( char const * dataBuffer, size_t const bufferSize); 89 }; 90 91 #endif 92