mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2024-12-22 20:36:01 +01:00
Removed iso-c-bindings in C. Will be done for Fortran
This commit is contained in:
parent
baf48d1987
commit
90714f069b
10
src/Makefile
10
src/Makefile
@ -6,7 +6,12 @@ FFLAGS=
|
||||
|
||||
SOURCE_FILES=$(wildcard *.org)
|
||||
|
||||
%.c %_f.f90 %.h: %.c.org
|
||||
.PHONY: clean
|
||||
|
||||
%.c %.h: %.org
|
||||
emacs --quick --no-init-file --batch --eval "(require 'org)" --eval '(org-babel-tangle-file "$^")'
|
||||
|
||||
%.c %.h %_f.f90: %.org
|
||||
emacs --quick --no-init-file --batch --eval "(require 'org)" --eval '(org-babel-tangle-file "$^")'
|
||||
|
||||
%.o: %.c
|
||||
@ -15,4 +20,7 @@ SOURCE_FILES=$(wildcard *.org)
|
||||
%.o: %.f90
|
||||
$(FC) $(FFLAGS) -c $*.f90 -o $*.o
|
||||
|
||||
clean:
|
||||
rm -f qmckl_*.f90 qmckl_*.c qmckl_*.o qmckl_*.h
|
||||
|
||||
|
||||
|
@ -2,16 +2,49 @@
|
||||
|
||||
** Introduction
|
||||
|
||||
The main objective of present library is documentation. Therefore,
|
||||
literate programming is particularly adapted in this context.
|
||||
Source files are written in org-mode format, to provide useful
|
||||
comments and LaTex formulas close to the code. There exists multiple
|
||||
possibilities to convert org-mode files into different formats such as
|
||||
HTML or pdf.
|
||||
For a tutorial on literate programming with org-mode, follow
|
||||
[[http://www.howardism.org/Technical/Emacs/literate-programming-tutorial.html][this link]].
|
||||
|
||||
The code is extracted from the org files using Emacs in the =Makefile=,
|
||||
and then the produced files are compiled.
|
||||
The code is extracted from the org files using Emacs as a command-line
|
||||
tool in the =Makefile=, and then the produced files are compiled.
|
||||
|
||||
For a better experience, editing can be done with Emacs. Note that
|
||||
Emacs can behave like Vim when switched into ``Evil'' mode.
|
||||
*** Source code editing
|
||||
|
||||
Any text editor can be used to edit org-mode files. For a better
|
||||
user experience Emacs is recommended.
|
||||
For users hating Emacs, it is good to know that Emacs can behave
|
||||
like Vim when switched into ``Evil'' mode. There also exists
|
||||
[[https://www.spacemacs.org][Spacemacs]] which is particularly well adapted to Vim users.
|
||||
|
||||
For users with a preference for Jupyter notebooks, the following
|
||||
script can convert jupyter notebooks to org-mode files:
|
||||
|
||||
#+BEGIN_SRC sh tangle: nb_to_org.sh
|
||||
#!/bin/bash
|
||||
# $ nb_to_org.sh notebook.ipynb
|
||||
# produces the org-mode file notebook.org
|
||||
|
||||
set -e
|
||||
|
||||
nb=$(basename $1 .ipynb)
|
||||
jupyter nbconvert --to markdown ${nb}.ipynb --output ${nb}.md
|
||||
pandoc ${nb}.md -o ${nb}.org
|
||||
rm ${nb}.md
|
||||
#+END_SRC
|
||||
|
||||
And pandoc can convert multiple markdown formats into org-mode.
|
||||
|
||||
*** Writing in Fortran
|
||||
|
||||
The Fortran source files should provide a C interface using
|
||||
iso-c-binding. The name of the Fortran source files should end
|
||||
with =_f.f90= to be properly handled by the Makefile.
|
||||
|
||||
** Documentation
|
||||
|
||||
|
@ -1,7 +1,9 @@
|
||||
# -*- mode: org -*-
|
||||
|
||||
#+TITLE: Context
|
||||
|
||||
This file is written in C because it is more natural to express the context in
|
||||
C than in Fortran. This file also produces the Fortran binding.
|
||||
C than in Fortran.
|
||||
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
@ -15,10 +17,12 @@ C than in Fortran. This file also produces the Fortran binding.
|
||||
is stored in the following data structure, which can't be seen
|
||||
outside of the library.
|
||||
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
#define QMCKL_DEFAULT_PRECISION 53
|
||||
#define QMCKL_DEFAULT_RANGE 2
|
||||
|
||||
/* 64-bit integer */
|
||||
typedef long long int qmckl_context ;
|
||||
#+END_SRC
|
||||
|
||||
@ -31,9 +35,11 @@ typedef struct qmckl_context_struct_ {
|
||||
} qmckl_context_struct;
|
||||
#+END_SRC
|
||||
|
||||
** =qmckl_context_create=
|
||||
|
||||
To create a new context, use =qmckl_context_create()=. If the creation
|
||||
failed, the function returns 0. On success, a pointer to a context
|
||||
is returned as a long integer.
|
||||
failed, the function returns =0=. On success, a pointer to a context
|
||||
is returned as a 64-bit integer.
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_create();
|
||||
@ -57,22 +63,7 @@ qmckl_context qmckl_context_create() {
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC fortran :tangle qmckl_context_f.f90
|
||||
integer(8) function qmckl_context_create()
|
||||
use, intrinsic :: iso_c_binding
|
||||
implicit none
|
||||
|
||||
interface
|
||||
integer(c_long_long) function c_qmckl_context_create() &
|
||||
bind(C, name='qmckl_context_create')
|
||||
use, intrinsic :: iso_c_binding, only : c_long_long
|
||||
end function
|
||||
end interface
|
||||
|
||||
qmckl_context_create = c_qmckl_context_create()
|
||||
end
|
||||
#+END_SRC
|
||||
|
||||
** =qmckl_context_copy=
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_copy(qmckl_context context);
|
||||
@ -100,31 +91,15 @@ qmckl_context qmckl_context_copy(qmckl_context context) {
|
||||
#+END_SRC
|
||||
|
||||
|
||||
#+BEGIN_SRC fortran :tangle qmckl_context_f.f90
|
||||
integer(8) function qmckl_context_copy(context)
|
||||
use, intrinsic :: iso_c_binding
|
||||
implicit none
|
||||
integer(8), intent(in) :: context
|
||||
|
||||
interface
|
||||
integer(c_long_long) function c_qmckl_context_copy(context) &
|
||||
bind(C, name='qmckl_context_copy')
|
||||
use, intrinsic :: iso_c_binding, only : c_long_long
|
||||
integer(c_long_long), intent(in) :: context
|
||||
end function
|
||||
end interface
|
||||
|
||||
qmckl_context_copy = c_qmckl_context_copy(context)
|
||||
end
|
||||
#+END_SRC
|
||||
|
||||
|
||||
* Precision
|
||||
|
||||
The following functions set the expected required precision and range.
|
||||
=precision= should be an integer between 2 and 53, and =range= should be
|
||||
an integer between 2 and 11.
|
||||
These functions return 0 upon success.
|
||||
The following functions set and get the expected required precision
|
||||
and range. =precision= should be an integer between 2 and 53, and
|
||||
=range= should be an integer between 2 and 11.
|
||||
The setter functions functions return a new context as a 64-bit integer.
|
||||
The getter functions return the value, as a 32-bit integer.
|
||||
|
||||
** =qmckl_context_set_precision=
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_set_precision(qmckl_context context, int precision);
|
||||
@ -143,7 +118,7 @@ qmckl_context qmckl_context_set_precision(qmckl_context context, int precision)
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
** =qmckl_context_set_range=
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_set_range(qmckl_context context, int range);
|
||||
#+END_SRC
|
||||
@ -163,3 +138,31 @@ qmckl_context qmckl_context_set_range(qmckl_context context, int range) {
|
||||
|
||||
|
||||
|
||||
** =qmckl_context_get_precision=
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
int qmckl_context_get_precision(qmckl_context context);
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
int qmckl_context_get_precision(qmckl_context context) {
|
||||
qmckl_context_struct* ctx;
|
||||
ctx = (qmckl_context_struct*) context;
|
||||
return ctx->precision;
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
** =qmckl_context_get_range=
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
int qmckl_context_get_range(qmckl_context context);
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
int qmckl_context_get_range(qmckl_context context) {
|
||||
qmckl_context_struct* ctx;
|
||||
ctx = (qmckl_context_struct*) context;
|
||||
return ctx->range;
|
||||
}
|
||||
#+END_SRC
|
||||
|
Loading…
Reference in New Issue
Block a user