26#include "mdb_thread.h"
29static MDB_THREAD_LOCK defaultStringLengthLock = MDB_THREAD_LOCK_INITIALIZER;
30static int32_t defaultStringLength = SDDS_MPI_STRING_COLUMN_LEN;
32static MDB_THREAD_LOCK defaultTitleBufferSizeLock = MDB_THREAD_LOCK_INITIALIZER;
33static int32_t defaultTitleBufferSize = 2400000;
35static MDB_THREAD_LOCK defaultReadBufferSizeLock = MDB_THREAD_LOCK_INITIALIZER;
36static int32_t defaultReadBufferSize = 4000000;
38static MDB_THREAD_LOCK defaultWriteBufferSizeLock = MDB_THREAD_LOCK_INITIALIZER;
39static int32_t defaultWriteBufferSize = 0;
41static MDB_THREAD_LOCK number_of_string_truncated_lock = MDB_THREAD_LOCK_INITIALIZER;
42static int32_t number_of_string_truncated = 0;
44static MDB_THREAD_LOCK SDDS_MPI_write_kludge_usleep_lock = MDB_THREAD_LOCK_INITIALIZER;
45static long SDDS_MPI_write_kludge_usleep = 0;
47static MDB_THREAD_LOCK SDDS_MPI_force_file_sync_lock = MDB_THREAD_LOCK_INITIALIZER;
48static short SDDS_MPI_force_file_sync = 0;
50static int32_t SDDS_GetLockedDefaultStringLength(
void) {
52 mdb_thread_lock(&defaultStringLengthLock);
53 length = defaultStringLength;
54 mdb_thread_unlock(&defaultStringLengthLock);
58static int32_t SDDS_GetLockedDefaultTitleBufferSize(
void) {
60 mdb_thread_lock(&defaultTitleBufferSizeLock);
61 size = defaultTitleBufferSize;
62 mdb_thread_unlock(&defaultTitleBufferSizeLock);
66static int32_t SDDS_GetLockedDefaultReadBufferSize(
void) {
68 mdb_thread_lock(&defaultReadBufferSizeLock);
69 size = defaultReadBufferSize;
70 mdb_thread_unlock(&defaultReadBufferSizeLock);
74static int32_t SDDS_GetLockedDefaultWriteBufferSize(
void) {
76 mdb_thread_lock(&defaultWriteBufferSizeLock);
77 size = defaultWriteBufferSize;
78 mdb_thread_unlock(&defaultWriteBufferSizeLock);
82static long SDDS_MPI_GetLockedWriteKludgeUsleep(
void) {
84 mdb_thread_lock(&SDDS_MPI_write_kludge_usleep_lock);
85 value = SDDS_MPI_write_kludge_usleep;
86 mdb_thread_unlock(&SDDS_MPI_write_kludge_usleep_lock);
90static short SDDS_MPI_GetLockedForceFileSync(
void) {
92 mdb_thread_lock(&SDDS_MPI_force_file_sync_lock);
93 value = SDDS_MPI_force_file_sync;
94 mdb_thread_unlock(&SDDS_MPI_force_file_sync_lock);
99static FILE *fpdeb = NULL;
115 return SDDS_GetLockedDefaultReadBufferSize();
116 mdb_thread_lock(&defaultReadBufferSizeLock);
117 previous = defaultReadBufferSize;
118 defaultReadBufferSize = newSize;
119 mdb_thread_unlock(&defaultReadBufferSizeLock);
136 return SDDS_GetLockedDefaultWriteBufferSize();
137 mdb_thread_lock(&defaultWriteBufferSizeLock);
138 previous = defaultWriteBufferSize;
139 defaultWriteBufferSize = newSize;
140 mdb_thread_unlock(&defaultWriteBufferSizeLock);
157 return SDDS_GetLockedDefaultTitleBufferSize();
158 mdb_thread_lock(&defaultTitleBufferSizeLock);
159 previous = defaultTitleBufferSize;
160 defaultTitleBufferSize = newSize;
161 mdb_thread_unlock(&defaultTitleBufferSizeLock);
176 mdb_thread_lock(&number_of_string_truncated_lock);
177 count = number_of_string_truncated;
178 mdb_thread_unlock(&number_of_string_truncated_lock);
188 mdb_thread_lock(&number_of_string_truncated_lock);
189 number_of_string_truncated++;
190 mdb_thread_unlock(&number_of_string_truncated_lock);
206 return SDDS_GetLockedDefaultStringLength();
207 mdb_thread_lock(&defaultStringLengthLock);
208 previous = defaultStringLength;
209 defaultStringLength = newValue;
210 mdb_thread_unlock(&defaultStringLengthLock);
225 logDebug(
"SDDS_MPI_WriteBinaryPage", SDDS_dataset);
245 logDebug(
"SDDS_MPI_WriteBinaryString", SDDS_dataset);
251 length = strlen(
string);
274 logDebug(
"SDDS_MPI_WriteNonNativeBinaryString", SDDS_dataset);
280 length = strlen(
string);
308 logDebug(
"SDDS_MPI_WriteBinaryParameters", SDDS_dataset);
314 layout = &SDDS_dataset->layout;
315 for (i = 0; i < layout->n_parameters; i++) {
316 if (layout->parameter_definition[i].fixed_value)
318 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
348 logDebug(
"SDDS_MPI_WriteNonNativeBinaryParameters", SDDS_dataset);
354 layout = &SDDS_dataset->layout;
356 for (i = 0; i < layout->n_parameters; i++) {
357 if (layout->parameter_definition[i].fixed_value)
359 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
388 int32_t i, j, zero = 0, writeSize = 0;
394 layout = &SDDS_dataset->layout;
395 for (i = 0; i < layout->n_arrays; i++) {
396 if (!SDDS_dataset->array[i].dimension) {
397 for (j = 0; j < layout->array_definition[i].dimensions; j++) {
399 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_MPI_WriteBinaryArrays)");
405 writeSize =
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions;
407 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_MPI_WriteBinaryArrays)");
410 if (layout->array_definition[i].type ==
SDDS_STRING) {
411 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
413 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryArrays)");
418 writeSize =
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements;
420 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_MPI_WriteBinaryArrays)");
442 int32_t i, j, zero = 0, writeSize = 0;
450 layout = &SDDS_dataset->layout;
451 for (i = 0; i < layout->n_arrays; i++) {
452 if (!SDDS_dataset->array[i].dimension) {
453 for (j = 0; j < layout->array_definition[i].dimensions; j++) {
455 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_MPI_WriteBinaryArrays)");
462 writeSize =
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions;
464 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_MPI_WriteBinaryArrays)");
468 if (layout->array_definition[i].type ==
SDDS_STRING) {
469 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
471 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryArrays)");
477 writeSize =
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements;
479 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_MPI_WriteBinaryArrays)");
499 mdb_thread_lock(&SDDS_MPI_write_kludge_usleep_lock);
500 SDDS_MPI_write_kludge_usleep = value;
501 mdb_thread_unlock(&SDDS_MPI_write_kludge_usleep_lock);
515 mdb_thread_lock(&SDDS_MPI_force_file_sync_lock);
516 SDDS_MPI_force_file_sync = value;
517 mdb_thread_unlock(&SDDS_MPI_force_file_sync_lock);
539 int32_t currentDefaultStringLength;
540 long writeKludgeUsleep;
543 logDebug(
"SDDS_MPI_WriteBinaryRow", SDDS_dataset);
549 layout = &SDDS_dataset->layout;
550 currentDefaultStringLength = SDDS_GetLockedDefaultStringLength();
552 if (currentDefaultStringLength < 0 || currentDefaultStringLength >= INT32_MAX) {
553 SDDS_SetError(
"Default string length is too large in SDDS_MPI_WriteBinaryRow!");
556 if (snprintf(format,
sizeof(format),
"%%-%" PRId32
"s", currentDefaultStringLength) >= (
int)
sizeof(format)) {
557 SDDS_SetError(
"Default string length is too large in SDDS_MPI_WriteBinaryRow!");
560 if (!(buff = malloc(
sizeof(*buff) * ((
size_t)currentDefaultStringLength + 1)))) {
561 SDDS_SetError(
"Can not allocate memory in SDDS_MPI_WriteBinaryRow!");
564 buff[currentDefaultStringLength] = 0;
565 for (i = 0; i < layout->n_columns; i++) {
566 type = layout->column_definition[i].type;
570 if (strlen(*((
char **)SDDS_dataset->data[i] + row)) <= currentDefaultStringLength)
571 sprintf(buff, format, *((
char **)SDDS_dataset->data[i] + row));
573 strncpy(buff, *((
char **)SDDS_dataset->data[i] + row), currentDefaultStringLength);
589 writeKludgeUsleep = SDDS_MPI_GetLockedWriteKludgeUsleep();
590 if (writeKludgeUsleep)
592 if (SDDS_MPI_GetLockedForceFileSync())
593 MPI_File_sync(SDDS_dataset->MPI_dataset->MPI_file);
616 int32_t currentDefaultStringLength;
617 long writeKludgeUsleep;
619 logDebug(
"SDDS_MPI_WriteNonNativeBinaryRow", SDDS_dataset);
625 layout = &SDDS_dataset->layout;
626 currentDefaultStringLength = SDDS_GetLockedDefaultStringLength();
628 if (currentDefaultStringLength < 0 || currentDefaultStringLength >= INT32_MAX) {
629 SDDS_SetError(
"Default string length is too large in SDDS_MPI_WriteNonNativeBinaryRow!");
632 if (snprintf(format,
sizeof(format),
"%%-%" PRId32
"s", currentDefaultStringLength) >= (
int)
sizeof(format)) {
633 SDDS_SetError(
"Default string length is too large in SDDS_MPI_WriteNonNativeBinaryRow!");
636 if (!(buff = malloc(
sizeof(*buff) * ((
size_t)currentDefaultStringLength + 1)))) {
637 SDDS_SetError(
"Can not allocate memory in SDDS_MPI_WriteNonNativeBinaryRow!");
640 buff[currentDefaultStringLength] = 0;
641 for (i = 0; i < layout->n_columns; i++) {
642 type = layout->column_definition[i].type;
646 if (strlen(*((
char **)SDDS_dataset->data[i] + row)) <= currentDefaultStringLength)
647 sprintf(buff, format, *((
char **)SDDS_dataset->data[i] + row));
649 strncpy(buff, *((
char **)SDDS_dataset->data[i] + row), currentDefaultStringLength);
665 writeKludgeUsleep = SDDS_MPI_GetLockedWriteKludgeUsleep();
666 if (writeKludgeUsleep)
668 if (SDDS_MPI_GetLockedForceFileSync())
669 MPI_File_sync(SDDS_dataset->MPI_dataset->MPI_file);
685 MPI_Offset column_offset = 0;
687 int32_t currentDefaultStringLength;
689 layout = &SDDS_dataset->layout;
690 currentDefaultStringLength = SDDS_GetLockedDefaultStringLength();
691 for (i = 0; i < layout->n_columns; i++) {
692 if (layout->column_definition[i].type ==
SDDS_STRING)
695 column_offset +=
sizeof(int32_t) + currentDefaultStringLength *
sizeof(
char);
697 column_offset +=
SDDS_type_size[layout->column_definition[i].type - 1];
699 return column_offset;
716 MPI_DATASET *MPI_dataset;
720 logDebug(
"SDDS_MPI_BufferedWrite", SDDS_dataset);
722 MPI_dataset = SDDS_dataset->MPI_dataset;
723 fBuffer = &(SDDS_dataset->fBuffer);
725 if (!fBuffer->bufferSize) {
726 if ((mpi_code = MPI_File_write(MPI_dataset->MPI_file, target, targetSize, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
727 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
732 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
733 memcpy((
char *)fBuffer->data, (
char *)target, targetSize);
734 fBuffer->data += targetSize;
736 fprintf(stderr,
"SDDS_MPI_BufferedWrite of %" PRId64
" bytes done in-memory, %" PRId64
" bytes left\n", targetSize, fBuffer->bytesLeft);
745 lastLeft = (fBuffer->bytesLeft += targetSize);
747 memcpy((
char *)fBuffer->data, (
char *)target, (
size_t)fBuffer->bytesLeft);
748 if ((mpi_code = MPI_File_write(MPI_dataset->MPI_file, fBuffer->buffer, (
int)(fBuffer->bufferSize), MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
749 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
757 fBuffer->data = fBuffer->buffer;
758 if ((targetSize -= lastLeft) > (fBuffer->bytesLeft = fBuffer->bufferSize)) {
759 if ((mpi_code = MPI_File_write_at(MPI_dataset->MPI_file, (MPI_Offset)(MPI_dataset->file_offset), (
char *)target + lastLeft, targetSize, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
760 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
768 memcpy((
char *)fBuffer->data, (
char *)target + lastLeft, targetSize);
769 fBuffer->data += targetSize;
770 fBuffer->bytesLeft -= targetSize;
788 MPI_DATASET *MPI_dataset;
792 logDebug(
"SDDS_MPI_BufferedWriteAll", SDDS_dataset);
794 MPI_dataset = SDDS_dataset->MPI_dataset;
795 fBuffer = &(SDDS_dataset->fBuffer);
797 if (!fBuffer->bufferSize) {
798 if ((mpi_code = MPI_File_write_all(MPI_dataset->MPI_file, target, targetSize, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
799 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
804 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
805 memcpy((
char *)fBuffer->data, (
char *)target, targetSize);
806 fBuffer->data += targetSize;
808 fprintf(stderr,
"SDDS_MPI_BufferedWrite of %" PRId64
" bytes done in-memory, %" PRId64
" bytes left\n", targetSize, fBuffer->bytesLeft);
817 lastLeft = (fBuffer->bytesLeft += targetSize);
819 memcpy((
char *)fBuffer->data, (
char *)target, (
size_t)fBuffer->bytesLeft);
820 if ((mpi_code = MPI_File_write_all(MPI_dataset->MPI_file, fBuffer->buffer, (
int)(fBuffer->bufferSize), MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
821 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
829 fBuffer->data = fBuffer->buffer;
830 if ((targetSize -= lastLeft) > (fBuffer->bytesLeft = fBuffer->bufferSize)) {
831 if ((mpi_code = MPI_File_write_all(MPI_dataset->MPI_file, (
char *)target + lastLeft, targetSize, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
832 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_WriteBufferedWrite(MPI_File_write_at failed)", mpi_code, 0);
840 memcpy((
char *)fBuffer->data, (
char *)target + lastLeft, targetSize);
841 fBuffer->data += targetSize;
842 fBuffer->bytesLeft -= targetSize;
860 MPI_DATASET *MPI_dataset;
865 logDebug(
"SDDS_MPI_FlushBuffer", SDDS_dataset);
868 MPI_dataset = SDDS_dataset->MPI_dataset;
869 fBuffer = &(SDDS_dataset->fBuffer);
871 if (!fBuffer->bufferSize)
874 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
875 if (writeBytes < 0) {
876 SDDS_SetError(
"Unable to flush buffer: negative byte count (SDDS_FlushBuffer).");
880 fprintf(stderr,
"Writing %" PRId64
" bytes to disk\n", writeBytes);
882 if ((mpi_code = MPI_File_write(MPI_dataset->MPI_file, fBuffer->buffer, writeBytes, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
883 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_FlushBuffer(MPI_File_write_at failed)", mpi_code, 0);
886 fBuffer->bytesLeft = fBuffer->bufferSize;
887 fBuffer->data = fBuffer->buffer;
905 for (i = start_row; i < end_row; i++) {
906 if (i > SDDS_dataset->n_rows - 1)
908 if (SDDS_dataset->row_flag[i])
925 MPI_Reduce(&(SDDS_dataset->n_rows), &total_rows, 1, MPI_INT64_T, MPI_SUM, 0, SDDS_dataset->MPI_dataset->comm);
943 int64_t row, prev_rows, i, total_rows, fixed_rows, rows;
944 int mpi_code, type = 0;
945 MPI_Offset column_offset, rowcount_offset, offset;
946 int64_t *n_rows = NULL;
948 int32_t min32 = INT32_MIN;
950 MPI_DATASET *MPI_dataset = NULL;
954 logDebug(
"SDDS_MPI_WriteNonNativeBinaryPage", SDDS_dataset);
957 MPI_dataset = SDDS_dataset->MPI_dataset;
966 fBuffer = &SDDS_dataset->fBuffer;
967 if (SDDS_dataset->layout.data_mode.column_major)
969 rows = SDDS_dataset->n_rows;
972 if (!fBuffer->buffer) {
973 fBuffer->bufferSize = SDDS_GetLockedDefaultWriteBufferSize();
974 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
975 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteNonNativeBinaryPage)");
978 fBuffer->bytesLeft = fBuffer->bufferSize;
979 fBuffer->data[0] = 0;
982 if (MPI_dataset->n_page >= 1)
983 MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL);
986 column_offset = MPI_dataset->column_offset;
987 if (!(n_rows = calloc(
sizeof(*n_rows), MPI_dataset->n_processors))) {
991 MPI_Allgather(&rows, 1, MPI_INT64_T, n_rows, 1, MPI_INT64_T, MPI_dataset->comm);
993 for (i = 0; i < MPI_dataset->myid; i++)
994 prev_rows += n_rows[i];
996 for (i = 0; i < MPI_dataset->n_processors; i++)
997 total_rows += n_rows[i];
998 if (MPI_dataset->myid == 0) {
999 fixed_rows = total_rows;
1000 if (!fBuffer->buffer) {
1001 fBuffer->bufferSize = SDDS_GetLockedDefaultWriteBufferSize();
1002 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
1003 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteNonNativeBinaryPage)");
1006 fBuffer->bytesLeft = fBuffer->bufferSize;
1007 fBuffer->data[0] = 0;
1009 if (fixed_rows > INT32_MAX) {
1017 int32_t fixed_rows32;
1018 fixed_rows32 = (int32_t)fixed_rows;
1030 if (SDDS_dataset->layout.data_mode.column_major) {
1032 offset = rowcount_offset;
1033 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
1034 type = SDDS_dataset->layout.column_definition[i].type;
1035 MPI_dataset->file_offset = offset + (MPI_Offset)prev_rows *
SDDS_type_size[type - 1];
1037 SDDS_SetError(
"Can not write string column to SDDS3 (SDDS_MPI_WriteNonNativeBinaryPage");
1040 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
1045 if ((mpi_code = MPI_File_write(MPI_dataset->MPI_file, SDDS_dataset->data[i], rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
1046 SDDS_SetError(
"Unable to write binary columns (SDDS_MPI_WriteNonNativeBinaryPage");
1052 MPI_dataset->file_offset = offset;
1055 MPI_dataset->file_offset = rowcount_offset + (MPI_Offset)prev_rows * column_offset;
1057 MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL);
1058 if (!MPI_dataset->collective_io) {
1060 for (i = 0; i < SDDS_dataset->n_rows; i++) {
1066 SDDS_dataset->n_rows = row;
1072 row = SDDS_dataset->n_rows;
1074 MPI_Allreduce(&row, &total_rows, 1, MPI_INT64_T, MPI_SUM, MPI_dataset->comm);
1075 MPI_dataset->file_offset = rowcount_offset + total_rows * column_offset;
1081 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
1082 SDDS_dataset->n_rows_written = rows;
1083 SDDS_dataset->writing_page = 1;
1084 MPI_dataset->n_page++;
1101 int64_t row, prev_rows, i, total_rows, fixed_rows, rows;
1102 int mpi_code, type = 0;
1103 MPI_Offset column_offset, rowcount_offset, offset;
1104 int64_t *n_rows = NULL;
1105 int32_t min32 = INT32_MIN;
1108 MPI_DATASET *MPI_dataset = NULL;
1110 char *outputEndianess = NULL;
1113 logDebug(
"SDDS_MPI_WriteContinuousBinaryPage", SDDS_dataset);
1118 if ((outputEndianess = getenv(
"SDDS_OUTPUT_ENDIANESS"))) {
1123 MPI_dataset = SDDS_dataset->MPI_dataset;
1128 fBuffer = &SDDS_dataset->fBuffer;
1129 if (SDDS_dataset->layout.data_mode.column_major)
1131 rows = SDDS_dataset->n_rows;
1134 if (!fBuffer->buffer) {
1135 fBuffer->bufferSize = SDDS_GetLockedDefaultWriteBufferSize();
1136 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
1137 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteContinuousBinaryPage)");
1140 fBuffer->bytesLeft = fBuffer->bufferSize;
1141 fBuffer->data[0] = 0;
1144 if (MPI_dataset->n_page >= 1)
1145 MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL);
1148 column_offset = MPI_dataset->column_offset;
1149 if (!(n_rows = calloc(
sizeof(*n_rows), MPI_dataset->n_processors))) {
1153 MPI_Allgather(&rows, 1, MPI_INT64_T, n_rows, 1, MPI_INT64_T, MPI_dataset->comm);
1155 for (i = 0; i < MPI_dataset->myid; i++)
1156 prev_rows += n_rows[i];
1158 for (i = 0; i < MPI_dataset->n_processors; i++)
1159 total_rows += n_rows[i];
1160 if (MPI_dataset->myid == 0) {
1161 fixed_rows = total_rows;
1162 if (!fBuffer->buffer) {
1163 fBuffer->bufferSize = SDDS_GetLockedDefaultWriteBufferSize();
1164 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
1165 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteContinuousBinaryPage)");
1168 fBuffer->bytesLeft = fBuffer->bufferSize;
1169 fBuffer->data[0] = 0;
1171 if (fixed_rows > INT32_MAX) {
1177 int32_t fixed_rows32;
1178 fixed_rows32 = (int32_t)fixed_rows;
1189 if (SDDS_dataset->layout.data_mode.column_major) {
1191 offset = rowcount_offset;
1192 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
1193 type = SDDS_dataset->layout.column_definition[i].type;
1194 MPI_dataset->file_offset = offset + (MPI_Offset)prev_rows *
SDDS_type_size[type - 1];
1196 SDDS_SetError(
"Can not write string column to SDDS3 (SDDS_MPI_WriteContinuousBinaryPage");
1199 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
1204 if ((mpi_code = MPI_File_write(MPI_dataset->MPI_file, SDDS_dataset->data[i], rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
1205 SDDS_SetError(
"Unable to write binary columns (SDDS_MPI_WriteContinuousBinaryPage");
1211 MPI_dataset->file_offset = offset;
1214 MPI_dataset->file_offset = rowcount_offset + (MPI_Offset)prev_rows * column_offset;
1216 MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL);
1217 if (!MPI_dataset->collective_io) {
1219 for (i = 0; i < SDDS_dataset->n_rows; i++) {
1225 SDDS_dataset->n_rows = row;
1231 row = SDDS_dataset->n_rows;
1233 MPI_Allreduce(&row, &total_rows, 1, MPI_INT64_T, MPI_SUM, MPI_dataset->comm);
1234 MPI_dataset->file_offset = rowcount_offset + total_rows * column_offset;
1239 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
1240 SDDS_dataset->n_rows_written = rows;
1241 SDDS_dataset->writing_page = 1;
1242 MPI_dataset->n_page++;
1265 int32_t bytesRead, count;
1267 MPI_DATASET *MPI_dataset = SDDS_dataset->MPI_dataset;
1269 if (!fBuffer || !fBuffer->bufferSize) {
1272 mpi_code = MPI_File_seek(MPI_dataset->MPI_file, targetSize, MPI_SEEK_CUR);
1274 mpi_code = MPI_File_read(MPI_dataset->MPI_file, target, targetSize, MPI_BYTE, &status);
1275 MPI_Get_count(&status, MPI_BYTE, &bytesRead);
1277 MPI_dataset->end_of_file = 1;
1280 if (bytesRead < targetSize)
1283 if (mpi_code != MPI_SUCCESS) {
1289 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
1291 if (target && targetSize > 0) {
1292 memcpy((
char *)target, (
char *)fBuffer->data, (
size_t)targetSize);
1294 fBuffer->data += targetSize;
1298 int64_t bytesNeeded, offset;
1299 fBuffer->bytesLeft += targetSize;
1301 if ((offset = fBuffer->bytesLeft)) {
1303 if (target && offset > 0) {
1304 memcpy((
char *)target, (
char *)fBuffer->data, (
size_t)offset);
1306 bytesNeeded = targetSize - offset;
1307 fBuffer->bytesLeft = 0;
1309 bytesNeeded = targetSize;
1311 fBuffer->data = fBuffer->buffer;
1312 if (fBuffer->bufferSize < bytesNeeded) {
1315 mpi_code = MPI_File_seek(MPI_dataset->MPI_file, targetSize, MPI_SEEK_CUR);
1317 mpi_code = MPI_File_read(MPI_dataset->MPI_file, (
char *)target + offset, bytesNeeded, MPI_BYTE, &status);
1318 MPI_Get_count(&status, MPI_BYTE, &bytesRead);
1320 MPI_dataset->end_of_file = 1;
1323 if (bytesRead < bytesNeeded)
1326 if (mpi_code != MPI_SUCCESS) {
1327 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_ReadBufferedRead(MPI_File_read failed)", mpi_code, 0);
1333 mpi_code = MPI_File_read(MPI_dataset->MPI_file, fBuffer->data, (
int)(fBuffer->bufferSize), MPI_BYTE, &status);
1334 MPI_Get_count(&status, MPI_BYTE, &count);
1335 fBuffer->bytesLeft = count;
1336 if (!(fBuffer->bytesLeft))
1337 MPI_dataset->end_of_file = 1;
1338 if (fBuffer->bytesLeft < bytesNeeded)
1340 if (target && bytesNeeded > 0)
1341 memcpy((
char *)target + offset, (
char *)fBuffer->data, (
size_t)bytesNeeded);
1342 fBuffer->data += bytesNeeded;
1343 fBuffer->bytesLeft -= bytesNeeded;
1365 int32_t mpi_code, bytesRead, count;
1367 MPI_DATASET *MPI_dataset = SDDS_dataset->MPI_dataset;
1369 if (!fBuffer || !fBuffer->bufferSize) {
1372 mpi_code = MPI_File_seek(MPI_dataset->MPI_file, targetSize, MPI_SEEK_CUR);
1374 mpi_code = MPI_File_read_all(MPI_dataset->MPI_file, target, targetSize, MPI_BYTE, &status);
1375 MPI_Get_count(&status, MPI_BYTE, &bytesRead);
1377 MPI_dataset->end_of_file = 1;
1380 if (bytesRead < targetSize)
1383 if (mpi_code != MPI_SUCCESS) {
1389 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
1391 if (target && targetSize > 0) {
1392 memcpy((
char *)target, (
char *)fBuffer->data, (
size_t)targetSize);
1394 fBuffer->data += targetSize;
1398 int64_t bytesNeeded, offset;
1399 fBuffer->bytesLeft += targetSize;
1401 if ((offset = fBuffer->bytesLeft)) {
1403 if (target && offset > 0) {
1404 memcpy((
char *)target, (
char *)fBuffer->data, (
size_t)offset);
1406 bytesNeeded = targetSize - offset;
1407 fBuffer->bytesLeft = 0;
1409 bytesNeeded = targetSize;
1411 fBuffer->data = fBuffer->buffer;
1412 if (fBuffer->bufferSize < bytesNeeded) {
1415 mpi_code = MPI_File_seek(MPI_dataset->MPI_file, targetSize, MPI_SEEK_CUR);
1417 mpi_code = MPI_File_read_all(MPI_dataset->MPI_file, (
char *)target + offset, bytesNeeded, MPI_BYTE, &status);
1418 MPI_Get_count(&status, MPI_BYTE, &bytesRead);
1420 MPI_dataset->end_of_file = 1;
1423 if (bytesRead < bytesNeeded)
1426 if (mpi_code != MPI_SUCCESS) {
1427 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_ReadBufferedRead(MPI_File_read failed)", mpi_code, 0);
1433 mpi_code = MPI_File_read_all(MPI_dataset->MPI_file, fBuffer->data, (
int)(fBuffer->bufferSize), MPI_BYTE, &status);
1434 MPI_Get_count(&status, MPI_BYTE, &count);
1435 fBuffer->bytesLeft = count;
1436 if (!(fBuffer->bytesLeft))
1437 MPI_dataset->end_of_file = 1;
1438 if (fBuffer->bytesLeft < bytesNeeded)
1440 if (target && bytesNeeded > 0)
1441 memcpy((
char *)target + offset, (
char *)fBuffer->data, (
size_t)bytesNeeded);
1442 fBuffer->data += bytesNeeded;
1443 fBuffer->bytesLeft -= bytesNeeded;
1469 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
1471 if (length && !
SDDS_MPI_BufferedRead(skip ? NULL :
string,
sizeof(*
string) * length, SDDS_dataset, fBuffer))
1502 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
1504 if (length && !
SDDS_MPI_BufferedRead(skip ? NULL :
string,
sizeof(*
string) * length, SDDS_dataset, fBuffer))
1527 char buffer[SDDS_MAXLINE];
1531 layout = &SDDS_dataset->layout;
1532 if (!layout->n_parameters)
1534 for (i = 0; i < layout->n_parameters; i++) {
1535 if (layout->parameter_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
1537 if (layout->parameter_definition[i].fixed_value) {
1538 strcpy(buffer, layout->parameter_definition[i].fixed_value);
1539 if (!
SDDS_ScanData(buffer, layout->parameter_definition[i].type, 0, SDDS_dataset->parameter[i], 0, 1)) {
1540 SDDS_SetError(
"Unable to read page--parameter scanning error (SDDS_MPI_ReadBinaryParameters)");
1543 }
else if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1544 if (*(
char **)SDDS_dataset->parameter[i])
1545 free(*(
char **)SDDS_dataset->parameter[i]);
1547 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_MPI_ReadBinaryParameters)");
1552 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_MPI_ReadBinaryParameters)");
1582 layout = &SDDS_dataset->layout;
1583 fBuffer = &SDDS_dataset->fBuffer;
1585 for (i = 0; i < layout->n_columns; i++) {
1586 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
1588 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
1590 if (((
char ***)SDDS_dataset->data)[i][row])
1591 free((((
char ***)SDDS_dataset->data)[i][row]));
1593 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_MPI_ReadBinaryRows)");
1598 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_MPI_ReadBinaryRows)");
1604 if (!
SDDS_MPI_BufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, SDDS_dataset, fBuffer)) {
1605 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_MPI_ReadBinaryRow)");
1635 layout = &SDDS_dataset->layout;
1636 if (!layout->n_arrays)
1639 if (!SDDS_dataset->array) {
1640 SDDS_SetError(
"Unable to read array--pointer to structure storage area is NULL (SDDS_MPI_ReadBinaryArrays)");
1643 for (i = 0; i < layout->n_arrays; i++) {
1644 array = SDDS_dataset->array + i;
1646 SDDS_SetError(
"Unable to get array--array definition corrupted (SDDS_MPI_ReadBinaryArrays)");
1650 SDDS_SetError(
"Unable to read array--definition copy failed (SDDS_MPI_ReadBinaryArrays)");
1654 if (!(array->dimension =
SDDS_Realloc(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions))) {
1655 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_MPI_ReadBinaryArrays)");
1658 if (!
SDDS_MPI_BufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, SDDS_dataset, fBuffer)) {
1659 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_MPI_ReadBinaryArrays)");
1662 array->elements = 1;
1663 for (j = 0; j < array->definition->dimensions; j++)
1664 array->elements *= array->dimension[j];
1667 array->data = array->pointer = NULL;
1668 if (array->elements == 0)
1670 if (array->elements < 0) {
1671 SDDS_SetError(
"Unable to read array--number of elements is negative (SDDS_MPI_ReadBinaryArrays)");
1675 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_MPI_ReadBinaryArrays)");
1679 for (j = 0; j < array->elements; j++) {
1681 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_MPI_ReadBinaryArrays)");
1687 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_MPI_ReadBinaryArrays)");
1712 char buffer[SDDS_MAXLINE];
1716 layout = &SDDS_dataset->layout;
1717 if (!layout->n_parameters)
1719 for (i = 0; i < layout->n_parameters; i++) {
1720 if (layout->parameter_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
1722 if (layout->parameter_definition[i].fixed_value) {
1723 strcpy(buffer, layout->parameter_definition[i].fixed_value);
1724 if (!
SDDS_ScanData(buffer, layout->parameter_definition[i].type, 0, SDDS_dataset->parameter[i], 0, 1)) {
1725 SDDS_SetError(
"Unable to read page--parameter scanning error (SDDS_MPI_ReadNonNativeBinaryParameters)");
1728 }
else if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1729 if (*(
char **)SDDS_dataset->parameter[i])
1730 free(*(
char **)SDDS_dataset->parameter[i]);
1732 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_MPI_ReadNonNativeBinaryParameters)");
1737 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_MPI_ReadNonNativeBinaryParameters)");
1764 layout = &SDDS_dataset->layout;
1765 if (!layout->n_arrays)
1768 if (!SDDS_dataset->array) {
1769 SDDS_SetError(
"Unable to read array--pointer to structure storage area is NULL (SDDS_MPI_ReadNonNativeBinaryArrays)");
1772 for (i = 0; i < layout->n_arrays; i++) {
1773 array = SDDS_dataset->array + i;
1775 SDDS_SetError(
"Unable to get array--array definition corrupted (SDDS_MPI_ReadNonNativeBinaryArrays)");
1779 SDDS_SetError(
"Unable to read array--definition copy failed (SDDS_MPI_ReadNonNativeBinaryArrays)");
1783 if (!(array->dimension =
SDDS_Realloc(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions))) {
1784 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_MPI_ReadNonNativeBinaryArrays)");
1787 if (!
SDDS_MPI_BufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, SDDS_dataset, fBuffer)) {
1788 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_MPI_ReadNonNativeBinaryArrays)");
1792 array->elements = 1;
1793 for (j = 0; j < array->definition->dimensions; j++)
1794 array->elements *= array->dimension[j];
1797 array->data = array->pointer = NULL;
1798 if (array->elements == 0)
1800 if (array->elements < 0) {
1801 SDDS_SetError(
"Unable to read array--number of elements is negative (SDDS_MPI_ReadNonNativeBinaryArrays)");
1805 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_MPI_ReadNonNativeBinaryArrays)");
1809 for (j = 0; j < array->elements; j++) {
1811 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_MPI_ReadNonNativeBinaryArrays)");
1817 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_MPI_ReadNonNativeBinaryArrays)");
1846 layout = &SDDS_dataset->layout;
1847 fBuffer = &SDDS_dataset->fBuffer;
1849 for (i = 0; i < layout->n_columns; i++) {
1850 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
1852 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
1854 if (((
char ***)SDDS_dataset->data)[i][row])
1855 free((((
char ***)SDDS_dataset->data)[i][row]));
1857 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_MPI_ReadNonNativeBinaryRow)");
1862 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_MPI_ReadNonNativeBinaryRow)");
1868 if (!
SDDS_MPI_BufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, SDDS_dataset, fBuffer)) {
1869 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_MPI_ReadNonNativeBinaryRow)");
1888 char *par_data = NULL;
1890 int64_t i, count = 0, *data_len = NULL;
1891 MPI_DATASET *MPI_dataset;
1893 char *
string = NULL;
1895 MPI_dataset = SDDS_dataset->MPI_dataset;
1896 layout = &(SDDS_dataset->layout);
1897 if (!layout->n_parameters && !layout->n_arrays) {
1899 MPI_Bcast(&(MPI_dataset->total_rows), 1, MPI_INT64_T, 0, MPI_dataset->comm);
1902 data_len = calloc(
sizeof(*data_len), 1 + layout->n_parameters);
1903 if (MPI_dataset->myid == 0) {
1904 data_len[0] =
sizeof(int64_t);
1905 count = data_len[0];
1906 for (i = 0; i < layout->n_parameters; i++) {
1907 type = layout->parameter_definition[i].type;
1909 data_len[i + 1] = strlen(*((
char **)SDDS_dataset->parameter[i])) *
sizeof(char);
1913 count += data_len[i + 1];
1915 par_data = (
char *)malloc(
sizeof(
char) * count);
1916 memcpy((
char *)par_data, &(MPI_dataset->total_rows), data_len[0]);
1917 count = data_len[0];
1918 for (i = 0; i < layout->n_parameters; i++) {
1919 if (layout->parameter_definition[i].type ==
SDDS_STRING)
1920 memcpy((
char *)par_data + count, *(
char **)SDDS_dataset->parameter[i], data_len[i + 1]);
1922 memcpy((
char *)par_data + count, (
char *)SDDS_dataset->parameter[i], data_len[i + 1]);
1923 count += data_len[i + 1];
1926 MPI_Bcast(data_len, 1 + layout->n_parameters, MPI_INT64_T, 0, MPI_dataset->comm);
1927 if (MPI_dataset->myid) {
1928 count = data_len[0];
1929 for (i = 0; i < layout->n_parameters; i++)
1930 count += data_len[i + 1];
1931 par_data = (
char *)malloc(
sizeof(
char) * count);
1934 MPI_Bcast(par_data, count, MPI_BYTE, 0, MPI_dataset->comm);
1936 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_MPI_BroadcastTitleData)");
1939 if (MPI_dataset->myid) {
1940 memcpy(&(MPI_dataset->total_rows), (
char *)par_data, data_len[0]);
1941 count = data_len[0];
1942 for (i = 0; i < layout->n_parameters; i++) {
1943 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1944 string = malloc(
sizeof(
char) * (data_len[i + 1] + 1));
1945 memcpy((
char *)
string, (
char *)par_data + count, data_len[i + 1]);
1946 string[data_len[i + 1]] =
'\0';
1947 *(
char **)SDDS_dataset->parameter[i] =
string;
1949 memcpy((
char *)(SDDS_dataset->parameter[i]), (
char *)par_data + count, data_len[i + 1]);
1950 count += data_len[i + 1];
1958 if (layout->n_arrays) {
1959 data_len = malloc(
sizeof(*data_len) * layout->n_arrays);
1960 if (MPI_dataset->myid == 0) {
1961 for (i = 0; i < layout->n_arrays; i++)
1962 data_len[i] = layout->array_definition[i].dimensions;
1964 MPI_Bcast(data_len, layout->n_arrays, MPI_INT64_T, 0, MPI_dataset->comm);
1965 for (i = 0; i < layout->n_arrays; i++) {
1966 type = layout->array_definition[i].type;
1970 if (MPI_dataset->myid == 0) {
1974 MPI_Bcast((
char *)SDDS_dataset->array[i].data, data_len[i] * size, MPI_BYTE, 0, MPI_dataset->comm);
1995 int32_t mpi_code, type = 0, retval, master_read;
1996 int64_t i, j, n_rows, prev_rows;
1997 MPI_DATASET *MPI_dataset;
2003 MPI_dataset = SDDS_dataset->MPI_dataset;
2004 master_read = MPI_dataset->master_read;
2006 if (SDDS_dataset->autoRecovered)
2008 if (SDDS_dataset->swapByteOrder) {
2014 if (MPI_dataset->file_offset >= MPI_dataset->file_size)
2015 return (SDDS_dataset->page_number = -1);
2016 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2018 SDDS_SetError(
"Unable to set view for read binary page(1)");
2021#if defined(MASTER_READTITLE_ONLY)
2022 if (MPI_dataset->myid == 0)
2025#if defined(MASTER_READTITLE_ONLY)
2026 MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_dataset->comm);
2030 return (SDDS_dataset->page_number = -1);
2032 SDDS_SetError(
"Unable to read the SDDS title (row number, parameter and/or array) data");
2035#if defined(MASTER_READTITLE_ONLY)
2039 if (MPI_dataset->total_rows < 0) {
2040 SDDS_SetError(
"Unable to read page--negative number of rows (SDDS_MPI_ReadBinaryPage)");
2045 return (SDDS_dataset->page_number = -1);
2049 n_rows = MPI_dataset->total_rows / MPI_dataset->n_processors;
2050 prev_rows = MPI_dataset->myid * n_rows;
2051 if (MPI_dataset->myid < (ID_offset = MPI_dataset->total_rows % (MPI_dataset->n_processors))) {
2053 prev_rows += MPI_dataset->myid;
2055 prev_rows += ID_offset;
2057 if (MPI_dataset->myid == 0)
2060 n_rows = MPI_dataset->total_rows / (MPI_dataset->n_processors - 1);
2061 prev_rows = (MPI_dataset->myid - 1) * n_rows;
2062 if (MPI_dataset->myid <= (ID_offset = MPI_dataset->total_rows % (MPI_dataset->n_processors - 1))) {
2064 prev_rows += (MPI_dataset->myid - 1);
2066 prev_rows += ID_offset;
2069 MPI_dataset->start_row = prev_rows;
2071 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_MPI_ReadBinaryPage)");
2074 offset = MPI_dataset->file_offset;
2075 fBuffer = &SDDS_dataset->fBuffer;
2077 if (SDDS_dataset->layout.data_mode.column_major) {
2079 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2080 type = SDDS_dataset->layout.column_definition[i].type;
2082 SDDS_SetError(
"Can not read string column from SDDS3 (SDDS_MPI_ReadBinaryPage");
2085 MPI_dataset->file_offset = offset + (MPI_Offset)prev_rows *
SDDS_type_size[type - 1];
2086 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2087 SDDS_SetError(
"Unable to set view for read binary columns");
2090 if (!MPI_dataset->collective_io) {
2091 if ((mpi_code = MPI_File_read(MPI_dataset->MPI_file, (
char *)SDDS_dataset->data[i], n_rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
2092 SDDS_SetError(
"Unable to set view for read binary columns");
2096 if ((mpi_code = MPI_File_read_all(MPI_dataset->MPI_file, (
char *)SDDS_dataset->data[i], n_rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
2097 SDDS_SetError(
"Unable to set view for read binary columns");
2101 offset += (MPI_Offset)MPI_dataset->total_rows *
SDDS_type_size[type - 1];
2103 MPI_dataset->n_rows = SDDS_dataset->n_rows = n_rows;
2104 MPI_dataset->file_offset = offset;
2107 if (!fBuffer->buffer) {
2108 fBuffer->bufferSize = SDDS_GetLockedDefaultReadBufferSize();
2109 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
2110 SDDS_SetError(
"Unable to do buffered read--allocation failure");
2113 fBuffer->bytesLeft = 0;
2114 fBuffer->data[0] = 0;
2116 if (fBuffer->bytesLeft > 0) {
2118 fBuffer->data[0] = 0;
2119 fBuffer->bytesLeft = 0;
2121 MPI_dataset->file_offset += (MPI_Offset)prev_rows * MPI_dataset->column_offset;
2122 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2127 if (!master_read || !MPI_dataset->collective_io) {
2128 for (j = 0; j < n_rows; j++) {
2130 SDDS_dataset->n_rows = j;
2131 if (SDDS_dataset->autoRecover) {
2133 fprintf(stderr,
"Doing auto-read recovery\n");
2135 SDDS_dataset->autoRecovered = 1;
2137 return (SDDS_dataset->page_number = MPI_dataset->n_page);
2139 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_MPI_ReadBinaryPage)");
2144 MPI_dataset->n_rows = SDDS_dataset->n_rows = j;
2146 MPI_dataset->n_rows = SDDS_dataset->n_rows = n_rows;
2150 MPI_dataset->file_offset = offset + MPI_dataset->total_rows * MPI_dataset->column_offset;
2152 MPI_dataset->n_page++;
2153 return (SDDS_dataset->page_number = MPI_dataset->n_page);
2188 if (SDDS_dataset->layout.disconnected) {
2189 SDDS_SetError(
"Can't read page--file is disconnected (SDDS_MPI_ReadNonNativePageSparse)");
2193 if (SDDS_dataset->original_layout.data_mode.mode == SDDS_ASCII) {
2196 }
else if (SDDS_dataset->original_layout.data_mode.mode == SDDS_BINARY) {
2201 SDDS_SetError(
"Unable to read page--unrecognized data mode (SDDS_MPI_ReadNonNativePageSparse)");
2219 int32_t ID_offset, mpi_code, master_read, type, retval;
2220 int64_t i, j, n_rows, total_rows, prev_rows;
2222 MPI_DATASET *MPI_dataset;
2226 MPI_dataset = SDDS_dataset->MPI_dataset;
2227 master_read = MPI_dataset->master_read;
2231 if (MPI_dataset->file_offset >= MPI_dataset->file_size)
2232 return (SDDS_dataset->page_number = -1);
2234 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2236 SDDS_SetError(
"Unable to set view for read binary page(1)");
2240#if defined(MASTER_READTITLE_ONLY)
2241 if (MPI_dataset->myid == 0)
2244#if defined(MASTER_READTITLE_ONLY)
2245 MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_dataset->comm);
2249 return (SDDS_dataset->page_number = -1);
2251 SDDS_SetError(
"Unable to read the SDDS title (row number, parameter and/or array) data");
2254#if defined(MASTER_READTITLE_ONLY)
2258 if (MPI_dataset->total_rows < 0) {
2259 SDDS_SetError(
"Unable to read page--negative number of rows (SDDS_MPI_ReadBinaryPage)");
2264 return (SDDS_dataset->page_number = -1);
2266 total_rows = MPI_dataset->total_rows;
2269 n_rows = total_rows / MPI_dataset->n_processors;
2270 prev_rows = MPI_dataset->myid * n_rows;
2271 if (MPI_dataset->myid < (ID_offset = total_rows % (MPI_dataset->n_processors))) {
2273 prev_rows += MPI_dataset->myid;
2275 prev_rows += ID_offset;
2277 if (MPI_dataset->myid == 0)
2280 n_rows = total_rows / (MPI_dataset->n_processors - 1);
2281 prev_rows = (MPI_dataset->myid - 1) * n_rows;
2282 if (MPI_dataset->myid <= (ID_offset = total_rows % (MPI_dataset->n_processors - 1))) {
2284 prev_rows += (MPI_dataset->myid - 1);
2286 prev_rows += ID_offset;
2289 MPI_dataset->start_row = prev_rows;
2291 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_MPI_ReadNonNativeBinaryPage)");
2295 offset = MPI_dataset->file_offset;
2296 fBuffer = &SDDS_dataset->fBuffer;
2297 if (SDDS_dataset->layout.data_mode.column_major) {
2299 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2300 type = SDDS_dataset->layout.column_definition[i].type;
2302 SDDS_SetError(
"Can not read string column from SDDS3 (SDDS_MPI_ReadBinaryPage");
2305 MPI_dataset->file_offset = offset + (MPI_Offset)prev_rows *
SDDS_type_size[type - 1];
2306 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2307 SDDS_SetError(
"Unable to set view for read binary columns");
2310 if (!MPI_dataset->collective_io) {
2311 if ((mpi_code = MPI_File_read(MPI_dataset->MPI_file, (
char *)SDDS_dataset->data[i], n_rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
2312 SDDS_SetError(
"Unable to set view for read binary columns");
2316 if ((mpi_code = MPI_File_read_all(MPI_dataset->MPI_file, (
char *)SDDS_dataset->data[i], n_rows *
SDDS_type_size[type - 1], MPI_BYTE, &status)) != MPI_SUCCESS) {
2317 SDDS_SetError(
"Unable to set view for read binary columns");
2321 offset += (MPI_Offset)MPI_dataset->total_rows *
SDDS_type_size[type - 1];
2323 MPI_dataset->n_rows = SDDS_dataset->n_rows = n_rows;
2324 MPI_dataset->file_offset = offset;
2327 if (!fBuffer->buffer) {
2328 fBuffer->bufferSize = SDDS_GetLockedDefaultReadBufferSize();
2329 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
2330 SDDS_SetError(
"Unable to do buffered read--allocation failure");
2333 fBuffer->bytesLeft = 0;
2334 fBuffer->data[0] = 0;
2336 if (fBuffer->bytesLeft > 0) {
2338 fBuffer->data[0] = 0;
2339 fBuffer->bytesLeft = 0;
2341 MPI_dataset->file_offset += (MPI_Offset)prev_rows * MPI_dataset->column_offset;
2342 if ((mpi_code = MPI_File_set_view(MPI_dataset->MPI_file, MPI_dataset->file_offset, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL)) != MPI_SUCCESS) {
2347 if (!MPI_dataset->collective_io || !master_read) {
2348 for (j = 0; j < n_rows; j++) {
2350 SDDS_dataset->n_rows = j - 1;
2351 if (SDDS_dataset->autoRecover) {
2354 return (SDDS_dataset->page_number = MPI_dataset->n_page);
2356 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_MPI_ReadNonNativeBinaryPage)");
2361 SDDS_dataset->n_rows = j;
2363 MPI_dataset->n_rows = SDDS_dataset->n_rows = n_rows;
2367 MPI_dataset->file_offset = offset + MPI_dataset->total_rows * MPI_dataset->column_offset;
2370 MPI_dataset->n_page++;
2371 MPI_Barrier(MPI_dataset->comm);
2372 return (SDDS_dataset->page_number = MPI_dataset->n_page);
2388 MPI_DATASET *MPI_dataset = NULL;
2392 MPI_dataset = SDDS_dataset->MPI_dataset;
2393 fBuffer = &(SDDS_dataset->titleBuffer);
2394 if (!fBuffer->buffer) {
2395 fBuffer->bufferSize = SDDS_GetLockedDefaultTitleBufferSize();
2396 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
2397 SDDS_SetError(
"Unable to do buffered read--allocation failure(SDDS_MPI_ReadNonNativeBinaryTitle)");
2400 fBuffer->bytesLeft = 0;
2402 if (fBuffer->bytesLeft > 0) {
2404 fBuffer->data[0] = 0;
2405 fBuffer->bytesLeft = 0;
2407 if ((ret_val =
SDDS_MPI_BufferedRead((
void *)&(total_rows),
sizeof(int32_t), SDDS_dataset, fBuffer)) < 0)
2410 if (total_rows == INT32_MIN) {
2411 if ((ret_val =
SDDS_MPI_BufferedRead((
void *)&(MPI_dataset->total_rows),
sizeof(int64_t), SDDS_dataset, fBuffer)) < 0)
2414 MPI_dataset->total_rows = total_rows;
2419 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_MPI_BufferedReadNonNativeBinaryTitle)");
2424 SDDS_SetError(
"Unable to read page--parameter reading error (SDDS_MPI_BufferedNonNativeReadTitle)");
2429 SDDS_SetError(
"Unable to read page--array reading error (SDDS_MPI_BufferedNonNativeReadTitle)");
2450 MPI_Offset offset = 0;
2453 layout = &(SDDS_dataset->layout);
2454 offset +=
sizeof(int32_t);
2455 if (SDDS_dataset->n_rows > INT32_MAX) {
2456 offset +=
sizeof(int64_t);
2458 for (i = 0; i < layout->n_parameters; i++) {
2459 if (layout->parameter_definition[i].fixed_value)
2461 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
2462 if (*(
char **)SDDS_dataset->parameter[i])
2463 offset +=
sizeof(int32_t) +
sizeof(
char) * strlen(*(
char **)SDDS_dataset->parameter[i]);
2465 offset +=
sizeof(int32_t);
2467 offset +=
SDDS_type_size[layout->parameter_definition[i].type - 1];
2470 for (i = 0; i < layout->n_arrays; i++) {
2471 if (!(SDDS_dataset->array[i].dimension)) {
2472 offset += layout->array_definition[i].dimensions *
sizeof(int32_t);
2475 offset +=
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions;
2476 if (layout->array_definition[i].type ==
SDDS_STRING) {
2477 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
2478 if (((
char **)SDDS_dataset->array[i].data)[j])
2479 offset +=
sizeof(int32_t) +
sizeof(
char) * strlen(((
char **)SDDS_dataset->array[i].data)[j]);
2481 offset +=
sizeof(int32_t);
2484 offset +=
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements;
2504 MPI_DATASET *MPI_dataset = NULL;
2508 MPI_dataset = SDDS_dataset->MPI_dataset;
2509 fBuffer = &(SDDS_dataset->titleBuffer);
2510 if (!fBuffer->buffer) {
2511 fBuffer->bufferSize = SDDS_GetLockedDefaultTitleBufferSize();
2512 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
2513 SDDS_SetError(
"Unable to do buffered read--allocation failure(SDDS_MPI_ReadBinaryTitle)");
2516 fBuffer->bytesLeft = 0;
2518 if (fBuffer->bytesLeft > 0) {
2520 fBuffer->data[0] = 0;
2521 fBuffer->bytesLeft = 0;
2523 if ((ret_val =
SDDS_MPI_BufferedRead((
void *)&(total_rows),
sizeof(int32_t), SDDS_dataset, fBuffer)) < 0)
2525 if (total_rows == INT32_MIN) {
2526 if ((ret_val =
SDDS_MPI_BufferedRead((
void *)&(MPI_dataset->total_rows),
sizeof(int64_t), SDDS_dataset, fBuffer)) < 0)
2529 MPI_dataset->total_rows = total_rows;
2534 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_MPI_BufferedReadBinaryTitle)");
2539 SDDS_SetError(
"Unable to read page--parameter reading error (SDDS_MPI_BufferedReadTitle)");
2544 SDDS_SetError(
"Unable to read page--array reading error (SDDS_MPI_BufferedReadTitle)");
2563 MPI_DATASET *MPI_dataset;
2565 int32_t mpi_code, type, size;
2566 int64_t i, j, n_rows, min_rows, writeBytes;
2570 logDebug(
"SDDS_MPI_CollectiveWriteByRow", SDDS_dataset);
2573 MPI_dataset = SDDS_dataset->MPI_dataset;
2574 layout = &(SDDS_dataset->layout);
2575 fBuffer = &(SDDS_dataset->fBuffer);
2576 n_rows = SDDS_dataset->n_rows;
2577 MPI_Allreduce(&n_rows, &min_rows, 1, MPI_INT64_T, MPI_MIN, MPI_dataset->comm);
2578 for (i = 0; i < min_rows; i++) {
2579 for (j = 0; j < layout->n_columns; j++) {
2580 type = layout->column_definition[j].type;
2583 SDDS_SetError(
"Can not write binary string in collective io.");
2591 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
2592 if (writeBytes < 0) {
2593 SDDS_SetError(
"Unable to flush buffer: negative byte count (SDDS_FlushBuffer).");
2596 if ((mpi_code = MPI_File_write_all(MPI_dataset->MPI_file, fBuffer->buffer, writeBytes, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
2597 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_FlushBuffer(MPI_File_write_at failed)", mpi_code, 0);
2600 fBuffer->bytesLeft = fBuffer->bufferSize;
2601 fBuffer->data = fBuffer->buffer;
2604 for (i = min_rows; i < n_rows; i++)
2624 MPI_DATASET *MPI_dataset;
2626 int32_t mpi_code, type, size;
2627 int64_t i, j, n_rows, min_rows, writeBytes;
2631 logDebug(
"SDDS_MPI_CollectiveWriteNonNativeByRow", SDDS_dataset);
2634 MPI_dataset = SDDS_dataset->MPI_dataset;
2635 layout = &(SDDS_dataset->layout);
2636 fBuffer = &(SDDS_dataset->fBuffer);
2637 n_rows = SDDS_dataset->n_rows;
2638 MPI_Allreduce(&n_rows, &min_rows, 1, MPI_INT64_T, MPI_MIN, MPI_dataset->comm);
2639 for (i = 0; i < min_rows; i++) {
2640 for (j = 0; j < layout->n_columns; j++) {
2641 type = layout->column_definition[j].type;
2644 SDDS_SetError(
"Can not write binary string in collective io.");
2652 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
2653 if (writeBytes < 0) {
2654 SDDS_SetError(
"Unable to flush buffer: negative byte count (SDDS_FlushBuffer).");
2657 if ((mpi_code = MPI_File_write_all(MPI_dataset->MPI_file, fBuffer->buffer, writeBytes, MPI_BYTE, MPI_STATUS_IGNORE)) != MPI_SUCCESS) {
2658 SDDS_MPI_GOTO_ERROR(stderr,
"SDDS_MPI_FlushBuffer(MPI_File_write_at failed)", mpi_code, 0);
2661 fBuffer->bytesLeft = fBuffer->bufferSize;
2662 fBuffer->data = fBuffer->buffer;
2665 for (i = min_rows; i < n_rows; i++)
2687 MPI_DATASET *MPI_dataset;
2689 int64_t min_rows, i, j;
2692 MPI_dataset = SDDS_dataset->MPI_dataset;
2693 fBuffer = &(SDDS_dataset->fBuffer);
2694 layout = &(SDDS_dataset->layout);
2696 if (!MPI_dataset->master_read) {
2697 SDDS_SetError(
"Cannot read row with collective io when master is not reading the data.");
2700 min_rows = MPI_dataset->total_rows / MPI_dataset->n_processors;
2701 for (i = 0; i < min_rows; i++) {
2702 for (j = 0; j < layout->n_columns; j++) {
2703 type = layout->column_definition[j].type;
2706 SDDS_SetError(
"Can not write binary string in collective io.");
2713 for (i = min_rows; i < MPI_dataset->n_rows; i++)
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_MPI_WriteBinaryParameters(SDDS_DATASET *SDDS_dataset)
Write binary parameters of an SDDS dataset using MPI.
int32_t SDDS_MPI_ReadNonNativeBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row, int32_t skip)
Reads a single non-native binary row from a binary file buffer into the SDDS dataset using MPI.
int32_t SDDS_MPI_BufferedReadNonNativeBinaryTitle(SDDS_DATASET *SDDS_dataset)
Buffers and reads the non-native binary title data from an SDDS dataset using MPI.
int32_t SDDS_MPI_WriteBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row)
Write a binary row to an SDDS dataset using MPI.
int32_t SDDS_MPI_CollectiveWriteNonNativeByRow(SDDS_DATASET *SDDS_dataset)
Writes non-native binary SDDS dataset rows collectively by row using MPI parallel I/O.
char * SDDS_MPI_ReadBinaryString(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Read a binary string from the SDDS dataset using MPI.
int32_t SDDS_MPI_FlushBuffer(SDDS_DATASET *SDDS_dataset)
Flush the buffer by writing any remaining data to the MPI file.
int32_t SDDS_MPI_WriteBinaryString(SDDS_DATASET *SDDS_dataset, char *string)
Write a binary string to an SDDS dataset using MPI.
int32_t SDDS_MPI_WriteContinuousBinaryPage(SDDS_DATASET *SDDS_dataset)
Write a continuous binary page of the SDDS dataset using MPI.
int32_t SDDS_MPI_BufferedReadBinaryTitle(SDDS_DATASET *SDDS_dataset)
Buffers and reads the binary title data from an SDDS dataset using MPI.
void SDDS_StringTuncated(void)
Increment the truncated strings counter.
void SDDS_MPI_SetFileSync(short value)
Set the file synchronization flag.
int32_t SDDS_SetDefaultStringLength(int32_t newValue)
Set the default string length for SDDS.
int32_t SDDS_MPI_ReadNonNativePage(SDDS_DATASET *SDDS_dataset)
Reads a non-native binary page from an SDDS dataset using MPI parallel I/O.
int32_t SDDS_MPI_ReadBinaryParameters(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Read binary parameters from the SDDS dataset using MPI.
int32_t SDDS_MPI_WriteNonNativeBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row)
Write a non-native binary row to an SDDS dataset using MPI.
int32_t SDDS_MPI_BufferedRead(void *target, int64_t targetSize, SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Buffered read from an SDDS dataset using MPI.
MPI_Offset SDDS_MPI_GetTitleOffset(SDDS_DATASET *SDDS_dataset)
Calculates the byte offset for the title section in a non-native binary SDDS dataset.
int32_t SDDS_MPI_CollectiveReadByRow(SDDS_DATASET *SDDS_dataset)
Reads SDDS dataset rows collectively by row using MPI parallel I/O.
int64_t SDDS_MPI_CountRowsOfInterest(SDDS_DATASET *SDDS_dataset, int64_t start_row, int64_t end_row)
Count the number of rows marked as "of interest" within a specified range.
int32_t SDDS_SetDefaultWriteBufferSize(int32_t newSize)
Set the default write buffer size for SDDS.
MPI_Offset SDDS_MPI_Get_Column_Size(SDDS_DATASET *SDDS_dataset)
Get the total size of all columns in an SDDS dataset.
int32_t SDDS_CheckStringTruncated(void)
Check the number of truncated strings.
int64_t SDDS_MPI_GetTotalRows(SDDS_DATASET *SDDS_dataset)
Get the total number of rows across all MPI processes.
int32_t SDDS_MPI_WriteBinaryPage(SDDS_DATASET *SDDS_dataset)
Write an SDDS binary page using MPI.
int32_t SDDS_MPI_WriteNonNativeBinaryString(SDDS_DATASET *SDDS_dataset, char *string)
Write a non-native binary string to an SDDS dataset using MPI.
int32_t SDDS_MPI_ReadNonNativeBinaryParameters(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Read non-native binary parameters from the SDDS dataset using MPI.
int32_t SDDS_MPI_WriteBinaryArrays(SDDS_DATASET *SDDS_dataset)
Write binary arrays of an SDDS dataset using MPI.
int32_t SDDS_MPI_WriteNonNativeBinaryArrays(SDDS_DATASET *SDDS_dataset)
Write non-native binary arrays of an SDDS dataset using MPI.
int32_t SDDS_MPI_BufferedWrite(void *target, int64_t targetSize, SDDS_DATASET *SDDS_dataset)
Buffered write to an SDDS dataset using MPI.
int32_t SDDS_MPI_ReadBinaryArrays(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Read binary arrays from the SDDS dataset using MPI.
int32_t SDDS_MPI_WriteNonNativeBinaryParameters(SDDS_DATASET *SDDS_dataset)
Write non-native binary parameters of an SDDS dataset using MPI.
int32_t SDDS_MPI_ReadBinaryPage(SDDS_DATASET *SDDS_dataset)
Reads a binary page from an SDDS dataset using MPI parallel I/O.
int32_t SDDS_MPI_BufferedWriteAll(void *target, int64_t targetSize, SDDS_DATASET *SDDS_dataset)
Buffered write all to an SDDS dataset using MPI.
int32_t SDDS_SetDefaultReadBufferSize(int32_t newSize)
Set the default read buffer size for SDDS.
int32_t SDDS_MPI_BroadcastTitleData(SDDS_DATASET *SDDS_dataset)
Broadcasts the title data (parameters and arrays) of the SDDS dataset to all MPI processes.
int32_t SDDS_MPI_ReadBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row, int32_t skip)
Read a binary row from the SDDS dataset using MPI.
int32_t SDDS_MPI_BufferedReadAll(void *target, int64_t targetSize, SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Buffered read all from an SDDS dataset using MPI.
int32_t SDDS_MPI_ReadNonNativeBinaryArrays(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer)
Reads non-native binary arrays from a binary file buffer into the SDDS dataset using MPI.
int32_t SDDS_MPI_CollectiveWriteByRow(SDDS_DATASET *SDDS_dataset)
Writes SDDS dataset rows collectively by row using MPI parallel I/O.
int32_t SDDS_SetDefaultTitleBufferSize(int32_t newSize)
Set the default title buffer size for SDDS.
void SDDS_MPI_SetWriteKludgeUsleep(long value)
Set the write kludge usleep duration.
int32_t SDDS_MPI_ReadNonNativePageSparse(SDDS_DATASET *SDDS_dataset, uint32_t mode)
Reads a sparse non-native binary page from an SDDS dataset using MPI parallel I/O.
int32_t SDDS_MPI_WriteNonNativeBinaryPage(SDDS_DATASET *SDDS_dataset)
Write a non-native binary page of the SDDS dataset using MPI.
int32_t SDDS_MPI_ReadNonNativeBinaryPage(SDDS_DATASET *SDDS_dataset)
Reads a non-native binary page from an SDDS dataset using MPI parallel I/O.
char * SDDS_MPI_ReadNonNativeBinaryString(SDDS_DATASET *SDDS_dataset, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Read a non-native binary string from the SDDS dataset using MPI.
int32_t SDDS_ScanData(char *string, int32_t type, int32_t field_length, void *data, int64_t index, int32_t is_parameter)
Scans a string and saves the parsed value into a data pointer according to the specified data type.
int32_t SDDS_SwapEndsColumnData(SDDS_DATASET *SDDSin)
Swaps the endianness of the column data in an SDDS dataset.
void SDDS_SwapLong64(int64_t *data)
Swaps the endianness of a 64-bit integer.
void SDDS_SetReadRecoveryMode(SDDS_DATASET *SDDS_dataset, int32_t mode)
Sets the read recovery mode for an SDDS dataset.
int32_t SDDS_SwapEndsArrayData(SDDS_DATASET *SDDSin)
Swaps the endianness of the array data in an SDDS dataset.
int32_t SDDS_SwapEndsParameterData(SDDS_DATASET *SDDSin)
Swaps the endianness of the parameter data in an SDDS dataset.
void SDDS_SwapLong(int32_t *data)
Swaps the endianness of a 32-bit integer.
int32_t SDDS_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
int32_t SDDS_LengthenTable(SDDS_DATASET *SDDS_dataset, int64_t n_additional_rows)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
int32_t SDDS_FreeArrayDefinition(ARRAY_DEFINITION *source)
Frees memory allocated for an array definition.
int32_t SDDS_CheckDataset(SDDS_DATASET *SDDS_dataset, const char *caller)
Validates the SDDS dataset pointer.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
void SDDS_ClearErrors()
Clears all recorded error messages from the SDDS error stack.
ARRAY_DEFINITION * SDDS_CopyArrayDefinition(ARRAY_DEFINITION **target, ARRAY_DEFINITION *source)
Creates a copy of an array definition.
int32_t SDDS_IsBigEndianMachine()
Determines whether the current machine uses big-endian byte ordering.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
void SDDS_MPI_GOTO_ERROR(FILE *fp, char *str, int32_t mpierr, int32_t exit_code)
Handles MPI errors by printing an error message and optionally exiting.
#define SDDS_STRING
Identifier for the string data type.
void usleepSystemIndependent(long usec)
Sleep for a given number of microseconds, system-independently.