From 9d27f88c1dd69be038015dfbd83e07f5ee39163d Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Wed, 17 Nov 2021 18:46:49 +0100
Subject: [PATCH] Add first version comparing both approaches

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 ref/Makefile                                  |  33 +-
 ref/common/gga_x_pbeopt.h                     |  14 -
 ref/common/mix_func.c                         | 313 ------------------
 ref/common/registered_funcs.h                 |  52 +--
 .../gga_x_pbe_genxc.c}                        | 101 +++---
 ref/genxc/gga_x_pbe_genxc.h                   |  14 +
 .../gga_x_pbe_genxc_funcs.h}                  |   0
 .../work_gga_genxc.h}                         |   2 +-
 ref/gga_x_pbe                                 | Bin 77376 -> 0 bytes
 ref/gga_x_pbe.c                               | 118 -------
 ref/gga_x_pbe_both.c                          | 161 ---------
 ref/gga_x_pbeopt.c                            | 119 -------
 ref/{common => libxc}/gga_x_pbe.c             |   7 +-
 ref/{common => libxc}/gga_x_pbe.h             |   0
 .../gga_x_pbe.c => libxc/gga_x_pbe_funcs.h}   |   0
 ref/{common/work_gga.c => libxc/work_gga.h}   |   2 +-
 ref/main.c                                    | 154 +++++++++
 17 files changed, 278 insertions(+), 812 deletions(-)
 delete mode 100644 ref/common/gga_x_pbeopt.h
 delete mode 100644 ref/common/mix_func.c
 rename ref/{common/gga_x_pbeopt.c => genxc/gga_x_pbe_genxc.c} (79%)
 create mode 100644 ref/genxc/gga_x_pbe_genxc.h
 rename ref/{maple2c/gga_x_pbeopt.c => genxc/gga_x_pbe_genxc_funcs.h} (100%)
 rename ref/{common/work_gga_x_pbe.c => genxc/work_gga_genxc.h} (99%)
 delete mode 100755 ref/gga_x_pbe
 delete mode 100644 ref/gga_x_pbe.c
 delete mode 100644 ref/gga_x_pbe_both.c
 delete mode 100644 ref/gga_x_pbeopt.c
 rename ref/{common => libxc}/gga_x_pbe.c (99%)
 rename ref/{common => libxc}/gga_x_pbe.h (100%)
 rename ref/{maple2c/gga_x_pbe.c => libxc/gga_x_pbe_funcs.h} (100%)
 rename ref/{common/work_gga.c => libxc/work_gga.h} (99%)
 create mode 100644 ref/main.c

diff --git a/ref/Makefile b/ref/Makefile
index 901f230..cc7aaa4 100644
--- a/ref/Makefile
+++ b/ref/Makefile
@@ -1,13 +1,34 @@
-CC=/usr/bin/cc
-CFLAGS=-O3 -DHAVE_CBRT -DXC_DONT_COMPILE_KXC -DXC_DONT_COMPILE_LXC -std=gnu99 -lm
-COMMON_FILES=common/gga.c common/gga_x_pbe.c common/util.c common/functionals.c
+# GCC
+#CC=/usr/bin/cc
+#CFLAGS=-O3 -DHAVE_CBRT -DXC_DONT_COMPILE_KXC -DXC_DONT_COMPILE_LXC -std=gnu99 -lm -fopenmp
 
-all: gga_x_pbe
+# Intel compiler
+CC=/apps/intel/ComposerXE2019/compilers_and_libraries_2019.5.281/linux/bin/intel64/icc
+#CFLAGS=-xHost -O3 -DHAVE_CBRT -DXC_DONT_COMPILE_KXC -DXC_DONT_COMPILE_LXC -std=gnu99 -lm -fopenmp
+CFLAGS=-xCORE-AVX512 -Ofast -qopt-zmm-usage=high -DHAVE_CBRT -DXC_DONT_COMPILE_KXC -DXC_DONT_COMPILE_LXC -std=gnu99 -lm -fopenmp
 
-gga_x_pbe: gga_x_pbe.c $(COMMON_FILES)
-	$(CC) $^ -o $@ $(CFLAGS)
+LINKER=$(CC)
+BUILD_DIR=build
+Q?=@
+
+VPATH=common libxc genxc
+OBJ =   $(patsubst common/%.c, $(BUILD_DIR)/%.o, $(wildcard common/*.c))
+OBJ +=  $(patsubst libxc/%.c, $(BUILD_DIR)/%.o, $(wildcard libxc/*.c))
+OBJ +=  $(patsubst genxc/%.c, $(BUILD_DIR)/%.o, $(wildcard genxc/*.c))
+
+main: $(BUILD_DIR) main.c $(OBJ)
+	$(info ===>  LINKING AND COMPILING $@)
+	$(Q)${LINKER} -o $@ main.c $(OBJ) $(CFLAGS)
+
+$(BUILD_DIR)/%.o: %.c
+	$(info ===>  COMPILE  $@)
+	$(Q)$(CC) -c $< -o $@ $(CFLAGS)
+
+$(BUILD_DIR):
+	@mkdir -p $(BUILD_DIR)
 
 .PHONY: clean
 
 clean:
 	@rm -f gga_x_pbe
+	@rm -rf $(BUILD_DIR)
diff --git a/ref/common/gga_x_pbeopt.h b/ref/common/gga_x_pbeopt.h
deleted file mode 100644
index df3a25b..0000000
--- a/ref/common/gga_x_pbeopt.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#define XC_GGA_X_PBE_OPT           1101 /* Perdew, Burke & Ernzerhof exchange             */
-#define XC_GGA_X_PBE_R_OPT         1102 /* Perdew, Burke & Ernzerhof exchange (revised)   */
-#define XC_GGA_X_PBE_SOL_OPT       1116 /* Perdew, Burke & Ernzerhof exchange (solids)    */
-#define XC_GGA_X_XPBE_OPT          1123 /* xPBE reparametrization by Xu & Goddard         */
-#define XC_GGA_X_PBE_JSJR_OPT      1126 /* JSJR reparametrization by Pedroza, Silva & Capelle */
-#define XC_GGA_X_PBEK1_VDW_OPT     1140 /* PBE reparametrization for vdW                  */
-#define XC_GGA_X_APBE_OPT          1184 /* mu fixed from the semiclassical neutral atom   */
-#define XC_GGA_X_PBE_TCA_OPT       1059 /* PBE revised by Tognetti et al                  */
-#define XC_GGA_X_PBE_MOL_OPT       1049 /* Del Campo, Gazquez, Trickey and Vela (PBE-like) */
-#define XC_GGA_X_LAMBDA_LO_N_OPT   1045 /* lambda_LO(N) version of PBE                    */
-#define XC_GGA_X_LAMBDA_CH_N_OPT   1044 /* lambda_CH(N) version of PBE                    */
-#define XC_GGA_X_LAMBDA_OC2_N_OPT  1040 /* lambda_OC2(N) version of PBE                   */
-#define XC_GGA_X_BCGP_OPT          1038 /* Burke, Cancio, Gould, and Pittalis             */
-#define XC_GGA_X_PBEFE_OPT         1265 /* PBE for formation energies                     */
diff --git a/ref/common/mix_func.c b/ref/common/mix_func.c
deleted file mode 100644
index aeb2f30..0000000
--- a/ref/common/mix_func.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
-  Copyright (C) 2006-2021 M.A.L. Marques
-                2018-2021 Susi Lehtola
-                2019 X. Andrade
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-*/
-
-
-#include "util.h"
-
-/* initializes the mixing */
-void
-xc_mix_init(xc_func_type *p, int n_funcs, const int *funcs_id, const double *mix_coef)
-{
-  int ii;
-
-  assert(p != NULL);
-  assert(p->func_aux == NULL && p->mix_coef == NULL);
-
-  /* allocate structures needed for mixed functional */
-  p->n_func_aux = n_funcs;
-  p->mix_coef   = (double *) libxc_malloc(n_funcs*sizeof(double));
-  p->func_aux   = (xc_func_type **) libxc_malloc(n_funcs*sizeof(xc_func_type *));
-
-  for(ii=0; ii<n_funcs; ii++){
-    p->mix_coef[ii] = mix_coef[ii];
-    p->func_aux[ii] = (xc_func_type *) libxc_malloc(sizeof(xc_func_type));
-    xc_func_init (p->func_aux[ii], funcs_id[ii], p->nspin);
-  }
-
-  /* initialize variables */
-  p->hyb_number_terms = 0;
-  p->hyb_type  = NULL;
-  p->hyb_coeff = NULL;
-  p->hyb_omega = NULL;
-
-  p->nlc_b     = 0.0;
-  p->nlc_C     = 0.0;
-}
-
-#ifdef HAVE_CUDA
-__global__ static void add_to_mix_gpu(size_t np, double * dst, double coeff, const double *src){
-  size_t ip = blockIdx.x * blockDim.x + threadIdx.x;
-  if(ip < np) dst[ip] += coeff*src[ip];
-}
-#endif
-
-static void add_to_mix(size_t np, double * dst, double coeff, const double *src){
-#ifndef HAVE_CUDA
-  size_t ip;
-  for(ip = 0; ip < np; ip++) dst[ip] += coeff*src[ip];
-#else
-  size_t nblocks = np/CUDA_BLOCK_SIZE;
-  if(np != nblocks*CUDA_BLOCK_SIZE) nblocks++;
-  add_to_mix_gpu<<<nblocks, CUDA_BLOCK_SIZE>>>(np, dst, coeff, src);
-#endif
-}
-
-#define is_mgga(id)   ((id) == XC_FAMILY_MGGA)
-#define is_gga(id)    ((id) == XC_FAMILY_GGA || is_mgga(id))
-#define is_lda(id)    ((id) == XC_FAMILY_LDA ||  is_gga(id))
-#define safe_free(pt) if(pt != NULL) libxc_free(pt)
-#define sum_var(VAR) add_to_mix(np*dim->VAR, VAR, func->mix_coef[ii], x ## VAR);
-
-void
-xc_mix_func(const xc_func_type *func, size_t np,
-            const double *rho, const double *sigma, const double *lapl, const double *tau,
-            double *zk MGGA_OUT_PARAMS_NO_EXC(XC_COMMA double *, ))
-{
-  const xc_func_type *aux;
-  double *xzk MGGA_OUT_PARAMS_NO_EXC(XC_COMMA *, x);
-  int ii;
-
-  const xc_dimensions *dim = &(func->dim);
-
-  /* Sanity check: have we claimed the highest possible derivatives?
-     First, check for the lowest common derivative (also need to make
-     sure the derivatives have been compiled in!)
-  */
-  int have_vxc = XC_FLAGS_I_HAVE_VXC;
-  int have_fxc = XC_FLAGS_I_HAVE_FXC;
-  int have_kxc = XC_FLAGS_I_HAVE_KXC;
-  int have_lxc = XC_FLAGS_I_HAVE_LXC;
-  for(ii=0; ii<func->n_func_aux; ii++){
-    aux = func->func_aux[ii];
-    if(! (aux->info->flags & XC_FLAGS_HAVE_VXC))
-      have_vxc = 0;
-    if(! (aux->info->flags & XC_FLAGS_HAVE_FXC))
-      have_fxc = 0;
-    if(! (aux->info->flags & XC_FLAGS_HAVE_KXC))
-      have_kxc = 0;
-    if(! (aux->info->flags & XC_FLAGS_HAVE_LXC))
-      have_lxc = 0;
-  }
-  /* Then, for the actual checks */
-  assert(have_lxc == (func->info->flags & XC_FLAGS_I_HAVE_LXC));
-  assert(have_kxc == (func->info->flags & XC_FLAGS_I_HAVE_KXC));
-  assert(have_fxc == (func->info->flags & XC_FLAGS_I_HAVE_FXC));
-  assert(have_vxc == (func->info->flags & XC_FLAGS_I_HAVE_VXC));
-
-  /* Sanity check: if component needs the Laplacian, then the mix
-     must require it too */
-  int need_laplacian = 0;
-  for(ii=0; ii<func->n_func_aux; ii++){
-    aux = func->func_aux[ii];
-    if(aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN)
-      need_laplacian = XC_FLAGS_NEEDS_LAPLACIAN;
-  }
-  assert((func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) == need_laplacian);
-  /* Same for tau */
-  int need_tau = 0;
-  for(ii=0; ii<func->n_func_aux; ii++){
-    aux = func->func_aux[ii];
-    if(aux->info->flags & XC_FLAGS_NEEDS_TAU)
-      need_tau = XC_FLAGS_NEEDS_TAU;
-  }
-  assert((func->info->flags & XC_FLAGS_NEEDS_TAU) == need_tau);
-
-  /* Check compatibility of the individual components */
-  for(ii=0; ii<func->n_func_aux; ii++){
-    aux = func->func_aux[ii];
-    /* Sanity check: if component is GGA or meta-GGA, mix functional
-       must also be GGA or meta-GGA */
-    if(is_gga(aux->info->family))
-      assert(is_gga(func->info->family));
-    if(is_mgga(aux->info->family) && !is_mgga(func->info->family))
-      assert(is_mgga(func->info->family));
-    /* Sanity checks: if mix functional has higher derivatives, these
-       must also exist in the individual components */
-    if(func->info->flags & XC_FLAGS_HAVE_VXC)
-      assert(aux->info->flags & XC_FLAGS_HAVE_VXC);
-    if(func->info->flags & XC_FLAGS_HAVE_FXC)
-      assert(aux->info->flags & XC_FLAGS_HAVE_FXC);
-    if(func->info->flags & XC_FLAGS_HAVE_KXC)
-      assert(aux->info->flags & XC_FLAGS_HAVE_KXC);
-    if(func->info->flags & XC_FLAGS_HAVE_LXC)
-      assert(aux->info->flags & XC_FLAGS_HAVE_LXC);
-  }
-
-  /* prepare buffers that will hold the results from the individual functionals */
-  xzk MGGA_OUT_PARAMS_NO_EXC(=, x) = NULL;
-
-  /* allocate buffers */
-  xc_mgga_vars_allocate_all(func->info->family, np, dim,
-                            zk != NULL, vrho != NULL, v2rho2 != NULL, v3rho3 != NULL, v4rho4 != NULL,
-                            &xzk MGGA_OUT_PARAMS_NO_EXC(XC_COMMA &, x));
-
-  /* Proceed by computing the mix */
-  for(ii=0; ii<func->n_func_aux; ii++){
-    aux = func->func_aux[ii];
-
-    /* Evaluate the functional */
-    switch(aux->info->family){
-    case XC_FAMILY_LDA:
-      xc_lda(aux, np, rho,
-             xzk LDA_OUT_PARAMS_NO_EXC(XC_COMMA, x));
-      break;
-    case XC_FAMILY_GGA:
-      xc_gga(aux, np, rho, sigma,
-             xzk GGA_OUT_PARAMS_NO_EXC(XC_COMMA, x));
-      break;
-    case XC_FAMILY_MGGA:
-      xc_mgga(aux, np, rho, sigma, lapl, tau,
-              xzk MGGA_OUT_PARAMS_NO_EXC(XC_COMMA, x));
-      break;
-    }
-
-    /* Do the mixing */
-    if(zk != NULL) {
-      sum_var(zk);
-    }
-
- #ifndef XC_DONT_COMPILE_VXC
-    if(vrho != NULL) {
-      sum_var(vrho);
-
-      if(is_gga(aux->info->family)) {
-        sum_var(vsigma);
-      }
-
-      if(is_mgga(aux->info->family)) {
-        if(aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) {
-          sum_var(vlapl);
-        }
-        if(aux->info->flags & XC_FLAGS_NEEDS_TAU) {
-          sum_var(vtau);
-        }
-      }
-    }
-
-#ifndef XC_DONT_COMPILE_FXC
-    if(v2rho2 != NULL){
-      sum_var(v2rho2);
-
-      if(is_gga(aux->info->family)) {
-        sum_var(v2rhosigma);
-        sum_var(v2sigma2);
-      }
-
-      if(is_mgga(aux->info->family)) {
-        if(aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) {
-          sum_var(v2rholapl);
-          sum_var(v2sigmalapl);
-          sum_var(v2lapl2);
-        }
-        if(aux->info->flags & XC_FLAGS_NEEDS_TAU) {
-          sum_var(v2rhotau);
-          sum_var(v2sigmatau);
-          sum_var(v2tau2);
-        }
-        if((aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) && (aux->info->flags & XC_FLAGS_NEEDS_TAU)) {
-          sum_var(v2lapltau);
-        }
-      }
-    }
-
-#ifndef XC_DONT_COMPILE_KXC
-    if(v3rho3 != NULL){
-      sum_var(v3rho3);
-
-      if(is_gga(aux->info->family)) {
-        sum_var(v3rho2sigma);
-        sum_var(v3rhosigma2);
-        sum_var(v3sigma3);
-      }
-
-      if(is_mgga(aux->info->family)) {
-        if(aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) {
-          sum_var(v3rho2lapl);
-          sum_var(v3rhosigmalapl);
-          sum_var(v3rholapl2);
-          sum_var(v3sigma2lapl);
-          sum_var(v3sigmalapl2);
-          sum_var(v3lapl3);
-        }
-        if(aux->info->flags & XC_FLAGS_NEEDS_TAU) {
-          sum_var(v3rho2tau);
-          sum_var(v3rhosigmatau);
-          sum_var(v3rhotau2);
-          sum_var(v3sigma2tau);
-          sum_var(v3sigmatau2);
-          sum_var(v3tau3);
-        }
-        if((aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) && (aux->info->flags & XC_FLAGS_NEEDS_TAU)) {
-          sum_var(v3rholapltau);
-          sum_var(v3sigmalapltau);
-          sum_var(v3lapl2tau);
-          sum_var(v3lapltau2);
-        }
-      }
-    }
-
-#ifndef XC_DONT_COMPILE_LXC
-    if(v4rho4 != NULL){
-      sum_var(v4rho4);
-
-      if(is_gga(aux->info->family)) {
-        sum_var(v4rho3sigma);
-        sum_var(v4rho2sigma2);
-        sum_var(v4rhosigma3);
-        sum_var(v4sigma4);
-      }
-      if(is_mgga(aux->info->family)) {
-        if(aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) {
-          sum_var(v4rho3lapl);
-          sum_var(v4rho2sigmalapl);
-          sum_var(v4rho2lapl2);
-          sum_var(v4rhosigma2lapl);
-          sum_var(v4rhosigmalapl2);
-          sum_var(v4rholapl3);
-          sum_var(v4sigma3lapl);
-          sum_var(v4sigma2lapl2);
-          sum_var(v4sigmalapl3);
-          sum_var(v4lapl4);
-        }
-        if(aux->info->flags & XC_FLAGS_NEEDS_TAU) {
-          sum_var(v4rho3tau);
-          sum_var(v4rho2sigmatau);
-          sum_var(v4rho2tau2);
-          sum_var(v4rhosigma2tau);
-          sum_var(v4rhosigmatau2);
-          sum_var(v4rhotau3);
-          sum_var(v4sigma3tau);
-          sum_var(v4sigma2tau2);
-          sum_var(v4sigmatau3);
-          sum_var(v4tau4);
-        }
-        if((aux->info->flags & XC_FLAGS_NEEDS_LAPLACIAN) && (aux->info->flags & XC_FLAGS_NEEDS_TAU)) {
-          sum_var(v4rho2lapltau);
-          sum_var(v4rhosigmalapltau);
-          sum_var(v4rholapl2tau);
-          sum_var(v4rholapltau2);
-          sum_var(v4sigma2lapltau);
-          sum_var(v4sigmalapl2tau);
-          sum_var(v4sigmalapltau2);
-          sum_var(v4lapl3tau);
-          sum_var(v4lapl2tau2);
-          sum_var(v4lapltau3);
-        }
-      }
-    }
-#endif
-#endif
-#endif
-#endif
-  } /* end functional loop */
-
-  /* deallocate internal buffers */
-  xc_mgga_vars_free_all(xzk MGGA_OUT_PARAMS_NO_EXC(XC_COMMA, x));
-}
diff --git a/ref/common/registered_funcs.h b/ref/common/registered_funcs.h
index 48552ca..b278b11 100644
--- a/ref/common/registered_funcs.h
+++ b/ref/common/registered_funcs.h
@@ -13,14 +13,14 @@ xc_functional_key_t xc_functional_keys[] = {
 {"gga_x_pbe_jsjr", 126},
 {"gga_x_pbek1_vdw", 140},
 {"gga_x_pbefe", 265},
-{"gga_x_pbe_mol_opt", 1049},
-{"gga_x_pbe_tca_opt", 1059},
-{"gga_x_pbe_opt", 1101},
-{"gga_x_pbe_r_opt", 1102},
-{"gga_x_pbe_sol_opt", 1116},
-{"gga_x_pbe_jsjr_opt", 1126},
-{"gga_x_pbek1_vdw_opt", 1140},
-{"gga_x_pbefe_opt", 1265},
+{"gga_x_pbe_mol_genxc", 1049},
+{"gga_x_pbe_tca_genxc", 1059},
+{"gga_x_pbe_genxc", 1101},
+{"gga_x_pbe_r_genxc", 1102},
+{"gga_x_pbe_sol_genxc", 1116},
+{"gga_x_pbe_jsjr_genxc", 1126},
+{"gga_x_pbek1_vdw_genxc", 1140},
+{"gga_x_pbefe_genxc", 1265},
 {"", -1},
 };
 
@@ -35,15 +35,15 @@ extern xc_func_info_type xc_func_info_gga_x_pbefe;
 extern xc_func_info_type xc_func_info_gga_x_bcgp;
 
 /*
-extern xc_func_info_type xc_func_info_gga_x_pbe_mol_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbe_tca_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbe_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbe_r_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbe_sol_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbe_jsjr_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbek1_vdw_opt;
-extern xc_func_info_type xc_func_info_gga_x_pbefe_opt;
-extern xc_func_info_type xc_func_info_gga_x_bcgp_opt;
+extern xc_func_info_type xc_func_info_gga_x_pbe_mol_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbe_tca_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbe_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbe_r_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbe_sol_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbe_jsjr_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbek1_vdw_genxc;
+extern xc_func_info_type xc_func_info_gga_x_pbefe_genxc;
+extern xc_func_info_type xc_func_info_gga_x_bcgp_genxc;
 */
 
 const xc_func_info_type *xc_lda_known_funct[] = {};
@@ -59,15 +59,15 @@ const xc_func_info_type *xc_gga_known_funct[] = {
   &xc_func_info_gga_x_pbefe,
   &xc_func_info_gga_x_bcgp,
 /*
-  &xc_func_info_gga_x_pbe_mol_opt,
-  &xc_func_info_gga_x_pbe_tca_opt,
-  &xc_func_info_gga_x_pbe_opt,
-  &xc_func_info_gga_x_pbe_r_opt,
-  &xc_func_info_gga_x_pbe_sol_opt,
-  &xc_func_info_gga_x_pbe_jsjr_opt,
-  &xc_func_info_gga_x_pbek1_vdw_opt,
-  &xc_func_info_gga_x_pbefe_opt,
-  &xc_func_info_gga_x_bcgp_opt,
+  &xc_func_info_gga_x_pbe_mol_genxc,
+  &xc_func_info_gga_x_pbe_tca_genxc,
+  &xc_func_info_gga_x_pbe_genxc,
+  &xc_func_info_gga_x_pbe_r_genxc,
+  &xc_func_info_gga_x_pbe_sol_genxc,
+  &xc_func_info_gga_x_pbe_jsjr_genxc,
+  &xc_func_info_gga_x_pbek1_vdw_genxc,
+  &xc_func_info_gga_x_pbefe_genxc,
+  &xc_func_info_gga_x_bcgp_genxc,
 */
 };
 
diff --git a/ref/common/gga_x_pbeopt.c b/ref/genxc/gga_x_pbe_genxc.c
similarity index 79%
rename from ref/common/gga_x_pbeopt.c
rename to ref/genxc/gga_x_pbe_genxc.c
index ef52c37..e32f683 100644
--- a/ref/common/gga_x_pbeopt.c
+++ b/ref/genxc/gga_x_pbe_genxc.c
@@ -6,9 +6,12 @@
  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
 
-#include "util.h"
-#include "gga_x_pbeopt.h"
+
 #include <omp.h>
+//---
+#include "../common/util.h"
+#include "gga_x_pbe_genxc.h"
+
 
 typedef struct{
   double kappa, mu;
@@ -58,18 +61,18 @@ static const double pbe_bcgp_values[PBE_N_PAR] =
 static const double pbe_fe_values[PBE_N_PAR] =
   {0.437, 0.346};
 
-//#include "work_gga.c"
-//#define work_gga_x_pbe work_gga
-#include "work_gga_x_pbe.c"
-//#include "maple2c/gga_exc/gga_x_pbe.c"
-#include "../maple2c/gga_x_pbeopt.c"
+//#include "../libxc/work_gga.h"
+//#define work_gga_genxc work_gga
+//#include "../libxc/gga_x_pbe.h"
+#include "gga_x_pbe_genxc_funcs.h"
+#include "work_gga_genxc.h"
 
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_opt = {
-  XC_GGA_X_PBE_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_genxc = {
+  XC_GGA_X_PBE_GENXC,
   XC_EXCHANGE,
   "Perdew, Burke & Ernzerhof",
   XC_FAMILY_GGA,
@@ -78,14 +81,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_r_opt = {
-  XC_GGA_X_PBE_R_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_r_genxc = {
+  XC_GGA_X_PBE_R_GENXC,
   XC_EXCHANGE,
   "Revised PBE from Zhang & Yang",
   XC_FAMILY_GGA,
@@ -94,14 +97,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_r_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_r_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_sol_opt = {
-  XC_GGA_X_PBE_SOL_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_sol_genxc = {
+  XC_GGA_X_PBE_SOL_GENXC,
   XC_EXCHANGE,
   "Perdew, Burke & Ernzerhof SOL",
   XC_FAMILY_GGA,
@@ -110,14 +113,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_sol_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_sol_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_xpbe_opt = {
-  XC_GGA_X_XPBE_OPT,
+const xc_func_info_type xc_func_info_gga_x_xpbe_genxc = {
+  XC_GGA_X_XPBE_GENXC,
   XC_EXCHANGE,
   "Extended PBE by Xu & Goddard III",
   XC_FAMILY_GGA,
@@ -126,14 +129,14 @@ const xc_func_info_type xc_func_info_gga_x_xpbe_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_xpbe_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_jsjr_opt = {
-  XC_GGA_X_PBE_JSJR_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_jsjr_genxc = {
+  XC_GGA_X_PBE_JSJR_GENXC,
   XC_EXCHANGE,
   "Reparametrized PBE by Pedroza, Silva & Capelle",
   XC_FAMILY_GGA,
@@ -142,14 +145,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_jsjr_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_jsjr_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbek1_vdw_opt = {
-  XC_GGA_X_PBEK1_VDW_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbek1_vdw_genxc = {
+  XC_GGA_X_PBEK1_VDW_GENXC,
   XC_EXCHANGE,
   "Reparametrized PBE for vdW",
   XC_FAMILY_GGA,
@@ -158,14 +161,14 @@ const xc_func_info_type xc_func_info_gga_x_pbek1_vdw_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_k1_vdw_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_apbe_opt = {
-  XC_GGA_X_APBE_OPT,
+const xc_func_info_type xc_func_info_gga_x_apbe_genxc = {
+  XC_GGA_X_APBE_GENXC,
   XC_EXCHANGE,
   "mu fixed from the semiclassical neutral atom",
   XC_FAMILY_GGA,
@@ -174,14 +177,14 @@ const xc_func_info_type xc_func_info_gga_x_apbe_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_apbe_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_tca_opt = {
-  XC_GGA_X_PBE_TCA_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_tca_genxc = {
+  XC_GGA_X_PBE_TCA_GENXC,
   XC_EXCHANGE,
   "PBE revised by Tognetti et al",
   XC_FAMILY_GGA,
@@ -190,14 +193,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_tca_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_tca_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbe_mol_opt = {
-  XC_GGA_X_PBE_MOL_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbe_mol_genxc = {
+  XC_GGA_X_PBE_MOL_GENXC,
   XC_EXCHANGE,
   "Reparametrized PBE by del Campo, Gazquez, Trickey & Vela",
   XC_FAMILY_GGA,
@@ -206,14 +209,14 @@ const xc_func_info_type xc_func_info_gga_x_pbe_mol_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_mol_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_bcgp_opt = {
-  XC_GGA_X_BCGP_OPT,
+const xc_func_info_type xc_func_info_gga_x_bcgp_genxc = {
+  XC_GGA_X_BCGP_GENXC,
   XC_EXCHANGE,
   "Burke, Cancio, Gould, and Pittalis",
   XC_FAMILY_GGA,
@@ -222,14 +225,14 @@ const xc_func_info_type xc_func_info_gga_x_bcgp_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_bcgp_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_pbefe_opt = {
-  XC_GGA_X_PBEFE_OPT,
+const xc_func_info_type xc_func_info_gga_x_pbefe_genxc = {
+  XC_GGA_X_PBEFE_GENXC,
   XC_EXCHANGE,
   "PBE for formation energies",
   XC_FAMILY_GGA,
@@ -238,7 +241,7 @@ const xc_func_info_type xc_func_info_gga_x_pbefe_opt = {
   1e-15,
   {PBE_N_PAR, pbe_names, pbe_desc, pbe_fe_values, set_ext_params_cpy},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #define PBEL_N_PAR 3
@@ -277,8 +280,8 @@ pbe_lambda_set_ext_params(xc_func_type *p, const double *ext_params)
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_lambda_lo_n_opt = {
-  XC_GGA_X_LAMBDA_LO_N_OPT,
+const xc_func_info_type xc_func_info_gga_x_lambda_lo_n_genxc = {
+  XC_GGA_X_LAMBDA_LO_N_GENXC,
   XC_EXCHANGE,
   "lambda_LO(N) version of PBE",
   XC_FAMILY_GGA,
@@ -287,14 +290,14 @@ const xc_func_info_type xc_func_info_gga_x_lambda_lo_n_opt = {
   1e-15,
   {PBEL_N_PAR, pbe_lambda_names, pbe_lambda_desc, pbe_lambda_lo_n_values, pbe_lambda_set_ext_params},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_lambda_ch_n_opt = {
-  XC_GGA_X_LAMBDA_CH_N_OPT,
+const xc_func_info_type xc_func_info_gga_x_lambda_ch_n_genxc = {
+  XC_GGA_X_LAMBDA_CH_N_GENXC,
   XC_EXCHANGE,
   "lambda_CH(N) version of PBE",
   XC_FAMILY_GGA,
@@ -303,14 +306,14 @@ const xc_func_info_type xc_func_info_gga_x_lambda_ch_n_opt = {
   1e-15,
   {PBEL_N_PAR, pbe_lambda_names, pbe_lambda_desc, pbe_lambda_ch_n_values, pbe_lambda_set_ext_params},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 #ifdef __cplusplus
 extern "C"
 #endif
-const xc_func_info_type xc_func_info_gga_x_lambda_oc2_n_opt = {
-  XC_GGA_X_LAMBDA_OC2_N_OPT,
+const xc_func_info_type xc_func_info_gga_x_lambda_oc2_n_genxc = {
+  XC_GGA_X_LAMBDA_OC2_N_GENXC,
   XC_EXCHANGE,
   "lambda_OC2(N) version of PBE",
   XC_FAMILY_GGA,
@@ -319,7 +322,7 @@ const xc_func_info_type xc_func_info_gga_x_lambda_oc2_n_opt = {
   1e-15,
   {PBEL_N_PAR, pbe_lambda_names, pbe_lambda_desc, pbe_lambda_oc2_n_values, pbe_lambda_set_ext_params},
   gga_x_pbe_init, NULL,
-  NULL, work_gga_x_pbe, NULL
+  NULL, work_gga_genxc, NULL
 };
 
 
diff --git a/ref/genxc/gga_x_pbe_genxc.h b/ref/genxc/gga_x_pbe_genxc.h
new file mode 100644
index 0000000..a940426
--- /dev/null
+++ b/ref/genxc/gga_x_pbe_genxc.h
@@ -0,0 +1,14 @@
+#define XC_GGA_X_PBE_GENXC          1101 /* Perdew, Burke & Ernzerhof exchange             */
+#define XC_GGA_X_PBE_R_GENXC        1102 /* Perdew, Burke & Ernzerhof exchange (revised)   */
+#define XC_GGA_X_PBE_SOL_GENXC      1116 /* Perdew, Burke & Ernzerhof exchange (solids)    */
+#define XC_GGA_X_XPBE_GENXC         1123 /* xPBE reparametrization by Xu & Goddard         */
+#define XC_GGA_X_PBE_JSJR_GENXC     1126 /* JSJR reparametrization by Pedroza, Silva & Capelle */
+#define XC_GGA_X_PBEK1_VDW_GENXC    1140 /* PBE reparametrization for vdW                  */
+#define XC_GGA_X_APBE_GENXC         1184 /* mu fixed from the semiclassical neutral atom   */
+#define XC_GGA_X_PBE_TCA_GENXC      1059 /* PBE revised by Tognetti et al                  */
+#define XC_GGA_X_PBE_MOL_GENXC      1049 /* Del Campo, Gazquez, Trickey and Vela (PBE-like) */
+#define XC_GGA_X_LAMBDA_LO_N_GENXC  1045 /* lambda_LO(N) version of PBE                    */
+#define XC_GGA_X_LAMBDA_CH_N_GENXC  1044 /* lambda_CH(N) version of PBE                    */
+#define XC_GGA_X_LAMBDA_OC2_N_GENXC 1040 /* lambda_OC2(N) version of PBE                   */
+#define XC_GGA_X_BCGP_GENXC         1038 /* Burke, Cancio, Gould, and Pittalis             */
+#define XC_GGA_X_PBEFE_GENXC        1265 /* PBE for formation energies                     */
diff --git a/ref/maple2c/gga_x_pbeopt.c b/ref/genxc/gga_x_pbe_genxc_funcs.h
similarity index 100%
rename from ref/maple2c/gga_x_pbeopt.c
rename to ref/genxc/gga_x_pbe_genxc_funcs.h
diff --git a/ref/common/work_gga_x_pbe.c b/ref/genxc/work_gga_genxc.h
similarity index 99%
rename from ref/common/work_gga_x_pbe.c
rename to ref/genxc/work_gga_genxc.h
index 4d41971..fa62e7f 100644
--- a/ref/common/work_gga_x_pbe.c
+++ b/ref/genxc/work_gga_genxc.h
@@ -24,7 +24,7 @@
  * @param[in,out] func_type: pointer to functional structure
  */
 static void
-work_gga_x_pbe(const XC(func_type) *p, size_t np,
+work_gga_genxc(const XC(func_type) *p, size_t np,
 #ifdef USE_INTERNAL_COUNTERS
          const double *irho, const double *isigma, double *izk,
          double *ivrho, double *ivsigma, double *iv2rho2, double *iv2rhosigma, double *iv2sigma2,
diff --git a/ref/gga_x_pbe b/ref/gga_x_pbe
deleted file mode 100755
index 2492791fdf0e80f1e34578a42375834d95b426d5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 77376
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

diff --git a/ref/gga_x_pbe.c b/ref/gga_x_pbe.c
deleted file mode 100644
index 3bfda67..0000000
--- a/ref/gga_x_pbe.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include "common/xc.h"
-#include "common/gga_x_pbe.h"
-
-double getTimeStamp() {
-    struct timespec ts;
-    clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9;
-}
-
-void cache_flush(const void *p, unsigned int allocation_size) {
-  const size_t cache_line = 64;
-  const char *cp = (const char *)p;
-
-  if(p == NULL || allocation_size <= 0) {
-    return;
-  }
-
-  for(int i = 0; i < allocation_size; i += cache_line) {
-    asm volatile("clflush (%0)\n\t" : : "r"(&cp[i]) : "memory");
-  }
-
-  asm volatile("sfence\n\t" : : : "memory");
-}
-
-int main() {
-  xc_func_type gga;
-  int i;
-  int npoints = 10000000;
-  //int npoints = 100;
-  double *rho, *sigma;
-  double *zk, zkp, *vrho, vrhop[2], *vsigma, vsigmap[3];
-  double *v2rho2, *v2rhosigma, *v2sigma2;
-  double *v3rho3, *v3rho2sigma, *v3rhosigma2, *v3sigma3;
-  double *v4rho4, *v4rho3sigma, *v4rho2sigma2, *v4rhosigma3, *v4sigma4;
-  double S, E;
-
-  rho          = (double*) malloc( 2*npoints*sizeof(double));
-  sigma        = (double*) malloc( 3*npoints*sizeof(double));
-  zk           = (double*) malloc( 1*npoints*sizeof(double));
-  vrho         = (double*) malloc( 2*npoints*sizeof(double));
-  vsigma       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rho2       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rhosigma   = (double*) malloc( 6*npoints*sizeof(double));
-  v2sigma2     = (double*) malloc( 6*npoints*sizeof(double));
-  #ifdef KXC
-  v3rho3       = (double*) malloc( 4*npoints*sizeof(double));
-  v3rho2sigma  = (double*) malloc( 9*npoints*sizeof(double));
-  v3rhosigma2  = (double*) malloc(12*npoints*sizeof(double));
-  v3sigma3     = (double*) malloc(10*npoints*sizeof(double));
-  #else
-  v3rho3       = (double*) NULL;
-  v3rho2sigma  = (double*) NULL;
-  v3rhosigma2  = (double*) NULL;
-  v3sigma3     = (double*) NULL;
-  #endif
-  #ifdef LXC
-  v4rho4       = (double*) malloc( 5*npoints*sizeof(double));
-  v4rho3sigma  = (double*) malloc(12*npoints*sizeof(double));
-  v4rho2sigma2 = (double*) malloc(18*npoints*sizeof(double));
-  v4rhosigma3  = (double*) malloc(20*npoints*sizeof(double));
-  v4sigma4     = (double*) malloc(15*npoints*sizeof(double));
-  #else
-  v4rho4       = (double*) NULL;
-  v4rho3sigma  = (double*) NULL;
-  v4rho2sigma2 = (double*) NULL;
-  v4rhosigma3  = (double*) NULL;
-  v4sigma4     = (double*) NULL;
-  #endif
-
-  if(xc_func_init(&gga, XC_GGA_X_BCGP, XC_POLARIZED) < 0) {
-    fprintf(stderr, "XC_GGA_X_BCGP not found!\n");
-    return -1;
-  }
-
-  for(i=0; i<npoints; i++){
-    rho[2*i + 0]   = 0.048 + i/(double)(npoints);
-    rho[2*i + 1]   = 0.025;
-    sigma[3*i + 0] = 0.0046;
-    sigma[3*i + 1] = 0.0044;
-    sigma[3*i + 2] = 0.0041;
-  }
-
-  cache_flush(rho, 2 * npoints * sizeof(double));
-  cache_flush(sigma, 3 * npoints * sizeof(double));
-  cache_flush(zk, 1 * npoints * sizeof(double));
-  cache_flush(vrho, 2 * npoints * sizeof(double));
-  cache_flush(vsigma, 3 * npoints * sizeof(double));
-  cache_flush(v2rho2, 3 * npoints * sizeof(double));
-  cache_flush(v2rhosigma, 6 * npoints * sizeof(double));
-  cache_flush(v2sigma2, 6 * npoints * sizeof(double));
-  #ifdef KXC
-  cache_flush(v3rho3, 4 * npoints * sizeof(double));
-  cache_flush(v3rho2sigma, 9 * npoints * sizeof(double));
-  cache_flush(v3rhosigma2, 12 * npoints * sizeof(double));
-  cache_flush(v3sigma3, 10 * npoints * sizeof(double));
-  #endif
-  #ifdef LXC
-  cache_flush(v4rho4, 5 * npoints * sizeof(double));
-  cache_flush(v4rho3sigma, 12 * npoints * sizeof(double));
-  cache_flush(v4rho2sigma2, 18 * npoints * sizeof(double));
-  cache_flush(v4rhosigma3, 20 * npoints * sizeof(double));
-  cache_flush(v4sigma4, 15 * npoints * sizeof(double));
-  #endif
-
-  S = getTimeStamp();
-  xc_gga(&gga, npoints, rho, sigma, zk, vrho, vsigma, v2rho2, v2rhosigma, v2sigma2, v3rho3, v3rho2sigma, v3rhosigma2, v3sigma3, v4rho4, v4rho3sigma, v4rho2sigma2, v4rhosigma3, v4sigma4);
-  E = getTimeStamp();
-  fprintf(stderr, "GGA_X_PBE: %.4fs\n", E-S);
-  /*for(i=0; i<npoints; i++){
-    fprintf(stderr, "%16.10lf\t%16.10lf\t%16.10lf\n", rho[2*i + 0], vrho[2*i + 0], v2rho2[3*i + 0]);
-  }*/
-
-  xc_func_end(&gga);
-  return 0;
-}
diff --git a/ref/gga_x_pbe_both.c b/ref/gga_x_pbe_both.c
deleted file mode 100644
index b92e430..0000000
--- a/ref/gga_x_pbe_both.c
+++ /dev/null
@@ -1,161 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <xc.h>
-#include <time.h>
-
-double getTimeStamp() {
-    struct timespec ts;
-    clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9;
-}
-
-void cache_flush(const void *p, unsigned int allocation_size) {
-  const size_t cache_line = 64;
-  const char *cp = (const char *)p;
-
-  if(p == NULL || allocation_size <= 0) {
-    return;
-  }
-
-  for(int i = 0; i < allocation_size; i += cache_line) {
-    asm volatile("clflush (%0)\n\t" : : "r"(&cp[i]) : "memory");
-  }
-
-  asm volatile("sfence\n\t" : : : "memory");
-}
-
-int main() {
-  xc_func_type gga, ggaopt;
-  int i;
-  int npoints = 10000000;
-  //int npoints = 100;
-  double *rho, *sigma;
-  double *zk, zkp, *vrho, vrhop[2], *vsigma, vsigmap[3];
-  double *v2rho2, *v2rhosigma, *v2sigma2;
-  double *v3rho3, *v3rho2sigma, *v3rhosigma2, *v3sigma3;
-  double *v4rho4, *v4rho3sigma, *v4rho2sigma2, *v4rhosigma3, *v4sigma4;
-  double S, E;
-
-  rho          = (double*) malloc( 2*npoints*sizeof(double));
-  sigma        = (double*) malloc( 3*npoints*sizeof(double));
-  zk           = (double*) malloc( 1*npoints*sizeof(double));
-  vrho         = (double*) malloc( 2*npoints*sizeof(double));
-  vsigma       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rho2       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rhosigma   = (double*) malloc( 6*npoints*sizeof(double));
-  v2sigma2     = (double*) malloc( 6*npoints*sizeof(double));
-  #ifdef KXC
-  v3rho3       = (double*) malloc( 4*npoints*sizeof(double));
-  v3rho2sigma  = (double*) malloc( 9*npoints*sizeof(double));
-  v3rhosigma2  = (double*) malloc(12*npoints*sizeof(double));
-  v3sigma3     = (double*) malloc(10*npoints*sizeof(double));
-  #else
-  v3rho3       = (double*) NULL;
-  v3rho2sigma  = (double*) NULL;
-  v3rhosigma2  = (double*) NULL;
-  v3sigma3     = (double*) NULL;
-  #endif
-  #ifdef LXC
-  v4rho4       = (double*) malloc( 5*npoints*sizeof(double));
-  v4rho3sigma  = (double*) malloc(12*npoints*sizeof(double));
-  v4rho2sigma2 = (double*) malloc(18*npoints*sizeof(double));
-  v4rhosigma3  = (double*) malloc(20*npoints*sizeof(double));
-  v4sigma4     = (double*) malloc(15*npoints*sizeof(double));
-  #else
-  v4rho4       = (double*) NULL;
-  v4rho3sigma  = (double*) NULL;
-  v4rho2sigma2 = (double*) NULL;
-  v4rhosigma3  = (double*) NULL;
-  v4sigma4     = (double*) NULL;
-  #endif
-
-  if(xc_func_init(&gga, XC_GGA_X_BCGP, XC_POLARIZED) < 0) {
-    fprintf(stderr, "XC_GGA_X_BCGP not found!\n");
-    return -1;
-  }
-
-  if(xc_func_init(&ggaopt, XC_GGA_X_BCGP_OPT, XC_POLARIZED) < 0) {
-    fprintf(stderr, "XC_GGA_X_BCGP_OPT not found!\n");
-    return -1;
-  }
-
-  for(i=0; i<npoints; i++){
-    rho[2*i + 0]   = 0.048 + i/(double)(npoints);
-    rho[2*i + 1]   = 0.025;
-    sigma[3*i + 0] = 0.0046;
-    sigma[3*i + 1] = 0.0044;
-    sigma[3*i + 2] = 0.0041;
-  }
-
-  cache_flush(rho, 2 * npoints * sizeof(double));
-  cache_flush(sigma, 3 * npoints * sizeof(double));
-  cache_flush(zk, 1 * npoints * sizeof(double));
-  cache_flush(vrho, 2 * npoints * sizeof(double));
-  cache_flush(vsigma, 3 * npoints * sizeof(double));
-  cache_flush(v2rho2, 3 * npoints * sizeof(double));
-  cache_flush(v2rhosigma, 6 * npoints * sizeof(double));
-  cache_flush(v2sigma2, 6 * npoints * sizeof(double));
-  #ifdef KXC
-  cache_flush(v3rho3, 4 * npoints * sizeof(double));
-  cache_flush(v3rho2sigma, 9 * npoints * sizeof(double));
-  cache_flush(v3rhosigma2, 12 * npoints * sizeof(double));
-  cache_flush(v3sigma3, 10 * npoints * sizeof(double));
-  #endif
-  #ifdef LXC
-  cache_flush(v4rho4, 5 * npoints * sizeof(double));
-  cache_flush(v4rho3sigma, 12 * npoints * sizeof(double));
-  cache_flush(v4rho2sigma2, 18 * npoints * sizeof(double));
-  cache_flush(v4rhosigma3, 20 * npoints * sizeof(double));
-  cache_flush(v4sigma4, 15 * npoints * sizeof(double));
-  #endif
-
-  S = getTimeStamp();
-  xc_gga(&ggaopt, npoints, rho, sigma, zk, vrho, vsigma, v2rho2, v2rhosigma, v2sigma2, v3rho3, v3rho2sigma, v3rhosigma2, v3sigma3, v4rho4, v4rho3sigma, v4rho2sigma2, v4rhosigma3, v4sigma4);
-  E = getTimeStamp();
-  fprintf(stderr, "GGA_X_PBE_OPT: %.4fs\n", E-S);
-  /*for(i=0; i<npoints; i++){
-    fprintf(stderr, "%16.10lf\t%16.10lf\t%16.10lf\n", rho[2*i + 0], vrho[2*i + 0], v2rho2[3*i + 0]);
-  }*/
-
-  for(i=0; i<npoints; i++){
-    rho[2*i + 0]   = 0.048 + i/(double)(npoints);
-    rho[2*i + 1]   = 0.025;
-    sigma[3*i + 0] = 0.0046;
-    sigma[3*i + 1] = 0.0044;
-    sigma[3*i + 2] = 0.0041;
-  }
-
-  cache_flush(rho, 2 * npoints * sizeof(double));
-  cache_flush(sigma, 3 * npoints * sizeof(double));
-  cache_flush(zk, 1 * npoints * sizeof(double));
-  cache_flush(vrho, 2 * npoints * sizeof(double));
-  cache_flush(vsigma, 3 * npoints * sizeof(double));
-  cache_flush(v2rho2, 3 * npoints * sizeof(double));
-  cache_flush(v2rhosigma, 6 * npoints * sizeof(double));
-  cache_flush(v2sigma2, 6 * npoints * sizeof(double));
-  #ifdef KXC
-  cache_flush(v3rho3, 4 * npoints * sizeof(double));
-  cache_flush(v3rho2sigma, 9 * npoints * sizeof(double));
-  cache_flush(v3rhosigma2, 12 * npoints * sizeof(double));
-  cache_flush(v3sigma3, 10 * npoints * sizeof(double));
-  #endif
-  #ifdef LXC
-  cache_flush(v4rho4, 5 * npoints * sizeof(double));
-  cache_flush(v4rho3sigma, 12 * npoints * sizeof(double));
-  cache_flush(v4rho2sigma2, 18 * npoints * sizeof(double));
-  cache_flush(v4rhosigma3, 20 * npoints * sizeof(double));
-  cache_flush(v4sigma4, 15 * npoints * sizeof(double));
-  #endif
-
-  S = getTimeStamp();
-  xc_gga(&gga, npoints, rho, sigma, zk, vrho, vsigma, v2rho2, v2rhosigma, v2sigma2, v3rho3, v3rho2sigma, v3rhosigma2, v3sigma3, v4rho4, v4rho3sigma, v4rho2sigma2, v4rhosigma3, v4sigma4);
-  E = getTimeStamp();
-  fprintf(stderr, "GGA_X_PBE: %.4fs\n", E-S);
-  /*for(i=0; i<npoints; i++){
-    fprintf(stderr, "%16.10lf\t%16.10lf\t%16.10lf\n", rho[2*i + 0], vrho[2*i + 0], v2rho2[3*i + 0]);
-  }*/
-
-  xc_func_end(&gga);
-  xc_func_end(&ggaopt);
-  return 0;
-}
diff --git a/ref/gga_x_pbeopt.c b/ref/gga_x_pbeopt.c
deleted file mode 100644
index ec3f509..0000000
--- a/ref/gga_x_pbeopt.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <xc.h>
-#include <time.h>
-#include <omp.h>
-
-double getTimeStamp() {
-    struct timespec ts;
-    clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9;
-}
-
-void cache_flush(const void *p, unsigned int allocation_size) {
-  const size_t cache_line = 64;
-  const char *cp = (const char *)p;
-
-  if(p == NULL || allocation_size <= 0) {
-    return;
-  }
-
-  for(int i = 0; i < allocation_size; i += cache_line) {
-    asm volatile("clflush (%0)\n\t" : : "r"(&cp[i]) : "memory");
-  }
-
-  asm volatile("sfence\n\t" : : : "memory");
-}
-
-int main() {
-  xc_func_type ggaopt;
-  int i;
-  int npoints = 10000000;
-  //int npoints = 100;
-  double *rho, *sigma;
-  double *zk, zkp, *vrho, vrhop[2], *vsigma, vsigmap[3];
-  double *v2rho2, *v2rhosigma, *v2sigma2;
-  double *v3rho3, *v3rho2sigma, *v3rhosigma2, *v3sigma3;
-  double *v4rho4, *v4rho3sigma, *v4rho2sigma2, *v4rhosigma3, *v4sigma4;
-  double S, E;
-
-  rho          = (double*) malloc( 2*npoints*sizeof(double));
-  sigma        = (double*) malloc( 3*npoints*sizeof(double));
-  zk           = (double*) malloc( 1*npoints*sizeof(double));
-  vrho         = (double*) malloc( 2*npoints*sizeof(double));
-  vsigma       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rho2       = (double*) malloc( 3*npoints*sizeof(double));
-  v2rhosigma   = (double*) malloc( 6*npoints*sizeof(double));
-  v2sigma2     = (double*) malloc( 6*npoints*sizeof(double));
-  #ifdef KXC
-  v3rho3       = (double*) malloc( 4*npoints*sizeof(double));
-  v3rho2sigma  = (double*) malloc( 9*npoints*sizeof(double));
-  v3rhosigma2  = (double*) malloc(12*npoints*sizeof(double));
-  v3sigma3     = (double*) malloc(10*npoints*sizeof(double));
-  #else
-  v3rho3       = (double*) NULL;
-  v3rho2sigma  = (double*) NULL;
-  v3rhosigma2  = (double*) NULL;
-  v3sigma3     = (double*) NULL;
-  #endif
-  #ifdef LXC
-  v4rho4       = (double*) malloc( 5*npoints*sizeof(double));
-  v4rho3sigma  = (double*) malloc(12*npoints*sizeof(double));
-  v4rho2sigma2 = (double*) malloc(18*npoints*sizeof(double));
-  v4rhosigma3  = (double*) malloc(20*npoints*sizeof(double));
-  v4sigma4     = (double*) malloc(15*npoints*sizeof(double));
-  #else
-  v4rho4       = (double*) NULL;
-  v4rho3sigma  = (double*) NULL;
-  v4rho2sigma2 = (double*) NULL;
-  v4rhosigma3  = (double*) NULL;
-  v4sigma4     = (double*) NULL;
-  #endif
-
-  if(xc_func_init(&ggaopt, XC_GGA_X_BCGP_OPT, XC_POLARIZED) < 0) {
-    fprintf(stderr, "XC_GGA_X_BCGP_OPT not found!\n");
-    return -1;
-  }
-
-  #pragma omp parallel for
-  for(i=0; i<npoints; i++){
-    rho[2*i + 0]   = 0.048 + i/(double)(npoints);
-    rho[2*i + 1]   = 0.025;
-    sigma[3*i + 0] = 0.0046;
-    sigma[3*i + 1] = 0.0044;
-    sigma[3*i + 2] = 0.0041;
-  }
-
-  cache_flush(rho, 2 * npoints * sizeof(double));
-  cache_flush(sigma, 3 * npoints * sizeof(double));
-  cache_flush(zk, 1 * npoints * sizeof(double));
-  cache_flush(vrho, 2 * npoints * sizeof(double));
-  cache_flush(vsigma, 3 * npoints * sizeof(double));
-  cache_flush(v2rho2, 3 * npoints * sizeof(double));
-  cache_flush(v2rhosigma, 6 * npoints * sizeof(double));
-  cache_flush(v2sigma2, 6 * npoints * sizeof(double));
-  #ifdef KXC
-  cache_flush(v3rho3, 4 * npoints * sizeof(double));
-  cache_flush(v3rho2sigma, 9 * npoints * sizeof(double));
-  cache_flush(v3rhosigma2, 12 * npoints * sizeof(double));
-  cache_flush(v3sigma3, 10 * npoints * sizeof(double));
-  #endif
-  #ifdef LXC
-  cache_flush(v4rho4, 5 * npoints * sizeof(double));
-  cache_flush(v4rho3sigma, 12 * npoints * sizeof(double));
-  cache_flush(v4rho2sigma2, 18 * npoints * sizeof(double));
-  cache_flush(v4rhosigma3, 20 * npoints * sizeof(double));
-  cache_flush(v4sigma4, 15 * npoints * sizeof(double));
-  #endif
-
-  S = getTimeStamp();
-  xc_gga(&ggaopt, npoints, rho, sigma, zk, vrho, vsigma, v2rho2, v2rhosigma, v2sigma2, v3rho3, v3rho2sigma, v3rhosigma2, v3sigma3, v4rho4, v4rho3sigma, v4rho2sigma2, v4rhosigma3, v4sigma4);
-  E = getTimeStamp();
-  fprintf(stderr, "GGA_X_PBE_OPT: %.4fs\n", E-S);
-  /*for(i=0; i<npoints; i++){
-    fprintf(stderr, "%16.10lf\t%16.10lf\t%16.10lf\n", rho[2*i + 0], vrho[2*i + 0], v2rho2[3*i + 0]);
-  }*/
-
-  xc_func_end(&ggaopt);
-  return 0;
-}
diff --git a/ref/common/gga_x_pbe.c b/ref/libxc/gga_x_pbe.c
similarity index 99%
rename from ref/common/gga_x_pbe.c
rename to ref/libxc/gga_x_pbe.c
index 605036f..2bc3cac 100644
--- a/ref/common/gga_x_pbe.c
+++ b/ref/libxc/gga_x_pbe.c
@@ -6,7 +6,7 @@
  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
 
-#include "util.h"
+#include "../common/util.h"
 #include "gga_x_pbe.h"
 
 typedef struct{
@@ -57,9 +57,8 @@ static const double pbe_bcgp_values[PBE_N_PAR] =
 static const double pbe_fe_values[PBE_N_PAR] =
   {0.437, 0.346};
 
-#include "../maple2c/gga_x_pbe.c"
-#include "work_gga.c"
-
+#include "gga_x_pbe_funcs.h"
+#include "work_gga.h"
 
 #ifdef __cplusplus
 extern "C"
diff --git a/ref/common/gga_x_pbe.h b/ref/libxc/gga_x_pbe.h
similarity index 100%
rename from ref/common/gga_x_pbe.h
rename to ref/libxc/gga_x_pbe.h
diff --git a/ref/maple2c/gga_x_pbe.c b/ref/libxc/gga_x_pbe_funcs.h
similarity index 100%
rename from ref/maple2c/gga_x_pbe.c
rename to ref/libxc/gga_x_pbe_funcs.h
diff --git a/ref/common/work_gga.c b/ref/libxc/work_gga.h
similarity index 99%
rename from ref/common/work_gga.c
rename to ref/libxc/work_gga.h
index 9b47b93..7e326d0 100644
--- a/ref/common/work_gga.c
+++ b/ref/libxc/work_gga.h
@@ -17,7 +17,7 @@
 #include <fenv.h>
 #endif
 
-#include "xc.h"
+#include "../common/xc.h"
 
 /* hack to avoid compiler warnings */
 #define NOARG
diff --git a/ref/main.c b/ref/main.c
new file mode 100644
index 0000000..19fdae3
--- /dev/null
+++ b/ref/main.c
@@ -0,0 +1,154 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <float.h>
+#include "common/xc.h"
+#include "libxc/gga_x_pbe.h"
+#include "genxc/gga_x_pbe_genxc.h"
+
+// Precision for correctness checking
+#define EPSILON     0.00000001
+
+int nearlyEqual(double a, double b) {
+    //double abs_a = abs(a);
+    //double abs_b = abs(b);
+    double diff = abs(a - b);
+
+    //if(a == b) { return 1; }
+    //if(a == 0 || b == 0 || abs_a + abs_b < MIN_NORMAL) { return diff < (EPSILON * MIN_NORMAL); }
+    //return (diff / min((abs_a + abs_b), DBL_MAX)) < EPSILON;
+    return diff < EPSILON;
+}
+
+double getTimeStamp() {
+    struct timespec ts;
+    clock_gettime(CLOCK_MONOTONIC, &ts);
+    return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9;
+}
+
+int main() {
+  xc_func_type gga_libxc, gga_genxc;
+  int i;
+  int npoints = 10000000;
+  //int npoints = 100;
+  double *rho_libxc, *sigma_libxc;
+  double *rho_genxc, *sigma_genxc;
+  double *zk_libxc, *vrho_libxc, *vsigma_libxc;
+  double *zk_genxc, *vrho_genxc, *vsigma_genxc;
+  double *v2rho2_libxc, *v2rhosigma_libxc, *v2sigma2_libxc;
+  double *v2rho2_genxc, *v2rhosigma_genxc, *v2sigma2_genxc;
+  double *v3rho3_libxc, *v3rho2sigma_libxc, *v3rhosigma2_libxc, *v3sigma3_libxc;
+  double *v3rho3_genxc, *v3rho2sigma_genxc, *v3rhosigma2_genxc, *v3sigma3_genxc;
+  double *v4rho4_libxc, *v4rho3sigma_libxc, *v4rho2sigma2_libxc, *v4rhosigma3_libxc, *v4sigma4_libxc;
+  double *v4rho4_genxc, *v4rho3sigma_genxc, *v4rho2sigma2_genxc, *v4rhosigma3_genxc, *v4sigma4_genxc;
+  double S, E;
+
+  rho_libxc          = (double*) malloc( 2*npoints*sizeof(double));
+  sigma_libxc        = (double*) malloc( 3*npoints*sizeof(double));
+  zk_libxc           = (double*) malloc( 1*npoints*sizeof(double));
+  vrho_libxc         = (double*) malloc( 2*npoints*sizeof(double));
+  vsigma_libxc       = (double*) malloc( 3*npoints*sizeof(double));
+  v2rho2_libxc       = (double*) malloc( 3*npoints*sizeof(double));
+  v2rhosigma_libxc   = (double*) malloc( 6*npoints*sizeof(double));
+  v2sigma2_libxc     = (double*) malloc( 6*npoints*sizeof(double));
+  rho_genxc          = (double*) malloc( 2*npoints*sizeof(double));
+  sigma_genxc        = (double*) malloc( 3*npoints*sizeof(double));
+  zk_genxc           = (double*) malloc( 1*npoints*sizeof(double));
+  vrho_genxc         = (double*) malloc( 2*npoints*sizeof(double));
+  vsigma_genxc       = (double*) malloc( 3*npoints*sizeof(double));
+  v2rho2_genxc       = (double*) malloc( 3*npoints*sizeof(double));
+  v2rhosigma_genxc   = (double*) malloc( 6*npoints*sizeof(double));
+  v2sigma2_genxc     = (double*) malloc( 6*npoints*sizeof(double));
+  #ifdef KXC
+  v3rho3_libxc       = (double*) malloc( 4*npoints*sizeof(double));
+  v3rho2sigma_libxc  = (double*) malloc( 9*npoints*sizeof(double));
+  v3rhosigma2_libxc  = (double*) malloc(12*npoints*sizeof(double));
+  v3sigma3_libxc     = (double*) malloc(10*npoints*sizeof(double));
+  v3rho3_genxc       = (double*) malloc( 4*npoints*sizeof(double));
+  v3rho2sigma_genxc  = (double*) malloc( 9*npoints*sizeof(double));
+  v3rhosigma2_genxc  = (double*) malloc(12*npoints*sizeof(double));
+  v3sigma3_genxc     = (double*) malloc(10*npoints*sizeof(double));
+  #else
+  v3rho3_libxc       = (double*) NULL;
+  v3rho2sigma_libxc  = (double*) NULL;
+  v3rhosigma2_libxc  = (double*) NULL;
+  v3sigma3_libxc     = (double*) NULL;
+  v3rho3_genxc       = (double*) NULL;
+  v3rho2sigma_genxc  = (double*) NULL;
+  v3rhosigma2_genxc  = (double*) NULL;
+  v3sigma3_genxc     = (double*) NULL;
+  #endif
+  #ifdef LXC
+  v4rho4_libxc       = (double*) malloc( 5*npoints*sizeof(double));
+  v4rho3sigma_libxc  = (double*) malloc(12*npoints*sizeof(double));
+  v4rho2sigma2_libxc = (double*) malloc(18*npoints*sizeof(double));
+  v4rhosigma3_libxc  = (double*) malloc(20*npoints*sizeof(double));
+  v4sigma4_libxc     = (double*) malloc(15*npoints*sizeof(double));
+  v4rho4_genxc       = (double*) malloc( 5*npoints*sizeof(double));
+  v4rho3sigma_genxc  = (double*) malloc(12*npoints*sizeof(double));
+  v4rho2sigma2_genxc = (double*) malloc(18*npoints*sizeof(double));
+  v4rhosigma3_genxc  = (double*) malloc(20*npoints*sizeof(double));
+  v4sigma4_genxc     = (double*) malloc(15*npoints*sizeof(double));
+  #else
+  v4rho4_genxc       = (double*) NULL;
+  v4rho3sigma_genxc  = (double*) NULL;
+  v4rho2sigma2_genxc = (double*) NULL;
+  v4rhosigma3_genxc  = (double*) NULL;
+  v4sigma4_genxc     = (double*) NULL;
+  #endif
+
+  if(xc_func_init(&gga_libxc, XC_GGA_X_BCGP, XC_POLARIZED) < 0) {
+    fprintf(stderr, "XC_GGA_X_BCGP not found!\n");
+    return -1;
+  }
+
+  for(i=0; i<npoints; i++){
+    rho_libxc[2*i + 0]   = 0.048 + i/(double)(npoints);
+    rho_libxc[2*i + 1]   = 0.025;
+    sigma_libxc[3*i + 0] = 0.0046;
+    sigma_libxc[3*i + 1] = 0.0044;
+    sigma_libxc[3*i + 2] = 0.0041;
+  }
+
+  S = getTimeStamp();
+  xc_gga(
+    &gga_libxc, npoints, rho_libxc, sigma_libxc, zk_libxc, vrho_libxc, vsigma_libxc, v2rho2_libxc, v2rhosigma_libxc, v2sigma2_libxc,
+    v3rho3_libxc, v3rho2sigma_libxc, v3rhosigma2_libxc, v3sigma3_libxc, v4rho4_libxc, v4rho3sigma_libxc, v4rho2sigma2_libxc,
+    v4rhosigma3_libxc, v4sigma4_libxc
+  );
+  E = getTimeStamp();
+  fprintf(stderr, "GGA_X_PBE: %.4fs\n", E-S);
+
+  if(xc_func_init(&gga_genxc, XC_GGA_X_BCGP_GENXC, XC_POLARIZED) < 0) {
+    fprintf(stderr, "XC_GGA_X_BCGP_GENXC not found!\n");
+    return -1;
+  }
+
+  for(i=0; i<npoints; i++){
+    rho_genxc[2*i + 0]   = 0.048 + i/(double)(npoints);
+    rho_genxc[2*i + 1]   = 0.025;
+    sigma_genxc[3*i + 0] = 0.0046;
+    sigma_genxc[3*i + 1] = 0.0044;
+    sigma_genxc[3*i + 2] = 0.0041;
+  }
+
+  S = getTimeStamp();
+  xc_gga(
+    &gga_genxc, npoints, rho_genxc, sigma_genxc, zk_genxc, vrho_genxc, vsigma_genxc, v2rho2_genxc, v2rhosigma_genxc, v2sigma2_genxc,
+    v3rho3_genxc, v3rho2sigma_genxc, v3rhosigma2_genxc, v3sigma3_genxc, v4rho4_genxc, v4rho3sigma_genxc, v4rho2sigma2_genxc,
+    v4rhosigma3_genxc, v4sigma4_genxc
+  );
+  E = getTimeStamp();
+  fprintf(stderr, "GGA_X_PBE_GENXC: %.4fs\n", E-S);
+
+  #define CHECK_CORRECTNESS(arr1,arr2,i);  if(!nearlyEqual(arr1[i], arr2[i])) { fprintf(stderr, "Results differ!\n"); return -1; }
+  for(i = 0; i < npoints; i++) {
+    CHECK_CORRECTNESS(rho_libxc, rho_genxc, 2 * i + 0);
+    CHECK_CORRECTNESS(vrho_libxc, vrho_genxc, 2 * i + 0);
+    CHECK_CORRECTNESS(v2rho2_libxc, v2rho2_genxc, 3 * i + 0);
+  }
+
+  xc_func_end(&gga_libxc);
+  xc_func_end(&gga_genxc);
+  return 0;
+}
-- 
GitLab