1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-06-13 08:45:36 +02:00

Moved documentation in share/doc

This commit is contained in:
Anthony Scemama 2021-04-30 01:26:19 +02:00
parent 79c9651021
commit e2e46d0714
24 changed files with 451 additions and 404 deletions

View File

@ -21,29 +21,29 @@ jobs:
run: sudo apt-get install emacs26
- name: install htmlize
run: git clone https://github.com/hniksic/emacs-htmlize && cp emacs-htmlize/htmlize.el docs/
run: git clone https://github.com/hniksic/emacs-htmlize && cp emacs-htmlize/htmlize.el share/doc/qmckl/html/
- name: make
run: make -C src/ doc && ls -sh ./docs/
run: make -C src/ doc && ls -sh ./share/doc/qmckl/html/
- name: pwd
run: pwd
- name: ls
run: ls -sh ./docs
run: ls -sh ./share/doc/qmckl/html/
# - name: Deploy
# uses: peaceiris/actions-gh-pages@v3
# with:
# github_token: ${{ secrets.GITHUB_TOKEN }}
# publish_dir: ./docs
# publish_dir: ./share/doc/qmckl/html/
- name: Deploy
uses: JamesIves/github-pages-deploy-action@4.1.0
with:
branch: gh-pages
folder: ./docs
folder: ./share/doc/qmckl/html/
# github_token: ${{ secrets.GITHUB_TOKEN }}
# publish_dir: ./docs
# publish_dir: ./share/doc/qmckl/html/

3
.gitmodules vendored
View File

@ -1,6 +1,3 @@
[submodule "munit"]
path = munit
url = https://github.com/nemequ/munit/
[submodule "docs/org-html-themes"]
path = docs/org-html-themes
url = https://github.com/fniessen/org-html-themes.git

View File

@ -16,15 +16,19 @@ static_lib=$(QMCKL_ROOT)/lib/libqmckl.a
qmckl_h=$(QMCKL_ROOT)/include/qmckl.h
qmckl_f=$(QMCKL_ROOT)/share/qmckl/fortran/qmckl_f.f90
docdir=$(prefix)/share/doc/qmckl
libdir=$(prefix)/lib
includedir=$(prefix)/include
fortrandir=$(prefix)/share/qmckl/fortran
export prefix shared_lib static_lib qmckl_h qmckl_f
all clean doc check install uninstall:
all clean doc install uninstall check:
$(MAKE) -C src $@
dist: $(distdir).tar.gz
$(distdir).tar.gz: $(distdir)
tar chof - $(distdir) | gzip -9 -c > $@
rm -rf $(distdir)
@ -39,15 +43,15 @@ $(distdir): $(qmckl_h) $(qmckl_f) $(static_lib) $(shared_lib) src/Makefile.gener
mkdir -p $(distdir)/share/doc/qmckl/html/
mkdir -p $(distdir)/share/doc/qmckl/text/
mkdir -p $(distdir)/man
cp munit/munit.h munit/munit.c $(distdir)/munit/
cp src/*.c src/*.h src/*.f90 $(distdir)/src/
cp src/Makefile.generated $(distdir)/src/Makefile
cp include/* $(distdir)/include
cp Makefile $(distdir)/
cp docs/*.html $(distdir)/share/doc/qmckl/html/
cp docs/*.css $(distdir)/share/doc/qmckl/html/
cp docs/*.txt $(distdir)/share/doc/qmckl/text/
cp share/qmckl/fortran/* $(distdir)/share/qmckl/fortran
cp $(QMCKL_ROOT)/munit/munit.h munit/munit.c $(distdir)/munit/
cp $(QMCKL_ROOT)/src/*.c src/*.h src/*.f90 $(distdir)/src/
cp $(QMCKL_ROOT)/src/Makefile.generated $(distdir)/src/Makefile
cp $(qmckl_h) $(distdir)/include
cp $(QMCKL_ROOT)/Makefile $(distdir)/
cp $(QMCKL_ROOT)/share/doc/qmckl/html/*.html $(distdir)/share/doc/qmckl/html/
cp $(QMCKL_ROOT)/share/doc/qmckl/html/*.css $(distdir)/share/doc/qmckl/html/
cp $(QMCKL_ROOT)/share/doc/qmckl/text/*.txt $(distdir)/share/doc/qmckl/text/
cp $(qmckl_f) $(distdir)/share/qmckl/fortran/
mkdir -p $(distdir)/lib
@ -58,21 +62,27 @@ FORCE:
distcheck: $(distdir).tar.gz
gzip -cd $(distdir).tar.gz | tar xvf -
cd $(distdir) && $(MAKE) all check
rm $(distdir)/lib/libqmckl.so
rm $(distdir)/include/qmckl.h
rm $(distdir)/share/qmckl/fortran/qmckl_f.f90
rm $(distdir)/share/doc/qmckl/html/*.html
rm $(distdir)/share/doc/qmckl/html/*.css
rm $(distdir)/share/doc/qmckl/text/*.txt
cd $(distdir) && $(MAKE) all
cd $(distdir) && $(MAKE) check
cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst install
cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst uninstall
@remaining="`find $${PWD}/$(distdir)/_inst -type f | wc -l`" ;\
if test "$${remaining}" -ne 0; then \
echo "*** $${remaining} file(s) remaining in stage directory"; \
exit 1; \
fi
cd $(distdir) && $(MAKE) clean
rm -rf $(distdir)
@echo "*** Package $(distdir).tar.gz is ready for distribution."
$(qmckl_h) $(qmckl_f) $(static_lib) $(shared_lib) src/Makefile.generated:
$(qmckl_h) $(qmckl_f) $(static_lib) $(shared_lib):
$(MAKE) -C src $@
src/Makefile.generated:
$(MAKE) -C src Makefile.generated
veryclean: FORCE clean
.PHONY: all clean dist doc install uninstall FORCE
.PHONY: all veryclean clean dist doc install uninstall FORCE

1
docs/.gitignore vendored
View File

@ -1 +0,0 @@
*.txt

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

View File

@ -1,16 +0,0 @@
# -*- mode: org; -*-
#+HTML_LINK_HOME: index.html
#+OPTIONS: H:4 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t d:(HIDE)
# SETUPFILE: ../docs/org-html-themes/org/theme-readtheorg.setup
#+INFOJS_OPT: toc:t mouse:underline path:org-info.js
#+HTML_HEAD: <link rel="stylesheet" title="Standard" href="qmckl.css" type="text/css" />
#+STARTUP: align fold nodlcheck hidestars oddeven lognotestate
#+AUTHOR: TREX CoE
#+LANGUAGE: en

12
qmckl.pc Normal file
View File

@ -0,0 +1,12 @@
prefix=/usr
exec_prefix=${prefix}
includedir=${exec_prefix}/include
libdir=${exec_prefix}/lib
Name: QMCkl
Description: Quantum Monte Carlo kernel library
URL: https://github.com/trex-coe/qmckl
Version: 1.0.0
Cflags: -I${includedir}
Libs: -L${libdir} -lqmckl
Requires.private: blas

0
share/doc/qmckl/html/.gitignore vendored Normal file
View File

0
share/doc/qmckl/text/.gitignore vendored Normal file
View File

View File

@ -92,10 +92,13 @@ endif
# The Makefile.generated is the one that will be distributed with the library.
.PHONY: clean shared static doc all check install uninstall syntax
.PHONY: clean shared static doc all check install uninstall
.SECONDARY: # Needed to keep the produced C and Fortran files
$(shared_lib) $(static_lib) install uninstall: $(qmckl_h) $(qmckl_f) Makefile.generated
$(shared_lib) $(static_lib): $(qmckl_h) $(qmckl_f) Makefile.generated
$(MAKE) -f Makefile.generated $@
install uninstall: Makefile.generated
$(MAKE) -f Makefile.generated $@
$(qmckl_f) $(qmckl_h): Makefile.generated
@ -108,8 +111,11 @@ all: shared static doc check
check: $(static_lib)
$(MAKE) -f Makefile.generated check
syntax:
cppcheck --addon=cert qmckl_*.c
cppcheck:
cppcheck \
--addon=cert \
--enable=warning,style,performance,portability,information \
qmckl_*.c
doc: $(ORG_SOURCE_FILES)
$(QMCKL_ROOT)/tools/build_doc.sh
@ -122,10 +128,10 @@ clean:
Makefile.generated *.html *.txt
veryclean: clean FORCE
- $(RM) $(QMCKL_ROOT)/docs/*.html \
$(QMCKL_ROOT)/docs/*.txt
- $(RM) $(QMCKL_ROOT)/share/doc/qmckl/html/*.html \
$(QMCKL_ROOT)/share/doc/qmckl/text/*.txt
Makefile.generated: Makefile $(QMCKL_ROOT)/tools/create_makefile.sh $(ORG_SOURCE_FILES)
Makefile.generated: Makefile $(QMCKL_ROOT)/tools/create_makefile.sh $(ORG_SOURCE_FILES) ../tools/Building.org
$(QMCKL_ROOT)/tools/create_makefile.sh

View File

@ -1,6 +1,6 @@
#+TITLE: QMCkl source code documentation
#+PROPERTY: comments org
#+SETUPFILE: ../docs/theme.setup
#+SETUPFILE: ../tools/theme.setup
------------------
@ -14,7 +14,7 @@
#+begin_src sh :exports none
grep TITLE $(cat table_of_contents) | tr ':' ' '
#+end_src
#+RESULTS: toc
| qmckl.org | #+TITLE | Header | files |
| qmckl_error.org | #+TITLE | Error | handling |
@ -43,7 +43,7 @@ return '\n'.join(result)
- [[./qmckl_distance.html][Distances]]
- [[./qmckl_ao.html][Atomic Orbitals]]
- [[./test_qmckl.html][Testing]]
--------------------------------
@ -65,4 +65,4 @@ return '\n'.join(result)
[[https://trex-coe.eu/sites/default/files/inline-images/euflag.jpg]] [[https://trex-coe.eu][TREX: Targeting Real Chemical Accuracy at the Exascale]] project has received funding from the European Unions Horizon 2020 - Research and Innovation program - under grant agreement no. 952165. The content of this document does not represent the opinion of the European Union, and the European Union is not responsible for any use that might be made of such content.
# -*- mode: org -*-

View File

@ -1,6 +1,6 @@
#+TITLE: Introduction
#+PROPERTY: comments org
#+SETUPFILE: ../docs/theme.setup
#+SETUPFILE: ../tools/theme.setup
# -*- mode: org -*-
* Using QMCkl

View File

@ -1,5 +1,5 @@
#+TITLE: Atomic Orbitals
#+SETUPFILE: ../docs/theme.setup
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
The atomic basis set is defined as a list of shells. Each shell $s$ is
@ -11,7 +11,7 @@ Gaussian ($p=2$):
\[
R_s(\mathbf{r}) = \mathcal{N}_s |\mathbf{r}-\mathbf{R}_A|^{n_s}
\sum_{k=1}^{N_{\text{prim}}} a_{ks}
\exp \left( - \gamma_{ks} | \mathbf{r}-\mathbf{R}_A | ^p \right).
\exp \left( - \gamma_{ks} | \mathbf{r}-\mathbf{R}_A | ^p \right).
\]
In the case of Gaussian functions, $n_s$ is always zero.
@ -26,7 +26,7 @@ Atomic orbitals (AOs) are defined as
\[
\chi_i (\mathbf{r}) = P_{\eta(i)}(\mathbf{r})\, R_{\theta(i)} (\mathbf{r})
\]
where $\theta(i)$ returns the shell on which the AO is expanded,
and $\eta(i)$ denotes which angular function is chosen.
@ -34,7 +34,7 @@ In this section we describe the kernels used to compute the values,
gradients and Laplacian of the atomic basis functions.
* Headers :noexport:
#+begin_src elisp :noexport :results none
#+begin_src elisp :noexport :results none
(org-babel-lob-ingest "../tools/lib.org")
#+end_src
@ -74,7 +74,7 @@ MunitResult test_<<filename()>>() {
* Context
The following arrays are stored in the context:
| ~type~ | | Gaussian (~'G'~) or Slater (~'S'~) |
| ~shell_num~ | | Number of shells |
| ~prim_num~ | | Total number of primitives |
@ -150,9 +150,9 @@ typedef struct qmckl_ao_basis_struct {
initialization function which has not bee called. It becomes equal
to zero after all initialization functions have been called. The
struct is then initialized and ~provided == true~.
** Access functions
#+begin_src c :comments org :tangle (eval h_private_func) :exports none
char qmckl_get_ao_basis_type (const qmckl_context context);
int64_t qmckl_get_ao_basis_shell_num (const qmckl_context context);
@ -179,7 +179,7 @@ if ( (ctx->ao_basis.uninitialized & mask) != 0) {
return NULL;
}
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
char qmckl_get_ao_basis_type (const qmckl_context context) {
@ -385,12 +385,12 @@ bool qmckl_ao_basis_provided(const qmckl_context context) {
return ctx->ao_basis.provided;
}
#+end_src
** Initialization functions
To set the basis set, all the following functions need to be
called. When
#+begin_src c :comments org :tangle (eval h_func)
qmckl_exit_code qmckl_set_ao_basis_type (qmckl_context context, const char t);
qmckl_exit_code qmckl_set_ao_basis_shell_num (qmckl_context context, const int64_t shell_num);
@ -415,12 +415,12 @@ qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
#+NAME:post2
#+begin_src c :exports none
ctx->ao_basis.uninitialized &= ~mask;
ctx->ao_basis.uninitialized &= ~mask;
ctx->ao_basis.provided = (ctx->ao_basis.uninitialized == 0);
return QMCKL_SUCCESS;
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_set_ao_basis_type(qmckl_context context, const char t) {
@ -464,7 +464,7 @@ qmckl_exit_code qmckl_set_ao_basis_shell_num(qmckl_context context, const int64_
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_prim_num(qmckl_context context, const int64_t prim_num) {
<<pre2>>
@ -490,7 +490,7 @@ qmckl_exit_code qmckl_set_ao_basis_prim_num(qmckl_context context, const int64_
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_shell_center(qmckl_context context, const int64_t* shell_center) {
<<pre2>>
@ -504,11 +504,11 @@ qmckl_exit_code qmckl_set_ao_basis_shell_center(qmckl_context context, const in
"qmckl_set_ao_basis_shell_center",
"shell_num is not set");
}
if (ctx->ao_basis.shell_center != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.shell_center);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_shell_center",
NULL);
}
@ -526,13 +526,13 @@ qmckl_exit_code qmckl_set_ao_basis_shell_center(qmckl_context context, const in
}
memcpy(new_array, shell_center, mem_info.size);
ctx->ao_basis.shell_center = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_shell_ang_mom(qmckl_context context, const char* shell_ang_mom) {
<<pre2>>
@ -545,17 +545,17 @@ qmckl_exit_code qmckl_set_ao_basis_shell_ang_mom(qmckl_context context, const c
"qmckl_set_ao_basis_shell_ang_mom",
"shell_num is not set");
}
if (ctx->ao_basis.shell_ang_mom != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.shell_ang_mom);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_shell_ang_mom",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = shell_num * sizeof(char);
char* new_array = (char*) qmckl_malloc(context, mem_info);
@ -568,12 +568,12 @@ qmckl_exit_code qmckl_set_ao_basis_shell_ang_mom(qmckl_context context, const c
}
memcpy(new_array, shell_ang_mom, mem_info.size);
ctx->ao_basis.shell_ang_mom = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_shell_prim_num(qmckl_context context, const int64_t* shell_prim_num) {
<<pre2>>
@ -587,17 +587,17 @@ qmckl_exit_code qmckl_set_ao_basis_shell_prim_num(qmckl_context context, const
"qmckl_set_ao_basis_shell_prim_num",
"shell_num is not set");
}
if (ctx->ao_basis.shell_prim_num != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.shell_prim_num);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_shell_prim_num",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = shell_num * sizeof(int64_t);
int64_t* new_array = (int64_t*) qmckl_malloc(context, mem_info);
@ -610,13 +610,13 @@ qmckl_exit_code qmckl_set_ao_basis_shell_prim_num(qmckl_context context, const
}
memcpy(new_array, shell_prim_num, mem_info.size);
ctx->ao_basis.shell_prim_num = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_shell_prim_index(qmckl_context context, const int64_t* shell_prim_index) {
<<pre2>>
@ -629,16 +629,16 @@ qmckl_exit_code qmckl_set_ao_basis_shell_prim_index(qmckl_context context, cons
"qmckl_set_ao_basis_shell_prim_index",
"shell_num is not set");
}
if (ctx->ao_basis.shell_prim_index != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.shell_prim_index);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_shell_prim_index",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = shell_num * sizeof(int64_t);
int64_t* new_array = (int64_t*) qmckl_malloc(context, mem_info);
@ -651,13 +651,13 @@ qmckl_exit_code qmckl_set_ao_basis_shell_prim_index(qmckl_context context, cons
}
memcpy(new_array, shell_prim_index, mem_info.size);
ctx->ao_basis.shell_prim_index = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_shell_factor(qmckl_context context, const double* shell_factor) {
<<pre2>>
@ -670,17 +670,17 @@ qmckl_exit_code qmckl_set_ao_basis_shell_factor(qmckl_context context, const do
"qmckl_set_ao_basis_shell_factor",
"shell_num is not set");
}
if (ctx->ao_basis.shell_factor != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.shell_factor);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_shell_factor",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = shell_num * sizeof(double);
double* new_array = (double*) qmckl_malloc(context, mem_info);
@ -693,12 +693,12 @@ qmckl_exit_code qmckl_set_ao_basis_shell_factor(qmckl_context context, const do
}
memcpy(new_array, shell_factor, mem_info.size);
ctx->ao_basis.shell_factor = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_exponent(qmckl_context context, const double* exponent) {
<<pre2>>
@ -711,16 +711,16 @@ qmckl_exit_code qmckl_set_ao_basis_exponent(qmckl_context context, const double
"qmckl_set_ao_basis_exponent",
"prim_num is not set");
}
if (ctx->ao_basis.exponent != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.exponent);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_exponent",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = prim_num * sizeof(double);
double* new_array = (double*) qmckl_malloc(context, mem_info);
@ -733,12 +733,12 @@ qmckl_exit_code qmckl_set_ao_basis_exponent(qmckl_context context, const double
}
memcpy(new_array, exponent, mem_info.size);
ctx->ao_basis.exponent = new_array;
<<post2>>
}
qmckl_exit_code qmckl_set_ao_basis_coefficient(qmckl_context context, const double* coefficient) {
<<pre2>>
@ -751,16 +751,16 @@ qmckl_exit_code qmckl_set_ao_basis_coefficient(qmckl_context context, const dou
"qmckl_set_ao_basis_coefficient",
"prim_num is not set");
}
if (ctx->ao_basis.coefficient != NULL) {
qmckl_exit_code rc = qmckl_free(context, ctx->ao_basis.coefficient);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc,
return qmckl_failwith( context, rc,
"qmckl_set_ao_basis_coefficient",
NULL);
}
}
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = prim_num * sizeof(double);
double* new_array = (double*) qmckl_malloc(context, mem_info);
@ -773,12 +773,12 @@ qmckl_exit_code qmckl_set_ao_basis_coefficient(qmckl_context context, const dou
}
memcpy(new_array, coefficient, mem_info.size);
ctx->ao_basis.coefficient = new_array;
<<post2>>
}
#+end_src
** TODO Fortran interfaces
@ -817,7 +817,7 @@ double coefficient [prim_num] =
1.0, 1.0, 1.0, 1.0, 1.0, 0.006068, 0.045308, 0.202822,
0.503903, 0.383421, 1.0, 1.0, 1.0, 1.0, 1.0 };
/* --- */
qmckl_exit_code rc;
munit_assert(!qmckl_ao_basis_provided(context));
@ -875,11 +875,11 @@ munit_assert(qmckl_ao_basis_provided(context));
:CRetType: qmckl_exit_code
:FRetType: qmckl_exit_code
:END:
The ~qmckl_ao_power~ function computes all the powers of the ~n~
input data up to the given maximum value given in input for each of
the $n$ points:
\[ P_{ik} = X_i^k \]
#+NAME: qmckl_ao_power_args
@ -911,12 +911,12 @@ munit_assert(qmckl_ao_basis_provided(context));
const double* X,
const int32_t* LMAX,
double* const P,
const int64_t ldp );
const int64_t ldp );
#+end_src
*** Source
#+begin_src f90 :tangle (eval f)
#+begin_src f90 :tangle (eval f)
integer function qmckl_ao_power_f(context, n, X, LMAX, P, ldp) result(info)
use qmckl
implicit none
@ -955,12 +955,12 @@ integer function qmckl_ao_power_f(context, n, X, LMAX, P, ldp) result(info)
do i=1,n
P(1,i) = X(i)
do k=2,LMAX(i)
P(k,i) = P(k-1,i) * X(i)
P(k,i) = P(k-1,i) * X(i)
end do
end do
end function qmckl_ao_power_f
#+end_src
#+end_src
*** C interface
#+CALL: generate_c_interface(table=qmckl_ao_power_args,rettyp=get_value("CRetType"),fname="qmckl_ao_power")
@ -1015,15 +1015,15 @@ end function qmckl_ao_power_f
*** Test
#+begin_src f90 :tangle (eval f_test)
#+begin_src f90 :tangle (eval f_test)
integer(c_int32_t) function test_qmckl_ao_power(context) bind(C)
use qmckl
implicit none
integer(qmckl_context), intent(in), value :: context
integer*8 :: n, LDP
integer, allocatable :: LMAX(:)
integer*8 :: n, LDP
integer, allocatable :: LMAX(:)
double precision, allocatable :: X(:), P(:,:)
integer*8 :: i,j
double precision :: epsilon
@ -1040,7 +1040,7 @@ integer(c_int32_t) function test_qmckl_ao_power(context) bind(C)
LMAX(j) = 1 + int(mod(j, 5),4)
end do
test_qmckl_ao_power = qmckl_ao_power(context, n, X, LMAX, P, LDP)
test_qmckl_ao_power = qmckl_ao_power(context, n, X, LMAX, P, LDP)
if (test_qmckl_ao_power /= QMCKL_SUCCESS) return
test_qmckl_ao_power = QMCKL_FAILURE
@ -1073,29 +1073,29 @@ munit_assert_int(0, ==, test_qmckl_ao_power(context));
:END:
A polynomial is centered on a nucleus $\mathbf{R}_i$
\[
P_l(\mathbf{r},\mathbf{R}_i) = (x-X_i)^a (y-Y_i)^b (z-Z_i)^c
P_l(\mathbf{r},\mathbf{R}_i) = (x-X_i)^a (y-Y_i)^b (z-Z_i)^c
\]
The gradients with respect to electron coordinates are
\begin{eqnarray*}
\begin{eqnarray*}
\frac{\partial }{\partial x} P_l\left(\mathbf{r},\mathbf{R}_i \right) &
= & a (x-X_i)^{a-1} (y-Y_i)^b (z-Z_i)^c \\
\frac{\partial }{\partial y} P_l\left(\mathbf{r},\mathbf{R}_i \right) &
= & b (x-X_i)^a (y-Y_i)^{b-1} (z-Z_i)^c \\
\frac{\partial }{\partial z} P_l\left(\mathbf{r},\mathbf{R}_i \right) &
= & c (x-X_i)^a (y-Y_i)^b (z-Z_i)^{c-1} \\
\end{eqnarray*}
\end{eqnarray*}
and the Laplacian is
\begin{eqnarray*}
\left( \frac{\partial }{\partial x^2} +
\frac{\partial }{\partial y^2} +
\begin{eqnarray*}
\left( \frac{\partial }{\partial x^2} +
\frac{\partial }{\partial y^2} +
\frac{\partial }{\partial z^2} \right) P_l
\left(\mathbf{r},\mathbf{R}_i \right) & = &
\left(\mathbf{r},\mathbf{R}_i \right) & = &
a(a-1) (x-X_i)^{a-2} (y-Y_i)^b (z-Z_i)^c + \\
&& b(b-1) (x-X_i)^a (y-Y_i)^{b-1} (z-Z_i)^c + \\
&& c(c-1) (x-X_i)^a (y-Y_i)^b (z-Z_i)^{c-1}.
@ -1115,7 +1115,7 @@ munit_assert_int(0, ==, test_qmckl_ao_power(context));
| int64_t | ldl | in | Leading dimension of ~L~ |
| double | VGL[n][ldv] | out | Value, gradients and Laplacian of the polynomials |
| int64_t | ldv | in | Leading dimension of array ~VGL~ |
*** Requirements
- ~context~ is not ~QMCKL_NULL_CONTEXT~
@ -1150,7 +1150,7 @@ munit_assert_int(0, ==, test_qmckl_ao_power(context));
int32_t* const L,
const int64_t ldl,
double* const VGL,
const int64_t ldv );
const int64_t ldv );
#+end_src
*** Source
@ -1212,9 +1212,9 @@ integer function qmckl_ao_polynomial_vgl_f(context, X, R, lmax, n, L, ldl, VGL,
else if (lmax > 0) then
pows(-2:0,1:3) = 1.d0
do i=1,lmax
pows(i,1) = pows(i-1,1) * Y(1)
pows(i,2) = pows(i-1,2) * Y(2)
pows(i,3) = pows(i-1,3) * Y(3)
pows(i,1) = pows(i-1,1) * Y(1)
pows(i,2) = pows(i-1,2) * Y(2)
pows(i,3) = pows(i-1,3) * Y(3)
end do
VGL(1:5,1:4) = 0.d0
@ -1282,8 +1282,8 @@ integer function qmckl_ao_polynomial_vgl_f(context, X, R, lmax, n, L, ldl, VGL,
info = QMCKL_SUCCESS
end function qmckl_ao_polynomial_vgl_f
#+end_src
#+end_src
*** C interface
#+CALL: generate_c_interface(table=qmckl_ao_polynomial_vgl_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
@ -1341,7 +1341,7 @@ end function qmckl_ao_polynomial_vgl_f
end function qmckl_ao_polynomial_vgl
end interface
#+end_src
*** Test
#+begin_src f90 :tangle (eval f_test)
@ -1419,13 +1419,13 @@ integer(c_int32_t) function test_qmckl_ao_polynomial_vgl(context) bind(C)
test_qmckl_ao_polynomial_vgl = QMCKL_FAILURE
w = 0.d0
if (L(1,j) > 1) then
w = w + L(1,j) * (L(1,j)-1) * Y(1)**(L(1,j)-2) * Y(2)**L(2,j) * Y(3)**L(3,j)
w = w + L(1,j) * (L(1,j)-1) * Y(1)**(L(1,j)-2) * Y(2)**L(2,j) * Y(3)**L(3,j)
end if
if (L(2,j) > 1) then
w = w + L(2,j) * (L(2,j)-1) * Y(1)**L(1,j) * Y(2)**(L(2,j)-2) * Y(3)**L(3,j)
w = w + L(2,j) * (L(2,j)-1) * Y(1)**L(1,j) * Y(2)**(L(2,j)-2) * Y(3)**L(3,j)
end if
if (L(3,j) > 1) then
w = w + L(3,j) * (L(3,j)-1) * Y(1)**L(1,j) * Y(2)**L(2,j) * Y(3)**(L(3,j)-2)
w = w + L(3,j) * (L(3,j)-1) * Y(1)**L(1,j) * Y(2)**L(2,j) * Y(3)**(L(3,j)-2)
end if
if (dabs(1.d0 - VGL(5,j) / w) > epsilon ) return
end do
@ -1440,14 +1440,14 @@ end function test_qmckl_ao_polynomial_vgl
int test_qmckl_ao_polynomial_vgl(qmckl_context context);
munit_assert_int(0, ==, test_qmckl_ao_polynomial_vgl(context));
#+end_src
* Radial part
** Gaussian basis functions
~qmckl_ao_gaussian_vgl~ computes the values, gradients and
Laplacians at a given point of ~n~ Gaussian functions centered at
the same point:
\[ v_i = \exp(-a_i |X-R|^2) \]
\[ \nabla_x v_i = -2 a_i (X_x - R_x) v_i \]
\[ \nabla_y v_i = -2 a_i (X_y - R_y) v_i \]
@ -1461,7 +1461,7 @@ munit_assert_int(0, ==, test_qmckl_ao_polynomial_vgl(context));
| ~A(n)~ | input | Exponents of the Gaussians |
| ~VGL(ldv,5)~ | output | Value, gradients and Laplacian of the Gaussians |
| ~ldv~ | input | Leading dimension of array ~VGL~ |
Requirements
- ~context~ is not 0
@ -1483,7 +1483,7 @@ qmckl_ao_gaussian_vgl(const qmckl_context context,
const double *VGL,
const int64_t ldv);
#+end_src
#+begin_src f90 :tangle (eval f)
integer function qmckl_ao_gaussian_vgl_f(context, X, R, n, A, VGL, ldv) result(info)
use qmckl
@ -1497,30 +1497,30 @@ integer function qmckl_ao_gaussian_vgl_f(context, X, R, n, A, VGL, ldv) result(i
integer*8 :: i,j
real*8 :: Y(3), r2, t, u, v
info = QMCKL_SUCCESS
if (context == QMCKL_NULL_CONTEXT) then
info = QMCKL_INVALID_CONTEXT
return
endif
if (n <= 0) then
info = QMCKL_INVALID_ARG_4
return
endif
if (ldv < n) then
info = QMCKL_INVALID_ARG_7
return
endif
do i=1,3
Y(i) = X(i) - R(i)
end do
r2 = Y(1)*Y(1) + Y(2)*Y(2) + Y(3)*Y(3)
do i=1,n
VGL(i,1) = dexp(-A(i) * r2)
end do
@ -1545,7 +1545,7 @@ integer function qmckl_ao_gaussian_vgl_f(context, X, R, n, A, VGL, ldv) result(i
end do
end function qmckl_ao_gaussian_vgl_f
#+end_src
#+end_src
#+begin_src f90 :tangle (eval f) :exports none
integer(c_int32_t) function qmckl_ao_gaussian_vgl(context, X, R, n, A, VGL, ldv) &
@ -1560,14 +1560,14 @@ integer(c_int32_t) function qmckl_ao_gaussian_vgl(context, X, R, n, A, VGL, ldv)
integer (c_int64_t) , intent(in) , value :: ldv
integer, external :: qmckl_ao_gaussian_vgl_f
info = qmckl_ao_gaussian_vgl_f(context, X, R, n, A, VGL, ldv)
info = qmckl_ao_gaussian_vgl_f(context, X, R, n, A, VGL, ldv)
end function qmckl_ao_gaussian_vgl
#+end_src
#+begin_src f90 :tangle (eval fh_func) :exports none
interface
integer(c_int32_t) function qmckl_ao_gaussian_vgl(context, X, R, n, A, VGL, ldv) &
bind(C)
bind(C)
use, intrinsic :: iso_c_binding
integer (c_int64_t) , intent(in) , value :: context
integer (c_int64_t) , intent(in) , value :: ldv
@ -1585,7 +1585,7 @@ integer(c_int32_t) function test_qmckl_ao_gaussian_vgl(context) bind(C)
implicit none
integer(c_int64_t), intent(in), value :: context
integer*8 :: n, ldv, j, i
double precision :: X(3), R(3), Y(3), r2
double precision, allocatable :: VGL(:,:), A(:)
@ -1618,22 +1618,22 @@ integer(c_int32_t) function test_qmckl_ao_gaussian_vgl(context) bind(C)
if (dabs(1.d0 - VGL(i,1) / (&
dexp(-A(i) * r2) &
)) > epsilon ) return
test_qmckl_ao_gaussian_vgl = -12
if (dabs(1.d0 - VGL(i,2) / (&
-2.d0 * A(i) * Y(1) * dexp(-A(i) * r2) &
)) > epsilon ) return
test_qmckl_ao_gaussian_vgl = -13
if (dabs(1.d0 - VGL(i,3) / (&
-2.d0 * A(i) * Y(2) * dexp(-A(i) * r2) &
)) > epsilon ) return
test_qmckl_ao_gaussian_vgl = -14
if (dabs(1.d0 - VGL(i,4) / (&
-2.d0 * A(i) * Y(3) * dexp(-A(i) * r2) &
)) > epsilon ) return
test_qmckl_ao_gaussian_vgl = -15
if (dabs(1.d0 - VGL(i,5) / (&
A(i) * (4.d0*r2*A(i) - 6.d0) * dexp(-A(i) * r2) &
@ -1641,7 +1641,7 @@ integer(c_int32_t) function test_qmckl_ao_gaussian_vgl(context) bind(C)
end do
test_qmckl_ao_gaussian_vgl = 0
deallocate(VGL)
end function test_qmckl_ao_gaussian_vgl
#+end_src
@ -1650,13 +1650,13 @@ end function test_qmckl_ao_gaussian_vgl
int test_qmckl_ao_gaussian_vgl(qmckl_context context);
munit_assert_int(0, ==, test_qmckl_ao_gaussian_vgl(context));
#+end_src
** TODO Slater basis functions
** TODO Radial functions on a grid
* Combining radial and polynomial parts
* End of files :noexport:
#+begin_src c :tangle (eval h_private_type)
#endif
#+end_src
@ -1668,35 +1668,35 @@ munit_assert_int(0, ==, test_qmckl_ao_gaussian_vgl(context));
return MUNIT_OK;
}
#+end_src
**✸ Compute file names
#+begin_src emacs-lisp
; The following is required to compute the file names
(setq pwd (file-name-directory buffer-file-name))
(setq name (file-name-nondirectory (substring buffer-file-name 0 -4)))
(setq f (concat pwd name "_f.f90"))
(setq fh (concat pwd name "_fh.f90"))
(setq c (concat pwd name ".c"))
(setq h (concat name ".h"))
(setq h_private (concat name "_private.h"))
(setq c_test (concat pwd "test_" name ".c"))
(setq f_test (concat pwd "test_" name "_f.f90"))
; Minted
(require 'ox-latex)
(setq org-latex-listings 'minted)
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
#+end_src
**✸ Compute file names
#+begin_src emacs-lisp
; The following is required to compute the file names
(setq pwd (file-name-directory buffer-file-name))
(setq name (file-name-nondirectory (substring buffer-file-name 0 -4)))
(setq f (concat pwd name "_f.f90"))
(setq fh (concat pwd name "_fh.f90"))
(setq c (concat pwd name ".c"))
(setq h (concat name ".h"))
(setq h_private (concat name "_private.h"))
(setq c_test (concat pwd "test_" name ".c"))
(setq f_test (concat pwd "test_" name "_f.f90"))
; Minted
(require 'ox-latex)
(setq org-latex-listings 'minted)
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
#+end_src
#+RESULTS:
| | color |
| | listings |
# -*- mode: org -*-
# vim: syntax=c

View File

@ -1,6 +1,6 @@
#+TITLE: Context
#+SETUPFILE: ../docs/theme.setup
#+INCLUDE: ../tools/lib.org
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
* Headers :noexport:
@ -24,7 +24,7 @@ MunitResult test_<<filename()>>() {
#include "qmckl_ao_private_type.h"
#+end_src
#+begin_src c :tangle (eval c)
#+begin_src c :tangle (eval c)
#include <stdint.h>
#include <assert.h>
#include <math.h>
@ -63,7 +63,7 @@ typedef int64_t qmckl_context ;
integer , parameter :: qmckl_context = c_int64_t
integer*8, parameter :: QMCKL_NULL_CONTEXT = 0
#+end_src
An immutable context would have required to implement a garbage
collector. To keep the library simple, we have chosen to implement
the context as a mutable data structure, so it has to be handled
@ -73,7 +73,7 @@ typedef int64_t qmckl_context ;
and ~ctx~ is a ~qmckl_context_struct*~ pointer.
** Data structure
#+begin_src c :comments org :tangle (eval h_private_type) :noweb yes :exports none
typedef struct qmckl_context_struct {
/* -- State of the library -- */
@ -113,11 +113,11 @@ typedef struct qmckl_context_struct {
The context keeps a ``date'' that allows to check which data needs
to be recomputed. The date is incremented when the electron
coordinates are updated.
When a new element is added to the context, the functions
[[Creation][qmckl_context_create]], [[Destroy][qmckl_context_destroy]] and [[Copy][qmckl_context_copy]]
should be updated inorder to make deep copies.
A tag is used internally to check if the memory domain pointed
by a pointer is a valid context. This allows to check that even if
@ -155,7 +155,7 @@ qmckl_context qmckl_context_check(const qmckl_context context) {
#+end_src
** Creation
To create a new context, ~qmckl_context_create()~ should be used.
- Upon success, it returns a pointer to a new context with the ~qmckl_context~ type
- It returns ~QMCKL_NULL_CONTEXT~ upon failure to allocate the internal data structure
@ -185,17 +185,17 @@ qmckl_context qmckl_context_create() {
{
pthread_mutexattr_t attr;
int rc;
rc = pthread_mutexattr_init(&attr);
rc = pthread_mutexattr_init(&attr);
assert (rc == 0);
(void) pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
rc = pthread_mutex_init ( &(ctx->mutex), &attr);
assert (rc == 0);
(void) pthread_mutexattr_destroy(&attr);
}
}
/* Initialize data */
ctx->tag = VALID_TAG;
@ -215,15 +215,15 @@ qmckl_context qmckl_context_create() {
qmckl_memory_info_struct * new_array = calloc(size, sizeof(qmckl_memory_info_struct));
if (new_array == NULL) {
free(ctx);
return QMCKL_NULL_CONTEXT;
return QMCKL_NULL_CONTEXT;
}
memset( &(new_array[0]), 0, size * sizeof(qmckl_memory_info_struct) );
ctx->memory.element = new_array;
ctx->memory.array_size = size;
ctx->memory.n_allocated = (size_t) 0;
}
return (qmckl_context) ctx;
}
#+end_src
@ -304,7 +304,7 @@ void qmckl_unlock(const qmckl_context context) {
qmckl_context qmckl_context_copy(const qmckl_context context);
#+end_src
# Source
#+begin_src c :tangle (eval c)
qmckl_context qmckl_context_copy(const qmckl_context context) {
@ -318,24 +318,24 @@ qmckl_context qmckl_context_copy(const qmckl_context context) {
/*
qmckl_lock(context);
{
const qmckl_context_struct* const old_ctx =
(qmckl_context_struct* const) checked_context;
qmckl_context_struct* const new_ctx =
(qmckl_context_struct* const) malloc (context, sizeof(qmckl_context_struct));
if (new_ctx == NULL) {
qmckl_unlock(context);
return QMCKL_NULL_CONTEXT;
}
* Copy the old context on the new one *
* TODO Deep copies should be done here *
* Copy the old context on the new one *
* TODO Deep copies should be done here *
memcpy(new_ctx, old_ctx, sizeof(qmckl_context_struct));
qmckl_unlock( (qmckl_context) new_ctx );
return (qmckl_context) new_ctx;
}
qmckl_unlock(context);
@ -456,4 +456,4 @@ return MUNIT_OK;
}
#+end_src

View File

@ -1,11 +1,11 @@
#+TITLE: Inter-particle distances
#+SETUPFILE: ../docs/theme.setup
#+INCLUDE: ../tools/lib.org
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
Functions for the computation of distances between particles.
* Headers :noexport:
#+begin_src elisp :noexport :results none
#+begin_src elisp :noexport :results none
(org-babel-lob-ingest "../tools/lib.org")
#+end_src
@ -56,11 +56,11 @@ MunitResult test_<<filename()>>() {
- ~lda >= m~ if ~transa == 'T'~
- ~ldb >= 3~ if ~transb == 'N'~
- ~ldb >= n~ if ~transb == 'T'~
- ~ldc >= m~
- ~ldc >= m~
- ~A~ is allocated with at least $3 \times m \times 8$ bytes
- ~B~ is allocated with at least $3 \times n \times 8$ bytes
- ~C~ is allocated with at least $m \times n \times 8$ bytes
*** C header
#+CALL: generate_c_header(table=qmckl_distance_sq_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
@ -78,7 +78,7 @@ MunitResult test_<<filename()>>() {
const double* B,
const int64_t ldb,
double* const C,
const int64_t ldc );
const int64_t ldc );
#+end_src
*** Source
@ -137,7 +137,7 @@ integer function qmckl_distance_sq_f(context, transa, transb, m, n, &
if (transab < 0) then
info = QMCKL_INVALID_ARG_1
return
return
endif
if (iand(transab,1) == 0 .and. LDA < 3) then
@ -211,8 +211,8 @@ integer function qmckl_distance_sq_f(context, transa, transb, m, n, &
end function qmckl_distance_sq_f
#+end_src
*** Performance
*** Performance
This function might be more efficient when ~A~ and ~B~ are
transposed.
@ -220,7 +220,7 @@ end function qmckl_distance_sq_f
** C interface :noexport:
#+CALL: generate_c_interface(table=qmckl_distance_sq_args,rettyp=get_value("FRetType"),fname=get_value("Name"))
#+RESULTS:
#+begin_src f90 :tangle (eval f) :comments org :exports none
integer(c_int32_t) function qmckl_distance_sq &
@ -287,7 +287,7 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
double precision, allocatable :: A(:,:), B(:,:), C(:,:)
integer*8 :: m, n, LDA, LDB, LDC
double precision :: x
integer*8 :: i,j
integer*8 :: i,j
m = 5
n = 6
@ -311,17 +311,17 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 'X', 't', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq == 0) return
if (test_qmckl_distance_sq == 0) return
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 't', 'X', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq == 0) return
if (test_qmckl_distance_sq == 0) return
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 'T', 't', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq /= 0) return
if (test_qmckl_distance_sq /= 0) return
test_qmckl_distance_sq = -1
@ -337,7 +337,7 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 'n', 'T', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq /= 0) return
if (test_qmckl_distance_sq /= 0) return
test_qmckl_distance_sq = -1
@ -353,7 +353,7 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 'T', 'n', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq /= 0) return
if (test_qmckl_distance_sq /= 0) return
test_qmckl_distance_sq = -1
@ -369,7 +369,7 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
test_qmckl_distance_sq = &
qmckl_distance_sq(context, 'n', 'N', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_distance_sq /= 0) return
if (test_qmckl_distance_sq /= 0) return
test_qmckl_distance_sq = -1
@ -387,7 +387,7 @@ integer(qmckl_exit_code) function test_qmckl_distance_sq(context) bind(C)
deallocate(A,B,C)
end function test_qmckl_distance_sq
#+end_src
#+begin_src c :comments link :tangle (eval c_test)
int test_qmckl_distance_sq(qmckl_context context);
munit_assert_int(0, ==, test_qmckl_distance_sq(context));
@ -430,11 +430,11 @@ munit_assert_int(0, ==, test_qmckl_distance_sq(context));
- ~lda >= m~ if ~transa == 'T'~
- ~ldb >= 3~ if ~transb == 'N'~
- ~ldb >= n~ if ~transb == 'T'~
- ~ldc >= m~
- ~ldc >= m~
- ~A~ is allocated with at least $3 \times m \times 8$ bytes
- ~B~ is allocated with at least $3 \times n \times 8$ bytes
- ~C~ is allocated with at least $m \times n \times 8$ bytes
*** C header
#+CALL: generate_c_header(table=qmckl_distance_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
@ -452,7 +452,7 @@ munit_assert_int(0, ==, test_qmckl_distance_sq(context));
const double* B,
const int64_t ldb,
double* const C,
const int64_t ldc );
const int64_t ldc );
#+end_src
*** Source
@ -511,7 +511,7 @@ integer function qmckl_distance_f(context, transa, transb, m, n, &
if (transab < 0) then
info = QMCKL_INVALID_ARG_1
return
return
endif
if (iand(transab,1) == 0 .and. LDA < 3) then
@ -589,8 +589,8 @@ integer function qmckl_distance_f(context, transa, transb, m, n, &
end function qmckl_distance_f
#+end_src
*** Performance
*** Performance
This function might be more efficient when ~A~ and ~B~ are
transposed.
@ -598,7 +598,7 @@ end function qmckl_distance_f
** C interface :noexport:
#+CALL: generate_c_interface(table=qmckl_distance_args,rettyp=get_value("FRetType"),fname=get_value("Name"))
#+RESULTS:
#+begin_src f90 :tangle (eval f) :comments org :exports none
integer(c_int32_t) function qmckl_distance &
@ -665,7 +665,7 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
double precision, allocatable :: A(:,:), B(:,:), C(:,:)
integer*8 :: m, n, LDA, LDB, LDC
double precision :: x
integer*8 :: i,j
integer*8 :: i,j
m = 5
n = 6
@ -689,17 +689,17 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
test_qmckl_dist = &
qmckl_distance(context, 'X', 't', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist == 0) return
if (test_qmckl_dist == 0) return
test_qmckl_dist = &
qmckl_distance(context, 't', 'X', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist == 0) return
if (test_qmckl_dist == 0) return
test_qmckl_dist = &
qmckl_distance(context, 'T', 't', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist /= 0) return
if (test_qmckl_dist /= 0) return
test_qmckl_dist = -1
@ -715,7 +715,7 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
test_qmckl_dist = &
qmckl_distance(context, 'n', 'T', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist /= 0) return
if (test_qmckl_dist /= 0) return
test_qmckl_dist = -1
@ -731,7 +731,7 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
test_qmckl_dist = &
qmckl_distance(context, 'T', 'n', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist /= 0) return
if (test_qmckl_dist /= 0) return
test_qmckl_dist = -1
@ -747,7 +747,7 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
test_qmckl_dist = &
qmckl_distance(context, 'n', 'N', m, n, A, LDA, B, LDB, C, LDC)
if (test_qmckl_dist /= 0) return
if (test_qmckl_dist /= 0) return
test_qmckl_dist = -1
@ -765,7 +765,7 @@ integer(qmckl_exit_code) function test_qmckl_dist(context) bind(C)
deallocate(A,B,C)
end function test_qmckl_dist
#+end_src
#+begin_src c :comments link :tangle (eval c_test)
int test_qmckl_dist(qmckl_context context);
munit_assert_int(0, ==, test_qmckl_dist(context));
@ -779,7 +779,7 @@ munit_assert_int(0, ==, test_qmckl_dist(context));
}
#+end_src
# -*- mode: org -*-
# vim: syntax=c

View File

@ -1,5 +1,5 @@
#+TITLE: Electrons
#+SETUPFILE: ../docs/theme.setup
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
In conventional QMC simulations, up-spin and down-spin electrons are
@ -7,7 +7,7 @@ different. The ~electron~ data structure contains the number of
up-spin and down-spin electrons, and the electron coordinates.
* Headers :noexport:
#+begin_src elisp :noexport :results none
#+begin_src elisp :noexport :results none
(org-babel-lob-ingest "../tools/lib.org")
#+end_src
@ -51,7 +51,7 @@ MunitResult test_<<filename()>>() {
* Context
The following data stored in the context:
| ~uninitialized~ | int32_t | Keeps bit set for uninitialized data |
| ~num~ | int64_t | Total number of electrons |
| ~up_num~ | int64_t | Number of up-spin electrons |
@ -86,7 +86,7 @@ typedef struct qmckl_electron_struct {
initialization function which has not bee called. It becomes equal
to zero after all initialization functions have been called. The
struct is then initialized and ~provided == true~.
** Access functions
#+begin_src c :comments org :tangle (eval h_private_func) :exports none
@ -111,7 +111,7 @@ if ( (ctx->electron.uninitialized & mask) != 0) {
return NULL;
}
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
int64_t qmckl_get_electron_num (const qmckl_context context) {
@ -203,13 +203,13 @@ bool qmckl_electron_provided(const qmckl_context context) {
return ctx->electron.provided;
}
#+end_src
** Initialization functions
To set the data relative to the electrons in the context, the
following functions need to be called. When the data structure is
initialized, the ~coord_new~ and ~coord_old~ arrays are both allocated.
#+begin_src c :comments org :tangle (eval h_func)
qmckl_exit_code qmckl_set_electron_num (qmckl_context context, const int64_t up_num, const int64_t down_num);
qmckl_exit_code qmckl_set_electron_walk_num (qmckl_context context, const int64_t walk_num);
@ -227,7 +227,7 @@ qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
#+NAME:post2
#+begin_src c :exports none
ctx->electron.uninitialized &= ~mask;
ctx->electron.uninitialized &= ~mask;
ctx->electron.provided = (ctx->electron.uninitialized == 0);
if (ctx->electron.provided) {
@ -265,11 +265,11 @@ if (ctx->electron.provided) {
return QMCKL_SUCCESS;
#+end_src
To set the number of electrons, we give the number of up-spin and
down-spin electrons to the context and we set the number of walkers.
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_set_electron_num(qmckl_context context,
const int64_t up_num,
const int64_t down_num) {
@ -298,9 +298,9 @@ qmckl_exit_code qmckl_set_electron_num(qmckl_context context,
<<post2>>
}
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_set_electron_walk_num(qmckl_context context, const int64_t walk_num) {
<<pre2>>
@ -317,14 +317,14 @@ qmckl_exit_code qmckl_set_electron_walk_num(qmckl_context context, const int64_t
<<post2>>
}
#+end_src
The following function sets the electron coordinates of all the
walkers. When this is done, the pointers to the old and new sets
of coordinates are swapped, and the new coordinates are
overwritten. This can be done only when the data relative to
electrons have been set.
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_set_electron_coord(qmckl_context context, const double* coord) {
<<pre2>>
@ -336,7 +336,7 @@ qmckl_exit_code qmckl_set_electron_coord(qmckl_context context, const double* c
"qmckl_set_electron_coord",
"num is not set");
}
const int64_t walk_num = qmckl_get_electron_walk_num(context);
if (walk_num == 0L) {
return qmckl_failwith( context,
@ -344,11 +344,11 @@ qmckl_exit_code qmckl_set_electron_coord(qmckl_context context, const double* c
"qmckl_set_electron_coord",
"walk_num is not set");
}
/* If num and walk_num are set, the arrays should be allocated */
assert (ctx->electron.coord_old != NULL);
assert (ctx->electron.coord_new != NULL);
/* Increment the date of the context */
ctx->date += 1UL;
@ -357,12 +357,12 @@ qmckl_exit_code qmckl_set_electron_coord(qmckl_context context, const double* c
swap = ctx->electron.coord_old;
ctx->electron.coord_old = ctx->electron.coord_new;
ctx->electron.coord_new = swap;
memcpy(ctx->electron.coord_new, coord, walk_num * num * 3 * sizeof(double));
ctx->electron.coord_new_date = ctx->date;
return QMCKL_SUCCESS;
}
#+end_src
@ -377,7 +377,7 @@ qmckl_exit_code qmckl_set_electron_coord(qmckl_context context, const double* c
#define num (up_num+down_num)
double coord[walk_num*3*num] =
{ 7.303633091022677881e+00, 1.375868694453235719e+01, 1.167371490471771217e-01,
{ 7.303633091022677881e+00, 1.375868694453235719e+01, 1.167371490471771217e-01,
4.547755371567960836e+00, 3.245907105524011182e+00, 2.410764357550297110e-01,
5.932816068137344523e+00, 1.491671465549257469e+01, 3.825374039119375236e-01,
7.347336142660052083e+00, 1.341946976062362129e+00, 1.648917914228352322e+00,
@ -387,9 +387,9 @@ double coord[walk_num*3*num] =
1.484094322159507051e+01, 9.777903829455864226e+00, 5.243007994024882767e-02,
9.081723054990456845e+00, 5.499568496038920173e+00, 2.910446438899221347e-02,
2.583154239492383653e+00, 1.442282811294904432e+00, 6.387191629878670451e-02 };
/* --- */
qmckl_exit_code rc;
munit_assert(!qmckl_electron_provided(context));
@ -408,7 +408,7 @@ munit_assert_int64(rc, ==, QMCKL_SUCCESS);
#+end_src
* Computation
The computed data is stored in the context so that it can be reused
by different kernels. To ensure that the data is valid, for each
computed data the date of the context is stored when it is computed.
@ -416,16 +416,16 @@ munit_assert_int64(rc, ==, QMCKL_SUCCESS);
the dependencies are more recent than the date of the data to
compute. If it is the case, then the data is recomputed and the
current date is stored.
** Electron-electron distances
*** Get
#+begin_src c :comments org :tangle (eval h_func) :noweb yes
qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* distance);
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* distance)
{
/* Check input parameters */
@ -446,12 +446,12 @@ qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* di
}
#+end_src
*** Provide :noexport:
#+begin_src c :comments org :tangle (eval h_private_func) :noweb yes :exports none
#+begin_src c :comments org :tangle (eval h_private_func) :noweb yes :exports none
qmckl_exit_code qmckl_provide_ee_distance(qmckl_context context);
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
qmckl_exit_code qmckl_provide_ee_distance(qmckl_context context)
{
/* Check input parameters */
@ -462,19 +462,18 @@ qmckl_exit_code qmckl_provide_ee_distance(qmckl_context context)
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
assert (ctx != NULL);
/* Compute if necessary */
if (ctx->electron.coord_new_date > ctx->electron.ee_distance_date) {
fprintf(stderr, "%10ld: provide ee_distance", ctx->date);
/* Allocate array */
if (ctx->electron.ee_distance == NULL) {
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = ctx->electron.num * ctx->electron.num *
ctx->electron.walk_num * sizeof(double);
double* ee_distance = (double*) qmckl_malloc(context, mem_info);
if (ee_distance == NULL) {
return qmckl_failwith( context,
QMCKL_ALLOCATION_FAILED,
@ -486,7 +485,7 @@ qmckl_exit_code qmckl_provide_ee_distance(qmckl_context context)
qmckl_exit_code rc =
qmckl_compute_ee_distance(context,
ctx->electron.num,
ctx->electron.num,
ctx->electron.walk_num,
ctx->electron.coord_new,
ctx->electron.ee_distance);
@ -507,7 +506,7 @@ qmckl_exit_code qmckl_provide_ee_distance(qmckl_context context)
:CRetType: qmckl_exit_code
:FRetType: qmckl_exit_code
:END:
#+NAME: qmckl_ee_distance_args
| qmckl_context | context | in | Global state |
| int64_t | elec_num | in | Number of electrons |
@ -530,19 +529,19 @@ integer function qmckl_compute_ee_distance_f(context, elec_num, walk_num, coord,
info = QMCKL_SUCCESS
if (context == QMCKL_NULL_CONTEXT) then
info = QMCKL_INVALID_CONTEXT
return
if (context == QMCKL_NULL_CONTEXT) then
info = QMCKL_INVALID_CONTEXT
return
endif
if (elec_num <= 0) then
if (elec_num <= 0) then
info = QMCKL_INVALID_ARG_2
return
return
endif
if (walk_num <= 0) then
if (walk_num <= 0) then
info = QMCKL_INVALID_ARG_3
return
return
endif
!$OMP PARALLEL DO DEFAULT(NONE) &
@ -565,11 +564,11 @@ end function qmckl_compute_ee_distance_f
const int64_t elec_num,
const int64_t walk_num,
const double* coord,
double* const ee_distance );
double* const ee_distance );
#+end_src
#+CALL: generate_c_interface(table=qmckl_ee_distance_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
#+RESULTS:
#+begin_src f90 :tangle (eval f) :comments org :exports none
integer(c_int32_t) function qmckl_compute_ee_distance &
@ -609,7 +608,7 @@ munit_assert_double_equal(distance[1], 8.6114953086801, 12);
#+end_src
* End of files :noexport:
#+begin_src c :tangle (eval h_private_type)
#endif
#+end_src
@ -621,35 +620,35 @@ munit_assert_double_equal(distance[1], 8.6114953086801, 12);
return MUNIT_OK;
}
#+end_src
**✸ Compute file names
#+begin_src emacs-lisp
; The following is required to compute the file names
(setq pwd (file-name-directory buffer-file-name))
(setq name (file-name-nondirectory (substring buffer-file-name 0 -4)))
(setq f (concat pwd name "_f.f90"))
(setq fh (concat pwd name "_fh.f90"))
(setq c (concat pwd name ".c"))
(setq h (concat name ".h"))
(setq h_private (concat name "_private.h"))
(setq c_test (concat pwd "test_" name ".c"))
(setq f_test (concat pwd "test_" name "_f.f90"))
; Minted
(require 'ox-latex)
(setq org-latex-listings 'minted)
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
#+end_src
**✸ Compute file names
#+begin_src emacs-lisp
; The following is required to compute the file names
(setq pwd (file-name-directory buffer-file-name))
(setq name (file-name-nondirectory (substring buffer-file-name 0 -4)))
(setq f (concat pwd name "_f.f90"))
(setq fh (concat pwd name "_fh.f90"))
(setq c (concat pwd name ".c"))
(setq h (concat name ".h"))
(setq h_private (concat name "_private.h"))
(setq c_test (concat pwd "test_" name ".c"))
(setq f_test (concat pwd "test_" name "_f.f90"))
; Minted
(require 'ox-latex)
(setq org-latex-listings 'minted)
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
#+end_src
#+RESULTS:
| | color |
| | listings |
# -*- mode: org -*-
# vim: syntax=c

View File

@ -1,6 +1,6 @@
#+TITLE: Error handling
#+SETUPFILE: ../docs/theme.setup
#+INCLUDE: ../tools/lib.org
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
* Headers :noexport:
@ -32,7 +32,7 @@ MunitResult test_<<filename()>>() {
#+end_src
*
*
:PROPERTIES:
:UNNUMBERED: t
:END:
@ -40,7 +40,7 @@ MunitResult test_<<filename()>>() {
The library should never make the calling programs abort, nor
perform any input/output operations. This decision has to be taken
by the developer of the code calling the library.
All the functions return with an exit code, defined as
#+NAME: type-exit-code
#+begin_src c :comments org :tangle (eval h_type)
@ -82,20 +82,20 @@ typedef int32_t qmckl_exit_code;
| ~QMCKL_INVALID_EXIT_CODE~ | 106 | 'Invalid exit code' |
# We need to force Emacs not to indent the Python code:
# -*- org-src-preserve-indentation: t
# -*- org-src-preserve-indentation: t
#+begin_src python :var table=table-exit-codes :results drawer :exports none
""" This script generates the C and Fortran constants for the error
codes from the org-mode table.
"""
result = [ "#+begin_src c :comments org :tangle (eval h_type) :exports none" ]
result = [ "#+begin_src c :comments org :tangle (eval h_type) :exports none" ]
for (text, code,_) in table:
text=text.replace("~","")
result += [ f"#define {text:30s} ((qmckl_exit_code) {code:d})" ]
result += [ "#+end_src" ]
result += [ "" ]
result += [ "" ]
result += [ "#+begin_src f90 :comments org :tangle (eval fh_type) :exports none" ]
for (text, code,_) in table:
@ -157,7 +157,7 @@ return '\n'.join(result)
* Decoding errors
To decode the error messages, ~qmckl_string_of_error~ converts an
error code into a string.
error code into a string.
#+NAME: MAX_STRING_LENGTH
: 128
@ -167,7 +167,7 @@ const char* qmckl_string_of_error(const qmckl_exit_code error);
void qmckl_string_of_error_f(const qmckl_exit_code error,
char result[<<MAX_STRING_LENGTH()>>]);
#+end_src
The text strings are extracted from the previous table.
#+NAME:cases
@ -179,7 +179,7 @@ void qmckl_string_of_error_f(const qmckl_exit_code error,
result = []
for (text, code, message) in table:
text = text.replace("~","")
message = message.replace("'",'"')
message = message.replace("'",'"')
result += [ f"""case {text}:
return {message};
break;""" ]
@ -187,7 +187,7 @@ return '\n'.join(result)
#+end_src
# Source
# Source
#+begin_src c :comments org :tangle (eval c) :noweb yes
const char* qmckl_string_of_error(const qmckl_exit_code error) {
switch (error) {
@ -200,7 +200,7 @@ void qmckl_string_of_error_f(const qmckl_exit_code error, char result[<<MAX_STRI
strncpy(result, qmckl_string_of_error(error), <<MAX_STRING_LENGTH()>>);
}
#+end_src
# Fortran interface
#+begin_src f90 :tangle (eval fh_func) :noexport :noweb yes
interface
@ -232,7 +232,7 @@ typedef struct qmckl_error_struct {
#+end_src
* Updating errors in the context
The error is updated in the context using ~qmckl_set_error~.
When the error is set in the context, it is mandatory to specify
from which function the error is triggered, and a message
@ -271,13 +271,13 @@ qmckl_set_error(qmckl_context context,
{
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
assert (ctx != NULL); /* Impossible because the context is valid. */
ctx->error.exit_code = exit_code;
strncpy(ctx->error.function, function_name, QMCKL_MAX_FUN_LEN);
strncpy(ctx->error.message, message, QMCKL_MAX_MSG_LEN);
}
qmckl_unlock(context);
return QMCKL_SUCCESS;
}
#+end_src
@ -316,13 +316,13 @@ qmckl_exit_code qmckl_failwith(qmckl_context context,
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT)
return QMCKL_INVALID_CONTEXT;
if (message == NULL) {
qmckl_exit_code rc =
qmckl_exit_code rc =
qmckl_set_error(context, exit_code, function, qmckl_string_of_error(exit_code));
assert (rc == QMCKL_SUCCESS);
} else {
qmckl_exit_code rc =
qmckl_exit_code rc =
qmckl_set_error(context, exit_code, function, message);
assert (rc == QMCKL_SUCCESS);
}
@ -337,11 +337,11 @@ qmckl_exit_code qmckl_failwith(qmckl_context context,
if (x < 0) {
return qmckl_failwith(context,
QMCKL_INVALID_ARG_2,
"qmckl_function",
"qmckl_function",
"Expected x >= 0");
}
#+end_src
* End of files :noexport:

View File

@ -1,6 +1,6 @@
#+TITLE: Memory management
#+SETUPFILE: ../docs/theme.setup
#+INCLUDE: ../tools/lib.org
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
We override the allocation functions to enable the possibility of
optimized libraries to fine-tune the memory allocation.
@ -43,10 +43,10 @@ MunitResult test_<<filename()>>() {
#+end_src
* Memory data structure for the context
Every time a new block of memory is allocated, the information
relative to the allocation is stored in a new ~qmckl_memory_info_struct~.
A ~qmckl_memory_info_struct~ contains the pointer to the memory block,
A ~qmckl_memory_info_struct~ contains the pointer to the memory block,
its size in bytes, and extra implementation-specific information such as
alignment, pinning, if the memory should be allocated on CPU or GPU
/etc/.
@ -63,11 +63,11 @@ static const qmckl_memory_info_struct qmckl_memory_info_struct_zero =
.pointer = NULL
};
#+end_src
The ~memory~ element of the context is a data structure which
contains an array of ~qmckl_memory_info_struct~, the size of the
array, and the number of allocated blocks.
#+begin_src c :tangle (eval h_private_type) :noweb yes
typedef struct qmckl_memory_struct {
size_t n_allocated;
@ -80,7 +80,7 @@ typedef struct qmckl_memory_struct {
Passing information to the allocation routine should be done by
passing an instance of a ~qmckl_memory_info_struct~.
* Allocation/deallocation functions
Memory allocation inside the library should be done with
@ -97,7 +97,7 @@ typedef struct qmckl_memory_struct {
void* qmckl_malloc(qmckl_context context,
const qmckl_memory_info_struct info);
#+end_src
# Source
#+begin_src c :tangle (eval c)
void* qmckl_malloc(qmckl_context context, const qmckl_memory_info_struct info) {
@ -126,12 +126,12 @@ void* qmckl_malloc(qmckl_context context, const qmckl_memory_info_struct info) {
free(pointer);
return NULL;
}
memset( &(new_array[old_size]), 0, old_size * sizeof(qmckl_memory_info_struct) );
ctx->memory.element = new_array;
ctx->memory.array_size = 2L * old_size;
}
/* Find first NULL entry */
size_t pos = (size_t) 0;
while ( pos < ctx->memory.array_size && ctx->memory.element[pos].size > (size_t) 0) {
@ -145,7 +145,7 @@ void* qmckl_malloc(qmckl_context context, const qmckl_memory_info_struct info) {
ctx->memory.n_allocated += (size_t) 1;
}
qmckl_unlock(context);
return pointer;
}
#+end_src
@ -154,7 +154,7 @@ void* qmckl_malloc(qmckl_context context, const qmckl_memory_info_struct info) {
# Test :noexport:
#+begin_src c :tangle (eval c_test)
/* Create a context */
qmckl_context context = qmckl_context_create();
qmckl_context context = qmckl_context_create();
qmckl_memory_info_struct info = qmckl_memory_info_struct_zero;
info.size = (size_t) 3;
@ -197,14 +197,14 @@ qmckl_exit_code qmckl_free(qmckl_context context, void * const ptr) {
"qmckl_free",
NULL);
}
if (ptr == NULL) {
return qmckl_failwith(context,
QMCKL_INVALID_ARG_2,
"qmckl_free",
"NULL pointer");
}
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
qmckl_lock(context);
@ -214,7 +214,7 @@ qmckl_exit_code qmckl_free(qmckl_context context, void * const ptr) {
while ( pos < ctx->memory.array_size && ctx->memory.element[pos].pointer != ptr) {
pos += (size_t) 1;
}
if (pos >= ctx->memory.array_size) {
/* Not found */
qmckl_unlock(context);
@ -276,7 +276,7 @@ munit_assert(rc == QMCKL_SUCCESS);
}
#+end_src
# -*- mode: org -*-
# vim: syntax=c

View File

@ -1,6 +1,6 @@
#+TITLE: Numerical precision
#+SETUPFILE: ../docs/theme.setup
#+INCLUDE: ../tools/lib.org
#+SETUPFILE: ../tools/theme.setup
#+INCLUDE: ../tools/lib.org
* Headers :noexport:
@ -17,7 +17,7 @@ MunitResult test_<<filename()>>() {
#include <stdint.h>
#+end_src
#+begin_src c :tangle (eval c)
#+begin_src c :tangle (eval c)
#include <stdint.h>
#include <assert.h>
#include <math.h>
@ -92,7 +92,7 @@ typedef struct qmckl_numprec_struct {
uint32_t range;
} qmckl_numprec_struct;
#+end_src
The following functions set and get the required precision and
range. ~precision~ is an integer between 2 and 53, and ~range~ is an
integer between 2 and 11.
@ -180,7 +180,7 @@ int qmckl_get_numprec_precision(const qmckl_context context) {
return ctx->numprec.precision;
}
#+end_src
# Fortran interface
#+begin_src f90 :tangle (eval fh_func)
interface
@ -193,7 +193,7 @@ int qmckl_get_numprec_precision(const qmckl_context context) {
#+end_src
* Range
~qmckl_set_numprec_range~ modifies the parameter for the numerical
range in a given context.

View File

@ -1,5 +1,5 @@
#+TITLE: Testing
#+SETUPFILE: ../docs/theme.setup
#+SETUPFILE: ../tools/theme.setup
* QMCkl test :noexport:
@ -8,7 +8,7 @@
First, we use a script to find the list of all the generated test files:
#+NAME: test-files
#+begin_src sh :exports none
#+begin_src sh :exports none
FILES=$(cat table_of_contents)
grep begin_src $FILES \
| grep c_test \
@ -48,7 +48,7 @@ echo "#+end_src"
MunitResult test_qmckl_distance();
#+end_src
:end:
and the required function calls:
#+begin_src sh :var files=test-files :exports output :results drawer
echo "#+NAME: calls"
@ -60,7 +60,7 @@ do
done
echo "#+end_src"
#+end_src
#+RESULTS:
:results:
#+NAME: calls
@ -78,7 +78,7 @@ echo "#+end_src"
allocations with ~mtrace~. Memory allocations will be traced in the
file specified by the ~MALLOC_TRACE~ environment variable.
#+begin_src c :comments link :noweb yes :tangle test_qmckl.c
#+begin_src c :comments link :noweb yes :tangle test_qmckl.c
#include "qmckl.h"
#include "munit.h"
#include "mcheck.h"
@ -97,10 +97,10 @@ int main(int argc, char* argv[MUNIT_ARRAY_PARAM(argc + 1)]) {
(char*) "", test_suite_tests, NULL, 1, MUNIT_SUITE_OPTION_NONE
};
int result = munit_suite_main(&test_suite, (void*) "µnit", argc, argv);
muntrace();
return result;
}
#+end_src

View File

@ -167,7 +167,10 @@ endif
.PHONY: clean shared static doc all check install uninstall
.SECONDARY: # Needed to keep the produced C and Fortran files
$(shared_lib) $(static_lib) install uninstall: $(qmckl_h) $(qmckl_f) Makefile.generated
$(shared_lib) $(static_lib): $(qmckl_h) $(qmckl_f) Makefile.generated
$(MAKE) -f Makefile.generated $@
install uninstall: Makefile.generated
$(MAKE) -f Makefile.generated $@
$(qmckl_f) $(qmckl_h): Makefile.generated
@ -180,6 +183,12 @@ all: shared static doc check
check: $(static_lib)
$(MAKE) -f Makefile.generated check
cppcheck:
cppcheck \
--addon=cert \
--enable=warning,style,performance,portability,information \
qmckl_*.c
doc: $(ORG_SOURCE_FILES)
$(QMCKL_ROOT)/tools/build_doc.sh
@ -191,10 +200,10 @@ clean:
Makefile.generated *.html *.txt
veryclean: clean FORCE
- $(RM) $(QMCKL_ROOT)/docs/*.html \
$(QMCKL_ROOT)/docs/*.txt
- $(RM) $(QMCKL_ROOT)/share/doc/qmckl/html/*.html \
$(QMCKL_ROOT)/share/doc/qmckl/text/*.txt
Makefile.generated: Makefile $(QMCKL_ROOT)/tools/create_makefile.sh $(ORG_SOURCE_FILES)
Makefile.generated: Makefile $(QMCKL_ROOT)/tools/create_makefile.sh $(ORG_SOURCE_FILES) ../tools/Building.org
$(QMCKL_ROOT)/tools/create_makefile.sh
@ -361,15 +370,29 @@ check: test_qmckl test_qmckl_shared
clean:
\$(RM) -- *.o *.mod \$(shared_lib) \$(static_lib) test_qmckl
install:
install -d \$(prefix)/lib
install -d \$(prefix)/include
install -d \$(prefix)/share/qmckl/fortran
install -d \$(prefix)/man
install \$(shared_lib) \$(prefix)/lib
install \$(static_lib) \$(prefix)/lib
install \$(qmckl_h) \$(prefix)/include
install \$(qmckl_f) \$(prefix)/share/qmckl/fortran
install -d \$(prefix)/share/doc/qmckl/html/
install -d \$(prefix)/share/doc/qmckl/text/
install \$(shared_lib) \$(prefix)/lib
install \$(static_lib) \$(prefix)/lib
install \$(qmckl_h) \$(prefix)/include
install \$(qmckl_f) \$(prefix)/share/qmckl/fortran
install \$(QMCKL_ROOT)/share/doc/qmckl/html/*.html \$(prefix)/share/doc/qmckl/html/
install \$(QMCKL_ROOT)/share/doc/qmckl/html/*.css \$(prefix)/share/doc/qmckl/html/
install \$(QMCKL_ROOT)/share/doc/qmckl/text/*.txt \$(prefix)/share/doc/qmckl/text/
uninstall:
rm \$(prefix)/lib/libqmckl.so
rm \$(prefix)/lib/libqmckl.a
rm \$(prefix)/include/qmckl.h
rm -rf \$(prefix)/share/qmckl/
rm -rf \$(prefix)/share/doc/qmckl/
.SUFFIXES: .c .f90 .o
@ -379,7 +402,7 @@ install:
.f90.o: qmckl_f.o
\$(FC) \$(FFLAGS) -c \$*.f90 -o \$*.o
.PHONY: check clean all
.PHONY: check cppcheck clean all
EOF
#+end_src
@ -495,9 +518,9 @@ EOF
First define readonly global variables.
#+begin_src bash :noweb yes
readonly DOCS=${QMCKL_ROOT}/docs/
readonly DOCS=${QMCKL_ROOT}/share/doc/qmckl/
readonly SRC=${QMCKL_ROOT}/src/
readonly HTMLIZE=${DOCS}/htmlize.el
readonly HTMLIZE=${DOCS}/html/htmlize.el
readonly CONFIG_DOC=${QMCKL_ROOT}/tools/config_doc.el
readonly CONFIG_TANGLE=${QMCKL_ROOT}/tools/config_tangle.el
#+end_src
@ -513,7 +536,7 @@ function check_preconditions()
exit 1
fi
for dir in ${DOCS} ${SRC}
for dir in ${DOCS}/html ${DOCS}/text ${SRC}
do
if [[ ! -d ${dir} ]]
then
@ -543,7 +566,7 @@ function install_htmlize()
local repo="emacs-htmlize"
[[ -f ${HTMLIZE} ]] || (
cd ${DOCS}
cd ${DOCS}/html
git clone ${url} \
&& cp ${repo}/htmlize.el ${HTMLIZE} \
&& rm -rf ${repo}
@ -564,7 +587,8 @@ function extract_doc()
local org=$1
local local_html=${SRC}/${org%.org}.html
local local_text=${SRC}/${org%.org}.txt
local html=${DOCS}/${org%.org}.html
local html=${DOCS}/html/${org%.org}.html
local text=${DOCS}/text/${org%.org}.txt
if [[ -f ${html} && ${org} -ot ${html} ]]
then
@ -577,7 +601,8 @@ function extract_doc()
--load ${CONFIG_TANGLE} \
-f org-html-export-to-html \
-f org-ascii-export-to-ascii
mv ${local_html} ${local_text} ${DOCS}
mv ${local_html} ${DOCS}/html
mv ${local_text} ${DOCS}/text
}
#+end_src
@ -605,7 +630,7 @@ function main() {
if [[ $? -eq 0 ]]
then
cd ${DOCS}
cd ${DOCS}/html
rm -f index.html
ln README.html index.html
exit 0

View File

@ -7,9 +7,9 @@
# First define readonly global variables.
readonly DOCS=${QMCKL_ROOT}/docs/
readonly DOCS=${QMCKL_ROOT}/share/doc/qmckl/
readonly SRC=${QMCKL_ROOT}/src/
readonly HTMLIZE=${DOCS}/htmlize.el
readonly HTMLIZE=${DOCS}/html/htmlize.el
readonly CONFIG_DOC=${QMCKL_ROOT}/tools/config_doc.el
readonly CONFIG_TANGLE=${QMCKL_ROOT}/tools/config_tangle.el
@ -26,7 +26,7 @@ function check_preconditions()
exit 1
fi
for dir in ${DOCS} ${SRC}
for dir in ${DOCS}/html ${DOCS}/text ${SRC}
do
if [[ ! -d ${dir} ]]
then
@ -57,7 +57,7 @@ function install_htmlize()
local repo="emacs-htmlize"
[[ -f ${HTMLIZE} ]] || (
cd ${DOCS}
cd ${DOCS}/html
git clone ${url} \
&& cp ${repo}/htmlize.el ${HTMLIZE} \
&& rm -rf ${repo}
@ -79,7 +79,8 @@ function extract_doc()
local org=$1
local local_html=${SRC}/${org%.org}.html
local local_text=${SRC}/${org%.org}.txt
local html=${DOCS}/${org%.org}.html
local html=${DOCS}/html/${org%.org}.html
local text=${DOCS}/text/${org%.org}.txt
if [[ -f ${html} && ${org} -ot ${html} ]]
then
@ -92,7 +93,8 @@ function extract_doc()
--load ${CONFIG_TANGLE} \
-f org-html-export-to-html \
-f org-ascii-export-to-ascii
mv ${local_html} ${local_text} ${DOCS}
mv ${local_html} ${DOCS}/html
mv ${local_text} ${DOCS}/text
}
@ -121,7 +123,7 @@ function main() {
if [[ $? -eq 0 ]]
then
cd ${DOCS}
cd ${DOCS}/html
rm -f index.html
ln README.html index.html
exit 0

View File

@ -117,15 +117,29 @@ check: test_qmckl test_qmckl_shared
clean:
\$(RM) -- *.o *.mod \$(shared_lib) \$(static_lib) test_qmckl
install:
install -d \$(prefix)/lib
install -d \$(prefix)/include
install -d \$(prefix)/share/qmckl/fortran
install -d \$(prefix)/man
install \$(shared_lib) \$(prefix)/lib
install \$(static_lib) \$(prefix)/lib
install \$(qmckl_h) \$(prefix)/include
install \$(qmckl_f) \$(prefix)/share/qmckl/fortran
install -d \$(prefix)/share/doc/qmckl/html/
install -d \$(prefix)/share/doc/qmckl/text/
install \$(shared_lib) \$(prefix)/lib
install \$(static_lib) \$(prefix)/lib
install \$(qmckl_h) \$(prefix)/include
install \$(qmckl_f) \$(prefix)/share/qmckl/fortran
install \$(QMCKL_ROOT)/share/doc/qmckl/html/*.html \$(prefix)/share/doc/qmckl/html/
install \$(QMCKL_ROOT)/share/doc/qmckl/html/*.css \$(prefix)/share/doc/qmckl/html/
install \$(QMCKL_ROOT)/share/doc/qmckl/text/*.txt \$(prefix)/share/doc/qmckl/text/
uninstall:
rm \$(prefix)/lib/libqmckl.so
rm \$(prefix)/lib/libqmckl.a
rm \$(prefix)/include/qmckl.h
rm -rf \$(prefix)/share/qmckl/
rm -rf \$(prefix)/share/doc/qmckl/
.SUFFIXES: .c .f90 .o
@ -135,5 +149,5 @@ install:
.f90.o: qmckl_f.o
\$(FC) \$(FFLAGS) -c \$*.f90 -o \$*.o
.PHONY: check clean all
.PHONY: check cppcheck clean all
EOF