#ifndef LMP_SNA_H
#define LMP_SNA_H
#include "pointers.h"
namespace LAMMPS_NS {
struct SNA_ZINDICES {
int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju;
};
struct SNA_BINDICES {
int j1, j2, j;
};
class SNA : protected Pointers {
public:
SNA(LAMMPS*, double, int, double, int, int);
SNA(LAMMPS* lmp) : Pointers(lmp) {};
~SNA();
void build_indexlist();
void init();
double memory_usage();
int ncoeff;
void compute_ui(int);
void compute_zi();
void compute_yi(const double*);
void compute_yterm(int, int, int, const double*);
void compute_bi();
void compute_duidrj(double*, double, double, int);
void compute_dbidrj();
void compute_deidrj(double*);
double compute_sfac(double, double);
double compute_dsfac(double, double);
double* blist;
double** dblist;
double** rij;
int* inside;
double* wj;
double* rcutij;
int nmax;
void grow_rij(int);
int twojmax;
private:
double rmin0, rfac0;
SNA_ZINDICES* idxz;
SNA_BINDICES* idxb;
int idxcg_max, idxu_max, idxz_max, idxb_max;
double** rootpqarray;
double* cglist;
int*** idxcg_block;
double* ulisttot_r, * ulisttot_i;
double** ulist_r_ij, ** ulist_i_ij;
int* idxu_block;
double* zlist_r, * zlist_i;
int*** idxz_block;
int*** idxb_block;
double** dulist_r, ** dulist_i;
double* ylist_r, * ylist_i;
static const int nmaxfactorial = 167;
static const double nfac_table[];
double factorial(int);
void create_twojmax_arrays();
void destroy_twojmax_arrays();
void init_clebsch_gordan();
void init_rootpqarray();
void zero_uarraytot();
void addself_uarraytot(double);
void add_uarraytot(double, double, double, int);
void compute_uarray(double, double, double,
double, double, int);
double deltacg(int, int, int);
int compute_ncoeff();
void compute_duarray(double, double, double,
double, double, double, double, double, int);
int switch_flag;
double wself;
int bzero_flag; double* bzero; };
}
#endif