mirror of
https://github.com/TREX-CoE/trexio.git
synced 2024-11-04 05:03:58 +01:00
commit
cdf25b4162
@ -56,7 +56,7 @@ AC_PROG_LN_S
|
|||||||
## ---------
|
## ---------
|
||||||
|
|
||||||
# Checks for basic header files.
|
# Checks for basic header files.
|
||||||
AC_CHECK_HEADERS([fcntl.h inttypes.h stdint.h stdlib.h string.h unistd.h])
|
AC_CHECK_HEADERS([fcntl.h inttypes.h stdint.h stdbool.h stdlib.h string.h unistd.h])
|
||||||
|
|
||||||
|
|
||||||
### HDF5
|
### HDF5
|
||||||
|
@ -50,11 +50,12 @@ typedef int32_t trexio_exit_code;
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "trexio.h"
|
#include "trexio.h"
|
||||||
#include "trexio_s.h"
|
|
||||||
#include "trexio_private.h"
|
#include "trexio_private.h"
|
||||||
|
#include "trexio_s.h"
|
||||||
#include "trexio_text.h"
|
#include "trexio_text.h"
|
||||||
#include "trexio_hdf5.h"
|
#include "trexio_hdf5.h"
|
||||||
/*
|
/*
|
||||||
@ -71,6 +72,7 @@ typedef int32_t trexio_exit_code;
|
|||||||
#include "trexio.h"
|
#include "trexio.h"
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Coding conventions
|
* Coding conventions
|
||||||
@ -422,11 +424,12 @@ typedef struct trexio_s trexio_t;
|
|||||||
|
|
||||||
#+begin_src c :tangle prefix_s_front.h
|
#+begin_src c :tangle prefix_s_front.h
|
||||||
struct trexio_s {
|
struct trexio_s {
|
||||||
char* file_name;
|
char file_name[TREXIO_MAX_FILENAME_LENGTH];
|
||||||
pthread_mutex_t thread_lock;
|
pthread_mutex_t thread_lock;
|
||||||
back_end_t back_end;
|
back_end_t back_end;
|
||||||
char mode;
|
char mode;
|
||||||
char padding[7]; /* Ensures the proper alignment of back ends */
|
bool one_based;
|
||||||
|
char padding[6]; /* Ensures the proper alignment of back ends */
|
||||||
};
|
};
|
||||||
#+end_src
|
#+end_src
|
||||||
** Polymorphism of the file handle
|
** Polymorphism of the file handle
|
||||||
@ -459,11 +462,13 @@ struct trexio_back_end_s {
|
|||||||
output:
|
output:
|
||||||
~trexio_t~ file handle
|
~trexio_t~ file handle
|
||||||
|
|
||||||
Note: the ~file_name~ in TEXT back end actually corresponds to the name of the folder where ~.txt~
|
Note: the ~file_name~ in TEXT back end actually corresponds to the
|
||||||
data files are stored. The actual name of each ~.txt~ file corresponds to the group name provided in
|
name of the directory where ~.txt~ data files are stored. The
|
||||||
~trex.config~ (e.g. ~nucleus.txt~ for nuclei-related data).
|
actual name of each ~.txt~ file corresponds to the group name
|
||||||
These names are populated by the generator.py (i.e. they are hard-coded), which is why the user
|
provided in ~trex.config~ (e.g. ~nucleus.txt~ for nuclei-related
|
||||||
should tend to avoid renaming the ~.txt~ data files.
|
data). These names are populated by the generator.py (i.e. they
|
||||||
|
are hard-coded), which is why the user should tend to avoid
|
||||||
|
renaming the ~.txt~ data files.
|
||||||
|
|
||||||
#+begin_src c :tangle prefix_front.h :exports none
|
#+begin_src c :tangle prefix_front.h :exports none
|
||||||
trexio_t* trexio_open(const char* file_name, const char mode, const back_end_t back_end);
|
trexio_t* trexio_open(const char* file_name, const char mode, const back_end_t back_end);
|
||||||
@ -510,16 +515,15 @@ trexio_open(const char* file_name, const char mode,
|
|||||||
|
|
||||||
/* Data for the parent type */
|
/* Data for the parent type */
|
||||||
|
|
||||||
result->file_name = CALLOC(TREXIO_MAX_FILENAME_LENGTH, char);
|
|
||||||
strncpy(result->file_name, file_name, TREXIO_MAX_FILENAME_LENGTH);
|
strncpy(result->file_name, file_name, TREXIO_MAX_FILENAME_LENGTH);
|
||||||
if (result->file_name[TREXIO_MAX_FILENAME_LENGTH-1] != '\0') {
|
if (result->file_name[TREXIO_MAX_FILENAME_LENGTH-1] != '\0') {
|
||||||
free(result->file_name);
|
|
||||||
free(result);
|
free(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
result->back_end = back_end;
|
result->back_end = back_end;
|
||||||
result->mode = mode;
|
result->mode = mode;
|
||||||
|
result->one_based = false; // Need to be flipped in Fortran interface
|
||||||
int irc = pthread_mutex_init ( &(result->thread_lock), NULL);
|
int irc = pthread_mutex_init ( &(result->thread_lock), NULL);
|
||||||
assert (irc == 0);
|
assert (irc == 0);
|
||||||
|
|
||||||
@ -546,7 +550,6 @@ trexio_open(const char* file_name, const char mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rc != TREXIO_SUCCESS) {
|
if (rc != TREXIO_SUCCESS) {
|
||||||
free(result->file_name);
|
|
||||||
free(result);
|
free(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -572,7 +575,6 @@ trexio_open(const char* file_name, const char mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rc != TREXIO_SUCCESS) {
|
if (rc != TREXIO_SUCCESS) {
|
||||||
free(result->file_name);
|
|
||||||
free(result);
|
free(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -593,6 +595,34 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
Because arrays are zero-based in Fortran, we need to set a flag to
|
||||||
|
know if we need to shift by 1 arrays of indices.
|
||||||
|
|
||||||
|
#+begin_src c :tangle prefix_front.h :exports none
|
||||||
|
trexio_exit_code trexio_set_one_based(trexio_t* file);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle prefix_front.c
|
||||||
|
trexio_exit_code trexio_set_one_based(trexio_t* file)
|
||||||
|
{
|
||||||
|
if (file == NULL)
|
||||||
|
return TREXIO_FILE_ERROR;
|
||||||
|
|
||||||
|
file->one_based = true;
|
||||||
|
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle prefix_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_set_one_based(trex_file) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
end function trexio_set_one_based
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
** File closing
|
** File closing
|
||||||
|
|
||||||
~trexio_close~ closes an existing ~trexio_t~ file.
|
~trexio_close~ closes an existing ~trexio_t~ file.
|
||||||
@ -636,7 +666,6 @@ trexio_close (trexio_t* file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rc != TREXIO_SUCCESS) {
|
if (rc != TREXIO_SUCCESS) {
|
||||||
FREE(file->file_name);
|
|
||||||
FREE(file);
|
FREE(file);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -663,8 +692,6 @@ trexio_close (trexio_t* file)
|
|||||||
|
|
||||||
/* Terminate front end */
|
/* Terminate front end */
|
||||||
|
|
||||||
FREE(file->file_name);
|
|
||||||
|
|
||||||
int irc = pthread_mutex_destroy( &(file->thread_lock) );
|
int irc = pthread_mutex_destroy( &(file->thread_lock) );
|
||||||
|
|
||||||
free(file);
|
free(file);
|
||||||
@ -1102,6 +1129,7 @@ trexio_read_$group_dset$_64 (trexio_t* const file, $group_dset_dtype_double$* co
|
|||||||
|
|
||||||
/* Error handling for this call is added by the generator */
|
/* Error handling for this call is added by the generator */
|
||||||
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
@ -1110,22 +1138,36 @@ trexio_read_$group_dset$_64 (trexio_t* const file, $group_dset_dtype_double$* co
|
|||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
|
|
||||||
|
rc = TREXIO_FAILURE;
|
||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
return trexio_text_read_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_text_read_$group_dset$(file, $group_dset$, rank, dims);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
return trexio_hdf5_read_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_hdf5_read_$group_dset$(file, $group_dset$, rank, dims);
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
return trexio_json_read_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_json_read_$group_dset$(file, $group_dset$, rank, dims);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
}
|
}
|
||||||
return TREXIO_FAILURE;
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
|
/* Handle index type */
|
||||||
|
if ($is_index$) {
|
||||||
|
uint64_t dim_size = 1;
|
||||||
|
for (uint32_t i=0; i<rank; ++i){
|
||||||
|
dim_size *= dims[i];
|
||||||
|
}
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$[i] += ($group_dset_dtype_single$) 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1143,30 +1185,56 @@ trexio_write_$group_dset$_64 (trexio_t* const file, const $group_dset_dtype_doub
|
|||||||
|
|
||||||
/* Error handling for this call is added by the generator */
|
/* Error handling for this call is added by the generator */
|
||||||
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
uint32_t rank = $group_dset_rank$;
|
uint32_t rank = $group_dset_rank$;
|
||||||
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
|
$group_dset_dtype_double$* $group_dset$_p = $group_dset$;
|
||||||
|
|
||||||
|
/* Handle index type */
|
||||||
|
if ($is_index$) {
|
||||||
|
|
||||||
|
uint64_t dim_size = 1;
|
||||||
|
for (uint32_t i=0; i<rank; ++i){
|
||||||
|
dim_size *= dims[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$group_dset$_p = CALLOC(dim_size, $group_dset_dtype_double$);
|
||||||
|
if ($group_dset$_p == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$_p[i] = $group_dset$_p[i] - ($group_dset_dtype_single$) 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
|
|
||||||
|
rc = TREXIO_FAILURE;
|
||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
return trexio_text_write_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_text_write_$group_dset$(file, $group_dset$_p, rank, dims);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
return trexio_hdf5_write_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_hdf5_write_$group_dset$(file, $group_dset$_p, rank, dims);
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
return trexio_json_write_$group_dset$(file, $group_dset$, rank, dims);
|
rc = trexio_json_write_$group_dset$(file, $group_dset$_p, rank, dims);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
}
|
}
|
||||||
return TREXIO_FAILURE;
|
|
||||||
|
/* Handle index type */
|
||||||
|
if ($is_index$) {
|
||||||
|
FREE($group_dset$_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1190,7 +1258,7 @@ trexio_read_$group_dset$_32 (trexio_t* const file, $group_dset_dtype_single$* co
|
|||||||
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
uint64_t dim_size = 1;
|
uint64_t dim_size = 1;
|
||||||
for (unsigned int i=0; i<rank; ++i){
|
for (uint32_t i=0; i<rank; ++i){
|
||||||
dim_size *= dims[i];
|
dim_size *= dims[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1222,8 +1290,14 @@ trexio_read_$group_dset$_32 (trexio_t* const file, $group_dset_dtype_single$* co
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint64_t i=0; i<dim_size; ++i){
|
if ($is_index$) {
|
||||||
$group_dset$[i] = ($group_dset_dtype_single$) $group_dset$_64[i];
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$[i] = ($group_dset_dtype_single$) $group_dset$_64[i] + ($group_dset_dtype_single$) 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$[i] = ($group_dset_dtype_single$) $group_dset$_64[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE($group_dset$_64);
|
FREE($group_dset$_64);
|
||||||
@ -1252,7 +1326,7 @@ trexio_write_$group_dset$_32 (trexio_t* const file, const $group_dset_dtype_sing
|
|||||||
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
uint64_t dim_size = 1;
|
uint64_t dim_size = 1;
|
||||||
for (unsigned int i=0; i<rank; ++i){
|
for (uint32_t i=0; i<rank; ++i){
|
||||||
dim_size *= dims[i];
|
dim_size *= dims[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1260,8 +1334,14 @@ trexio_write_$group_dset$_32 (trexio_t* const file, const $group_dset_dtype_sing
|
|||||||
if ($group_dset$_64 == NULL) return TREXIO_ALLOCATION_FAILED;
|
if ($group_dset$_64 == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
/* A type conversion from single precision to double reqired since back end only accepts 64-bit data */
|
/* A type conversion from single precision to double reqired since back end only accepts 64-bit data */
|
||||||
for (uint64_t i=0; i<dim_size; ++i){
|
if ($is_index$) {
|
||||||
$group_dset$_64[i] = ($group_dset_dtype_double$) $group_dset$[i];
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$_64[i] = ($group_dset_dtype_double$) $group_dset$[i] - ($group_dset_dtype_double$) 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$_64[i] = ($group_dset_dtype_double$) $group_dset$[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
@ -1535,13 +1615,22 @@ contains
|
|||||||
integer(8) function trexio_open (filename, mode, backend)
|
integer(8) function trexio_open (filename, mode, backend)
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
implicit none
|
implicit none
|
||||||
character(len=*) :: filename
|
character(len=*) :: filename
|
||||||
character, intent(in), value :: mode
|
character, intent(in), value :: mode
|
||||||
integer(trexio_backend), intent(in), value :: backend
|
integer(trexio_backend), intent(in), value :: backend
|
||||||
character(len=len_trim(filename)+1) :: filename_c
|
character(len=len_trim(filename)+1) :: filename_c
|
||||||
|
integer :: rc
|
||||||
|
|
||||||
filename_c = trim(filename) // c_null_char
|
filename_c = trim(filename) // c_null_char
|
||||||
trexio_open = trexio_open_c(filename_c, mode, backend)
|
trexio_open = trexio_open_c(filename_c, mode, backend)
|
||||||
|
if (trexio_open == 0_8) then
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
rc = trexio_set_one_based(trexio_open)
|
||||||
|
if (rc /= TREXIO_SUCCESS) then
|
||||||
|
rc = trexio_close(trexio_open)
|
||||||
|
trexio_open = 0_8
|
||||||
|
endif
|
||||||
end function trexio_open
|
end function trexio_open
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
character*(128) :: str
|
character*(128) :: str
|
||||||
|
|
||||||
|
|
||||||
|
integer :: basis_nucleus_index(12)
|
||||||
double precision :: charge(12)
|
double precision :: charge(12)
|
||||||
double precision :: coord(3,12)
|
double precision :: coord(3,12)
|
||||||
|
|
||||||
@ -55,6 +56,8 @@ subroutine test_write(file_name, back_end)
|
|||||||
0.00000000d0, 2.47304151d0 , 0.00000000d0 /), &
|
0.00000000d0, 2.47304151d0 , 0.00000000d0 /), &
|
||||||
shape(coord) )
|
shape(coord) )
|
||||||
|
|
||||||
|
basis_nucleus_index = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 /)
|
||||||
|
|
||||||
! ================= START OF TEST ===================== !
|
! ================= START OF TEST ===================== !
|
||||||
|
|
||||||
trex_file = trexio_open(file_name, 'w', back_end)
|
trex_file = trexio_open(file_name, 'w', back_end)
|
||||||
@ -63,7 +66,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_HAS_NOT) then
|
if (rc == TREXIO_HAS_NOT) then
|
||||||
write(*,*) 'SUCCESS HAS NOT 1'
|
write(*,*) 'SUCCESS HAS NOT 1'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -72,7 +75,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_HAS_NOT) then
|
if (rc == TREXIO_HAS_NOT) then
|
||||||
write(*,*) 'SUCCESS HAS NOT 2'
|
write(*,*) 'SUCCESS HAS NOT 2'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -82,7 +85,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS WRITE NUM'
|
write(*,*) 'SUCCESS WRITE NUM'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -91,7 +94,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS WRITE CHARGE'
|
write(*,*) 'SUCCESS WRITE CHARGE'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -100,7 +103,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS WRITE COORD'
|
write(*,*) 'SUCCESS WRITE COORD'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -109,7 +112,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS HAS 1'
|
write(*,*) 'SUCCESS HAS 1'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -118,7 +121,16 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS HAS 2'
|
write(*,*) 'SUCCESS HAS 2'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
|
print *, trim(str)
|
||||||
|
call exit(1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
rc = trexio_write_basis_nucleus_index(trex_file, basis_nucleus_index)
|
||||||
|
if (rc == TREXIO_SUCCESS) then
|
||||||
|
write(*,*) 'SUCCESS WRITE INDEX'
|
||||||
|
else
|
||||||
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -127,7 +139,7 @@ subroutine test_write(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS CLOSE'
|
write(*,*) 'SUCCESS CLOSE'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -172,6 +184,7 @@ subroutine test_read(file_name, back_end)
|
|||||||
integer :: rc = 1
|
integer :: rc = 1
|
||||||
integer :: num, num_read
|
integer :: num, num_read
|
||||||
|
|
||||||
|
integer :: basis_nucleus_index(12)
|
||||||
double precision :: charge(12)
|
double precision :: charge(12)
|
||||||
double precision :: coord(3,12)
|
double precision :: coord(3,12)
|
||||||
|
|
||||||
@ -188,7 +201,7 @@ subroutine test_read(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS .and. num_read == num) then
|
if (rc == TREXIO_SUCCESS .and. num_read == num) then
|
||||||
write(*,*) 'SUCCESS READ NUM'
|
write(*,*) 'SUCCESS READ NUM'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
@ -199,7 +212,7 @@ subroutine test_read(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS .and. (dabs(charge(11) - 1.d0) < 1.0D-8) ) then
|
if (rc == TREXIO_SUCCESS .and. (dabs(charge(11) - 1.d0) < 1.0D-8) ) then
|
||||||
write(*,*) 'SUCCESS READ CHARGE'
|
write(*,*) 'SUCCESS READ CHARGE'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(-1)
|
call exit(-1)
|
||||||
endif
|
endif
|
||||||
@ -209,16 +222,26 @@ subroutine test_read(file_name, back_end)
|
|||||||
if (rc == TREXIO_SUCCESS .and. (dabs(coord(2,1) - 1.39250319d0) < 1.0D-8) ) then
|
if (rc == TREXIO_SUCCESS .and. (dabs(coord(2,1) - 1.39250319d0) < 1.0D-8) ) then
|
||||||
write(*,*) 'SUCCESS READ COORD'
|
write(*,*) 'SUCCESS READ COORD'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(-1)
|
call exit(-1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
rc = trexio_read_basis_nucleus_index(trex_file, basis_nucleus_index)
|
||||||
|
if (rc == TREXIO_SUCCESS .and. (basis_nucleus_index(12) == 12) ) then
|
||||||
|
write(*,*) 'SUCCESS READ INDEX'
|
||||||
|
else
|
||||||
|
call trexio_string_of_error(rc,str)
|
||||||
|
print *, trim(str)
|
||||||
|
call exit(-1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
rc = trexio_close(trex_file)
|
rc = trexio_close(trex_file)
|
||||||
if (rc == TREXIO_SUCCESS) then
|
if (rc == TREXIO_SUCCESS) then
|
||||||
write(*,*) 'SUCCESS CLOSE'
|
write(*,*) 'SUCCESS CLOSE'
|
||||||
else
|
else
|
||||||
call trexio_string_of_error(TREXIO_READONLY,str)
|
call trexio_string_of_error(rc,str)
|
||||||
print *, trim(str)
|
print *, trim(str)
|
||||||
call exit(1)
|
call exit(1)
|
||||||
endif
|
endif
|
||||||
|
@ -100,7 +100,7 @@ def recursive_populate_file(fname: str, paths: dict, detailed_source: dict) -> N
|
|||||||
fname_new = join('populated',f'pop_{fname}')
|
fname_new = join('populated',f'pop_{fname}')
|
||||||
templ_path = get_template_path(fname, paths)
|
templ_path = get_template_path(fname, paths)
|
||||||
|
|
||||||
triggers = ['group_dset_dtype', 'group_dset_h5_dtype', 'default_prec',
|
triggers = ['group_dset_dtype', 'group_dset_h5_dtype', 'default_prec', 'is_index',
|
||||||
'group_dset_f_dtype_default', 'group_dset_f_dtype_double', 'group_dset_f_dtype_single',
|
'group_dset_f_dtype_default', 'group_dset_f_dtype_double', 'group_dset_f_dtype_single',
|
||||||
'group_dset_dtype_default', 'group_dset_dtype_double', 'group_dset_dtype_single',
|
'group_dset_dtype_default', 'group_dset_dtype_double', 'group_dset_dtype_single',
|
||||||
'group_dset_rank', 'group_dset_dim_list', 'group_dset_f_dims',
|
'group_dset_rank', 'group_dset_dim_list', 'group_dset_f_dims',
|
||||||
@ -472,7 +472,7 @@ def split_dset_dict_detailed (datasets: dict) -> tuple:
|
|||||||
default_prec = '64'
|
default_prec = '64'
|
||||||
group_dset_std_dtype_out = '24.16e'
|
group_dset_std_dtype_out = '24.16e'
|
||||||
group_dset_std_dtype_in = 'lf'
|
group_dset_std_dtype_in = 'lf'
|
||||||
elif v[0] == 'int':
|
elif v[0] in ['int', 'index']:
|
||||||
datatype = 'int64_t'
|
datatype = 'int64_t'
|
||||||
group_dset_h5_dtype = 'native_int64'
|
group_dset_h5_dtype = 'native_int64'
|
||||||
group_dset_f_dtype_default= 'integer(4)'
|
group_dset_f_dtype_default= 'integer(4)'
|
||||||
@ -490,6 +490,11 @@ def split_dset_dict_detailed (datasets: dict) -> tuple:
|
|||||||
|
|
||||||
# add the dset name for templates
|
# add the dset name for templates
|
||||||
tmp_dict['group_dset'] = k
|
tmp_dict['group_dset'] = k
|
||||||
|
# add flag to detect index types
|
||||||
|
if 'index' == v[0]:
|
||||||
|
tmp_dict['is_index'] = 'file->one_based'
|
||||||
|
else:
|
||||||
|
tmp_dict['is_index'] = 'false'
|
||||||
# add the datatypes for templates
|
# add the datatypes for templates
|
||||||
tmp_dict['dtype'] = datatype
|
tmp_dict['dtype'] = datatype
|
||||||
tmp_dict['group_dset_dtype'] = datatype
|
tmp_dict['group_dset_dtype'] = datatype
|
||||||
|
104
trex.json
104
trex.json
@ -1,104 +0,0 @@
|
|||||||
{
|
|
||||||
|
|
||||||
"metadata": {
|
|
||||||
"code_num" : [ "int", [] ]
|
|
||||||
, "code" : [ "str", [ "metadata.code_num" ] ]
|
|
||||||
, "author_num" : [ "int", [] ]
|
|
||||||
, "author" : [ "str", [ "metadata.author_num" ] ]
|
|
||||||
, "description" : [ "str", [] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"electron": {
|
|
||||||
"up_num" : [ "int", [] ]
|
|
||||||
, "dn_num" : [ "int", [] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"nucleus": {
|
|
||||||
"num" : [ "int" , [] ]
|
|
||||||
, "charge" : [ "float", [ "nucleus.num" ] ]
|
|
||||||
, "coord" : [ "float", [ "nucleus.num", "3" ] ]
|
|
||||||
, "label" : [ "str" , [ "nucleus.num" ] ]
|
|
||||||
, "point_group" : [ "str" , [] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"ecp": {
|
|
||||||
"lmax_plus_1" : [ "int" , [ "nucleus.num" ] ]
|
|
||||||
, "z_core" : [ "float", [ "nucleus.num" ] ]
|
|
||||||
, "local_n" : [ "int" , [ "nucleus.num" ] ]
|
|
||||||
, "local_num_n_max" : [ "int" , [] ]
|
|
||||||
, "local_exponent" : [ "float", [ "nucleus.num", "ecp.local_num_n_max" ] ]
|
|
||||||
, "local_coef" : [ "float", [ "nucleus.num", "ecp.local_num_n_max" ] ]
|
|
||||||
, "local_power" : [ "int" , [ "nucleus.num", "ecp.local_num_n_max" ] ]
|
|
||||||
, "non_local_n" : [ "int" , [ "nucleus.num" ] ]
|
|
||||||
, "non_local_num_n_max" : [ "int" , [] ]
|
|
||||||
, "non_local_exponent" : [ "float", [ "nucleus.num", "ecp.non_local_num_n_max" ] ]
|
|
||||||
, "non_local_coef" : [ "float", [ "nucleus.num", "ecp.non_local_num_n_max" ] ]
|
|
||||||
, "non_local_power" : [ "int" , [ "nucleus.num", "ecp.non_local_num_n_max" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"basis": {
|
|
||||||
"type" : [ "str" , [] ]
|
|
||||||
, "shell_num" : [ "int" , [] ]
|
|
||||||
, "shell_center" : [ "int" , [ "basis.shell_num" ] ]
|
|
||||||
, "shell_ang_mom" : [ "int" , [ "basis.shell_num" ] ]
|
|
||||||
, "shell_prim_num" : [ "int" , [ "basis.shell_num" ] ]
|
|
||||||
, "shell_factor" : [ "float", [ "basis.shell_num" ] ]
|
|
||||||
, "prim_index" : [ "int" , [ "basis.shell_num" ] ]
|
|
||||||
, "prim_num" : [ "int" , [] ]
|
|
||||||
, "exponent" : [ "float", [ "basis.prim_num" ] ]
|
|
||||||
, "coefficient" : [ "float", [ "basis.prim_num" ] ]
|
|
||||||
, "prim_factor" : [ "float", [ "basis.prim_num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"ao": {
|
|
||||||
"cartesian" : [ "int" , [] ]
|
|
||||||
, "num" : [ "int" , [] ]
|
|
||||||
, "shell" : [ "int" , [ "ao.num" ] ]
|
|
||||||
, "normalization" : [ "float", [ "ao.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"ao_1e_int": {
|
|
||||||
"overlap" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
, "kinetic" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
, "potential_n_e" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
, "ecp_local" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
, "ecp_non_local" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
, "core_hamiltonian" : [ "float", [ "ao.num", "ao.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"ao_2e_int": {
|
|
||||||
"eri" : [ "float sparse", [ "ao.num", "ao.num", "ao.num", "ao.num" ] ]
|
|
||||||
, "eri_lr" : [ "float sparse", [ "ao.num", "ao.num", "ao.num", "ao.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"mo": {
|
|
||||||
"type" : [ "str" , [] ]
|
|
||||||
, "num" : [ "int" , [] ]
|
|
||||||
, "coefficient" : [ "float", [ "mo.num", "ao.num" ] ]
|
|
||||||
, "class" : [ "str" , [ "mo.num" ] ]
|
|
||||||
, "symmetry" : [ "str" , [ "mo.num" ] ]
|
|
||||||
, "occupation" : [ "float", [ "mo.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"mo_1e_int": {
|
|
||||||
"overlap" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
, "kinetic" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
, "potential_n_e" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
, "ecp_local" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
, "ecp_non_local" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
, "core_hamiltonian" : [ "float", [ "mo.num", "mo.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"mo_2e_int": {
|
|
||||||
"eri" : [ "float sparse", [ "mo.num", "mo.num", "mo.num", "mo.num" ] ]
|
|
||||||
, "eri_lr" : [ "float sparse", [ "mo.num", "mo.num", "mo.num", "mo.num" ] ]
|
|
||||||
} ,
|
|
||||||
|
|
||||||
"rdm": {
|
|
||||||
"one_e" : [ "float" , [ "mo.num", "mo.num" ] ]
|
|
||||||
, "one_e_up" : [ "float" , [ "mo.num", "mo.num" ] ]
|
|
||||||
, "one_e_dn" : [ "float" , [ "mo.num", "mo.num" ] ]
|
|
||||||
, "two_e" : [ "float sparse", [ "mo.num", "mo.num", "mo.num", "mo.num" ] ]
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
16
trex.org
16
trex.org
@ -7,6 +7,10 @@ column-major order (as in Fortran), and the ordering of the dimensions
|
|||||||
is reversed in the produces JSON configuration file as the library is
|
is reversed in the produces JSON configuration file as the library is
|
||||||
written in C.
|
written in C.
|
||||||
|
|
||||||
|
In Fortran, the arrays are 1-based and in most other languages the
|
||||||
|
arrays are 0-base. Hence, we introduce the ~index~ type which is an
|
||||||
|
1-based ~int~ in the Fortran interface and 0-based otherwise.
|
||||||
|
|
||||||
#+begin_src python :tangle trex.json
|
#+begin_src python :tangle trex.json
|
||||||
{
|
{
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -198,12 +202,12 @@ written in C.
|
|||||||
| ~type~ | ~str~ | | Type of basis set: "Gaussian" or "Slater" |
|
| ~type~ | ~str~ | | Type of basis set: "Gaussian" or "Slater" |
|
||||||
| ~num~ | ~int~ | | Total Number of shells |
|
| ~num~ | ~int~ | | Total Number of shells |
|
||||||
| ~prim_num~ | ~int~ | | Total number of primitives |
|
| ~prim_num~ | ~int~ | | Total number of primitives |
|
||||||
| ~nucleus_index~ | ~int~ | ~(nucleus.num)~ | Index of the first shell of each nucleus ($A$) |
|
| ~nucleus_index~ | ~index~ | ~(nucleus.num)~ | Index of the first shell of each nucleus ($A$) |
|
||||||
| ~nucleus_shell_num~ | ~int~ | ~(nucleus.num)~ | Number of shells for each nucleus |
|
| ~nucleus_shell_num~ | ~int~ | ~(nucleus.num)~ | Number of shells for each nucleus |
|
||||||
| ~shell_ang_mom~ | ~int~ | ~(basis.num)~ | Angular momentum ~0:S, 1:P, 2:D, ...~ |
|
| ~shell_ang_mom~ | ~int~ | ~(basis.num)~ | Angular momentum ~0:S, 1:P, 2:D, ...~ |
|
||||||
| ~shell_prim_num~ | ~int~ | ~(basis.num)~ | Number of primitives in the shell ($N_{\text{prim}}$) |
|
| ~shell_prim_num~ | ~int~ | ~(basis.num)~ | Number of primitives in the shell ($N_{\text{prim}}$) |
|
||||||
| ~shell_factor~ | ~float~ | ~(basis.num)~ | Normalization factor of the shell ($\mathcal{N}_s$) |
|
| ~shell_factor~ | ~float~ | ~(basis.num)~ | Normalization factor of the shell ($\mathcal{N}_s$) |
|
||||||
| ~shell_prim_index~ | ~int~ | ~(basis.num)~ | Index of the first primitive in the complete list |
|
| ~shell_prim_index~ | ~index~ | ~(basis.num)~ | Index of the first primitive in the complete list |
|
||||||
| ~exponent~ | ~float~ | ~(basis.prim_num)~ | Exponents of the primitives ($\gamma_{ks}) |
|
| ~exponent~ | ~float~ | ~(basis.prim_num)~ | Exponents of the primitives ($\gamma_{ks}) |
|
||||||
| ~coefficient~ | ~float~ | ~(basis.prim_num)~ | Coefficients of the primitives ($a_{ks}$) |
|
| ~coefficient~ | ~float~ | ~(basis.prim_num)~ | Coefficients of the primitives ($a_{ks}$) |
|
||||||
| ~prim_factor~ | ~float~ | ~(basis.prim_num)~ | Normalization coefficients for the primitives ($f_{ks}$) |
|
| ~prim_factor~ | ~float~ | ~(basis.prim_num)~ | Normalization coefficients for the primitives ($f_{ks}$) |
|
||||||
@ -217,12 +221,12 @@ written in C.
|
|||||||
"type" : [ "str" , [] ]
|
"type" : [ "str" , [] ]
|
||||||
, "num" : [ "int" , [] ]
|
, "num" : [ "int" , [] ]
|
||||||
, "prim_num" : [ "int" , [] ]
|
, "prim_num" : [ "int" , [] ]
|
||||||
, "nucleus_index" : [ "int" , [ "nucleus.num" ] ]
|
, "nucleus_index" : [ "index" , [ "nucleus.num" ] ]
|
||||||
, "nucleus_shell_num" : [ "int" , [ "nucleus.num" ] ]
|
, "nucleus_shell_num" : [ "int" , [ "nucleus.num" ] ]
|
||||||
, "shell_ang_mom" : [ "int" , [ "basis.num" ] ]
|
, "shell_ang_mom" : [ "int" , [ "basis.num" ] ]
|
||||||
, "shell_prim_num" : [ "int" , [ "basis.num" ] ]
|
, "shell_prim_num" : [ "int" , [ "basis.num" ] ]
|
||||||
, "shell_factor" : [ "float", [ "basis.num" ] ]
|
, "shell_factor" : [ "float", [ "basis.num" ] ]
|
||||||
, "shell_prim_index" : [ "int" , [ "basis.num" ] ]
|
, "shell_prim_index" : [ "index" , [ "basis.num" ] ]
|
||||||
, "exponent" : [ "float", [ "basis.prim_num" ] ]
|
, "exponent" : [ "float", [ "basis.prim_num" ] ]
|
||||||
, "coefficient" : [ "float", [ "basis.prim_num" ] ]
|
, "coefficient" : [ "float", [ "basis.prim_num" ] ]
|
||||||
, "prim_factor" : [ "float", [ "basis.prim_num" ] ]
|
, "prim_factor" : [ "float", [ "basis.prim_num" ] ]
|
||||||
@ -333,7 +337,7 @@ prim_factor =
|
|||||||
#+NAME: ao
|
#+NAME: ao
|
||||||
| ~cartesian~ | ~int~ | | ~1~: true, ~0~: false |
|
| ~cartesian~ | ~int~ | | ~1~: true, ~0~: false |
|
||||||
| ~num~ | ~int~ | | Total number of atomic orbitals |
|
| ~num~ | ~int~ | | Total number of atomic orbitals |
|
||||||
| ~shell~ | ~int~ | ~(ao.num)~ | basis set shell for each AO |
|
| ~shell~ | ~index~ | ~(ao.num)~ | basis set shell for each AO |
|
||||||
| ~normalization~ | ~float~ | ~(ao.num)~ | Normalization factors |
|
| ~normalization~ | ~float~ | ~(ao.num)~ | Normalization factors |
|
||||||
|
|
||||||
#+CALL: json(data=ao, title="ao")
|
#+CALL: json(data=ao, title="ao")
|
||||||
@ -344,7 +348,7 @@ prim_factor =
|
|||||||
"ao": {
|
"ao": {
|
||||||
"cartesian" : [ "int" , [] ]
|
"cartesian" : [ "int" , [] ]
|
||||||
, "num" : [ "int" , [] ]
|
, "num" : [ "int" , [] ]
|
||||||
, "shell" : [ "int" , [ "ao.num" ] ]
|
, "shell" : [ "index", [ "ao.num" ] ]
|
||||||
, "normalization" : [ "float", [ "ao.num" ] ]
|
, "normalization" : [ "float", [ "ao.num" ] ]
|
||||||
} ,
|
} ,
|
||||||
#+end_src
|
#+end_src
|
||||||
|
Loading…
Reference in New Issue
Block a user