1
0
mirror of https://github.com/TREX-CoE/trexio.git synced 2024-12-23 04:43:57 +01:00

Working text back end [to test]

This commit is contained in:
q-posev 2022-04-11 13:13:56 +02:00
parent a2fee3164b
commit aa47ae4c2e

View File

@ -1313,7 +1313,7 @@ trexio_text_delete_$group$ (trexio_t* const file)
}
#+end_src
** Source code for the determinant part
** 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
@ -1334,7 +1334,7 @@ trexio_exit_code trexio_text_read_determinant_list(
const uint32_t rank,
const uint64_t* dims,
int64_t* const eof_read_size,
int64_t* const list)
int64_t* const list)
{
if (file == NULL) return TREXIO_INVALID_ARG_1;
if (eof_read_size == NULL) return TREXIO_INVALID_ARG_5;
@ -1353,9 +1353,9 @@ trexio_exit_code trexio_text_read_determinant_list(
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,
/* 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.
,*/
@ -1366,49 +1366,43 @@ trexio_exit_code trexio_text_read_determinant_list(
/* 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;
/* Declare fixed buffer which will be used to read the determinant string <a1 a2 ... a/\ b1 b2 ... b\/> */
char buffer[1024];
uint32_t buf_size = sizeof(buffer);
/* Parameters to post-process the buffer and to get bit fields integers */
uint64_t accum = 0UL;
for (uint64_t i=0UL; i < (uint64_t) dims[0]; ++i) {
uint32_t shift_int64 = 10U;
/* Counter for number of elements beind processed */
uint64_t count = 0UL;
for (uint64_t i=0UL; i < dims[0]; ++i) {
accum = 0UL;
memset(buffer, 0, line_length+1); // sizeof(buffer)); //1024);
accum = 0UL;
memset(buffer, 0, buf_size);
if(fgets(buffer, line_length, f) == NULL){
if(fgets(buffer, buf_size-1, f) == NULL){
fclose(f);
FREE(buffer);
*eof_read_size = count;
return TREXIO_END;
fclose(f);
,*eof_read_size = count;
return TREXIO_END;
} else {
} 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;
/* 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 (uint32_t j=0; j < (uint32_t) dims[1]; ++j) {
rc = sscanf(buffer+accum, "%10" SCNd64, list + i + j);
if(rc <= 0) {
fclose(f);
return TREXIO_FAILURE;
}
accum += shift_int64 + 1;
count += 1UL;
buffer -= accum;
}
}
}
FREE(buffer);
/* Close the TXT file */
rc = fclose(f);
if(rc != 0) return TREXIO_FILE_ERROR;
@ -1422,7 +1416,7 @@ 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)
const int64_t* list)
{
if (file == NULL) return TREXIO_INVALID_ARG_1;
@ -1443,7 +1437,7 @@ trexio_exit_code trexio_text_write_determinant_list(trexio_t* const file,
/* 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));
@ -1453,7 +1447,7 @@ trexio_exit_code trexio_text_write_determinant_list(trexio_t* const file,
}
}
fprintf(f, "%s", "\n");
}
/* Close the TXT file */