#ifndef HAVE_DEFINED_ECP_H
#define HAVE_DEFINED_ECP_H
#include <complex.h>
#define RADI_POWER 3
#define SO_TYPE_OF 4
#define ECP_LMAX 5
#define SIM_ZERO 1e-50
#define EXPCUTOFF 39
#define CUTOFF 460
#define CLOSE_ENOUGH(x, y) (fabs(x-y) < 1e-12*fabs(y) || fabs(x-y) < 1e-12)
#define SQUARE(r) (r[0]*r[0]+r[1]*r[1]+r[2]*r[2])
#define CART_CUM (455+1)
#define K_TAYLOR_MAX 7
#define K_TAB_COL 24
#define K_TAB_ENTRIES 400
#define K_TAB_INTERVAL (16./K_TAB_ENTRIES)
#define MALLOC_INSTACK(var, n) \
var = (void *)cache; \
cache = (void *)(((uintptr_t)(var + (n)) + 7) & (-(uintptr_t)8));
#define MARK_STACK cache0 = cache;
#define RESTORE_STACK cache = cache0;
#define AS_RINV_ORIG_ATOM 17
#define AS_ECPBAS_OFFSET 18
#define AS_NECPBAS 19
#define LEVEL0 5
#define LEVEL_MAX 11
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#endif
typedef struct {
double *u_ecp;
} ECPOpt;
void NPdset0(double *p, const unsigned long n);
void ECPdel_optimizer(ECPOpt **opt);
int ECPscalar_sph(
double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_cart(
double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPso_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPso_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPso_spinor(double complex *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPso_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_ignuc_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_ignuc_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_ignuc_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_ipnuc_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_ipnuc_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_ipnuc_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_ipipnuc_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_ipipnuc_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_ipipnuc_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_ipnucip_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_ipnucip_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_ipnucip_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_iprinv_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_iprinv_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_iprinv_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_ipiprinv_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_ipiprinv_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_ipiprinv_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);
int ECPscalar_iprinvip_sph(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
int ECPscalar_iprinvip_cart(double *out, int *dims, int *shls, int *atm, int natm,
int *bas, int nbas, double *env, ECPOpt *opt, double *cache);
void ECPscalar_iprinvip_optimizer(ECPOpt **opt, int *atm, int natm, int *bas, int nbas, double *env);