#include #include #include #include "libderiv.h" #include "d1hrr_header.h" extern "C" { void (*build_deriv1_eri[4][4][4][4])(Libderiv_t *, int); void (*build_deriv12_eri[3][3][3][3])(Libderiv_t *, int); int libderiv1_stack_size[4]; int libderiv12_stack_size[3]; void init_libderiv_base() { build_deriv1_eri[0][0][0][0] = d1hrr_order_0000; build_deriv1_eri[0][0][1][0] = d1hrr_order_00p0; build_deriv1_eri[0][0][2][0] = d1hrr_order_00d0; build_deriv1_eri[0][0][1][1] = d1hrr_order_00pp; build_deriv1_eri[0][0][3][0] = d1hrr_order_00f0; build_deriv1_eri[0][0][2][1] = d1hrr_order_00dp; build_deriv1_eri[0][0][3][1] = d1hrr_order_00fp; build_deriv1_eri[0][0][2][2] = d1hrr_order_00dd; build_deriv1_eri[0][0][3][2] = d1hrr_order_00fd; build_deriv1_eri[0][0][3][3] = d1hrr_order_00ff; build_deriv1_eri[1][0][1][0] = d1hrr_order_p0p0; build_deriv1_eri[1][0][2][0] = d1hrr_order_p0d0; build_deriv1_eri[1][0][1][1] = d1hrr_order_p0pp; build_deriv1_eri[1][0][3][0] = d1hrr_order_p0f0; build_deriv1_eri[1][0][2][1] = d1hrr_order_p0dp; build_deriv1_eri[1][0][3][1] = d1hrr_order_p0fp; build_deriv1_eri[1][0][2][2] = d1hrr_order_p0dd; build_deriv1_eri[1][0][3][2] = d1hrr_order_p0fd; build_deriv1_eri[1][0][3][3] = d1hrr_order_p0ff; build_deriv1_eri[2][0][2][0] = d1hrr_order_d0d0; build_deriv1_eri[2][0][1][1] = d1hrr_order_d0pp; build_deriv1_eri[2][0][3][0] = d1hrr_order_d0f0; build_deriv1_eri[2][0][2][1] = d1hrr_order_d0dp; build_deriv1_eri[2][0][3][1] = d1hrr_order_d0fp; build_deriv1_eri[2][0][2][2] = d1hrr_order_d0dd; build_deriv1_eri[2][0][3][2] = d1hrr_order_d0fd; build_deriv1_eri[2][0][3][3] = d1hrr_order_d0ff; build_deriv1_eri[1][1][2][0] = d1hrr_order_ppd0; build_deriv1_eri[1][1][1][1] = d1hrr_order_pppp; build_deriv1_eri[1][1][3][0] = d1hrr_order_ppf0; build_deriv1_eri[1][1][2][1] = d1hrr_order_ppdp; build_deriv1_eri[1][1][3][1] = d1hrr_order_ppfp; build_deriv1_eri[1][1][2][2] = d1hrr_order_ppdd; build_deriv1_eri[1][1][3][2] = d1hrr_order_ppfd; build_deriv1_eri[1][1][3][3] = d1hrr_order_ppff; build_deriv1_eri[3][0][3][0] = d1hrr_order_f0f0; build_deriv1_eri[3][0][2][1] = d1hrr_order_f0dp; build_deriv1_eri[3][0][3][1] = d1hrr_order_f0fp; build_deriv1_eri[3][0][2][2] = d1hrr_order_f0dd; build_deriv1_eri[3][0][3][2] = d1hrr_order_f0fd; build_deriv1_eri[3][0][3][3] = d1hrr_order_f0ff; build_deriv1_eri[2][1][3][0] = d1hrr_order_dpf0; build_deriv1_eri[2][1][2][1] = d1hrr_order_dpdp; build_deriv1_eri[2][1][3][1] = d1hrr_order_dpfp; build_deriv1_eri[2][1][2][2] = d1hrr_order_dpdd; build_deriv1_eri[2][1][3][2] = d1hrr_order_dpfd; build_deriv1_eri[2][1][3][3] = d1hrr_order_dpff; build_deriv1_eri[3][1][3][1] = d1hrr_order_fpfp; build_deriv1_eri[3][1][2][2] = d1hrr_order_fpdd; build_deriv1_eri[3][1][3][2] = d1hrr_order_fpfd; build_deriv1_eri[3][1][3][3] = d1hrr_order_fpff; build_deriv1_eri[2][2][3][1] = d1hrr_order_ddfp; build_deriv1_eri[2][2][2][2] = d1hrr_order_dddd; build_deriv1_eri[2][2][3][2] = d1hrr_order_ddfd; build_deriv1_eri[2][2][3][3] = d1hrr_order_ddff; build_deriv1_eri[3][2][3][2] = d1hrr_order_fdfd; build_deriv1_eri[3][2][3][3] = d1hrr_order_fdff; build_deriv1_eri[3][3][3][3] = d1hrr_order_ffff; build_deriv12_eri[0][0][0][0] = d12hrr_order_0000; build_deriv12_eri[0][0][1][0] = d12hrr_order_00p0; build_deriv12_eri[0][0][2][0] = d12hrr_order_00d0; build_deriv12_eri[0][0][1][1] = d12hrr_order_00pp; build_deriv12_eri[0][0][2][1] = d12hrr_order_00dp; build_deriv12_eri[0][0][2][2] = d12hrr_order_00dd; build_deriv12_eri[1][0][1][0] = d12hrr_order_p0p0; build_deriv12_eri[1][0][2][0] = d12hrr_order_p0d0; build_deriv12_eri[1][0][1][1] = d12hrr_order_p0pp; build_deriv12_eri[1][0][2][1] = d12hrr_order_p0dp; build_deriv12_eri[1][0][2][2] = d12hrr_order_p0dd; build_deriv12_eri[2][0][2][0] = d12hrr_order_d0d0; build_deriv12_eri[2][0][1][1] = d12hrr_order_d0pp; build_deriv12_eri[2][0][2][1] = d12hrr_order_d0dp; build_deriv12_eri[2][0][2][2] = d12hrr_order_d0dd; build_deriv12_eri[1][1][2][0] = d12hrr_order_ppd0; build_deriv12_eri[1][1][1][1] = d12hrr_order_pppp; build_deriv12_eri[1][1][2][1] = d12hrr_order_ppdp; build_deriv12_eri[1][1][2][2] = d12hrr_order_ppdd; build_deriv12_eri[2][1][2][1] = d12hrr_order_dpdp; build_deriv12_eri[2][1][2][2] = d12hrr_order_dpdd; build_deriv12_eri[2][2][2][2] = d12hrr_order_dddd; libderiv1_stack_size[0] = 21; libderiv1_stack_size[1] = 1839; libderiv1_stack_size[2] = 30431; libderiv1_stack_size[3] = 244213; libderiv12_stack_size[0] = 127; libderiv12_stack_size[1] = 9998; libderiv12_stack_size[2] = 158107; } /* These functions initialize library objects */ /* Library objects operate independently of each other */ int init_libderiv1(Libderiv_t *libderiv, int max_am, int max_num_prim_quartets, int max_cart_class_size) { int memory = 0; if (max_am >= LIBDERIV_MAX_AM1) return -1; libderiv->int_stack = (double *) malloc(libderiv1_stack_size[max_am]*sizeof(double)); memory += libderiv1_stack_size[max_am]; libderiv->zero_stack = (double *) malloc(max_cart_class_size*sizeof(double)); bzero((char *)libderiv->zero_stack,max_cart_class_size*sizeof(double)); memory += max_cart_class_size; libderiv->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data)); memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double); return memory; } int init_libderiv12(Libderiv_t *libderiv, int max_am, int max_num_prim_quartets, int max_cart_class_size) { int memory = 0; if (max_am >= LIBDERIV_MAX_AM12) return -1; libderiv->int_stack = (double *) malloc(libderiv12_stack_size[max_am]*sizeof(double)); memory += libderiv12_stack_size[max_am]; libderiv->zero_stack = (double *) malloc(max_cart_class_size*sizeof(double)); bzero((char *)libderiv->zero_stack,max_cart_class_size*sizeof(double)); memory += max_cart_class_size; libderiv->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data)); memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double); return memory; } void free_libderiv(Libderiv_t *libderiv) { if (libderiv->int_stack != NULL) { free(libderiv->int_stack); libderiv->int_stack = NULL; } if (libderiv->zero_stack != NULL) { free(libderiv->zero_stack); libderiv->zero_stack = NULL; } if (libderiv->PrimQuartet != NULL) { free(libderiv->PrimQuartet); libderiv->PrimQuartet = NULL; } return; } int libderiv1_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size) { int memory = 0; if (max_am >= LIBDERIV_MAX_AM1) return -1; memory += libderiv1_stack_size[max_am]; memory += max_cart_class_size; memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double); return memory; } int libderiv12_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size) { int memory = 0; if (max_am >= LIBDERIV_MAX_AM12) return -1; memory += libderiv12_stack_size[max_am]; memory += max_cart_class_size; memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double); return memory; } }