File: integrator.h

package info (click to toggle)
ergo 3.8-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid
  • size: 17,396 kB
  • sloc: cpp: 94,740; ansic: 17,015; sh: 7,559; makefile: 1,402; yacc: 127; lex: 110; awk: 23
file content (125 lines) | stat: -rw-r--r-- 4,552 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
/* Ergo, version 3.8, a program for linear scaling electronic structure
 * calculations.
 * Copyright (C) 2019 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 integrator.h The DFT integrator interface.
    Pawel Salek.
*/

#ifndef _INTEGRATOR_H_
#define _INTEGRATOR_H_

#include "basisinfo.h"
#include "matrix_typedefs.h"
#include "grid_stream.h"
#include "functionals.h"

typedef ergo_real      real;
typedef ergo_long_real long_real;

/* =================================================================== */
/*                     BLOCKED INTEGRATORS                             */
/* =================================================================== */

typedef struct DftIntegratorBl_ {
    /* private to integrator */
    real (*coor)[3];
    real* weight;
    real* atv; /* the orbital values and their derivatives at given 
                * grid point. The vector is indexed by dftinf_.kso1, etc
                * the dimensioning is (C syntax) [ntypso][nbast][bllen].
                */
    real dfthri; /* threshold on orbital values */
    int nsym, shl_bl_cnt, bas_bl_cnt[8];
    int (*shlblocks)[2]; /* shell blocks   */
    int (*basblocks)[2]; /* basis function blocks */
#define BASBLOCK(grid,isym) ((grid)->basblocks + (isym)*(grid)->shl_bl_cnt)

    int ntypso; /* how many different vectors are computed for each
                 * (point,orbital) pair. i.e whether only orbital values
                 * are computed (1), orbital values and first derivatives 
                 * (4), etc. */

    int london_off; /* offset of the "london" orbital derivatives */
    /* 1 - only values; 4 - values + (x,y,z) derivatives, etc */

    int ndmat; /* 1 for closed shell, 2 for open shell */
    int nbast; /* number of basis functions */
    /* for closed shell, only rho is set. For open shell, only rhoa and rhob
     * is set. */
    union {
        real *rho; /* total density vector; used in closed shell code. */
        struct {  /* used in open-shell code.    */
            real *a, *b;
        }ho;
    }r;
    union {
        real (*grad)[3]; /*total density gradient; used in closed shell code.*/
        struct {
            real (*a)[3], (*b)[3];
        }rad;
    }g;
    /* public, read only */
    real tgrad[3];/* alpha, also used in closed-shell code */
    int  curr_point;  /* index of the current point */
    real curr_weight; /* the weight at current grid point */
    int dogga, needlap, needgb;
} DftIntegratorBl;

/* dft_integrate_ao_bl:
   numerical integration in atomic orbitals, blocked scheme.
*/
typedef void (*DftBlockCallback)(DftIntegratorBl* grid, real *tmp, 
                                 int bllen, int blstart, int blend,
                                 void* cb_data);

DftIntegratorBl*
dft_integrator_bl_new(Functional* f, int ndmat,
                      int bllen, int needlondon, const BasisInfoStruct& bis);

void
dft_integrator_bl_free(DftIntegratorBl *res);

class Molecule;
namespace Dft {
class FullMatrix;
class SparseMatrix;

real integrate(int ndmat, const FullMatrix * const*dmat,
               const BasisInfoStruct& bis,
               const Molecule& mol, const Dft::GridParams& gss,
               int nThreads, DftBlockCallback cb, void *cb_data);

real integrate(int nDmat, const SparseMatrix * const *dmat,
               const BasisInfoStruct& bis,
               const Molecule& mol, const Dft::GridParams& gss,
               int nThreads, DftBlockCallback cb, void *cb_data);

}

#endif /* _INTEGRATOR_H_ */