File: test-c-api.cc

package info (click to toggle)
libint2 2.7.2-1.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 63,792 kB
  • sloc: ansic: 842,934; cpp: 47,847; sh: 3,139; makefile: 1,017; f90: 676; perl: 482; python: 334
file content (75 lines) | stat: -rw-r--r-- 2,215 bytes parent folder | download | duplicates (4)
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
//
// Created by Eduard Valeyev on 8/11/18.
//

#include "catch.hpp"

#include <libint2.hpp>

#if defined(LIBINT2_SUPPORT_ERI) && LIBINT2_MAX_AM_eri >= 1

extern "C" {
void init_c_api(unsigned int max_am);

double *
compute_eri(unsigned int am1, double alpha1, double *A,
            unsigned int am2, double alpha2, double *B,
            unsigned int am3, double alpha3, double *C,
            unsigned int am4, double alpha4, double *D);

void finalize_c_api();
}

TEST_CASE("C API", "[c-api]") {

  int am1, am2, am3, am4;
  double alpha1, alpha2, alpha3, alpha4;
  double A[3], B[3], C[3], D[3];
  am1 = am2 = am3 = am4 = 1;
  alpha1 = 1.1;
  alpha2 = 2.3;
  alpha3 = 3.4;
  alpha4 = 4.8;
  A[0] = 0.0;  A[1] = 1.0;  A[2] = 2.0;
  B[0] = 1.0;  B[1] = 2.0;  B[2] = 0.0;
  C[0] = 2.0;  C[1] = 0.0;  C[2] = 1.0;
  D[0] = 0.0;  D[1] = 1.0;  D[2] = 2.0;

  using std::max;
  auto max_am = max(max(am1,am2),max(am3,am4));
  init_c_api(max_am);

  auto* c_result = compute_eri(am1, alpha1, A, am2, alpha2, B, am3, alpha3, C, am4, alpha4, D);

  const double* cpp_result;
  using libint2::Shell;
  Shell sh1{{alpha1}, {{am1, false, {1.0}}}, {A[0], A[1], A[2]}};
  Shell sh2{{alpha2}, {{am2, false, {1.0}}}, {B[0], B[1], B[2]}};
  Shell sh3{{alpha3}, {{am3, false, {1.0}}}, {C[0], C[1], C[2]}};
  Shell sh4{{alpha4}, {{am4, false, {1.0}}}, {D[0], D[1], D[2]}};
  libint2::Engine engine(libint2::Operator::coulomb, 1, max_am);
  engine.compute(sh1, sh2, sh3, sh4);
  cpp_result = engine.results()[0];

  unsigned int n1, n2, n3, n4;
  int a, b, c, d, abcd;
  n1 = (am1 + 1) * (am1 + 2)/2;
  n2 = (am2 + 1) * (am2 + 2)/2;
  n3 = (am3 + 1) * (am3 + 2)/2;
  n4 = (am4 + 1) * (am4 + 2)/2;
  const auto norm_factor = sh1.contr[0].coeff[0] * sh2.contr[0].coeff[0] * sh3.contr[0].coeff[0] * sh4.contr[0].coeff[0];
  for(a=0, abcd=0; a<n1; a++) {
    for(b=0; b<n2; b++) {
      for(c=0; c<n3; c++) {
        for(d=0; d<n4; d++, ++abcd) {
          //printf("a = %d b = %d c = %d d = %d (ab|cd) = %20.15lf , ref (ab|cd) = %20.15lf\n", a, b, c, d, c_result[abcd]*norm_factor, cpp_result[abcd]);
          REQUIRE(c_result[abcd]*norm_factor == Approx(cpp_result[abcd]));
        }
      }
    }
  }

  finalize_c_api();
}

#endif