Program Listing for File gbasis.h

Return to documentation for file (gbasis/gbasis.h)

// HORTON: Helpful Open-source Research TOol for N-fermion systems.
// Copyright (C) 2011-2017 The HORTON Development Team
//
// This file is part of HORTON.
//
// HORTON 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.
//
// HORTON 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/>
//
//--

#ifndef GBASIS_GBASIS_H_
#define GBASIS_GBASIS_H_

#include "ints.h"
#include "fns.h"

const double gob_cart_normalization(const double alpha, const long *n);

const double gob_pure_normalization(const double alpha, const long l);

class GBasis {
 private:
  // Auxiliary arrays that contain convenient derived information.
  long *basis_offsets;
  long *prim_offsets;
  long *scales_offsets;
  long *shell_lookup;
  double *scales;  // pre-computed normalization constants.
  long nbasis, nscales;
  long max_shell_type;

 public:
  // Arrays that fully describe the basis set.
  const double *centers;
  const long *shell_map;
  const long *nprims;
  const long *shell_types;
  const double *alphas;
  const double *con_coeffs;
  const long ncenter, nshell, nprim_total;

  double r0[3];
  double r1[3];
  double r2[3];
  double r3[3];

  GBasis(const double *centers, const long *shell_map, const long *nprims,
         const long *shell_types, const double *alphas, const double *con_coeffs,
         const long ncenter, const long nshell, const long nprim_total);
  GBasis(const GBasis &other) = delete;

  virtual ~GBasis();

  virtual const double normalization(const double alpha, const long *n) const = 0;

  void init_scales();

  void shift_center(const double *r, double *shift, double *r_total);

  void compute_two_index(double *output, GB2Integral *integral);

  void compute_four_index(double *output, GB4Integral *integral, double *shift = nullptr);

  void compute_grid_point1(double *output, double *point, GB1GridFn *grid_fn);

  double compute_grid_point2(double *dm, double *point, GB2DMGridFn *grid_fn);

  const long get_nbasis() const { return nbasis; }

  const long get_nscales() const { return nscales; }

  const long get_max_shell_type() const { return max_shell_type; }

  const long *get_basis_offsets() const { return basis_offsets; }

  const long *get_prim_offsets() const { return prim_offsets; }

  const long *get_shell_lookup() const { return shell_lookup; }

  const double *get_scales(long iprim) const { return scales + scales_offsets[iprim]; }
};

class GOBasis : public GBasis {
 public:
  // double compute_normalization(double alpha, long nx, long ny, long nz);
  GOBasis(const double *centers, const long *shell_map, const long *nprims,
          const long *shell_types, const double *alphas, const double *con_coeffs,
          const long ncenter, const long nshell, const long nprim_total);

  const double normalization(const double alpha, const long *n) const;

  void compute_overlap(double *output);

  void compute_kinetic(double *output);

  void compute_nuclear_attraction(double *charges, double *centers, long ncharge,
                                  double *output);

  void compute_erf_attraction(double *charges, double *centers, long ncharge,
                              double *output, double mu);

  void compute_gauss_attraction(double *charges, double *centers, long ncharge,
                                double *output, double c, double alpha);

  void compute_electron_repulsion(double *output);

  void compute_erf_repulsion(double *output, double mu);

  void compute_gauss_repulsion(double *output, double c, double alpha);

  void compute_ralpha_repulsion(double *output, double alpha);

  void compute_delta_repulsion(double *output, double *shift = nullptr);

  void compute_intra_density(double *output, double *point);

  void compute_multipole_moment(long *xyz, double *center, double *output);

  void compute_grid1_exp(long nfn, double *coeffs, long npoint, double *points,
                         long norb, long *iorbs, double *output);

  void compute_grid1_grad_exp(long nfn, double *coeffs, long npoint,
                              double *points, long norb, long *iorbs, double *output);

  void compute_grid1_dm(double *dm, long npoint, double *points,
                        GB1DMGridFn *grid_fn, double *output,
                        double epsilon, double *dmmaxrow);

  void compute_grid2_dm(double *dm, long npoint, double *points, double *output);

  void compute_grid1_fock(long npoint, double *points, double *weights,
                          long pot_stride, double *pots,
                          GB1DMGridFn *grid_fn, double *output);
};

#endif  // GBASIS_GBASIS_H_