463 MPI_DATASET *MPI_dataset;
465 char buf[2048], *field = NULL;
466 int32_t i, data_mode;
467 char *outputEndianess = NULL;
471 logDebug(
"SDDS_MPI_WriteLayout", SDDS_dataset);
474 MPI_dataset = SDDS_dataset->MPI_dataset;
475 MPI_File_set_view(MPI_dataset->MPI_file, 0, MPI_CHAR, MPI_CHAR,
"native", MPI_INFO_NULL);
480 layout = &SDDS_dataset->layout;
481 if (SDDS_dataset->layout.disconnected) {
482 SDDS_SetError(
"Can't write layout--file is disconnected (SDDS_MPI_WriteLayout)");
485 MPI_dataset->file_offset = 0;
486 if (layout->layout_written) {
487 SDDS_SetError(
"Can't write layout--already written to file (SDDS_MPI_WriteLayout)");
491 if ((outputEndianess = getenv(
"SDDS_OUTPUT_ENDIANESS"))) {
492 if (strncmp(outputEndianess,
"big", 3) == 0)
493 layout->byteOrderDeclared = SDDS_BIGENDIAN;
494 else if (strncmp(outputEndianess,
"little", 6) == 0)
495 layout->byteOrderDeclared = SDDS_LITTLEENDIAN;
498 if (!layout->byteOrderDeclared)
501 fBuffer = &(SDDS_dataset->fBuffer);
503 if (MPI_dataset->myid == 0) {
504 if (!fBuffer->buffer) {
506 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (fBuffer->bufferSize + 1)))) {
507 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_MPI_WriteLayout)");
510 fBuffer->bytesLeft = fBuffer->bufferSize;
511 fBuffer->data[0] = 0;
515 for (i = 0; i < layout->n_parameters; i++) {
516 if ((layout->parameter_definition[i].type ==
SDDS_ULONG) || (layout->parameter_definition[i].type ==
SDDS_USHORT)) {
521 for (i = 0; i < layout->n_arrays; i++) {
522 if ((layout->array_definition[i].type ==
SDDS_ULONG) || (layout->array_definition[i].type ==
SDDS_USHORT)) {
527 for (i = 0; i < layout->n_columns; i++) {
528 if ((layout->column_definition[i].type ==
SDDS_ULONG) || (layout->column_definition[i].type ==
SDDS_USHORT)) {
533 if ((layout->data_mode.column_major) && (layout->data_mode.mode == SDDS_BINARY)) {
536 for (i = 0; i < layout->n_parameters; i++) {
542 for (i = 0; i < layout->n_arrays; i++) {
548 for (i = 0; i < layout->n_columns; i++) {
554 if ((LDBL_DIG != 18) && (layout->version == 4)) {
555 SDDS_SetError(
"Operating system does not support 80bit float variables used by SDDS_LONGDOUBLE (SDDS_MPI_WriteLayout)");
558 for (i = 0; i < layout->n_parameters; i++) {
559 if ((layout->parameter_definition[i].type ==
SDDS_ULONG64) || (layout->parameter_definition[i].type ==
SDDS_LONG64)) {
564 for (i = 0; i < layout->n_arrays; i++) {
570 for (i = 0; i < layout->n_columns; i++) {
571 if ((layout->column_definition[i].type ==
SDDS_ULONG64) || (layout->column_definition[i].type ==
SDDS_LONG64)) {
578 sprintf(buf,
"SDDS%" PRId32
"\n", layout->version);
580 MPI_dataset->file_offset += strlen(buf) *
sizeof(char);
581 data_mode = SDDS_dataset->layout.data_mode.mode;
583 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
586 if (data_mode == SDDS_BINARY) {
587 if (layout->byteOrderDeclared == SDDS_BIGENDIAN)
588 sprintf(buf,
"!# big-endian\n");
590 sprintf(buf,
"!# little-endian\n");
592 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
595 MPI_dataset->file_offset += strlen(buf) *
sizeof(char);
597 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
598 sprintf(buf,
"!# fixed-rowcount\n");
600 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
603 MPI_dataset->file_offset += strlen(buf) *
sizeof(char);
608 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
611 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
616 for (i = 0; i < layout->n_parameters; i++) {
619 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
622 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
626 for (i = 0; i < layout->n_arrays; i++) {
629 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
632 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
636 for (i = 0; i < layout->n_columns; i++) {
639 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
642 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
647#if RW_ASSOCIATES != 0
648 for (i = 0; i < layout->n_associates; i++) {
651 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
654 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
661 fprintf(stderr,
"SDDS_MPI_WriteLayout(error1): Unable to write layout.\n");
664 MPI_dataset->file_offset += strlen(field) *
sizeof(char);
669 layout->layout_written = 1;
670 if (MPI_dataset->myid == 0) {
674 SDDS_dataset->original_layout.version = layout->version;
780 MPI_DATASET *MPI_dataset;
784 int32_t terminateMode;
787 logDebug(
"SDDS_MPI_Terminate", SDDS_dataset);
790 MPI_dataset = SDDS_dataset->MPI_dataset;
791 layout = &(SDDS_dataset->original_layout);
792 terminateMode = SDDS_GetTerminateMode();
795 if (SDDS_dataset->pagecount_offset)
796 free(SDDS_dataset->pagecount_offset);
797 if (SDDS_dataset->row_flag)
798 free(SDDS_dataset->row_flag);
799 if (SDDS_dataset->column_order)
800 free(SDDS_dataset->column_order);
801 if (SDDS_dataset->column_flag)
802 free(SDDS_dataset->column_flag);
803 if (SDDS_dataset->fBuffer.buffer)
804 free(SDDS_dataset->fBuffer.buffer);
805 if (SDDS_dataset->titleBuffer.buffer)
806 free(SDDS_dataset->titleBuffer.buffer);
807 if (SDDS_dataset->parameter) {
808 for (i = 0; i < layout->n_parameters; i++) {
809 if (layout->parameter_definition[i].type ==
SDDS_STRING && *(
char **)(SDDS_dataset->parameter[i]))
810 free(*(
char **)(SDDS_dataset->parameter[i]));
811 if (SDDS_dataset->parameter[i])
812 free(SDDS_dataset->parameter[i]);
814 free(SDDS_dataset->parameter);
816 if (SDDS_dataset->array) {
817 for (i = 0; i < layout->n_arrays; i++) {
818 if (layout->array_definition[i].type ==
SDDS_STRING && !(terminateMode & TERMINATE_DONT_FREE_ARRAY_STRINGS)) {
819 for (j = 0; j < SDDS_dataset->array[i].elements; j++)
820 if (((
char **)SDDS_dataset->array[i].data)[j])
821 free(((
char **)SDDS_dataset->array[i].data)[j]);
831 if (SDDS_dataset->array[i].data)
832 free(SDDS_dataset->array[i].data);
834 if (SDDS_dataset->array[i].pointer && SDDS_dataset->array[i].definition->dimensions != 1)
835 free(SDDS_dataset->array[i].pointer);
836 if (SDDS_dataset->array[i].dimension)
837 free(SDDS_dataset->array[i].dimension);
839 if (SDDS_dataset->array[i].definition && SDDS_dataset->array[i].definition->name) {
840 if (SDDS_dataset->array[i].definition->name != layout->array_definition[i].name)
843 SDDS_dataset->array[i].definition = NULL;
845 free(SDDS_dataset->array);
847 if (SDDS_dataset->data) {
848 for (i = 0; i < layout->n_columns; i++)
849 if (SDDS_dataset->data[i]) {
850 if (layout->column_definition[i].type ==
SDDS_STRING && !(terminateMode & TERMINATE_DONT_FREE_TABLE_STRINGS)) {
851 ptr = (
char **)SDDS_dataset->data[i];
852 for (j = 0; j < SDDS_dataset->n_rows_allocated; j++, ptr++)
856 free(SDDS_dataset->data[i]);
858 free(SDDS_dataset->data);
860 if (layout->description)
861 free(layout->description);
862 if (layout->contents == (&SDDS_dataset->layout)->contents)
863 (&SDDS_dataset->layout)->contents = NULL;
864 if (layout->contents)
865 free(layout->contents);
866 if (layout->filename)
867 free(layout->filename);
868 if (layout->column_definition) {
869 for (i = 0; i < layout->n_columns; i++) {
870 if (layout->column_index[i])
871 free(layout->column_index[i]);
872 if (layout->column_definition[i].name)
873 free(layout->column_definition[i].name);
874 if (layout->column_definition[i].symbol)
875 free(layout->column_definition[i].symbol);
876 if (layout->column_definition[i].units)
877 free(layout->column_definition[i].units);
878 if (layout->column_definition[i].description)
879 free(layout->column_definition[i].description);
880 if (layout->column_definition[i].format_string)
881 free(layout->column_definition[i].format_string);
883 free(layout->column_definition);
884 free(layout->column_index);
886 if (layout->parameter_definition) {
887 for (i = 0; i < layout->n_parameters; i++) {
888 if (layout->parameter_index[i])
889 free(layout->parameter_index[i]);
890 if (layout->parameter_definition[i].name)
891 free(layout->parameter_definition[i].name);
892 if (layout->parameter_definition[i].symbol)
893 free(layout->parameter_definition[i].symbol);
894 if (layout->parameter_definition[i].units)
895 free(layout->parameter_definition[i].units);
896 if (layout->parameter_definition[i].description)
897 free(layout->parameter_definition[i].description);
898 if (layout->parameter_definition[i].format_string)
899 free(layout->parameter_definition[i].format_string);
900 if (layout->parameter_definition[i].fixed_value)
901 free(layout->parameter_definition[i].fixed_value);
903 free(layout->parameter_definition);
904 free(layout->parameter_index);
906 if (layout->array_definition) {
907 for (i = 0; i < layout->n_arrays; i++) {
908 if (layout->array_index[i])
909 free(layout->array_index[i]);
910 if (layout->array_definition[i].name)
911 free(layout->array_definition[i].name);
912 if (layout->array_definition[i].symbol)
913 free(layout->array_definition[i].symbol);
914 if (layout->array_definition[i].units)
915 free(layout->array_definition[i].units);
916 if (layout->array_definition[i].description)
917 free(layout->array_definition[i].description);
918 if (layout->array_definition[i].format_string)
919 free(layout->array_definition[i].format_string);
920 if (layout->array_definition[i].group_name)
921 free(layout->array_definition[i].group_name);
923 free(layout->array_definition);
924 free(layout->array_index);
926 if (layout->associate_definition) {
927 for (i = 0; i < layout->n_associates; i++) {
928 if (layout->associate_definition[i].name)
929 free(layout->associate_definition[i].name);
930 if (layout->associate_definition[i].filename)
931 free(layout->associate_definition[i].filename);
932 if (layout->associate_definition[i].path)
933 free(layout->associate_definition[i].path);
934 if (layout->associate_definition[i].description)
935 free(layout->associate_definition[i].description);
936 if (layout->associate_definition[i].contents)
937 free(layout->associate_definition[i].contents);
939 free(layout->associate_definition);
942 layout = &SDDS_dataset->layout;
943 if (layout->contents)
944 free(layout->contents);
945 if (layout->column_definition)
946 free(layout->column_definition);
947 if (layout->array_definition)
948 free(layout->array_definition);
949 if (layout->associate_definition)
950 free(layout->associate_definition);
951 if (layout->parameter_definition)
952 free(layout->parameter_definition);
953 if (layout->column_index)
954 free(layout->column_index);
955 if (layout->parameter_index)
956 free(layout->parameter_index);
957 if (layout->array_index)
958 free(layout->array_index);
962 fprintf(stderr,
"done\n");
964 MPI_File_close(&(MPI_dataset->MPI_file));