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