1
0
mirror of https://github.com/TREX-CoE/trexio.git synced 2024-12-22 20:35:44 +01: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 }}
steps:
- name: Checkout the repo
uses: actions/checkout@v2
uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
# Gets the correct commit message for pull request
with:
ref: ${{ github.event.pull_request.head.sha }}
@ -31,15 +31,13 @@ jobs:
COMMIT_MSG=$(git log --no-merges -1 --oneline)
echo "::set-output name=message::$COMMIT_MSG"
trexio_ubuntu:
runs-on: ubuntu-20.04
name: x86 Ubuntu 20.04
runs-on: ubuntu-20.04
needs: get_commit_message
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
- name: install dependencies
run: |
@ -84,7 +82,7 @@ jobs:
if: >-
contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
github.event_name == 'release'
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2
with:
name: pytrexio-source
path: ./trexio-*.tar.gz
@ -114,29 +112,38 @@ jobs:
run: make maintainer-clean
trexio_macos:
runs-on: macos-11
name: x86 MacOS 11
name: x86 MacOS 12
runs-on: macos-12
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791
- name: install dependencies
run: |
brew install emacs
brew install hdf5
brew install hdf5@1.12
brew install automake
brew --prefix hdf5
- name: configure with autotools
run: |
./autogen.sh
./configure FC=gfortran-10 --enable-silent-rules
./configure FC=gfortran-12 --enable-silent-rules
- name: compile TREXIO
run: make -j 2
run: make -j3
- 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
if: failure()

View File

@ -21,7 +21,7 @@ jobs:
message: ${{ steps.commit_message.outputs.message }}
steps:
- name: Checkout the repo
uses: actions/checkout@v2
uses: actions/checkout@v3
# Gets the correct commit message for pull request
with:
ref: ${{ github.event.pull_request.head.sha }}
@ -42,14 +42,14 @@ jobs:
runs-on: ubuntu-20.04
strategy:
matrix:
manylinux_tag: [2010_x86_64, 2014_x86_64, 2_24_x86_64]
manylinux_tag: [2014_x86_64, 2_24_x86_64]
steps:
- name: Checkout the branch
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v1
uses: actions/setup-python@v4
with:
python-version: '3.9'
@ -103,22 +103,14 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-10.15]
python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
# 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'
os: [macos-12]
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
@ -128,11 +120,6 @@ jobs:
- name: Install HDF5
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
run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\ -f3 | tr -d '"')" >> $GITHUB_ENV
@ -158,6 +145,8 @@ jobs:
run: |
mkdir wheelhouse/
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=./
delocate-wheel trexio-*.whl
mv trexio-*.whl ../wheelhouse/
@ -186,10 +175,10 @@ jobs:
steps:
- name: Checkout the branch
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v1
uses: actions/setup-python@v4
with:
python-version: '3.9'

View File

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

View File

@ -22,8 +22,8 @@ TREX library for efficient I/O.
2. `gzip -cd trexio-<version>.tar.gz | tar xvf -`
3. `cd trexio-<version>`
4. `./configure`
5. `make`
6. `make check`
5. ```make -j`getconf _NPROCESSORS_ONLN` ```
6. ```make -j`getconf _NPROCESSORS_ONLN` check```
7. `sudo make install`
@ -45,8 +45,8 @@ TREX library for efficient I/O.
2. `cd trexio`
3. `./autogen.sh`
4. `./configure`
5. `make`
6. `make check`
5. ```make -j`getconf _NPROCESSORS_ONLN` ```
6. ```make -j`getconf _NPROCESSORS_ONLN` check```
7. `sudo make install`
## 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`
2. `cd build`
3. `make`
4. `ctest` (or `make test`)
3. ```make -j`getconf _NPROCESSORS_ONLN` ```
4. ```ctest -j`getconf _NPROCESSORS_ONLN` ```
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.**
@ -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:
```
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).
@ -88,7 +88,7 @@ Schema file contains the manifest specification for the `trexio` package.
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
@ -100,7 +100,7 @@ file contains the Spack specifications required to build different variants of `
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
@ -127,14 +127,14 @@ To build TREXIO without HDF5 back end, append `--without-hdf5` option to `config
## Linking to your program
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 order to link the program against TREXIO, the search paths can be modified as follows:
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 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
[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.
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_HEADERS([include/config.h])

View File

@ -200,7 +200,7 @@ program print_energy
#+begin_src f90
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
call trexio_string_of_error(rc, err_msg)
print *, 'Error opening TREXIO file: '//trim(err_msg)
@ -410,6 +410,139 @@ program print_energy
end program
#+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
** Fortran

View File

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

View File

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

View File

@ -66,7 +66,7 @@ option(ENABLE_HDF5 "Enable HDF5 support" ON)
if(ENABLE_HDF5)
# 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)
message(STATUS "HDF5 version :: ${HDF5_VERSION}")
@ -87,9 +87,7 @@ if(ENABLE_HDF5)
# - include directories with HDF5 header files
target_include_directories(trexio PRIVATE ${HDF5_C_INCLUDE_DIRS})
# - link to HDF5 C libraries
target_link_libraries(trexio PRIVATE
${HDF5_C_HL_LIBRARIES}
${HDF5_C_LIBRARIES})
target_link_libraries(trexio PRIVATE ${HDF5_C_LIBRARIES})
endif()
# Private headers have to be listed as sources, otherwise they are installed

View File

@ -34,14 +34,14 @@
num variable is modified by address
*/
/* Return num variables as part of the output tuple */
%apply int *OUTPUT { int32_t* const num};
%apply int *OUTPUT { int64_t* const num};
%apply int *OUTPUT { int32_t* const num_up};
%apply int *OUTPUT { int32_t* const num_dn};
%apply int *OUTPUT { int64_t* const num_up};
%apply int *OUTPUT { int64_t* const num_dn};
%apply int32_t *OUTPUT { int32_t* const num};
%apply int64_t *OUTPUT { int64_t* const num};
%apply int32_t *OUTPUT { int32_t* const num_up};
%apply int32_t *OUTPUT { int32_t* const num_dn};
%apply int64_t *OUTPUT { int64_t* const num_up};
%apply int64_t *OUTPUT { int64_t* const num_dn};
%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 */
%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 */

View File

@ -145,10 +145,10 @@ trexio_text_inquire (const char* file_name)
if (file_exists) {
bool is_a_directory = false;
#ifdef S_IFDIR
#if defined(S_IFDIR)
is_a_directory = st.st_mode & S_IFDIR;
#elif S_ISDIR
is_a_directory = S_ISDIR(s.st_mode);
#elif defined(S_ISDIR)
is_a_directory = S_ISDIR(st.st_mode);
#else
printf("Some important macros are missing for directory handling.\n");
return TREXIO_FAILURE;
@ -162,6 +162,29 @@ trexio_text_inquire (const char* file_name)
}
#+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
trexio_exit_code
trexio_text_init (trexio_t* const file)

View File

@ -60,8 +60,22 @@
"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
;; Default version of TREXIO.
trexio-2.2)
trexio-2.3)
trexio