mirror of
https://github.com/TREX-CoE/trexio.git
synced 2024-12-22 12:23:54 +01:00
[WIP] text back end
This commit is contained in:
parent
e5d6104a63
commit
a2fee3164b
@ -112,6 +112,7 @@ TESTS_C = \
|
|||||||
tests/io_dset_float_text \
|
tests/io_dset_float_text \
|
||||||
tests/io_dset_int_text \
|
tests/io_dset_int_text \
|
||||||
tests/io_dset_sparse_text \
|
tests/io_dset_sparse_text \
|
||||||
|
tests/io_determinant_text \
|
||||||
tests/io_safe_dset_float_text \
|
tests/io_safe_dset_float_text \
|
||||||
tests/io_str_text \
|
tests/io_str_text \
|
||||||
tests/io_dset_str_text \
|
tests/io_dset_str_text \
|
||||||
|
@ -39,6 +39,9 @@ echo "" >> trexio_f.f90
|
|||||||
cat populated/pop_*.c >> trexio.c
|
cat populated/pop_*.c >> trexio.c
|
||||||
cat populated/pop_*.h >> trexio.h
|
cat populated/pop_*.h >> trexio.h
|
||||||
|
|
||||||
|
cat hrw_determinant_front.h >> trexio.h
|
||||||
|
cat *_determinant_front.c >> trexio.c
|
||||||
|
|
||||||
# fortran front end
|
# fortran front end
|
||||||
cat populated/pop_*.f90 >> trexio_f.f90
|
cat populated/pop_*.f90 >> trexio_f.f90
|
||||||
# add helper functions
|
# add helper functions
|
||||||
|
@ -2749,7 +2749,7 @@ trexio_read_$group_dset$(trexio_t* const file,
|
|||||||
if (rc != TREXIO_SUCCESS) return rc;
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
// introduce a new variable which will be modified with the number of integrals being read if EOF is encountered
|
// introduce a new variable which will be modified with the number of integrals being read if EOF is encountered
|
||||||
int64_t eof_read_size = 0UL;
|
int64_t eof_read_size = 0L;
|
||||||
|
|
||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
@ -4128,18 +4128,16 @@ def delete_$group$(trexio_file) -> None:
|
|||||||
|
|
||||||
#+begin_src c :tangle hrw_determinant_front.h :exports none
|
#+begin_src c :tangle hrw_determinant_front.h :exports none
|
||||||
trexio_exit_code trexio_has_determinant_list(trexio_t* const file);
|
trexio_exit_code trexio_has_determinant_list(trexio_t* const file);
|
||||||
trexio_exit_code trexio_read_determinant_list(trexio_t* const file, int64_t* const dset);
|
|
||||||
trexio_exit_code trexio_write_determinant_list(trexio_t* const file, const int64_t* dset);
|
|
||||||
trexio_exit_code trexio_has_determinant_coefficient(trexio_t* const file);
|
trexio_exit_code trexio_has_determinant_coefficient(trexio_t* const file);
|
||||||
trexio_exit_code trexio_read_determinant_coefficient(trexio_t* const file, double* const dset);
|
trexio_exit_code trexio_read_determinant_list(trexio_t* const file, const int64_t offset_file, int64_t* const buffer_size, int64_t* const dset);
|
||||||
trexio_exit_code trexio_write_determinant_coefficient(trexio_t* const file, const double* dset);
|
trexio_exit_code trexio_write_determinant_list(trexio_t* const file, const int64_t offset_file, const int64_t buffer_size, const int64_t* dset);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
**** Source code for default functions
|
**** Source code for default functions
|
||||||
|
|
||||||
#+begin_src c :tangle read_determinant_front.c
|
#+begin_src c :tangle read_determinant_front.c
|
||||||
trexio_exit_code
|
trexio_exit_code
|
||||||
trexio_read_determinant_list (trexio_t* const file, int64_t* const dset)
|
trexio_read_determinant_list (trexio_t* const file, const int64_t offset_file, int64_t* const buffer_size, int64_t* const dset)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
@ -4147,116 +4145,92 @@ trexio_read_determinant_list (trexio_t* const file, int64_t* const dset)
|
|||||||
if (trexio_has_determinant_list(file) != TREXIO_SUCCESS) return TREXIO_DSET_MISSING;
|
if (trexio_has_determinant_list(file) != TREXIO_SUCCESS) return TREXIO_DSET_MISSING;
|
||||||
|
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
int64_t det_dim = 0L;
|
|
||||||
|
|
||||||
rc = trexio_read_determinant_num_64(file, &det_dim);
|
/* Read the number of mos */
|
||||||
|
int64_t mo_num = 0L;
|
||||||
|
rc = trexio_read_mo_num_64(file, &mo_num);
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
if (det_dim == 0L) return TREXIO_INVALID_NUM;
|
if (mo_num == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
/* Compute how many integer numbers is needed to represent a determinant */
|
||||||
|
uint32_t int_num = 0;
|
||||||
|
int_num = ((mo_num - 1)/64) + 1;
|
||||||
|
|
||||||
uint32_t rank = 2;
|
uint32_t rank = 2;
|
||||||
uint64_t dims[2] = {det_dim, 2};
|
uint64_t det_size = (uint64_t) (*buffer_size);
|
||||||
|
uint64_t dims[2] = {det_size, int_num*2UL};
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
// introduce a new variable which will be modified with the number of integrals being read if EOF is encountered
|
||||||
|
int64_t eof_read_size = 0L;
|
||||||
|
|
||||||
rc = TREXIO_FAILURE;
|
|
||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
return trexio_text_read_determinant_list(file, dset, rank, dims);
|
rc = trexio_text_read_determinant_list(file, offset_file, rank, dims, &eof_read_size, dset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
return trexio_hdf5_read_determinant_list(file, dset, rank, dims);
|
rc = -1; //trexio_hdf5_read_determinant_list(file, offset_file, rank, dims, &eof_read_size, dset);
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
return TREXIO_BACK_END_MISSING;
|
rc = TREXIO_BACK_END_MISSING;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
return trexio_json_read_
|
return trexio_json_read_$group_dset$(...);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
|
default:
|
||||||
|
rc = TREXIO_FAILURE; /* Impossible case */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rc != TREXIO_SUCCESS && rc != TREXIO_END) return rc;
|
||||||
|
|
||||||
|
if (rc == TREXIO_END) *buffer_size = eof_read_size;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trexio_exit_code
|
|
||||||
trexio_read_determinant_coefficient (trexio_t* const file, double* const dset)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
|
||||||
if (dset == NULL) return TREXIO_INVALID_ARG_2;
|
|
||||||
if (trexio_has_determinant_coefficient(file) != TREXIO_SUCCESS) return TREXIO_DSET_MISSING;
|
|
||||||
|
|
||||||
trexio_exit_code rc;
|
|
||||||
int64_t det_dim = 0L;
|
|
||||||
|
|
||||||
rc = trexio_read_determinant_num_64(file, &det_dim);
|
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
|
||||||
if (det_dim == 0L) return TREXIO_INVALID_NUM;
|
|
||||||
|
|
||||||
uint32_t rank = 1;
|
|
||||||
uint64_t dims[1] = {det_dim};
|
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
|
||||||
|
|
||||||
rc = TREXIO_FAILURE;
|
|
||||||
switch (file->back_end) {
|
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
|
||||||
return trexio_text_read_determinant_coefficient(file, dset, rank, dims);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
|
||||||
#ifdef HAVE_HDF5
|
|
||||||
return trexio_hdf5_read_determinant_coefficient(file, dset, rank, dims);
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
return TREXIO_BACK_END_MISSING;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
case TREXIO_JSON:
|
|
||||||
return trexio_json_read_
|
|
||||||
break;
|
|
||||||
,*/
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle write_determinant_front.c
|
#+begin_src c :tangle write_determinant_front.c
|
||||||
trexio_exit_code
|
trexio_exit_code
|
||||||
trexio_write_determinant_list (trexio_t* const file, const int64_t* dset)
|
trexio_write_determinant_list (trexio_t* const file, const int64_t offset_file, const int64_t buffer_size, const int64_t* dset)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
if (dset == NULL) return TREXIO_INVALID_ARG_2;
|
if (dset == NULL) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
int64_t det_dim = 0L;
|
|
||||||
|
|
||||||
rc = trexio_read_determinant_num_64(file, &det_dim);
|
/* Read the number of mos */
|
||||||
|
int64_t mo_num = 0L;
|
||||||
|
rc = trexio_read_mo_num_64(file, &mo_num);
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
if (det_dim == 0L) return TREXIO_INVALID_NUM;
|
if (mo_num == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
/* Compute how many integer numbers is needed to represent a determinant */
|
||||||
|
uint32_t int_num = 0;
|
||||||
|
int_num = ((mo_num - 1)/64) + 1;
|
||||||
|
|
||||||
uint32_t rank = 2;
|
uint32_t rank = 2;
|
||||||
uint64_t dims[2] = {det_dim, 2};
|
uint64_t dims[2] = {buffer_size, int_num*2UL};
|
||||||
|
|
||||||
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_determinant_list(file, dset, rank, dims);
|
return trexio_text_write_determinant_list(file, offset_file, rank, dims, dset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
return trexio_hdf5_write_determinant_list(file, dset, rank, dims);
|
return -1; //trexio_hdf5_write_determinant_list(file, dset, rank, dims);
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
return TREXIO_BACK_END_MISSING;
|
return TREXIO_BACK_END_MISSING;
|
||||||
@ -4271,47 +4245,6 @@ trexio_write_determinant_list (trexio_t* const file, const int64_t* dset)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trexio_exit_code
|
|
||||||
trexio_write_determinant_coefficient (trexio_t* const file, const double* dset)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
|
||||||
if (dset == NULL) return TREXIO_INVALID_ARG_2;
|
|
||||||
|
|
||||||
trexio_exit_code rc;
|
|
||||||
int64_t det_dim = 0L;
|
|
||||||
|
|
||||||
rc = trexio_read_determinant_num_64(file, &det_dim);
|
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
|
||||||
if (det_dim == 0L) return TREXIO_INVALID_NUM;
|
|
||||||
|
|
||||||
uint32_t rank = 1;
|
|
||||||
uint64_t dims[1] = {det_dim};
|
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
|
||||||
|
|
||||||
rc = TREXIO_FAILURE;
|
|
||||||
switch (file->back_end) {
|
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
|
||||||
return trexio_text_write_determinant_coefficient(file, dset, rank, dims);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
|
||||||
#ifdef HAVE_HDF5
|
|
||||||
return trexio_hdf5_write_determinant_coefficient(file, dset, rank, dims);
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
return TREXIO_BACK_END_MISSING;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
case TREXIO_JSON:
|
|
||||||
return trexio_json_read_
|
|
||||||
break;
|
|
||||||
,*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle has_determinant_front.c
|
#+begin_src c :tangle has_determinant_front.c
|
||||||
@ -4326,11 +4259,11 @@ trexio_has_determinant_list (trexio_t* const file)
|
|||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
return trexio_text_has_determinant_list(file)
|
return trexio_text_has_determinant_list(file);
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
return trexio_hdf5_has_determinant_list(file);
|
return -1; //trexio_hdf5_has_determinant_list(file);
|
||||||
#else
|
#else
|
||||||
return TREXIO_BACK_END_MISSING;
|
return TREXIO_BACK_END_MISSING;
|
||||||
#endif
|
#endif
|
||||||
@ -4355,11 +4288,11 @@ trexio_has_determinant_coefficient (trexio_t* const file)
|
|||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
return trexio_text_has_determinant_coefficient(file)
|
return -1; //trexio_text_has_determinant_coefficient(file);
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
return trexio_hdf5_has_determinant_coefficient(file);
|
return -1; //trexio_hdf5_has_determinant_coefficient(file);
|
||||||
#else
|
#else
|
||||||
return TREXIO_BACK_END_MISSING;
|
return TREXIO_BACK_END_MISSING;
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,6 +10,9 @@ cat populated/pop_struct_text_group_dset.h >> trexio_text.h
|
|||||||
cat populated/pop_struct_text_group.h >> trexio_text.h
|
cat populated/pop_struct_text_group.h >> trexio_text.h
|
||||||
cat basic_text.h >> trexio_text.h
|
cat basic_text.h >> trexio_text.h
|
||||||
|
|
||||||
|
cat hrw_determinant_text.h >> trexio_text.h
|
||||||
|
cat *_determinant_text.c >> trexio_text.c
|
||||||
|
|
||||||
cat populated/pop_free_group_text.c >> trexio_text.c
|
cat populated/pop_free_group_text.c >> trexio_text.c
|
||||||
cat populated/pop_read_group_text.c >> trexio_text.c
|
cat populated/pop_read_group_text.c >> trexio_text.c
|
||||||
cat populated/pop_flush_group_text.c >> trexio_text.c
|
cat populated/pop_flush_group_text.c >> trexio_text.c
|
||||||
|
@ -1313,6 +1313,182 @@ trexio_text_delete_$group$ (trexio_t* const file)
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** Source code for the determinant part
|
||||||
|
|
||||||
|
Each array is stored in a separate =.txt= file due to the fact that determinant I/O has to be decoupled
|
||||||
|
from conventional write/read/flush behaviour of the TEXT back end. Chunks are used to read/write the data
|
||||||
|
to prevent memory overflow. Chunks have a given ~int64_t size~.
|
||||||
|
Size specifies the number of data items, e.g. determinants.
|
||||||
|
|
||||||
|
|
||||||
|
#+begin_src c :tangle hrw_determinant_text.h :exports none
|
||||||
|
trexio_exit_code trexio_text_has_determinant_list(trexio_t* const file);
|
||||||
|
trexio_exit_code trexio_text_read_determinant_list(trexio_t* const file, const int64_t offset_file, const uint32_t rank, const uint64_t* dims, int64_t* const eof_read_size, int64_t* const list);
|
||||||
|
trexio_exit_code trexio_text_write_determinant_list(trexio_t* const file, const int64_t offset_file, const uint32_t rank, const uint64_t* dims, const int64_t* list);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle read_determinant_text.c
|
||||||
|
trexio_exit_code trexio_text_read_determinant_list(
|
||||||
|
trexio_t* const file,
|
||||||
|
const int64_t offset_file,
|
||||||
|
const uint32_t rank,
|
||||||
|
const uint64_t* dims,
|
||||||
|
int64_t* const eof_read_size,
|
||||||
|
int64_t* const list)
|
||||||
|
{
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
if (eof_read_size == NULL) return TREXIO_INVALID_ARG_5;
|
||||||
|
|
||||||
|
const char determinant_list_file_name[256] = "/determinant_list.txt";
|
||||||
|
/* The full path to the destination TXT file with sparse data. This will include TREXIO directory name. */
|
||||||
|
char file_full_path[TREXIO_MAX_FILENAME_LENGTH];
|
||||||
|
|
||||||
|
/* Copy directory name in file_full_path */
|
||||||
|
strncpy (file_full_path, file->file_name, TREXIO_MAX_FILENAME_LENGTH);
|
||||||
|
/* Append name of the file with sparse data */
|
||||||
|
strncat (file_full_path, determinant_list_file_name,
|
||||||
|
TREXIO_MAX_FILENAME_LENGTH-strlen(determinant_list_file_name));
|
||||||
|
|
||||||
|
/* Open the file in "r" (read) mode to guarantee that no truncation happens upon consecutive reads */
|
||||||
|
FILE* f = fopen(file_full_path, "r");
|
||||||
|
if(f == NULL) return TREXIO_FILE_ERROR;
|
||||||
|
|
||||||
|
/* Specify the line length in order to offset properly.
|
||||||
|
Each 64-bit integer takes at most 10 slots and requires one space,
|
||||||
|
we have int_num integers per up-spin determinant,
|
||||||
|
then this number is doubled because we have the same number for down-spin electrons,
|
||||||
|
and then one newline char.
|
||||||
|
,*/
|
||||||
|
uint64_t line_length = 6UL*10UL + 6UL; // + 6UL + 1UL; // dims[1]*11UL + 1UL;
|
||||||
|
|
||||||
|
/* Offset in the file according to the provided value of offset_file and optimal line_length */
|
||||||
|
fseek(f, (long) offset_file * line_length, SEEK_SET);
|
||||||
|
|
||||||
|
/* Read the data from the file and check the return code of fprintf to verify that > 0 bytes have been read or reached EOF */
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
//char buffer[16];
|
||||||
|
char* buffer = CALLOC(line_length+1, char);
|
||||||
|
|
||||||
|
uint64_t count = 0UL;
|
||||||
|
int shift = 0;
|
||||||
|
uint64_t accum = 0UL;
|
||||||
|
for (uint64_t i=0UL; i < (uint64_t) dims[0]; ++i) {
|
||||||
|
|
||||||
|
accum = 0UL;
|
||||||
|
memset(buffer, 0, line_length+1); // sizeof(buffer)); //1024);
|
||||||
|
|
||||||
|
if(fgets(buffer, line_length, f) == NULL){
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
FREE(buffer);
|
||||||
|
*eof_read_size = count;
|
||||||
|
return TREXIO_END;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* The format string is not anymore static but rather dynamic (the number of ints depend on the mo_num)
|
||||||
|
Thus, we parse the buffer string int_num*2 times to get the bit field determinants.
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (int32_t j=0; j<dims[1]; ++j) {
|
||||||
|
rc = sscanf(buffer, "%10" SCNd64 "%n", list + i + j, &shift);
|
||||||
|
if(rc <= 0) {
|
||||||
|
fclose(f);
|
||||||
|
FREE(buffer);
|
||||||
|
return TREXIO_FAILURE;
|
||||||
|
}
|
||||||
|
buffer += shift;
|
||||||
|
accum += shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
count += 1UL;
|
||||||
|
buffer -= accum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE(buffer);
|
||||||
|
|
||||||
|
/* Close the TXT file */
|
||||||
|
rc = fclose(f);
|
||||||
|
if(rc != 0) return TREXIO_FILE_ERROR;
|
||||||
|
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle write_determinant_text.c
|
||||||
|
trexio_exit_code trexio_text_write_determinant_list(trexio_t* const file,
|
||||||
|
const int64_t offset_file,
|
||||||
|
const uint32_t rank,
|
||||||
|
const uint64_t* dims,
|
||||||
|
const int64_t* list)
|
||||||
|
{
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
|
||||||
|
const char determinant_list_file_name[256] = "/determinant_list.txt";
|
||||||
|
/* The full path to the destination TXT file with sparse data. This will include TREXIO directory name. */
|
||||||
|
char file_full_path[TREXIO_MAX_FILENAME_LENGTH];
|
||||||
|
|
||||||
|
/* Copy directory name in file_full_path */
|
||||||
|
strncpy (file_full_path, file->file_name, TREXIO_MAX_FILENAME_LENGTH);
|
||||||
|
/* Append name of the file with sparse data */
|
||||||
|
strncat (file_full_path, determinant_list_file_name,
|
||||||
|
TREXIO_MAX_FILENAME_LENGTH-strlen(determinant_list_file_name));
|
||||||
|
|
||||||
|
/* Open the file in "a" (append) mode to guarantee that no truncation happens upon consecutive reads */
|
||||||
|
FILE* f = fopen(file_full_path, "a");
|
||||||
|
if(f == NULL) return TREXIO_FILE_ERROR;
|
||||||
|
|
||||||
|
/* Write the data in the file and check the return code of fprintf to verify that > 0 bytes have been written */
|
||||||
|
int rc;
|
||||||
|
for (uint64_t i=0UL; i < dims[0]; ++i) {
|
||||||
|
|
||||||
|
/* The loop below is needed to write a line with int bit fields for alpha and beta electrons */
|
||||||
|
for (uint32_t j=0; j < (uint32_t) dims[1]; ++j) {
|
||||||
|
rc = fprintf(f, "%10" PRId64 " ", *(list + i + j));
|
||||||
|
if(rc <= 0) {
|
||||||
|
fclose(f);
|
||||||
|
return TREXIO_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(f, "%s", "\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the TXT file */
|
||||||
|
rc = fclose(f);
|
||||||
|
if (rc != 0) return TREXIO_FILE_ERROR;
|
||||||
|
|
||||||
|
/* Exit upon success */
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle has_determinant_text.c
|
||||||
|
trexio_exit_code trexio_text_has_determinant_list(trexio_t* const file)
|
||||||
|
{
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
|
||||||
|
const char determinant_list_file_name[256] = "/determinant_list.txt";
|
||||||
|
/* The full path to the destination TXT file with sparse data. This will include TREXIO directory name. */
|
||||||
|
char file_full_path[TREXIO_MAX_FILENAME_LENGTH];
|
||||||
|
|
||||||
|
/* Copy directory name in file_full_path */
|
||||||
|
strncpy (file_full_path, file->file_name, TREXIO_MAX_FILENAME_LENGTH);
|
||||||
|
/* Append name of the file with sparse data */
|
||||||
|
strncat (file_full_path, determinant_list_file_name,
|
||||||
|
TREXIO_MAX_FILENAME_LENGTH-strlen(determinant_list_file_name));
|
||||||
|
|
||||||
|
/* Check the return code of access function to determine whether the file with data exists or not */
|
||||||
|
if (access(file_full_path, F_OK) == 0){
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
} else {
|
||||||
|
return TREXIO_HAS_NOT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
* Constant file suffixes (not used by the generator) :noexport:
|
* Constant file suffixes (not used by the generator) :noexport:
|
||||||
|
|
||||||
#+begin_src c :tangle suffix_text.h
|
#+begin_src c :tangle suffix_text.h
|
||||||
|
@ -4,6 +4,7 @@ from generator_tools import *
|
|||||||
# --------------------- GET CONFIGURATION FROM THE TREX.JSON ---------------- #
|
# --------------------- GET CONFIGURATION FROM THE TREX.JSON ---------------- #
|
||||||
config_file = 'trex.json'
|
config_file = 'trex.json'
|
||||||
trex_config = read_json(config_file)
|
trex_config = read_json(config_file)
|
||||||
|
trex_config.pop('determinant')
|
||||||
# --------------------------------------------------------------------------- #
|
# --------------------------------------------------------------------------- #
|
||||||
|
|
||||||
# -------------------- GET ATTRIBUTES FROM THE CONFIGURATION ---------------- #
|
# -------------------- GET ATTRIBUTES FROM THE CONFIGURATION ---------------- #
|
||||||
|
Loading…
Reference in New Issue
Block a user