File: integral_info.h

package info (click to toggle)
ergo 3.8.2-1.1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 17,568 kB
  • sloc: cpp: 94,763; ansic: 17,785; sh: 10,701; makefile: 1,403; yacc: 127; lex: 116; awk: 23
file content (173 lines) | stat: -rw-r--r-- 5,281 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* Ergo, version 3.8.2, a program for linear scaling electronic structure
 * calculations.
 * Copyright (C) 2023 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek,
 * and Anastasia Kruchinina.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Primary academic reference:
 * Ergo: An open-source program for linear-scaling electronic structure
 * calculations,
 * Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia
 * Kruchinina,
 * SoftwareX 7, 107 (2018),
 * <http://dx.doi.org/10.1016/j.softx.2018.03.005>
 * 
 * For further information about Ergo, see <http://www.ergoscf.org>.
 */

/** @file integral_info.h

    @brief Defines IntegralInfo object, providing the coefficients
    needed for integral evaluation.

    @author: Elias Rudberg <em>responsible</em>
*/

#ifndef BASISINFO_BASIC_HEADER
#define BASISINFO_BASIC_HEADER


#include "realtype.h"
#include "monomial_info.h"
#include "hermite_conversion_prep.h"
#include "boysfunction.h"
#include "multipole_prep.h"
#include "mm_limit_table.h"

#ifndef BASIS_FUNC_POLY_MAX_DEGREE
#error The constant BASIS_FUNC_POLY_MAX_DEGREE must be defined.
#endif
#if BASIS_FUNC_POLY_MAX_DEGREE<6
#define MAX_NO_OF_TERMS_IN_BASIS_FUNC_POLY 12
#define MAX_NO_OF_POLY_12_TERMS 180
#define MAX_NO_OF_BASIS_FUNC_POLYS 50
#else
#define MAX_NO_OF_TERMS_IN_BASIS_FUNC_POLY 16
#define MAX_NO_OF_POLY_12_TERMS 360
#define MAX_NO_OF_BASIS_FUNC_POLYS 100
#endif

typedef struct
{
  ergo_real coeff;
  char monomialInts[4];  /* nx, ny, nz    */
  int monomialID;
} basis_func_term_struct;

typedef struct
{
  int noOfTerms;
  basis_func_term_struct termList[MAX_NO_OF_TERMS_IN_BASIS_FUNC_POLY];
  ergo_real scaledSolidHarmonicPrefactor;
} basis_func_poly_struct;

typedef struct
{
  int id_1;
  int id_2;
  ergo_real coeff;
} poly_12_term_struct;

typedef struct
{
  int noOfTerms;
  poly_12_term_struct termList[MAX_NO_OF_POLY_12_TERMS];
} poly_12_struct;

/** Contains coefficients needed for quick integral evaluation. This
    object is quite large and should always be allocated with
    new. Placing it on stack is a bad idea. */

class IntegralInfo
{
 private:
  BoysFunctionManager boysFunctionManager;
  MultipolePrepManager multipolePrep;
  MMLimitTable mmLimitTable;
  hermite_conversion_info_struct hermite_conversion_info;
  bool initialized;
  IntegralInfo(); // This is to make it forbidden to create it without argument.
 public:
  basis_func_poly_struct basis_func_poly_list[MAX_NO_OF_BASIS_FUNC_POLYS];
  int no_of_basis_func_polys;
  monomial_info_struct monomial_info;
  void init();
  ergo_real BoysFunction(int n, ergo_real x) const;
  ergo_real BoysFunction_expensive(int n, ergo_real x, int noOfIntegrationIntervals) const;
  const MultipolePrepManager & GetMultipolePrep() const { return multipolePrep; }
  const MMLimitTable & GetMMLimitTable() const { return mmLimitTable; }
  int multiply_by_hermite_conversion_matrix_from_right(int n1max,        
						       int n2max,        
						       ergo_real a,      
						       ergo_real* A,     
						       ergo_real* result) const;
  int multiply_by_hermite_conversion_matrix_from_left(int n1max,        
						      int n2max,        
						      ergo_real a,      
						      ergo_real* A,     
						      ergo_real* result) const;
  int get_hermite_conversion_matrix_right(int nmax,
					  ergo_real a,
					  ergo_real* result) const;
  int get_hermite_conversion_matrix_left(int nmax,
					 ergo_real a,
					 ergo_real* result) const;
  int get_hermite_conversion_matrix_right_sparse(int nmax,
                                                 ergo_real a,
                                                 i_j_val_struct* result) const;

  IntegralInfo(bool initialize);
  ~IntegralInfo();

  // Stuff needed for Chunks&Tasks usage
  IntegralInfo(const IntegralInfo & ii);
  void write_to_buffer ( char * dataBuffer, size_t const bufferSize ) const;
  size_t get_size() const;
  void assign_from_buffer ( char const * dataBuffer, size_t const bufferSize);
};


namespace JK {
/* Struct ExchWeights holds parameters for CAM-style range-separated HF
   exchange.  We use the following short-long range split
   (alpha+beta*erf(mu*r))*HF_exchange.
 */
struct ExchWeights
{
  ergo_real alpha;
  ergo_real beta;
  ergo_real mu;
  int computeRangeSeparatedExchange; /**< shortcut for |beta| != 0 */

ExchWeights() :
  alpha(0),
    beta(0),
    mu(0),
    computeRangeSeparatedExchange(0)
  {}
  
};

}


int get_poly_info_from_shell_type(int* polyid_start, int* poly_count, int shellType);

int get_no_of_basis_func_polys_used_from_no_of_shell_types(int no_of_shell_types);

int get_shell_type_from_basis_func_poly_id(int basfuncpolyid);


#endif