Merge pull request #53 from fmgjcoppens/qmckl_integration

Qmckl integration
This commit is contained in:
François Coppens 2021-09-21 14:48:08 +02:00 committed by GitHub
commit 0bd71c1968
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 1258 additions and 294 deletions

View File

@ -24,10 +24,18 @@ jobs:
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with:
submodules: recursive
# Runs a single command using the runners shell
- name: Test compilation
run: |
sudo apt install libhdf5-dev flang-7 clang-7
sudo apt install libhdf5-dev flang-7 clang-7 emacs autoconf
source smvars.sh llvm
cd qmckl
./autogen.sh
QMCKL_DEVEL=1 ./configure --enable-silent-rules --enable-maintainer-mode
make -j 8
make -j check
cd ..
make

4
.gitmodules vendored Normal file
View File

@ -0,0 +1,4 @@
[submodule "qmckl"]
path = qmckl
url = https://github.com/fmgjcoppens/qmckl.git
branch = sherman-morrison-woodbury

View File

@ -2,7 +2,7 @@
ifeq ($(ENV),INTEL)
CXX = icpx
FC = ifort
ARCH = -march=native
ARCH = -xCORE-AVX2
OPT = -O3
DEBUG = -g -debug full
else ifeq ($(ENV),LLVM)
@ -14,8 +14,9 @@ else ifeq ($(ENV),LLVM)
else ifeq ($(ENV),GNU)
CXX = g++
FC = gfortran
ARCH = -mavx
OPT = -O3
# ARCH = -mavx
ARCH =
OPT = -O0
DEBUG = -g
else
$(error No valid compiler environment set in $$ENV. \
@ -29,7 +30,7 @@ CXXFLAGS = $(OPT) $(ARCH) $(DEBUG) $(THRESHOLD) -fPIC
## MKL linker flags
ifeq ($(MKL),-DMKL)
CXXFLAGS += $(MKL)
H5LFLAGS = -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
H5LFLAGS = -L$(MKLROOT)/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
ifeq ($(ENV),INTEL)
LFLAGS = -mkl=sequential # implicit
else
@ -50,6 +51,11 @@ DEPS_F = $(DEPS_CXX) \
$(OBJ_DIR)/finterface_mod.o \
$(OBJ_DIR)/helpers_mod.o
## QMCkl includes and linking
QMCKL_INCLUDE = -I$(SMROOT)/qmckl/include
QMCKLLFLAGS = -L$(SMROOT)/qmckl/src/.libs -lqmckl
## Directory structure
SRC_DIR := src
TST_DIR := tests
@ -60,6 +66,7 @@ BIN_DIR := bin
EXEC := $(BIN_DIR)/cMaponiA3_test_3x3_3 \
$(BIN_DIR)/test_h5 \
$(BIN_DIR)/fnu_test_h5 \
$(BIN_DIR)/qmckl_test_c \
$(BIN_DIR)/fMaponiA3_test_3x3_3 \
$(BIN_DIR)/fMaponiA3_test_4x4_2 \
$(BIN_DIR)/QMCChem_dataset_test
@ -93,6 +100,11 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(INC_DIR)/* | $(OBJ_DIR)
$(OBJ_DIR)/%_h5.o: $(TST_DIR)/%_h5.cpp $(INC_DIR)/* | $(OBJ_DIR)
$(H5CXX) $(H5CXXFLAGS) $(INCLUDE) -c -o $@ $<
## HDF5/C++ objects
$(OBJ_DIR)/qmckl_test_c.o: $(TST_DIR)/qmckl_test_c.cpp $(INC_DIR)/* | $(OBJ_DIR)
$(H5CXX) $(H5CXXFLAGS) $(INCLUDE) $(QMCKL_INCLUDE) -c -o $@ $<
## Fortran modules
$(OBJ_DIR)/%_mod.o: $(SRC_DIR)/%_mod.f90 | $(OBJ_DIR)
ifeq ($(ENV),$(filter $(ENV),LLVM GNU))
@ -116,6 +128,9 @@ $(BIN_DIR)/test_h5: $(OBJ_DIR)/test_h5.o $(DEPS_CXX) | $(BIN_DIR)
$(BIN_DIR)/fnu_test_h5: $(OBJ_DIR)/fnu_test_h5.o $(DEPS_CXX) | $(BIN_DIR)
$(H5CXX) $(H5LFLAGS) -o $@ $^
$(BIN_DIR)/qmckl_test_c: $(OBJ_DIR)/qmckl_test_c.o | $(BIN_DIR)
$(H5CXX) $(H5LFLAGS) $(QMCKLLFLAGS) -o $@ $^
$(BIN_DIR)/fMaponiA3_test_3x3_3: $(DEPS_F) $(OBJ_DIR)/fMaponiA3_test_3x3_3.o | $(BIN_DIR)
$(FC) $(LFLAGS) $(FLIBS) -o $@ $^

View File

@ -8,12 +8,7 @@
#include <mkl_lapacke.h>
#endif
// #define DEBUG
#ifndef THRESHOLD
#define THRESHOLD 1e-3
#endif
double threshold();
#include <cstdio>
void Switch(unsigned int *p, unsigned int l, unsigned int lbar);
@ -86,7 +81,8 @@ template <typename T> T *transpose(T *A, unsigned int M) {
return B;
}
template <typename T> void matMul(T *A, T *B, T *C, unsigned int M) {
template <typename T>
void matMul(T *A, T *B, T *C, unsigned int M) {
memset(C, 0, M * M * sizeof(T));
for (unsigned int i = 0; i < M; i++) {
for (unsigned int j = 0; j < M; j++) {
@ -263,7 +259,7 @@ template <typename T> T residual_frobenius2(T *A, unsigned int Dim) {
res += delta * delta;
}
}
return res;
return sqrt(res);
}
template <typename T> T residual2(T *A, unsigned int Dim) {

View File

@ -1,11 +1,17 @@
// Sherman-Morrison-Woodbury kernel 1
// WB2, WB3, SM2 mixing scheme
void SMWB1(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index);
// Sherman-Morrison-Woodbury kernel 2
// Sherman-Morrison-Woodbury kernel WB2s
// WB2, SM2 mixing scheme
void SMWB2(double *Slater_inv, const unsigned int Dim,
void WB2s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index);
unsigned int *Updates_index, const double breakdown);
// Sherman-Morrison-Woodbury kernel WB3s
// WB3, SM2 mixing scheme
void WB3s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index, const double breakdown);
// Sherman-Morrison-Woodbury kernel WB32s
// WB3, WB2, SM2 mixing scheme
void WB32s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index, const double breakdown);

View File

@ -1,8 +1,8 @@
// P. Maponi Algorithm 3
void MaponiA3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, double breakdown);
// P. Maponi Algorithm 3 with J. Slagel splitting
// http://hdl.handle.net/10919/52966
void MaponiA3S(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, double breakdown);

View File

@ -1,22 +1,22 @@
// Naïve Sherman Morrison
void SM1(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, const double breakdown);
// Sherman Morrison, with J. Slagel splitting
// http://hdl.handle.net/10919/52966
void SM2(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, const double breakdown);
void SM2star(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index,
double *later_updates, unsigned int *later_index,
unsigned int *later);
unsigned int *later, const double breakdown);
// Sherman Morrison, leaving zero denominators for later
void SM3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, const double breakdown);
// Sherman Morrison (SM3+SM2), leaving zero denominators for later (SM3), and
// when none are left falling back on Splitting (SM2)
void SM4(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index);
double *Updates, unsigned int *Updates_index, const double breakdown);

View File

@ -1,7 +1,7 @@
// Woodbury 2x2 kernel
bool WB2(double *Slater_inv, const unsigned int Dim, double *Updates,
const unsigned int *Updates_index);
const unsigned int *Updates_index, const double breakdown);
// Woodbury 3x3 kernel
bool WB3(double *Slater_inv, const unsigned int Dim, double *Updates,
const unsigned int *Updates_index);
const unsigned int *Updates_index, const double breakdown);

View File

@ -2,37 +2,35 @@ Sold = dlmread('Slater_old.dat');
Sold_inv = dlmread('Slater_old_inv.dat');
S = dlmread('Slater.dat');
S_inv = dlmread('Slater_inv.dat');
dim = columns(S);
cutoff = 1e-3;
printf("\n")
printf("======================================\n")
printf("============================================\n")
printf("OLD Slater-matrix and inverse\n")
printf("--------------------------------------\n")
printf("Determinant of S x S_inv : %f\n", det(Sold*Sold_inv))
printf("Trace of S x S_inv : %f\n", trace(Sold*Sold_inv))
printf("Norm of S x S_inv : %f\n", norm(Sold*Sold_inv))
printf("--------------------------------------------\n")
printf("Determinant of S x S_inv - Id : %f\n", det(Sold*Sold_inv-eye(dim)))
printf("Trace of S x S_inv - Id : %f\n", trace(Sold*Sold_inv-eye(dim)))
printf("Norm of S x S_inv - Id : %f\n", norm(Sold*Sold_inv-eye(dim)))
printf("\n")
printf("NEW Slater-matrix and inverse\n")
printf("--------------------------------------\n")
printf("Determinant of S x S_inv : %f\n", det(S*S_inv))
printf("Trace of S x S_inv : %f\n", trace(S*S_inv))
printf("Norm of S x S_inv : %f\n", norm(S*S_inv))
printf("--------------------------------------------\n")
printf("Determinant of S x S_inv - Id : %f\n", det(S*S_inv-eye(dim)))
printf("Trace of S x S_inv - Id : %f\n", trace(S*S_inv-eye(dim)))
printf("Norm of S x S_inv - Id : %f\n", norm(S*S_inv-eye(dim)))
cutoff = 1e-6;
printf("\n")
printf("Cutoff set to %e: S x S_inv = \n", cutoff)
printf(" -----------------------------------------\n")
dim = columns(S);
res=S*S_inv;
printf("Cutoff set to %e: S x S_inv - Id = \n", cutoff)
printf("--------------------------------------------\n")
res=S*S_inv-eye(dim);
for i = 1:dim
for j = 1:dim
if (res(i,j) < cutoff)
if (res(i,j) < cutoff)% && i!=j)
res(i,j) = 0;
elseif (S(i,j)-1 < cutoff)
res(i,j) = 1;
endif
endfor
endfor
format free;
disp(res);
printf(" =========================================\n")
printf("===========================================\n")

1
qmckl Submodule

@ -0,0 +1 @@
Subproject commit de03986bda2be207377875ed5a0852cb721b86b9

View File

@ -1,14 +1,5 @@
#include "Helpers.hpp"
// Set common break-down threshold
double threshold() {
const double threshold = THRESHOLD;
#ifdef DEBUG2
std::cerr << "Break-down threshold set to: " << threshold << std::endl;
#endif
return threshold;
}
void Switch(unsigned int *p, unsigned int l, unsigned int lbar) {
unsigned int tmp = p[l + 1];
p[l + 1] = p[lbar];

View File

@ -3,88 +3,14 @@
#include "SM_Standard.hpp"
#include "Woodbury.hpp"
// #define DEBUG1
#define DEBUG1
// #define DEBUG2
// Sherman-Morrison-Woodbury kernel 1
// WB2, WB3, SM2 mixing scheme
void SMWB1(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index) {
#ifdef DEBUG2
std::cerr << "Called Sherman-Morrison-Woodbury kernel 1 with " << N_updates
<< " updates" << std::endl;
showMatrix2(Updates_index, 1, N_updates, "Updates_index");
showMatrix2(Updates, N_updates, Dim, "Updates");
#endif
unsigned int n_of_3blocks = N_updates / 3;
unsigned int remainder = N_updates % 3;
unsigned int length_3block = 3 * Dim;
unsigned int length_2block = 2 * Dim;
unsigned int length_1block = 1 * Dim;
// Apply first 3*n_of_3blocks updates in n_of_3blocks blocks of 3 updates with
// Woodbury 3x3 kernel
double later_updates[Dim * N_updates];
unsigned int later_index[N_updates];
unsigned int later = 0;
if (n_of_3blocks > 0) {
for (unsigned int i = 0; i < n_of_3blocks; i++) {
double *Updates_3block = &Updates[i * length_3block];
unsigned int *Updates_index_3block = &Updates_index[i * 3];
bool ok;
ok = WB3(Slater_inv, Dim, Updates_3block, Updates_index_3block);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG2
std::cerr << "Woodbury 3x3 kernel failed! Sending block to SM2"
<< std::endl;
showMatrix2(Updates_3block, 3, Dim, "Updates_3block");
showMatrix2(Updates_index_3block, 1, 3, "Updates_index_3block");
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 3, Updates_3block, Updates_index_3block,
later_updates + (Dim * later), later_index + later, &l);
later = later + l;
}
}
}
if (remainder ==
2) { // Apply last remaining block of 2 updates with Woodbury 2x2 kernel
double *Updates_2block = &Updates[n_of_3blocks * length_3block];
unsigned int *Updates_index_2block = &Updates_index[3 * n_of_3blocks];
bool ok;
ok = WB2(Slater_inv, Dim, Updates_2block, Updates_index_2block);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG2
std::cerr << "Woodbury 2x2 kernel failed! Sending block to SM2"
<< std::endl;
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 2, Updates_2block, Updates_index_2block,
later_updates + (Dim * later), later_index + later, &l);
later = later + l;
}
} else if (remainder == 1) { // Apply last remaining update with SM2
double *Updates_1block = &Updates[n_of_3blocks * length_3block];
unsigned int *Updates_index_1block = &Updates_index[3 * n_of_3blocks];
unsigned int l = 0;
SM2star(Slater_inv, Dim, 1, Updates_1block, Updates_index_1block,
later_updates + (Dim * later), later_index + later, &l);
later = later + l;
}
if (later > 0) {
SM2(Slater_inv, Dim, later, later_updates, later_index);
}
}
// Sherman-Morrison-Woodbury kernel 2
// Sherman-Morrison-Woodbury kernel WB2s
// WB2, SM2 mixing scheme
void SMWB2(double *Slater_inv, const unsigned int Dim,
void WB2s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index) {
unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG2
std::cerr << "Called Sherman-Morrison-Woodbury kernel 1 with " << N_updates
<< " updates" << std::endl;
@ -95,7 +21,6 @@ void SMWB2(double *Slater_inv, const unsigned int Dim,
unsigned int n_of_2blocks = N_updates / 2;
unsigned int remainder = N_updates % 2;
unsigned int length_2block = 2 * Dim;
unsigned int length_1block = 1 * Dim;
// Apply first 2*n_of_2blocks updates in n_of_2blocks blocks of 2 updates with
// Woodbury 2x2 kernel
@ -107,10 +32,10 @@ void SMWB2(double *Slater_inv, const unsigned int Dim,
double *Updates_2block = &Updates[i * length_2block];
unsigned int *Updates_index_2block = &Updates_index[i * 2];
bool ok;
ok = WB2(Slater_inv, Dim, Updates_2block, Updates_index_2block);
ok = WB2(Slater_inv, Dim, Updates_2block, Updates_index_2block, breakdown);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG1
std::cerr << "Woodbury 2x2 kernel failed! Sending block to SM2star"
std::cerr << "Woodbury 2x2 block failed! Sending to SM w/ US"
<< std::endl;
#endif
#ifdef DEBUG2
@ -119,33 +44,169 @@ void SMWB2(double *Slater_inv, const unsigned int Dim,
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 2, Updates_2block, Updates_index_2block,
later_updates + (Dim * later), later_index + later, &l);
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
}
}
if (remainder == 1) { // Apply last remaining update with SM2
if (remainder != 0) { // Apply last remaining update with SM2
double *Updates_1block = &Updates[n_of_2blocks * length_2block];
unsigned int *Updates_index_1block = &Updates_index[2 * n_of_2blocks];
unsigned int l = 0;
SM2star(Slater_inv, Dim, 1, Updates_1block, Updates_index_1block,
later_updates + (Dim * later), later_index + later, &l);
SM2star(Slater_inv, Dim, remainder, Updates_1block, Updates_index_1block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
if (later > 0) {
SM2(Slater_inv, Dim, later, later_updates, later_index);
SM2(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
// Sherman-Morrison-Woodbury kernel WB3s
// WB3, SM2 mixing scheme
void WB3s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG2
std::cerr << "Called Sherman-Morrison-Woodbury kernel 1 with " << N_updates
<< " updates" << std::endl;
showMatrix2(Updates_index, 1, N_updates, "Updates_index");
showMatrix2(Updates, N_updates, Dim, "Updates");
#endif
unsigned int n_of_3blocks = N_updates / 3;
unsigned int remainder = N_updates % 3;
unsigned int length_3block = 3 * Dim;
// Apply first 3*n_of_3blocks updates in n_of_3blocks blocks of 3 updates with
// Woodbury 3x3 kernel
double later_updates[Dim * N_updates];
unsigned int later_index[N_updates];
unsigned int later = 0;
if (n_of_3blocks > 0) {
for (unsigned int i = 0; i < n_of_3blocks; i++) {
double *Updates_3block = &Updates[i * length_3block];
unsigned int *Updates_index_3block = &Updates_index[i * 3];
bool ok;
ok = WB3(Slater_inv, Dim, Updates_3block, Updates_index_3block, breakdown);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG1
std::cerr << "Woodbury 3x3 block failed! Sending to SM w/ US"
<< std::endl;
#endif
#ifdef DEBUG2
showMatrix2(Updates_3block, 3, Dim, "Updates_3block");
showMatrix2(Updates_index_3block, 1, 3, "Updates_index_3block");
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 3, Updates_3block, Updates_index_3block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
}
}
if (remainder != 0) { // Apply last remaining block of 2 updates with Woodbury 2x2 kernel
double *Updates_2block = &Updates[n_of_3blocks * length_3block];
unsigned int *Updates_index_2block = &Updates_index[3 * n_of_3blocks];
unsigned int l = 0;
SM2star(Slater_inv, Dim, remainder, Updates_2block, Updates_index_2block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
if (later > 0) {
SM2(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
// Sherman-Morrison-Woodbury kernel WB32s
// WB3, WB2, SM2 mixing scheme
void WB32s(double *Slater_inv, const unsigned int Dim,
const unsigned int N_updates, double *Updates,
unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG2
std::cerr << "Called Sherman-Morrison-Woodbury kernel 1 with " << N_updates
<< " updates" << std::endl;
showMatrix2(Updates_index, 1, N_updates, "Updates_index");
showMatrix2(Updates, N_updates, Dim, "Updates");
#endif
unsigned int n_of_3blocks = N_updates / 3;
unsigned int remainder = N_updates % 3;
unsigned int length_3block = 3 * Dim;
// Apply first 3*n_of_3blocks updates in n_of_3blocks blocks of 3 updates with
// Woodbury 3x3 kernel
double later_updates[Dim * N_updates];
unsigned int later_index[N_updates];
unsigned int later = 0;
if (n_of_3blocks > 0) {
for (unsigned int i = 0; i < n_of_3blocks; i++) {
double *Updates_3block = &Updates[i * length_3block];
unsigned int *Updates_index_3block = &Updates_index[i * 3];
bool ok;
ok = WB3(Slater_inv, Dim, Updates_3block, Updates_index_3block, breakdown);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG1
std::cerr << "Woodbury 3x3 block failed! Sending to SM w/ US"
<< std::endl;
#endif
#ifdef DEBUG2
showMatrix2(Updates_3block, 3, Dim, "Updates_3block");
showMatrix2(Updates_index_3block, 1, 3, "Updates_index_3block");
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 3, Updates_3block, Updates_index_3block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
}
}
if (remainder == 2) { // Apply last remaining block of 2 updates with Woodbury 2x2 kernel
double *Updates_2block = &Updates[n_of_3blocks * length_3block];
unsigned int *Updates_index_2block = &Updates_index[3 * n_of_3blocks];
bool ok;
ok = WB2(Slater_inv, Dim, Updates_2block, Updates_index_2block, breakdown);
if (!ok) { // Send the entire block to SM2
#ifdef DEBUG1
std::cerr << "Woodbury 2x2 block failed! Sending to SM w/ US"
<< std::endl;
#endif
unsigned int l = 0;
SM2star(Slater_inv, Dim, 2, Updates_2block, Updates_index_2block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
} else if (remainder == 1) { // Apply last remaining update with SM2
double *Updates_1block = &Updates[n_of_3blocks * length_3block];
unsigned int *Updates_index_1block = &Updates_index[3 * n_of_3blocks];
unsigned int l = 0;
SM2star(Slater_inv, Dim, 1, Updates_1block, Updates_index_1block,
later_updates + (Dim * later), later_index + later, &l, breakdown);
later = later + l;
}
if (later > 0) {
SM2(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
extern "C" {
void SMWB1_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SMWB1(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
void WB2s_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
WB2s(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
void SMWB2_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SMWB2(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
void WB3s_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
WB3s(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
void WB32s_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
WB32s(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
}

View File

@ -5,7 +5,7 @@
#include "Helpers.hpp"
void MaponiA3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
double *Updates, unsigned int *Updates_index, double breakdown) {
std::cerr << "Called MaponiA3 with " << N_updates << " updates" << std::endl;
/*
@ -74,7 +74,7 @@ void MaponiA3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
<< "] = " << beta << std::endl;
std::cerr << std::endl;
#endif
if (std::fabs(beta) < threshold()) {
if (std::fabs(beta) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -135,7 +135,7 @@ void MaponiA3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
}
void MaponiA3S(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
double *Updates, unsigned int *Updates_index, double breakdown) {
std::cerr << "Called MaponiA3S with " << N_updates << " updates" << std::endl;
/*
@ -208,7 +208,7 @@ void MaponiA3S(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
<< "] = " << beta << std::endl;
std::cerr << std::endl;
#endif
if (std::fabs(beta) < threshold()) {
if (std::fabs(beta) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -275,22 +275,22 @@ void MaponiA3S(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
delete[] Al, next, p, ylk;
if (later > 0) {
MaponiA3S(Slater_inv, Dim, later, later_updates, later_index);
MaponiA3S(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
extern "C" {
void MaponiA3_f(double **linSlater_inv, unsigned int *Dim,
unsigned int *N_updates, double **linUpdates,
unsigned int **Updates_index) {
MaponiA3(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
unsigned int **Updates_index, double breakdown) {
MaponiA3(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
}
extern "C" {
void MaponiA3S_f(double **linSlater_inv, unsigned int *Dim,
unsigned int *N_updates, double **linUpdates,
unsigned int **Updates_index) {
MaponiA3S(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
unsigned int **Updates_index, double breakdown) {
MaponiA3S(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
}

View File

@ -6,8 +6,12 @@
// #define DEBUG1
// Naïve Sherman Morrison
void SM1(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
void SM1(double *Slater_inv,
unsigned int Dim,
unsigned int N_updates,
double *Updates,
unsigned int *Updates_index,
const double breakdown) {
#ifdef DEBUG1
std::cerr << "Called SM1 with " << N_updates << " updates" << std::endl;
#endif
@ -28,7 +32,7 @@ void SM1(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Denominator
double den = 1 + C[Updates_index[l] - 1];
if (std::fabs(den) < threshold()) {
if (std::fabs(den) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -51,12 +55,13 @@ void SM1(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
l += 1;
}
}
// Sherman Morrison, with J. Slagel splitting
// http://hdl.handle.net/10919/52966
void SM2(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
double *Updates, unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG1
std::cerr << "Called SM2 with " << N_updates << " updates" << std::endl;
#endif
@ -66,10 +71,10 @@ void SM2(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
unsigned int later = 0;
SM2star(Slater_inv, Dim, N_updates, Updates, Updates_index, later_updates,
later_index, &later);
later_index, &later, breakdown);
if (later > 0) {
SM2(Slater_inv, Dim, later, later_updates, later_index);
SM2(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
@ -78,7 +83,7 @@ void SM2(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
void SM2star(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index,
double *later_updates, unsigned int *later_index,
unsigned int *later) {
unsigned int *later, const double breakdown) {
#ifdef DEBUG1
std::cerr << "Called SM2* with " << N_updates << " updates" << std::endl;
#endif
@ -99,7 +104,7 @@ void SM2star(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Denominator
double den = 1 + C[Updates_index[l] - 1];
if (std::fabs(den) < threshold()) {
if (std::fabs(den) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -136,7 +141,7 @@ void SM2star(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Sherman Morrison, leaving zero denominators for later
void SM3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
double *Updates, unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG1
std::cerr << "Called SM3 with " << N_updates << " updates" << std::endl;
#endif
@ -161,7 +166,7 @@ void SM3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Denominator
double den = 1 + C[Updates_index[l] - 1];
if (std::fabs(den) < threshold()) {
if (std::fabs(den) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -201,7 +206,7 @@ void SM3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
}
// If some have failed, make a recursive call
else if (later > 0) {
SM3(Slater_inv, Dim, later, later_updates, later_index);
SM3(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
@ -209,7 +214,7 @@ void SM3(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Leave zero denominators for later (SM3), and when none are left then split
// (SM2)
void SM4(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
double *Updates, unsigned int *Updates_index) {
double *Updates, unsigned int *Updates_index, const double breakdown) {
#ifdef DEBUG1
std::cerr << "Called SM4 with " << N_updates << " updates" << std::endl;
#endif
@ -234,7 +239,7 @@ void SM4(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// Denominator
double den = 1 + C[Updates_index[l] - 1];
if (std::fabs(den) < threshold()) {
if (std::fabs(den) < breakdown) {
#ifdef DEBUG1
std::cerr << "Breakdown condition triggered at " << Updates_index[l]
<< std::endl;
@ -266,32 +271,32 @@ void SM4(double *Slater_inv, unsigned int Dim, unsigned int N_updates,
// If all the updates have failed, fall back on splitting (SM2)
if (later == N_updates) {
SM2(Slater_inv, Dim, later, later_updates, later_index);
SM2(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
// If some have failed, make a recursive call
else if (later > 0) {
SM4(Slater_inv, Dim, later, later_updates, later_index);
SM4(Slater_inv, Dim, later, later_updates, later_index, breakdown);
}
}
extern "C" {
void SM1_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SM1(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
SM1(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
void SM2_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SM2(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
SM2(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
void SM3_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SM3(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
SM3(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
void SM4_f(double **linSlater_inv, unsigned int *Dim, unsigned int *N_updates,
double **linUpdates, unsigned int **Updates_index) {
SM4(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index);
double **linUpdates, unsigned int **Updates_index, const double breakdown) {
SM4(*linSlater_inv, *Dim, *N_updates, *linUpdates, *Updates_index, breakdown);
}
}

View File

@ -15,7 +15,7 @@
// Woodbury 2x2 kernel
bool WB2(double *Slater_inv, const unsigned int Dim, double *Updates,
const unsigned int *Updates_index) {
const unsigned int *Updates_index, const double breakdown) {
/*
C := S^{-1} * U, dim x 2
B := 1 + V * C, 2 x 2
@ -48,7 +48,7 @@ bool WB2(double *Slater_inv, const unsigned int Dim, double *Updates,
// Check if determinant of inverted matrix is not zero
double det = B0 * B3 - B1 * B2;
if (std::fabs(det) < threshold()) {
if (std::fabs(det) < breakdown) {
#ifdef DEBUG1
std::cerr << "Determinant too close to zero! No inverse found."
<< std::endl;
@ -86,7 +86,7 @@ bool WB2(double *Slater_inv, const unsigned int Dim, double *Updates,
// Woodbury 3x3 kernel
bool WB3(double *Slater_inv, const unsigned int Dim, double *Updates,
const unsigned int *Updates_index) {
const unsigned int *Updates_index, const double breakdown) {
/*
C := S^{-1} * U, dim x 3
B := 1 + V * C, 3 x 3
@ -139,7 +139,7 @@ bool WB3(double *Slater_inv, const unsigned int Dim, double *Updates,
#ifdef DEBUG2
std::cerr << "Determinant of B = " << det << std::endl;
#endif
if (std::fabs(det) < threshold()) {
if (std::fabs(det) < breakdown) {
#ifdef DEBUG1
std::cerr << "Determinant too close to zero! No inverse found."
<< std::endl;
@ -197,15 +197,15 @@ bool WB3(double *Slater_inv, const unsigned int Dim, double *Updates,
extern "C" {
bool WB2_f(double **linSlater_inv, unsigned int *Dim, double **linUpdates,
unsigned int **Updates_index) {
unsigned int **Updates_index, const double breakdown) {
bool ok;
ok = WB2(*linSlater_inv, *Dim, *linUpdates, *Updates_index);
ok = WB2(*linSlater_inv, *Dim, *linUpdates, *Updates_index, breakdown);
return ok;
}
bool WB3_f(double **linSlater_inv, unsigned int *Dim, double **linUpdates,
unsigned int **Updates_index) {
unsigned int **Updates_index, const double breakdown) {
bool ok;
ok = WB3(*linSlater_inv, *Dim, *linUpdates, *Updates_index);
ok = WB3(*linSlater_inv, *Dim, *linUpdates, *Updates_index, breakdown);
return ok;
}
}

View File

@ -14,7 +14,7 @@ module Helpers
character (len = *), intent(in) :: filename
integer, intent(inout) :: cycle_id, dim, n_updates
integer(c_int), allocatable, intent(inout) :: Updates_index(:)
integer, allocatable, intent(inout) :: Updates_index(:)
real(c_double), allocatable, intent(inout) :: S(:,:), S_inv(:,:)
real(c_double), allocatable, intent(inout) :: Updates(:,:)
integer :: i, j
@ -68,4 +68,4 @@ module Helpers
end do
end do
end subroutine Transpose
end module Helpers
end module Helpers

View File

@ -11,9 +11,10 @@ int main() {
unsigned int *Ar_index = new unsigned int[M];
double *A = new double[M * M]; // The matrix to be inverted
double *A0 =
new double[M * M]; // A diagonal matrix with the digonal elements of A
new double[M * M]; // A diagonal matrix with the digonal elements of A
double *Ar = new double[M * M]; // The update matrix
double *A0_inv = new double[M * M]; // The inverse
double breakdown = 1e-3;
// Fill with zeros
for (i = 0; i < M; i++) {
@ -51,7 +52,7 @@ int main() {
// Define pointers dim and n_updates to use in Sherman-Morrison(...) function
// call
MaponiA3(A0_inv, M, M, Ar, Ar_index);
MaponiA3(A0_inv, M, M, Ar, Ar_index, breakdown);
showMatrix(A0_inv, M, "A0_inv");
// Deallocate all vectors and matrices

View File

@ -59,6 +59,8 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
double *u = new double[nupdates * dim];
const double breakdown = 1e-3;
/* Test */
#ifdef DEBUG2
showMatrix(slater_inverse, dim, "OLD Inverse");
@ -88,49 +90,49 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM1(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
SM1(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
} else if (version == "sm2") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM2(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
SM2(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
} else if (version == "sm3") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM3(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
SM3(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
} else if (version == "sm4") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM4(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
SM4(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
} else if (version == "wb2") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB2(slater_inverse_nonpersistent, dim, u, col_update_index);
WB2(slater_inverse_nonpersistent, dim, u, col_update_index, breakdown);
}
} else if (version == "wb3") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB3(slater_inverse_nonpersistent, dim, u, col_update_index);
WB3(slater_inverse_nonpersistent, dim, u, col_update_index, breakdown);
}
} else if (version == "smwb1") {
} else if (version == "wb2s") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SMWB1(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
WB2s(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
} else if (version == "smwb2") {
} else if (version == "wb32s") {
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SMWB2(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
WB32s(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index, breakdown);
}
#ifdef MKL
} else if (version == "lapack") {
@ -149,25 +151,25 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
delete[] slater_inverse_nonpersistent;
#else // No performance measurements repetition
if (version == "maponia3") {
MaponiA3(slater_inverse, dim, nupdates, u, col_update_index);
MaponiA3(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "maponia3s") {
MaponiA3S(slater_inverse, dim, nupdates, u, col_update_index);
MaponiA3S(slater_inverse, dim, nupdates, u, col_update_index, breakdown;
} else if (version == "sm1") {
SM1(slater_inverse, dim, nupdates, u, col_update_index);
SM1(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "sm2") {
SM2(slater_inverse, dim, nupdates, u, col_update_index);
SM2(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "sm3") {
SM3(slater_inverse, dim, nupdates, u, col_update_index);
SM3(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "sm4") {
SM4(slater_inverse, dim, nupdates, u, col_update_index);
SM4(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "wb2") {
WB2(slater_inverse, dim, u, col_update_index);
WB2(slater_inverse, dim, u, col_update_index, breakdown);
} else if (version == "wb3") {
WB3(slater_inverse, dim, u, col_update_index);
} else if (version == "smwb1") {
SMWB1(slater_inverse, dim, nupdates, u, col_update_index);
} else if (version == "smwb2") {
SMWB2(slater_inverse, dim, nupdates, u, col_update_index);
WB3(slater_inverse, dim, u, col_update_index, breakdown);
} else if (version == "wb2s") {
WB2s(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
} else if (version == "wb32s") {
WB32s(slater_inverse, dim, nupdates, u, col_update_index, breakdown);
#ifdef MKL
} else if (version == "lapack") {
memcpy(slater_inverse, slater_matrix, dim * dim * sizeof(double));

215
tests/qmckl_test_c.cpp Normal file
View File

@ -0,0 +1,215 @@
#include "hdf5/serial/H5Cpp.h"
#include "hdf5/serial/hdf5.h"
#include "Helpers.hpp"
#include "qmckl.h"
#include <math.h>
#include <cstring>
#include <iostream>
#define PERF
#ifdef PERF
unsigned int repetition_number;
#endif
const H5std_string FILE_NAME("dataset.hdf5");
void read_int(H5::H5File file, std::string key, unsigned int *data) {
H5::DataSet ds = file.openDataSet(key);
ds.read(data, H5::PredType::STD_U32LE);
ds.close();
}
void read_double(H5::H5File file, std::string key, double *data) {
H5::DataSet ds = file.openDataSet(key);
ds.read(data, H5::PredType::IEEE_F64LE);
ds.close();
}
int test_cycle(H5::H5File file, int cycle, std::string version, double breakdown, double tolerance) {
/* Read the data */
std::string group = "cycle_" + std::to_string(cycle);
unsigned int col, i, j;
unsigned int dim_32, nupdates_32;
uint64_t dim, nupdates;
read_int(file, group + "/slater_matrix_dim", &dim_32);
read_int(file, group + "/nupdates", &nupdates_32);
dim = dim_32; nupdates = nupdates_32;
double *slater_matrix = new double[dim * dim];
read_double(file, group + "/slater_matrix", slater_matrix);
double *slater_inverse = new double[dim * dim];
read_double(file, group + "/slater_inverse", slater_inverse);
unsigned int *temp = new unsigned int[nupdates];
uint64_t *col_update_index = new uint64_t[nupdates];
read_int(file, group + "/col_update_index", temp);
for (i = 0; i < nupdates; i++) {
col_update_index[i] = temp[i];
}
delete[] temp;
double *updates = new double[nupdates * dim];
read_double(file, group + "/updates", updates);
double *u = new double[nupdates * dim];
/* Test */
// Transform replacement updates in 'updates[]' into additive updates in 'u[]'
for (j = 0; j < nupdates; j++) {
for (i = 0; i < dim; i++) {
col = col_update_index[j];
u[i + j * dim] =
updates[i + j * dim] - slater_matrix[i * dim + (col - 1)];
slater_matrix[i * dim + (col - 1)] = updates[i + j * dim];
}
}
delete[] updates;
qmckl_context context = qmckl_context_create();
qmckl_exit_code rc;
#ifdef PERF
std::cout << "# of reps. = " << repetition_number << std::endl;
double *slater_inverse_nonpersistent = new double[dim * dim];
if (version == "sm1") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
rc = qmckl_sherman_morrison(context, &dim, &nupdates,
u, col_update_index, &breakdown, slater_inverse_nonpersistent);
}
}
else if (version == "wb2") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
rc = qmckl_woodbury_2(context, &dim,
u, col_update_index, &breakdown, slater_inverse_nonpersistent);
}
}
else if (version == "wb3") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
rc = qmckl_woodbury_3(context, &dim,
u, col_update_index, &breakdown, slater_inverse_nonpersistent);
}
}
else if (version == "sm2") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
rc = qmckl_sherman_morrison_splitting(context, &dim, &nupdates,
u, col_update_index, &breakdown, slater_inverse_nonpersistent);
}
}
else if (version == "wb32s") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
rc = qmckl_sherman_morrison_smw32s(context, &dim, &nupdates,
u, col_update_index, &breakdown, slater_inverse_nonpersistent);
}
}
else {
std::cerr << "Unknown version " << version << std::endl;
exit(1);
}
std::memcpy(slater_inverse, slater_inverse_nonpersistent,
dim * dim * sizeof(double));
delete[] slater_inverse_nonpersistent;
#else // No performance measurements repetition
if (version == "sm1") {
qmckl_context context;
context = qmckl_context_create();
qmckl_exit_code rc;
rc = qmckl_sherman_morrison_c(context, dim, nupdates,
u, col_update_index, breakdown, slater_inverse);
}
else if (version == "wb2") {
qmckl_context context;
context = qmckl_context_create();
qmckl_exit_code rc;
rc = qmckl_woodbury_2_c(context, dim,
u, col_update_index, breakdown, slater_inverse);
}
else if (version == "wb3") {
qmckl_context context;
context = qmckl_context_create();
qmckl_exit_code rc;
rc = qmckl_woodbury_3_c(context, dim,
u, col_update_index, breakdown, slater_inverse);
}
else {
std::cerr << "Unknown version " << version << std::endl;
exit(1);
}
#endif // PERF
delete[] u, col_update_index;
rc = qmckl_context_destroy(context);
double *res = new double[dim * dim]{0};
matMul2(slater_matrix, slater_inverse, res, dim_32, dim_32, dim_32);
bool ok = is_identity(res, dim, tolerance);
double res_max = residual_max(res, dim);
double res2 = residual_frobenius2(res, dim);
std::cout << "Residual = " << version << " " << cycle << " " << res_max << " "
<< res2 << std::endl;
delete[] res, slater_matrix, slater_inverse;
return ok;
}
int main(int argc, char **argv) {
#ifdef PERF
if (argc != 7) {
std::cerr << "Execute from within 'datasets/'" << std::endl;
std::cerr
<< "usage: test_h5 <version> <start cycle> <stop cycle> <break-down threshold> <tolerance> <number of reps.>"
<< std::endl;
return 1;
}
#else
if (argc != 6) {
std::cerr << "Execute from within 'datasets/'" << std::endl;
std::cerr
<< "usage: test_h5 <version> <start cycle> <stop cycle> <break-down threshold> <tolerance>"
<< std::endl;
return 1;
}
#endif
std::string version(argv[1]);
int start_cycle = std::stoi(argv[2]);
int stop_cycle = std::stoi(argv[3]);
double breakdown = std::stod(argv[4]);
double tolerance = std::stod(argv[5]);
H5::H5File file(FILE_NAME, H5F_ACC_RDONLY);
#ifdef PERF
repetition_number = std::stoi(argv[6]);
#endif
bool ok;
for (int cycle = start_cycle; cycle < stop_cycle + 1; cycle++) {
ok = test_cycle(file, cycle, version, breakdown, tolerance);
if (ok) {
std::cerr << "ok -- cycle " << std::to_string(cycle) << std::endl;
} else {
std::cerr << "failed -- cycle " << std::to_string(cycle) << std::endl;
}
}
return ok;
}

View File

@ -0,0 +1 @@
../../qmckl/src/.libs/libqmckl.so

View File

@ -0,0 +1,9 @@
#!/usr/bin/env bash
## THIS SCRIPT ONLY WORKS IF QMCKL HAS BEEN BUILT CORRECTLY
gfortran -c qmckl_f.f90
gfortran -ffree-line-length-none -c qmckl_test_f.f90
gfortran -o qmckl_test_f qmckl_test_f.o -L. -lqmckl
export LD_LIBRARY_PATH=../../qmckl/src/.libs:$LD_LIBRARY_PATH
./qmckl_test_f && octave qmckl_test_f.m

View File

@ -0,0 +1 @@
../../qmckl/src/qmckl_f.f90

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,36 @@
Sold = dlmread('Slater_old.dat');
Sold_inv = dlmread('Slater_old_inv.dat');
S = dlmread('Slater.dat');
S_inv = dlmread('Slater_inv.dat');
dim = columns(S);
cutoff = 1e-3;
printf("\n")
printf("============================================\n")
printf("OLD Slater-matrix and inverse\n")
printf("--------------------------------------------\n")
printf("Determinant of S x S_inv - Id : %f\n", det(Sold*Sold_inv-eye(dim)))
printf("Trace of S x S_inv - Id : %f\n", trace(Sold*Sold_inv-eye(dim)))
printf("Norm of S x S_inv - Id : %f\n", norm(Sold*Sold_inv-eye(dim)))
printf("\n")
printf("NEW Slater-matrix and inverse\n")
printf("--------------------------------------------\n")
printf("Determinant of S x S_inv - Id : %f\n", det(S*S_inv-eye(dim)))
printf("Trace of S x S_inv - Id : %f\n", trace(S*S_inv-eye(dim)))
printf("Norm of S x S_inv - Id : %f\n", norm(S*S_inv-eye(dim)))
printf("\n")
printf("Cutoff set to %e: S x S_inv - Id = \n", cutoff)
printf("--------------------------------------------\n")
res=S*S_inv-eye(dim);
for i = 1:dim
for j = 1:dim
if (res(i,j) < cutoff)% && i!=j)
res(i,j) = 0;
endif
endfor
endfor
format free;
disp(res);
printf("===========================================\n")

View File

@ -0,0 +1,513 @@
#START_PACKET
#CYCLE_ID: 13
#SLATER_MATRIX_DIM: 21
#NUPDATES: 3
#SLATER_MATRIX: (i (outer), j (inner)), slater_matrix_alpha(i,j), ddet * slater_matrix_alpha_inv_det(i,j) / ddet
(01,01) -0.123240642249584E+00 0.311919238733319E+02
(01,02) 0.150952935218811E+00 0.391211616261786E+02
(01,03) 0.871514901518822E-01 0.230468185418855E+02
(01,04) -0.150895461440086E+00 0.385544395586345E+02
(01,05) -0.871202647686005E-01 0.233591113858616E+02
(01,06) -0.123183816671371E+00 -0.312005871898339E+02
(01,07) 0.100359566509724E+00 -0.751758654676229E+00
(01,08) -0.135056734085083E+00 -0.440356424219148E+01
(01,09) -0.744080543518066E-01 -0.157135293238612E+01
(01,10) -0.120210982859135E+00 0.311608268850865E+01
(01,11) -0.757721215486526E-01 0.269147143852639E+01
(01,12) 0.525853671133518E-01 -0.295675853033276E+01
(01,13) 0.102125488221645E+00 0.695722472661512E+01
(01,14) -0.307190138846636E-01 -0.656548036745546E+01
(01,15) 0.202103536576033E-01 0.357345834272637E+01
(01,16) -0.211704343557358E+00 -0.127226560851769E+00
(01,17) -0.152789223939180E-01 0.211510373691347E+01
(01,18) -0.396802611649036E-01 0.225402683839516E+01
(01,19) 0.156803593039513E+00 0.138095041843308E+00
(01,20) 0.273103892803192E+00 0.144755926374198E+00
(01,21) -0.666790679097176E-01 -0.129650521353452E+01
(02,01) -0.383377403020859E+00 0.748881862107261E+02
(02,02) 0.469519078731537E+00 0.913799202443389E+02
(02,03) -0.271040737628937E+00 0.511079244308798E+02
(02,04) 0.469401627779007E+00 0.908925159786654E+02
(02,05) -0.271042704582214E+00 0.524296869618370E+02
(02,06) 0.383267551660538E+00 -0.743781724291279E+02
(02,07) 0.116775326430798E+00 -0.308858192791382E+01
(02,08) -0.936452969908714E-01 -0.883914805747968E+01
(02,09) 0.369134694337845E-01 -0.251520306199258E+01
(02,10) -0.204805508255959E-01 0.120501905090525E+02
(02,11) -0.173394829034805E-01 0.968749784123027E+01
(02,12) -0.197960838675499E+00 -0.128360153025071E+02
(02,13) 0.962643101811409E-01 0.124602848636645E+02
(02,14) 0.274471193552017E+00 -0.108315097729706E+02
(02,15) 0.145023554563522E+00 0.538637730088244E+01
(02,16) -0.179225616157055E-01 -0.155954216668878E+01
(02,17) 0.136946782469749E+00 0.733071759611877E+01
(02,18) -0.174913182854652E+00 0.106785970043980E+02
(02,19) -0.128193218261003E-01 -0.526404570077434E+00
(02,20) 0.225567314773798E-01 0.126274276019119E+01
(02,21) -0.171542761381716E-02 -0.176385334707397E+01
(03,01) -0.109934650361538E+00 0.981074335673308E+01
(03,02) 0.393143796827644E-03 0.142283742204400E+02
(03,03) 0.155300989747047E+00 0.106061203769129E+02
(03,04) -0.378105294657871E-03 0.142205894966935E+02
(03,05) 0.154906913638115E+00 0.106658385090178E+02
(03,06) 0.109414055943489E+00 -0.999705856360834E+01
(03,07) 0.162110984325409E+00 -0.235530921594611E+01
(03,08) -0.104241691529751E+00 -0.397822961500586E+01
(03,09) -0.199010908603668E+00 -0.615755307417915E+00
(03,10) -0.178463548421860E+00 0.302954990045915E+01
(03,11) 0.115249522030354E+00 0.260774312202084E+01
(03,12) -0.751317143440247E-01 -0.324474908269315E+01
(03,13) -0.180085301399231E-01 0.506349143477028E+01
(03,14) 0.776397660374641E-01 -0.403331084954255E+01
(03,15) -0.162087708711624E+00 0.216159755322281E+01
(03,16) 0.115154005587101E+00 -0.356236831434911E+00
(03,17) -0.111836232244968E+00 0.229287231445069E+01
(03,18) 0.215133726596832E+00 0.345423911992016E+01
(03,19) -0.165389522910118E+00 -0.522840315767084E-01
(03,20) -0.160914268344641E-01 -0.798660202084652E+00
(03,21) -0.184740740805864E-01 -0.669484792656382E-01
(04,01) -0.505007863044739E+00 -0.509168796576331E+00
(04,02) -0.618503987789154E+00 -0.626061168716399E+00
(04,03) 0.357068866491318E+00 0.106282405724139E+00
(04,04) 0.618444144725800E+00 0.187208027678628E+00
(04,05) -0.357080936431885E+00 -0.361241794759462E+00
(04,06) -0.504969716072083E+00 -0.152171018401898E+00
(04,07) 0.778413712978363E-01 0.786005474778943E-02
(04,08) 0.487910546362400E-01 0.335536466772946E-01
(04,09) -0.115782171487808E-01 0.204150929795949E-01
(04,10) -0.530001707375050E-01 -0.431873457736125E-01
(04,11) 0.214109313674271E-02 -0.266642681570363E-01
(04,12) -0.194653034210205E+00 0.354230568719380E-01
(04,13) -0.116052091121674E+00 -0.662672792520103E-01
(04,14) -0.260605067014694E+00 0.541727654659900E-01
(04,15) -0.137633457779884E+00 -0.215053141567270E-01
(04,16) 0.422291792929173E-01 -0.313441408257335E-02
(04,17) 0.133351176977158E+00 -0.360061392608368E-01
(04,18) -0.170262515544891E+00 -0.364432600501005E-01
(04,19) -0.304439514875412E-01 -0.281329679904227E-02
(04,20) 0.533868409693241E-01 0.147042058872862E-01
(04,21) 0.596583448350430E-02 0.983501095240267E-02
(05,01) -0.947399914264679E+00 -0.515300150381945E+00
(05,02) 0.440122239524499E-04 -0.414148002449120E+00
(05,03) -0.133992493152618E+01 -0.483927352922599E+00
(05,04) 0.392828042095061E-04 -0.414236968594294E+00
(05,05) 0.134024262428284E+01 0.892894843202583E-02
(05,06) -0.947782099246979E+00 0.163447351211741E+00
(05,07) -0.155572161078453E+00 -0.263796606276840E-01
(05,08) -0.790303274989128E-01 -0.422167712445766E-01
(05,09) -0.178044617176056E+00 -0.244456092073667E-01
(05,10) 0.141150355339050E+00 0.343720228179847E-01
(05,11) -0.857104435563087E-01 0.188162844929908E-01
(05,12) 0.108973577618599E+00 -0.227730288498809E-01
(05,13) 0.100100971758366E-01 0.389866683213947E-01
(05,14) 0.567631311714649E-01 -0.313257678215315E-01
(05,15) -0.203381881117821E+00 0.166784616908835E-01
(05,16) 0.391849316656590E-01 -0.748798889931418E-02
(05,17) 0.140034869313240E+00 0.141492354958890E-01
(05,18) -0.172185719013214E+00 0.166134715418269E-01
(05,19) 0.583750754594803E-01 -0.569910669664292E-02
(05,20) -0.916111283004284E-03 -0.139449114927599E-01
(05,21) -0.292119309306145E-01 -0.277054057678700E-02
(06,01) -0.351941259577870E-02 0.320422300739978E+02
(06,02) -0.429157400503755E-02 0.396796238151428E+02
(06,03) 0.200041988864541E-02 0.225744499599300E+02
(06,04) 0.343890837393701E-02 0.385319291283625E+02
(06,05) -0.242624944075942E-02 0.228620731935291E+02
(06,06) -0.279381335712969E-02 -0.315787444812651E+02
(06,07) 0.133628234267235E+00 -0.201688119637744E+01
(06,08) 0.164535552263260E+00 -0.691868674131645E+01
(06,09) -0.303669814020395E-01 -0.337527478391271E+01
(06,10) 0.335082374513149E-01 0.737932786002596E+01
(06,11) -0.115301951766014E+00 0.532046905755991E+01
(06,12) -0.643811970949173E-01 -0.704646020919806E+01
(06,13) 0.168905649334192E-01 0.116798006516197E+02
(06,14) -0.131173312664032E+00 -0.103900446585121E+02
(06,15) -0.228150542825460E-01 0.367492551215626E+01
(06,16) -0.140278100967407E+00 0.541292498306359E+00
(06,17) 0.121666260063648E+00 0.688933313780047E+01
(06,18) -0.169033091515303E-01 0.643920432296654E+01
(06,19) 0.515771955251694E-01 0.640069090766210E+00
(06,20) -0.180635631084442E+00 -0.275193635264416E+01
(06,21) 0.195857465267181E+00 -0.188561818645725E+01
(07,01) -0.520476046949625E-02 0.236539170987535E+02
(07,02) 0.580822164192796E-02 0.295003969224203E+02
(07,03) -0.399843230843544E-02 0.174888381981832E+02
(07,04) 0.576473958790302E-02 0.294531380129501E+02
(07,05) -0.271833199076355E-02 0.175044078873038E+02
(07,06) 0.426918268203735E-02 -0.241830822724836E+02
(07,07) 0.147665038704872E+00 0.314282931518621E+01
(07,08) -0.117447517812252E+00 0.403784215759159E+01
(07,09) 0.147420719265938E+00 0.169155742879292E+01
(07,10) 0.135893806815147E+00 -0.554066860884136E+01
(07,11) 0.422651544213295E-01 -0.525713150347206E+01
(07,12) -0.695310905575752E-01 0.394727380633284E+01
(07,13) -0.168554261326790E-01 -0.641137465954821E+01
(07,14) 0.921243280172348E-01 0.423388578775427E+01
(07,15) 0.117380328476429E+00 0.306527904979264E-01
(07,16) 0.138013571500778E+00 0.202300380704869E+01
(07,17) -0.623580329120159E-01 -0.459569791294739E+01
(07,18) -0.136343047022820E+00 -0.468425326686841E+01
(07,19) 0.131682857871056E+00 0.121902516832242E+01
(07,20) -0.132132634520531E+00 -0.707896318054816E+00
(07,21) 0.119739077985287E+00 0.441694177169657E+00
(08,01) -0.241280291229486E-01 -0.964925469634583E+02
(08,02) 0.295925457030535E-01 -0.118149667679186E+03
(08,03) 0.161907169967890E-01 -0.672201839913842E+02
(08,04) -0.280807800590992E-01 -0.117411734713197E+03
(08,05) -0.170978084206581E-01 -0.686625184338945E+02
(08,06) -0.229465700685978E-01 0.961995663618476E+02
(08,07) 0.170763313770294E+00 0.451976509920424E+01
(08,08) -0.246933296322823E+00 0.100355852033043E+02
(08,09) -0.118787530809641E-01 0.362241589185164E+01
(08,10) -0.233876928687096E-01 -0.130069484167442E+02
(08,11) -0.235260799527168E+00 -0.110760346601338E+02
(08,12) -0.413223467767239E-01 0.139329830045770E+02
(08,13) 0.334977582097054E-01 -0.153873537547839E+02
(08,14) 0.146476894617081E+00 0.146103537661863E+02
(08,15) 0.599658722057939E-02 -0.765612032914714E+01
(08,16) -0.962516665458679E-01 0.886407137879243E+00
(08,17) 0.239439934492111E+00 -0.705337777438639E+01
(08,18) -0.289920177310705E-01 -0.116989846863909E+02
(08,19) 0.406377874314785E-01 0.592924574459365E-01
(08,20) 0.131046742200851E+00 -0.301336277255331E+00
(08,21) 0.136250451207161E+00 0.221249720574218E+01
(09,01) -0.887189060449600E-02 0.408696880275784E+02
(09,02) -0.451377010904253E-03 0.498549177991145E+02
(09,03) -0.123341614380479E-01 0.283099915956156E+02
(09,04) -0.489434518385679E-03 0.498508177346691E+02
(09,05) 0.119013069197536E-01 0.288351506046625E+02
(09,06) -0.825028307735920E-02 -0.408181390328127E+02
(09,07) 0.120959408581257E+00 0.274581588439313E+01
(09,08) 0.899301841855049E-01 0.442598366847707E+01
(09,09) 0.183146566152573E+00 0.258341971052896E+01
(09,10) -0.167249992489815E+00 -0.343796285403762E+01
(09,11) 0.150660663843155E+00 -0.176879400649229E+01
(09,12) 0.621877647936344E-01 0.220820305885640E+01
(09,13) 0.775983557105064E-01 -0.388855121748206E+01
(09,14) -0.421430803835392E-01 0.313381413329812E+01
(09,15) -0.270811710506678E-01 -0.180792375354553E+01
(09,16) 0.361108258366585E-01 0.773423930388479E+00
(09,17) 0.712988025043160E-03 -0.124926313426792E+01
(09,18) 0.177535593509674E+00 -0.149560597825620E+01
(09,19) 0.527953356504440E-01 0.612080363385255E+00
(09,20) 0.141406338661909E-01 0.160255194437205E+01
(09,21) -0.784571282565594E-02 0.260363897304434E+00
(10,01) 0.852987250254955E-05 0.301411990266088E+03
(10,02) 0.136617054522503E-04 0.368201194080180E+03
(10,03) 0.202008941414533E-04 0.207873209289172E+03
(10,04) 0.554962934984360E-05 0.367592383804457E+03
(10,05) -0.211104361369507E-04 0.212546863836424E+03
(10,06) 0.204913503694115E-04 -0.300694117440840E+03
(10,07) 0.147012909874320E-01 0.516692929993857E+01
(10,08) -0.299783907830715E-01 0.478244480753043E+01
(10,09) 0.106510026380420E-01 0.190200983103669E+01
(10,10) 0.321145392954350E-01 0.479668913780619E+01
(10,11) -0.327010415494442E-01 -0.406712268774822E+01
(10,12) 0.469501204788685E-01 -0.129331403067363E+02
(10,13) -0.509594380855560E-01 -0.101318538315566E+02
(10,14) -0.599967837333679E-01 -0.435269015938419E+01
(10,15) -0.323531590402126E-01 0.642934255142023E+01
(10,16) -0.460793916136026E-02 0.455735933529251E+00
(10,17) -0.224983040243387E-01 -0.346483670488126E+01
(10,18) 0.588687174022198E-01 0.108965933547002E+02
(10,19) -0.269168405793607E-02 0.146020551701604E+01
(10,20) 0.760632846504450E-02 0.935891778893215E+01
(10,21) -0.926463399082422E-02 -0.109012901159488E+01
(11,01) -0.162329792510718E-02 -0.439722468868773E+02
(11,02) -0.155836262274534E-02 -0.536247043860828E+02
(11,03) -0.135748169850558E-02 -0.303963712026272E+02
(11,04) -0.150117883458734E-02 -0.528578708468503E+02
(11,05) -0.450650841230527E-03 -0.306542964087078E+02
(11,06) 0.917027471587062E-03 0.432088828086063E+02
(11,07) 0.112307444214821E+00 0.284895856343348E+01
(11,08) 0.859148427844048E-01 0.612570733710553E+01
(11,09) 0.108720205724239E+00 0.319395569891390E+01
(11,10) -0.932282283902168E-01 -0.756710064416565E+01
(11,11) 0.284656975418329E-01 -0.555260155688967E+01
(11,12) -0.560129657387733E-01 0.729138222067640E+01
(11,13) -0.110948169603944E-01 -0.982617231657246E+01
(11,14) -0.682298317551613E-01 0.839812251519917E+01
(11,15) 0.883226171135902E-01 -0.269194027969023E+01
(11,16) -0.131774798035622E+00 -0.226683480127203E+01
(11,17) -0.403642915189266E-01 -0.641562127865956E+01
(11,18) 0.920902267098427E-01 -0.680007273581139E+01
(11,19) -0.128290548920631E+00 -0.197494901501065E+01
(11,20) -0.114749923348427E+00 -0.173653424919703E+00
(11,21) -0.100844800472260E+00 0.163116606552273E+01
(12,01) -0.122732308227569E-03 -0.152518665905767E+03
(12,02) 0.161253090482205E-03 -0.186570947710702E+03
(12,03) -0.120117227197625E-03 -0.106601315763174E+03
(12,04) 0.204894982744008E-03 -0.187054534721548E+03
(12,05) -0.675647606840357E-04 -0.108517073248987E+03
(12,06) 0.143623954500072E-03 0.153127156022849E+03
(12,07) 0.312066711485386E-01 -0.123830418453637E+02
(12,08) -0.353118106722832E-01 -0.304682312306106E+02
(12,09) 0.467785857617855E-01 -0.686119827740334E+01
(12,10) 0.669700726866722E-01 0.285727839324843E+02
(12,11) 0.159731749445200E-01 0.272695375357948E+02
(12,12) 0.522553734481335E-01 -0.145329020460164E+02
(12,13) -0.301160980015993E-01 0.394519469582405E+02
(12,14) -0.422964245080948E-01 -0.262032227418349E+02
(12,15) -0.366332642734051E-01 0.440123540181984E+01
(12,16) 0.137751828879118E-01 -0.480152374806063E+01
(12,17) -0.348058715462685E-01 0.206844374870974E+02
(12,18) 0.687717227265239E-02 0.176681540870106E+02
(12,19) 0.186093822121620E-01 -0.322685179905062E+01
(12,20) -0.138963768258691E-01 -0.693072145710399E+01
(12,21) 0.271552260965109E-01 -0.299148354256703E+01
(13,01) -0.116050858050585E-01 -0.974433821352575E+02
(13,02) 0.380535630029044E-05 -0.118894186687256E+03
(13,03) 0.164038110524416E-01 -0.678145724931819E+02
(13,04) -0.270099262706935E-04 -0.120113847111271E+03
(13,05) 0.164625588804483E-01 -0.697800218501777E+02
(13,06) 0.116816693916917E-01 0.982709046226804E+02
(13,07) 0.839531794190407E-01 0.183794147361240E+01
(13,08) -0.290049593895674E-01 -0.211184933123850E+01
(13,09) -0.165680781006813E+00 -0.341701670805002E+01
(13,10) -0.581433475017548E-01 -0.617525955449609E+00
(13,11) 0.208601281046867E+00 -0.107290136247085E+01
(13,12) 0.179246842861176E+00 0.576311903496641E+01
(13,13) -0.210931494832039E+00 0.348525089218890E+01
(13,14) 0.144276302307844E-01 -0.182340900435565E+01
(13,15) 0.231533348560333E+00 -0.196481152900671E+01
(13,16) -0.211453773081303E-01 0.515398790870046E+01
(13,17) 0.206030920147896E+00 0.612830413789551E+01
(13,18) 0.661853179335594E-01 -0.330426561798086E+01
(13,19) 0.334390364587307E-01 0.266628566506736E+01
(13,20) 0.252219894900918E-02 -0.631641611962441E+01
(13,21) 0.526576638221741E-01 -0.833732776936585E+01
(14,01) -0.437273271381855E-02 -0.359695109817143E+02
(14,02) -0.462692696601152E-02 -0.441431137577791E+02
(14,03) -0.348892970941961E-02 -0.256068810893284E+02
(14,04) -0.462776422500610E-02 -0.442923373719554E+02
(14,05) -0.185345404315740E-02 -0.255716486578541E+02
(14,06) 0.320841209031641E-02 0.361682912515179E+02
(14,07) 0.167358413338661E+00 -0.106016872374744E+01
(14,08) 0.120894066989422E+00 -0.188238211287414E+01
(14,09) 0.146612733602524E+00 -0.994102032235108E+00
(14,10) -0.114104241132736E+00 0.223591971782469E+01
(14,11) 0.352907255291939E-01 0.159655429090737E+01
(14,12) -0.118334278464317E+00 -0.205361173619823E+01
(14,13) -0.409047538414598E-02 0.264356759617923E+01
(14,14) -0.129458680748940E+00 -0.219743789511244E+01
(14,15) 0.150047942996025E+00 0.750051299535086E+00
(14,16) 0.104290992021561E+00 0.595419527031237E+00
(14,17) -0.437837503850460E-01 0.164954543747536E+01
(14,18) 0.142482638359070E+00 0.187932831454260E+01
(14,19) 0.945448875427246E-01 0.525623994704737E+00
(14,20) 0.911889076232910E-01 0.178475542825685E+00
(14,21) 0.619743093848228E-01 -0.364538154174523E+00
(15,01) -0.218217610381544E-02 -0.310917736032053E+01
(15,02) -0.264662108384073E-02 -0.377923704249770E+01
(15,03) 0.152970384806395E-02 -0.184422147463024E+01
(15,04) 0.263672322034836E-02 -0.324061827036610E+01
(15,05) -0.152716226875782E-02 -0.209529573424705E+01
(15,06) -0.216715293936431E-02 0.269519062926751E+01
(15,07) 0.769277736544609E-01 0.508196426964923E+00
(15,08) 0.140253871679306E+00 0.117105367866777E+01
(15,09) -0.757992193102837E-01 -0.908058618311773E-01
(15,10) 0.182921692728996E+00 0.164352591385766E+00
(15,11) -0.116774775087833E+00 -0.788766372658534E+00
(15,12) 0.197751015424728E+00 0.116885552810645E+01
(15,13) 0.239971160888672E+00 -0.215046535598994E+00
(15,14) 0.236179351806641E+00 0.144881662476397E+01
(15,15) 0.138329446315765E+00 0.178339724976908E+00
(15,16) -0.386442616581917E-02 -0.116071749607031E+00
(15,17) -0.119596652686596E+00 -0.909498295398762E+00
(15,18) 0.228947326540947E+00 0.610646926717143E-01
(15,19) 0.306998658925295E-02 -0.153530058087171E+00
(15,20) -0.562079949304461E-02 0.286291057924642E+00
(15,21) -0.900598522275686E-02 0.297948743912008E+00
(16,01) -0.428344011306763E-01 -0.149205064262646E+02
(16,02) -0.119414471555501E-03 -0.182142441709329E+02
(16,03) 0.605285130441189E-01 -0.974811729836851E+01
(16,04) 0.105399143649265E-03 -0.174196586571617E+02
(16,05) 0.603122040629387E-01 -0.983403637118013E+01
(16,06) 0.425829663872719E-01 0.148648771225544E+02
(16,07) 0.147546008229256E+00 -0.335646648007986E+00
(16,08) 0.401769354939461E-01 0.201470033855699E+01
(16,09) -0.189309567213058E+00 0.104369831287472E+01
(16,10) 0.683742910623550E-01 -0.121294114124208E+01
(16,11) 0.125439286231995E+00 -0.829328960956144E+00
(16,12) -0.422803349792957E-01 0.689052934581414E+00
(16,13) -0.458180941641331E-01 -0.383226269716630E+01
(16,14) -0.296942126005888E-01 0.373098537300082E+01
(16,15) -0.109751708805561E+00 -0.170586149813142E+01
(16,16) -0.193516850471497E+00 -0.193030177533155E+01
(16,17) -0.665694326162338E-01 -0.168714597279047E+01
(16,18) -0.817999318242073E-01 -0.547045141065854E+00
(16,19) 0.279022544622421E+00 0.178195066309647E+01
(16,20) -0.160081461071968E-01 0.313524660082812E+00
(16,21) 0.335453636944294E-01 0.541301151089991E+00
(17,01) -0.921052098274231E+00 -0.313781087163451E+02
(17,02) 0.112806463241577E+01 -0.378487347233482E+02
(17,03) -0.651386320590973E+00 -0.214243947749121E+02
(17,04) 0.112832391262054E+01 -0.376461131371173E+02
(17,05) -0.651349246501923E+00 -0.219732301247688E+02
(17,06) 0.921293020248413E+00 0.311686483844811E+02
(17,07) -0.129972562193871E+00 0.126800002733523E+01
(17,08) 0.182197511196136E+00 0.365548308626798E+01
(17,09) -0.253000296652317E-02 0.103660756397868E+01
(17,10) -0.357133313082159E-02 -0.498166767375460E+01
(17,11) 0.184675022959709E+00 -0.400092670381805E+01
(17,12) 0.551109127700329E-01 0.531406946549384E+01
(17,13) 0.231322161853313E-01 -0.514788968725777E+01
(17,14) -0.134687021374702E+00 0.447991231100838E+01
(17,15) -0.352683709934354E-02 -0.223730164941427E+01
(17,16) 0.955944135785103E-01 0.638760991508856E+00
(17,17) -0.204981788992882E+00 -0.302527057763186E+01
(17,18) -0.310501866042614E-01 -0.441444840698545E+01
(17,19) 0.732915475964546E-01 0.213306065587418E+00
(17,20) -0.121698610484600E+00 -0.520607531935427E+00
(17,21) 0.487866103649139E-01 0.730688376616387E+00
(18,01) 0.845294289320009E-05 0.369665247269374E+03
(18,02) 0.200470458366908E-04 0.451735937919445E+03
(18,03) -0.500704288697307E-06 0.258293555787007E+03
(18,04) -0.117598438009736E-04 0.455925831388285E+03
(18,05) 0.122016963359783E-04 0.265784280467111E+03
(18,06) 0.177297315531177E-04 -0.372418765344440E+03
(18,07) 0.166253838688135E-01 -0.225545830162084E+01
(18,08) -0.616515334695578E-02 0.124672280645443E+02
(18,09) -0.348300337791443E-01 0.112465777171278E+02
(18,10) -0.131978942081332E-01 -0.945248700625405E+00
(18,11) 0.483418852090836E-01 0.332314552507453E+01
(18,12) 0.501377508044243E-01 -0.139535378216261E+02
(18,13) -0.548814050853252E-01 -0.195743707104671E+02
(18,14) -0.183727266266942E-02 0.870092400349449E+01
(18,15) 0.718188360333443E-01 0.100152523582761E+02
(18,16) -0.103118065744638E-01 -0.171444008663923E+02
(18,17) 0.654948502779007E-01 -0.218953533683405E+02
(18,18) 0.109703140333295E-01 0.713189479375495E+01
(18,19) 0.177329909056425E-01 -0.119032365190316E+02
(18,20) 0.323858810588717E-02 0.251995942921836E+02
(18,21) 0.499825514853001E-01 0.312135303090508E+02
(19,01) -0.682211592793465E-01 0.765967706327448E+01
(19,02) -0.430850574048236E-03 0.877594356269220E+01
(19,03) 0.962435081601143E-01 0.415620530045576E+01
(19,04) 0.422304205130786E-03 0.850982221207004E+01
(19,05) 0.957677885890007E-01 0.445399360802617E+01
(19,06) 0.675818175077438E-01 -0.745326318445295E+01
(19,07) 0.202333241701126E+00 0.370654267814242E+01
(19,08) 0.746065378189087E-01 0.561632690325829E+01
(19,09) -0.223254755139351E+00 0.100203495234038E+01
(19,10) 0.119545228779316E+00 -0.408091666676030E+01
(19,11) 0.991457328200340E-01 -0.360166368714016E+01
(19,12) -0.162345185875893E+00 0.392121124117465E+01
(19,13) 0.185034181922674E-01 -0.644936945503097E+01
(19,14) -0.627368614077568E-01 0.453191069282601E+01
(19,15) -0.280645161867142E+00 -0.207986659450949E+01
(19,16) 0.505855195224285E-01 0.914629091127449E+00
(19,17) -0.182546600699425E+00 -0.370670813302335E+01
(19,18) -0.147651746869087E+00 -0.476882671010381E+01
(19,19) -0.701333060860634E-01 -0.148427101363476E+01
(19,20) 0.668072421103716E-02 0.220237913196195E+01
(19,21) 0.869733467698097E-02 0.117938679293896E+01
(20,01) -0.449361046776175E-02 0.902376000084666E+00
(20,02) 0.220308941788971E-02 -0.801193767960690E+00
(20,03) 0.513966614380479E-02 -0.307272834790146E+01
(20,04) -0.225867680273950E-02 -0.110857606565975E+01
(20,05) 0.263794837519526E-02 -0.320007272165156E+01
(20,06) 0.947628752328455E-03 -0.121510907580541E+01
(20,07) 0.152274832129478E+00 -0.703746631901387E-01
(20,08) -0.117567442357540E+00 -0.221727238903005E+01
(20,09) -0.206277355551720E+00 -0.190035138613005E+01
(20,10) -0.207551613450050E+00 0.118705706035607E+01
(20,11) 0.124761372804642E+00 0.218395870949059E+01
(20,12) 0.863072555512190E-02 -0.225848673886085E+01
(20,13) -0.714888703078032E-02 0.183569641575782E+01
(20,14) 0.456247404217720E-01 -0.103488813996630E+01
(20,15) -0.708496421575546E-01 -0.190399084333949E+00
(20,16) 0.107937427237630E-01 -0.149848769988273E+00
(20,17) -0.103561900556087E+00 0.263149954374569E+00
(20,18) 0.195673510432243E+00 0.226312056314707E+01
(20,19) -0.138991530984640E-01 -0.215379472713573E+00
(20,20) -0.738288741558790E-02 -0.717177684354636E+00
(20,21) 0.119809703901410E-01 0.395015106415659E+00
(21,01) -0.111714076995850E+01 -0.157006272972466E+01
(21,02) 0.136832118034363E+01 -0.165695410559176E+01
(21,03) 0.789960503578186E+00 -0.102464959222303E+01
(21,04) -0.136850726604462E+01 -0.197490477262258E+01
(21,05) -0.790138483047485E+00 -0.123963009795365E+01
(21,06) -0.111746346950531E+01 0.127940329351346E+01
(21,07) -0.158849164843559E+00 -0.115726516828563E-01
(21,08) 0.157852247357368E+00 0.278837130191972E+00
(21,09) 0.170709997415543E+00 0.100161817596371E+00
(21,10) 0.214689865708351E+00 -0.726523579353106E-01
(21,11) -0.167143829166889E-01 -0.678547976954667E-01
(21,12) -0.241510886698961E-01 0.377502144275716E-01
(21,13) -0.105082295835018E+00 -0.447407742013355E+00
(21,14) 0.101131219416857E-01 0.419175912148910E+00
(21,15) 0.525299832224846E-01 -0.233384037060628E+00
(21,16) -0.143686249852180E+00 -0.418753822037995E-02
(21,17) 0.132168933749199E+00 -0.856999606537821E-01
(21,18) -0.693865939974785E-01 -0.714580334063162E-02
(21,19) 0.104032047092915E+00 -0.161645225161624E-01
(21,20) 0.185707733035088E+00 -0.856160510487734E-02
(21,21) -0.296475943177938E-01 0.957054267749156E-01
#COL_UPDATE_INDEX: 12
#COL_UPDATE_COMP_(01): 0.102125488221645E+00
#COL_UPDATE_COMP_(02): 0.962643101811409E-01
#COL_UPDATE_COMP_(03): -0.180085301399231E-01
#COL_UPDATE_COMP_(04): -0.116052091121674E+00
#COL_UPDATE_COMP_(05): 0.100100971758366E-01
#COL_UPDATE_COMP_(06): 0.168905649334192E-01
#COL_UPDATE_COMP_(07): -0.168554261326790E-01
#COL_UPDATE_COMP_(08): 0.334977582097054E-01
#COL_UPDATE_COMP_(09): 0.775983557105064E-01
#COL_UPDATE_COMP_(10): -0.509594380855560E-01
#COL_UPDATE_COMP_(11): -0.110948169603944E-01
#COL_UPDATE_COMP_(12): -0.301160980015993E-01
#COL_UPDATE_COMP_(13): -0.210931494832039E+00
#COL_UPDATE_COMP_(14): -0.409047538414598E-02
#COL_UPDATE_COMP_(15): 0.239971160888672E+00
#COL_UPDATE_COMP_(16): -0.458180941641331E-01
#COL_UPDATE_COMP_(17): 0.231322161853313E-01
#COL_UPDATE_COMP_(18): -0.548814050853252E-01
#COL_UPDATE_COMP_(19): 0.185034181922674E-01
#COL_UPDATE_COMP_(20): -0.714888703078032E-02
#COL_UPDATE_COMP_(21): -0.105082295835018E+00
#COL_UPDATE_INDEX: 13
#COL_UPDATE_COMP_(01): -0.727039668709040E-02
#COL_UPDATE_COMP_(02): -0.329451821744442E-01
#COL_UPDATE_COMP_(03): 0.230633586645126E+00
#COL_UPDATE_COMP_(04): 0.322856456041336E-01
#COL_UPDATE_COMP_(05): 0.188164815306664E+00
#COL_UPDATE_COMP_(06): 0.976034477353096E-01
#COL_UPDATE_COMP_(07): 0.124376058578491E+00
#COL_UPDATE_COMP_(08): -0.241902604699135E+00
#COL_UPDATE_COMP_(09): -0.214029267430305E+00
#COL_UPDATE_COMP_(10): -0.164923388510942E-01
#COL_UPDATE_COMP_(11): -0.796175077557564E-01
#COL_UPDATE_COMP_(12): 0.552074126899242E-01
#COL_UPDATE_COMP_(13): 0.794003605842590E-01
#COL_UPDATE_COMP_(14): -0.999749153852463E-01
#COL_UPDATE_COMP_(15): 0.135955372825265E-01
#COL_UPDATE_COMP_(16): -0.876737236976624E-01
#COL_UPDATE_COMP_(17): 0.210409909486771E+00
#COL_UPDATE_COMP_(18): 0.177621953189373E-01
#COL_UPDATE_COMP_(19): -0.151124328374863E+00
#COL_UPDATE_COMP_(20): 0.247122272849083E+00
#COL_UPDATE_COMP_(21): -0.161797225475311E+00
#COL_UPDATE_INDEX: 21
#COL_UPDATE_COMP_(01): -0.817385390400887E-01
#COL_UPDATE_COMP_(02): 0.108162150718272E-02
#COL_UPDATE_COMP_(03): 0.693925749510527E-02
#COL_UPDATE_COMP_(04): 0.493063451722264E-02
#COL_UPDATE_COMP_(05): -0.334013439714909E-01
#COL_UPDATE_COMP_(06): 0.323923602700233E-01
#COL_UPDATE_COMP_(07): 0.120032556355000E+00
#COL_UPDATE_COMP_(08): -0.119067849591374E-01
#COL_UPDATE_COMP_(09): -0.334841385483742E-01
#COL_UPDATE_COMP_(10): 0.125436363741755E-01
#COL_UPDATE_COMP_(11): -0.145120620727539E+00
#COL_UPDATE_COMP_(12): -0.101416520774364E-01
#COL_UPDATE_COMP_(13): -0.723919421434402E-01
#COL_UPDATE_COMP_(14): 0.134314149618149E+00
#COL_UPDATE_COMP_(15): -0.125767393037677E-01
#COL_UPDATE_COMP_(16): 0.361425074515864E-03
#COL_UPDATE_COMP_(17): -0.351854860782623E-01
#COL_UPDATE_COMP_(18): -0.506495498120785E-01
#COL_UPDATE_COMP_(19): -0.291761625558138E-01
#COL_UPDATE_COMP_(20): -0.932136957999319E-03
#COL_UPDATE_COMP_(21): -0.500183776021004E-01
#END_PACKET

View File

@ -13,31 +13,28 @@
unsigned int repetition_number;
#endif
using namespace H5;
// #define DEBUG
const H5std_string FILE_NAME("dataset.hdf5");
void read_int(H5File file, std::string key, unsigned int *data) {
DataSet ds = file.openDataSet(key);
ds.read(data, PredType::STD_U32LE);
void read_int(H5::H5File file, std::string key, unsigned int *data) {
H5::DataSet ds = file.openDataSet(key);
ds.read(data, H5::PredType::STD_U32LE);
ds.close();
}
void read_double(H5File file, std::string key, double *data) {
DataSet ds = file.openDataSet(key);
ds.read(data, PredType::IEEE_F64LE);
void read_double(H5::H5File file, std::string key, double *data) {
H5::DataSet ds = file.openDataSet(key);
ds.read(data, H5::PredType::IEEE_F64LE);
ds.close();
}
int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
int test_cycle(H5::H5File file, int cycle, std::string version, double breakdown, double tolerance) {
/* Read the data */
std::string group = "cycle_" + std::to_string(cycle);
unsigned int dim, nupdates, col, i, j;
read_int(file, group + "/slater_matrix_dim", &dim);
read_int(file, group + "/nupdates", &nupdates);
@ -56,9 +53,6 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
double *u = new double[nupdates * dim];
/* Test */
#ifdef DEBUG2
showMatrix(slater_inverse, dim, "OLD Inverse");
#endif
// Transform replacement updates in 'updates[]' into additive updates in 'u[]'
for (j = 0; j < nupdates; j++) {
@ -69,54 +63,79 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
slater_matrix[i * dim + (col - 1)] = updates[i + j * dim];
}
}
#ifdef DEBUG2
showMatrix(slater_matrix, dim, "OLD Slater");
#endif
#ifdef DEBUG2
showMatrix(u, dim, "Updates");
#endif
delete[] updates;
#ifdef PERF
std::cout << "# of reps. = " << repetition_number << std::endl;
double *slater_inverse_nonpersistent = new double[dim * dim];
for (unsigned int i = 0; i < repetition_number; i++) {
std::memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
if (version == "maponia3") {
MaponiA3(slater_inverse_nonpersistent, dim, nupdates, u,
col_update_index);
} else if (version == "maponia3s") {
MaponiA3S(slater_inverse_nonpersistent, dim, nupdates, u,
col_update_index);
} else if (version == "sm1") {
SM1(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
} else if (version == "sm2") {
SM2(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
} else if (version == "sm3") {
SM3(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
} else if (version == "sm4") {
SM4(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
} else if (version == "wb2") {
WB2(slater_inverse_nonpersistent, dim, u, col_update_index);
} else if (version == "wb3") {
WB3(slater_inverse_nonpersistent, dim, u, col_update_index);
} else if (version == "smwb1") {
SMWB1(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
} else if (version == "smwb2") {
SMWB2(slater_inverse_nonpersistent, dim, nupdates, u, col_update_index);
#ifdef MKL
} else if (version == "lapack") {
memcpy(slater_inverse_nonpersistent, slater_matrix,
dim * dim * sizeof(double));
inverse(slater_inverse_nonpersistent, dim);
#endif // MKL
} else {
std::cerr << "Unknown version " << version << std::endl;
exit(1);
if (version == "sm1") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM1(slater_inverse_nonpersistent, dim, nupdates,
u, col_update_index, breakdown);
}
}
else if (version == "wb2") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB2(slater_inverse_nonpersistent, dim,
u, col_update_index, breakdown);
}
}
else if (version == "wb3") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB3(slater_inverse_nonpersistent, dim,
u, col_update_index, breakdown);
}
}
else if (version == "sm2") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
SM2(slater_inverse_nonpersistent, dim, nupdates,
u, col_update_index, breakdown);
}
}
else if (version == "wb2s") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB2s(slater_inverse_nonpersistent, dim, nupdates,
u, col_update_index, breakdown);
}
}
else if (version == "wb3s") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB3s(slater_inverse_nonpersistent, dim, nupdates,
u, col_update_index, breakdown);
}
}
else if (version == "wb32s") {
for (unsigned int i = 0; i < repetition_number; i++) {
memcpy(slater_inverse_nonpersistent, slater_inverse,
dim * dim * sizeof(double));
WB32s(slater_inverse_nonpersistent, dim, nupdates,
u, col_update_index, breakdown);
}
}
#ifdef MKL
else if (version == "lapack") {
memcpy(slater_inverse_nonpersistent, slater_matrix,
dim * dim * sizeof(double));
inverse(slater_inverse_nonpersistent, dim);
}
#endif // MKL
else {
std::cerr << "Unknown version " << version << std::endl;
exit(1);
}
std::memcpy(slater_inverse, slater_inverse_nonpersistent,
dim * dim * sizeof(double));
delete[] slater_inverse_nonpersistent;
@ -137,10 +156,12 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
WB2(slater_inverse, dim, u, col_update_index);
} else if (version == "wb3") {
WB3(slater_inverse, dim, u, col_update_index);
} else if (version == "smwb1") {
SMWB1(slater_inverse, dim, nupdates, u, col_update_index);
} else if (version == "smwb4") {
SMWB4(slater_inverse, dim, nupdates, u, col_update_index);
} else if (version == "wb2s") {
WB2s(slater_inverse, dim, nupdates, u, col_update_index);
} else if (version == "wb3s") {
WB3s(slater_inverse, dim, nupdates, u, col_update_index);
} else if (version == "wb32s") {
WB32s(slater_inverse, dim, nupdates, u, col_update_index);
#ifdef MKL
} else if (version == "lapack") {
memcpy(slater_inverse, slater_matrix, dim * dim * sizeof(double));
@ -151,17 +172,10 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
exit(1);
}
#endif // PERF
#ifdef DEBUG2
showMatrix(slater_matrix, dim, "NEW Slater");
#endif
#ifdef DEBUG2
showMatrix(slater_inverse, dim, "NEW Inverse");
#endif
delete[] u, col_update_index;
double *res = new double[dim * dim]{0};
matMul(slater_matrix, slater_inverse, res, dim);
matMul2(slater_matrix, slater_inverse, res, dim, dim, dim);
bool ok = is_identity(res, dim, tolerance);
double res_max = residual_max(res, dim);
double res2 = residual_frobenius2(res, dim);
@ -173,25 +187,25 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
showMatrix(res, dim, "Result");
#endif
delete[] res, updates, u, col_update_index, slater_matrix, slater_inverse;
delete[] res, slater_matrix, slater_inverse;
return ok;
}
int main(int argc, char **argv) {
#ifdef PERF
if (argc != 6) {
if (argc != 7) {
std::cerr << "Execute from within 'datasets/'" << std::endl;
std::cerr
<< "usage: test_h5 <version> <start cycle> <stop cycle> <tolerance> <number of reps.>"
<< "usage: test_h5 <version> <start cycle> <stop cycle> <break-down threshold> <tolerance> <number of reps.>"
<< std::endl;
return 1;
}
#else
if (argc != 5) {
if (argc != 6) {
std::cerr << "Execute from within 'datasets/'" << std::endl;
std::cerr
<< "usage: test_h5 <version> <start cycle> <stop cycle> <tolerance>"
<< "usage: test_h5 <version> <start cycle> <stop cycle> <break-down threshold> <tolerance>"
<< std::endl;
return 1;
}
@ -200,16 +214,17 @@ int main(int argc, char **argv) {
std::string version(argv[1]);
int start_cycle = std::stoi(argv[2]);
int stop_cycle = std::stoi(argv[3]);
double tolerance = std::stod(argv[4]);
H5File file(FILE_NAME, H5F_ACC_RDONLY);
double breakdown = std::stod(argv[4]);
double tolerance = std::stod(argv[5]);
H5::H5File file(FILE_NAME, H5F_ACC_RDONLY);
#ifdef PERF
repetition_number = std::stoi(argv[5]);
repetition_number = std::stoi(argv[6]);
#endif
bool ok;
for (int cycle = start_cycle; cycle < stop_cycle + 1; cycle++) {
ok = test_cycle(file, cycle, version, tolerance);
ok = test_cycle(file, cycle, version, breakdown, tolerance);
if (ok) {
std::cerr << "ok -- cycle " << std::to_string(cycle) << std::endl;
} else {