1
0
mirror of https://github.com/TREX-CoE/trexio.git synced 2024-07-22 18:57:39 +02:00
This commit is contained in:
joguenzl 2023-05-16 14:14:55 +02:00
commit 2cb925c1f5
12 changed files with 236 additions and 72 deletions

View File

@ -20,7 +20,7 @@ jobs:
message: ${{ steps.commit_message.outputs.message }} message: ${{ steps.commit_message.outputs.message }}
steps: steps:
- name: Checkout the repo - name: Checkout the repo
uses: actions/checkout@v2 uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
# Gets the correct commit message for pull request # Gets the correct commit message for pull request
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
@ -31,15 +31,13 @@ jobs:
COMMIT_MSG=$(git log --no-merges -1 --oneline) COMMIT_MSG=$(git log --no-merges -1 --oneline)
echo "::set-output name=message::$COMMIT_MSG" echo "::set-output name=message::$COMMIT_MSG"
trexio_ubuntu: trexio_ubuntu:
runs-on: ubuntu-20.04
name: x86 Ubuntu 20.04 name: x86 Ubuntu 20.04
runs-on: ubuntu-20.04
needs: get_commit_message needs: get_commit_message
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
- name: install dependencies - name: install dependencies
run: | run: |
@ -84,7 +82,7 @@ jobs:
if: >- if: >-
contains(needs.get_commit_message.outputs.message, '[wheel build]') || contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
github.event_name == 'release' github.event_name == 'release'
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2
with: with:
name: pytrexio-source name: pytrexio-source
path: ./trexio-*.tar.gz path: ./trexio-*.tar.gz
@ -114,29 +112,38 @@ jobs:
run: make maintainer-clean run: make maintainer-clean
trexio_macos: trexio_macos:
name: x86 MacOS 12
runs-on: macos-11 runs-on: macos-12
name: x86 MacOS 11
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
- name: install dependencies - name: install dependencies
run: | run: |
brew install emacs brew install emacs
brew install hdf5 brew install hdf5@1.12
brew install automake brew install automake
brew --prefix hdf5
- name: configure with autotools - name: configure with autotools
run: | run: |
./autogen.sh ./autogen.sh
./configure FC=gfortran-10 --enable-silent-rules ./configure FC=gfortran-12 --enable-silent-rules
- name: compile TREXIO - name: compile TREXIO
run: make -j 2 run: make -j3
- name: check TREXIO - name: check TREXIO
run: make check run: make -j3 check
- name: compile Python API
run: |
export H5_CFLAGS="-I$(brew --prefix hdf5)/include"
export H5_LDFLAGS="-L$(brew --prefix hdf5)/lib"
make python-install
- name: test Python API
run: make python-test
- name: Archive test log file - name: Archive test log file
if: failure() if: failure()

View File

@ -21,7 +21,7 @@ jobs:
message: ${{ steps.commit_message.outputs.message }} message: ${{ steps.commit_message.outputs.message }}
steps: steps:
- name: Checkout the repo - name: Checkout the repo
uses: actions/checkout@v2 uses: actions/checkout@v3
# Gets the correct commit message for pull request # Gets the correct commit message for pull request
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
@ -42,14 +42,14 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
strategy: strategy:
matrix: matrix:
manylinux_tag: [2010_x86_64, 2014_x86_64, 2_24_x86_64] manylinux_tag: [2014_x86_64, 2_24_x86_64]
steps: steps:
- name: Checkout the branch - name: Checkout the branch
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v1 uses: actions/setup-python@v4
with: with:
python-version: '3.9' python-version: '3.9'
@ -103,22 +103,14 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
os: [macos-10.15] os: [macos-12]
python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
# TODO: normally, one could include macos-11 and the OS list above but the produced wheels receive an error upon installation:
# ERROR: trexio-1.1.0-cp39-cp39-macosx_11_0_x86_64.whl is not a supported wheel on this platform.
# This happens even with the MACOSX_DEPLOYMENT_TARGET trick. Perhaps it can be solved by configuring the build system
# to produce the wheels for MacOS-11 from the very beginning
#exclude:
# - os: macos-11
env:
H5_LDFLAGS: '-L/usr/local/Cellar/hdf5/1.12.1/lib'
H5_CFLAGS: '-I/usr/local/Cellar/hdf5/1.12.1/include'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v4
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
@ -128,11 +120,6 @@ jobs:
- name: Install HDF5 - name: Install HDF5
run: brew install hdf5@1.12 run: brew install hdf5@1.12
# This step is needed to produce wheels with the correct platform tag for MacOS-11 (Big Sur)
#- name: Set MACOSX_DEPLOYMENT_TARGET environment variable
# if: ${{ matrix.os == 'macos-11' }}
# run: echo "MACOSX_DEPLOYMENT_TARGET=11.0" >> $GITHUB_ENV
- name: Compute the PYTREXIO_VERSION environment variable - name: Compute the PYTREXIO_VERSION environment variable
run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\ -f3 | tr -d '"')" >> $GITHUB_ENV run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\ -f3 | tr -d '"')" >> $GITHUB_ENV
@ -158,6 +145,8 @@ jobs:
run: | run: |
mkdir wheelhouse/ mkdir wheelhouse/
cd trexio-${{ env.PYTREXIO_VERSION }}/ cd trexio-${{ env.PYTREXIO_VERSION }}/
export H5_CFLAGS="-I$(brew --prefix hdf5)/include"
export H5_LDFLAGS="-L$(brew --prefix hdf5)/lib"
python -m build --wheel --outdir=./ python -m build --wheel --outdir=./
delocate-wheel trexio-*.whl delocate-wheel trexio-*.whl
mv trexio-*.whl ../wheelhouse/ mv trexio-*.whl ../wheelhouse/
@ -186,10 +175,10 @@ jobs:
steps: steps:
- name: Checkout the branch - name: Checkout the branch
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v1 uses: actions/setup-python@v4
with: with:
python-version: '3.9' python-version: '3.9'

View File

@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.16)
# Initialize the CMake project. # Initialize the CMake project.
project(Trexio project(Trexio
VERSION 2.3.0 VERSION 2.3.1
DESCRIPTION "TREX I/O library" DESCRIPTION "TREX I/O library"
LANGUAGES C Fortran LANGUAGES C Fortran
) )

View File

@ -22,8 +22,8 @@ TREX library for efficient I/O.
2. `gzip -cd trexio-<version>.tar.gz | tar xvf -` 2. `gzip -cd trexio-<version>.tar.gz | tar xvf -`
3. `cd trexio-<version>` 3. `cd trexio-<version>`
4. `./configure` 4. `./configure`
5. `make` 5. ```make -j`getconf _NPROCESSORS_ONLN` ```
6. `make check` 6. ```make -j`getconf _NPROCESSORS_ONLN` check```
7. `sudo make install` 7. `sudo make install`
@ -45,8 +45,8 @@ TREX library for efficient I/O.
2. `cd trexio` 2. `cd trexio`
3. `./autogen.sh` 3. `./autogen.sh`
4. `./configure` 4. `./configure`
5. `make` 5. ```make -j`getconf _NPROCESSORS_ONLN` ```
6. `make check` 6. ```make -j`getconf _NPROCESSORS_ONLN` check```
7. `sudo make install` 7. `sudo make install`
## Installation procedure for CMake users (from the tarball or GitHub repo clone): ## Installation procedure for CMake users (from the tarball or GitHub repo clone):
@ -56,8 +56,8 @@ The aforementioned instructions rely on [Autotools](https://www.gnu.org/software
1. `cmake -S. -Bbuild` 1. `cmake -S. -Bbuild`
2. `cd build` 2. `cd build`
3. `make` 3. ```make -j`getconf _NPROCESSORS_ONLN` ```
4. `ctest` (or `make test`) 4. ```ctest -j`getconf _NPROCESSORS_ONLN` ```
5. `sudo make install` 5. `sudo make install`
**Note: on systems with no `sudo` access, one can add `-DCMAKE_INSTALL_PREFIX=build` as an argument to the `cmake` command so that `make install/uninstall` can be run without `sudo` privileges.** **Note: on systems with no `sudo` access, one can add `-DCMAKE_INSTALL_PREFIX=build` as an argument to the `cmake` command so that `make install/uninstall` can be run without `sudo` privileges.**
@ -73,7 +73,7 @@ The official releases of TREXIO `>2.0.0` are also available via the `conda-forge
The pre-compiled stable binaries of `trexio` can be installed as follows: The pre-compiled stable binaries of `trexio` can be installed as follows:
``` ```
conda install trexio -c conda-forge conda install -c conda-forge trexio
``` ```
More details can be found in the corresponding [trexio-feedstock](https://github.com/conda-forge/trexio-feedstock). More details can be found in the corresponding [trexio-feedstock](https://github.com/conda-forge/trexio-feedstock).
@ -88,7 +88,7 @@ Schema file contains the manifest specification for the `trexio` package.
It can be installed as follows: It can be installed as follows:
``` ```
guix package --cores=<n_cores> --install-from-file=trexio.scm guix package --cores=`getconf _NPROCESSORS_ONLN` --install-from-file=trexio.scm
``` ```
## Installation procedure for Spack users ## Installation procedure for Spack users
@ -100,7 +100,7 @@ file contains the Spack specifications required to build different variants of `
It can be installed as follows It can be installed as follows
``` ```
spack install --jobs <n_cores> trexio spack install --jobs `getconf _NPROCESSORS_ONLN` trexio
``` ```
## Installation procedure for Debian/Ubuntu users ## Installation procedure for Debian/Ubuntu users
@ -127,14 +127,14 @@ To build TREXIO without HDF5 back end, append `--without-hdf5` option to `config
## Linking to your program ## Linking to your program
The `make install` command takes care of installing the TREXIO shared library on the user machine. The `make install` command takes care of installing the TREXIO shared library on the user machine.
Once installed, add `-ltrexio` to the list of compiler options. After installation, append `-ltrexio` to the list of compiler (`$LIBS`) options.
In some cases (e.g. when using custom `prefix` during configuration), the TREXIO library might end up installed in a directory, which is absent in the default `$LIBRARY_PATH`. In some cases (e.g. when using custom installation prefix during configuration), the TREXIO library might end up installed in a directory, which is absent in the default `$LD_LIBRARY_PATH`.
In order to link the program against TREXIO, the search paths can be modified as follows: In order to link the program against TREXIO, the search path can be modified as follows:
`export LIBRARY_PATH=$LIBRARY_PATH:<path_to_trexio>/lib` `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<path_to_trexio>/lib`
(same holds for `$LD_LIBRARY_PATH`). The `<path_to_trexio>` has to be replaced by the prefix used during the installation. where the `<path_to_trexio>` has to be replaced by the prefix used during the installation.
If your project relies on CMake build system, feel free to use the If your project relies on CMake build system, feel free to use the
[FindTREXIO.cmake](https://github.com/TREX-CoE/trexio/blob/master/cmake/FindTREXIO.cmake) [FindTREXIO.cmake](https://github.com/TREX-CoE/trexio/blob/master/cmake/FindTREXIO.cmake)

View File

@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([trexio],[2.3.0],[https://github.com/TREX-CoE/trexio/issues]) AC_INIT([trexio],[2.3.1],[https://github.com/TREX-CoE/trexio/issues])
AC_CONFIG_SRCDIR([Makefile.in]) AC_CONFIG_SRCDIR([Makefile.in])
AC_CONFIG_HEADERS([include/config.h]) AC_CONFIG_HEADERS([include/config.h])

View File

@ -200,7 +200,7 @@ program print_energy
#+begin_src f90 #+begin_src f90
call getarg(1, filename) call getarg(1, filename)
f = trexio_open (filename, 'r', TREXIO_HDF5, rc) f = trexio_open (filename, 'r', TREXIO_AUTO, rc)
if (rc /= TREXIO_SUCCESS) then if (rc /= TREXIO_SUCCESS) then
call trexio_string_of_error(rc, err_msg) call trexio_string_of_error(rc, err_msg)
print *, 'Error opening TREXIO file: '//trim(err_msg) print *, 'Error opening TREXIO file: '//trim(err_msg)
@ -410,6 +410,139 @@ program print_energy
end program end program
#+end_src #+end_src
** Python
:PROPERTIES:
:header-args: :tangle print_energy.py
:END:
#+begin_src python
import sys
import trexio
import numpy as np
BUFSIZE = 100000
#+end_src
This program computes the energy as:
\[
E = E_{\text{NN}} + \sum_{ij} \gamma_{ij}\, \langle j | h | i \rangle\,
+\, \frac{1}{2} \sum_{ijkl} \Gamma_{ijkl}\, \langle k l | i j
\rangle\; \textrm{ with } \; 0 < i,j,k,l \le n
\]
One needs to read from the TREXIO file:
- $n$ :: The number of molecular orbitals
- $E_{\text{NN}}$ :: The nuclear repulsion energy
- $\gamma_{ij}$ :: The one-body reduced density matrix
- $\langle j |h| i \rangle$ :: The one-electron Hamiltonian integrals
- $\Gamma_{ijkl}$ :: The two-body reduced density matrix
- $\langle k l | i j \rangle$ :: The electron repulsion integrals
*** Obtain the name of the TREXIO file from the command line, and open it for reading
#+begin_src python
filename = sys.argv[1]
f = trexio.File(filename, 'r', trexio.TREXIO_AUTO)
#+end_src
*** Read the nuclear repulsion energy
#+begin_src python
E_nn = trexio.read_nucleus_repulsion(f)
#+end_src
*** Read the number of molecular orbitals
#+begin_src python
n = trexio.read_mo_num(f)
#+end_src
*** Read one-electron quantities
#+begin_src python
if not trexio.has_mo_1e_int_core_hamiltonian(f):
print("No core hamiltonian in file")
sys.exit(-1)
h0 = trexio.read_mo_1e_int_core_hamiltonian(f)
if not trexio.has_rdm_1e(f):
print("No 1e RDM in file")
sys.exit(-1)
D = trexio.read_rdm_1e(f)
#+end_src
*** Read two-electron quantities
**** Electron repulsion integrals
#+begin_src python
if not trexio.has_mo_2e_int_eri(f):
print("No electron repulsion integrals in file")
sys.exit(-1)
size_max = trexio.read_mo_2e_int_eri_size(f)
offset = 0
icount = BUFSIZE
feof = False
W = np.zeros( (n,n,n,n) )
while not feof:
buffer_index, buffer_values, icount, feof = trexio.read_mo_2e_int_eri(f, offset, icount)
for m in range(icount):
i, j, k, l = buffer_index[m]
W[i,j,k,l] = buffer_values[m]
W[k,j,i,l] = buffer_values[m]
W[i,l,k,j] = buffer_values[m]
W[k,l,i,j] = buffer_values[m]
W[j,i,l,k] = buffer_values[m]
W[j,k,l,i] = buffer_values[m]
W[l,i,j,k] = buffer_values[m]
W[l,k,j,i] = buffer_values[m]
#+end_src
**** Reduced density matrix
#+begin_src python
if not trexio.has_rdm_2e(f):
print("No two-body density matrix in file")
offset = 0
icount = BUFSIZE
feof = False
G = np.zeros( (n,n,n,n) )
while not feof:
buffer_index, buffer_values, icount, feof = trexio.read_rdm_2e(f, offset, icount)
for m in range(icount):
i, j, k, l = buffer_index[m]
G[i,j,k,l] = buffer_values[m]
#+end_src
*** Compute the energy
When the orbitals are real, we can use
\begin{eqnarray*}
E &=& E_{\text{NN}} + \sum_{ij} \gamma_{ij}\, \langle j | h | i \rangle\,
+\, \frac{1}{2} \sum_{ijkl} \Gamma_{ijkl}\, \langle k l | i j
\rangle \\
&=& E_{\text{NN}} + \sum_{ij} \gamma_{ij}\, \langle i | h | j \rangle\,
+\, \frac{1}{2} \sum_{ijkl} \Gamma_{ijkl}\, \langle i j | k l
\rangle \\
\end{eqnarray*}
#+begin_src python
G = np.reshape(G, (n*n, n*n) )
W = np.reshape(W, (n*n, n*n) )
E = E_nn
E += 0.5*sum( [ np.dot(G[:,l], W[:,l]) for l in range(n*n) ] )
E += sum( [ np.dot(D[:,l], h0[:,l]) for l in range(n) ] )
print (f"Energy: {E}")
#+end_src
* Reading determinants * Reading determinants
** Fortran ** Fortran

View File

@ -1 +1 @@
__version__ = "1.3.0" __version__ = "1.3.2"

View File

@ -1,4 +1,4 @@
setuptools>=42 setuptools>=42
pkgconfig pkgconfig
numpy<1.23.0 numpy<1.24.0
numpy>=1.17.3 numpy>=1.17.3

View File

@ -66,7 +66,7 @@ option(ENABLE_HDF5 "Enable HDF5 support" ON)
if(ENABLE_HDF5) if(ENABLE_HDF5)
# Try to detect HDF5 installation using built-in FindHDF5.cmake macro. # Try to detect HDF5 installation using built-in FindHDF5.cmake macro.
find_package(HDF5 REQUIRED COMPONENTS C HL) find_package(HDF5 REQUIRED COMPONENTS C)
if(HDF5_FOUND) if(HDF5_FOUND)
message(STATUS "HDF5 version :: ${HDF5_VERSION}") message(STATUS "HDF5 version :: ${HDF5_VERSION}")
@ -87,9 +87,7 @@ if(ENABLE_HDF5)
# - include directories with HDF5 header files # - include directories with HDF5 header files
target_include_directories(trexio PRIVATE ${HDF5_C_INCLUDE_DIRS}) target_include_directories(trexio PRIVATE ${HDF5_C_INCLUDE_DIRS})
# - link to HDF5 C libraries # - link to HDF5 C libraries
target_link_libraries(trexio PRIVATE target_link_libraries(trexio PRIVATE ${HDF5_C_LIBRARIES})
${HDF5_C_HL_LIBRARIES}
${HDF5_C_LIBRARIES})
endif() endif()
# Private headers have to be listed as sources, otherwise they are installed # Private headers have to be listed as sources, otherwise they are installed

View File

@ -34,14 +34,14 @@
num variable is modified by address num variable is modified by address
*/ */
/* Return num variables as part of the output tuple */ /* Return num variables as part of the output tuple */
%apply int *OUTPUT { int32_t* const num}; %apply int32_t *OUTPUT { int32_t* const num};
%apply int *OUTPUT { int64_t* const num}; %apply int64_t *OUTPUT { int64_t* const num};
%apply int *OUTPUT { int32_t* const num_up}; %apply int32_t *OUTPUT { int32_t* const num_up};
%apply int *OUTPUT { int32_t* const num_dn}; %apply int32_t *OUTPUT { int32_t* const num_dn};
%apply int *OUTPUT { int64_t* const num_up}; %apply int64_t *OUTPUT { int64_t* const num_up};
%apply int *OUTPUT { int64_t* const num_dn}; %apply int64_t *OUTPUT { int64_t* const num_dn};
%apply float *OUTPUT { float* const num}; %apply float *OUTPUT { float* const num};
%apply float *OUTPUT { double* const num}; %apply double *OUTPUT { double* const num};
/* Return TREXIO exit code from trexio_open as part of the output tuple */ /* Return TREXIO exit code from trexio_open as part of the output tuple */
%apply int *OUTPUT { trexio_exit_code* const rc_open}; %apply int *OUTPUT { trexio_exit_code* const rc_open};
/* Return number of sparse data points stored in the file as part of the output tuple */ /* Return number of sparse data points stored in the file as part of the output tuple */

View File

@ -145,10 +145,10 @@ trexio_text_inquire (const char* file_name)
if (file_exists) { if (file_exists) {
bool is_a_directory = false; bool is_a_directory = false;
#ifdef S_IFDIR #if defined(S_IFDIR)
is_a_directory = st.st_mode & S_IFDIR; is_a_directory = st.st_mode & S_IFDIR;
#elif S_ISDIR #elif defined(S_ISDIR)
is_a_directory = S_ISDIR(s.st_mode); is_a_directory = S_ISDIR(st.st_mode);
#else #else
printf("Some important macros are missing for directory handling.\n"); printf("Some important macros are missing for directory handling.\n");
return TREXIO_FAILURE; return TREXIO_FAILURE;
@ -162,6 +162,29 @@ trexio_text_inquire (const char* file_name)
} }
#+end_src #+end_src
On non-POSIX file systems, the function ~mkdtemp~ might is not defined.
In that case, we define an alternate one, which is not as safe as the original one.
#+begin_src c :tangle basic_text.c
#if defined _POSIX_C_SOURCE && (_POSIX_C_SOURCE - 0) >= 200809L
#else
char* mkdtemp(char* template) {
char* dir = NULL;
dir = tmpnam(dir);
if (dir == NULL) return NULL;
if (mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {
return NULL;
}
strcpy(template, dir);
return template;
}
#endif
#+end_src
#+begin_src c :tangle basic_text.c #+begin_src c :tangle basic_text.c
trexio_exit_code trexio_exit_code
trexio_text_init (trexio_t* const file) trexio_text_init (trexio_t* const file)

View File

@ -60,8 +60,22 @@
"1n9n1gbk5hgvg73am991xrv7ap002rz719a3nvh8m8ff9x10qd76" "1n9n1gbk5hgvg73am991xrv7ap002rz719a3nvh8m8ff9x10qd76"
)))))) ))))))
(define-public trexio-2.3
(package/inherit trexio-2.0
(version "2.3.0")
(source (origin
(method url-fetch)
(uri (string-append "https://github.com/TREX-CoE/trexio/releases/download/v" version
"/trexio-" version
".tar.gz"))
(sha256
(base32
;; the hash below is produced by guix download <url>
"183wljg1avsia2pf2wb59s2i2qw6y19qfw164ffy1g024b6362ii"
))))))
(define-public trexio (define-public trexio
;; Default version of TREXIO. ;; Default version of TREXIO.
trexio-2.2) trexio-2.3)
trexio trexio