int32_t SDDS_CopyLayout(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source) { SDDS_LAYOUT *target, *source; int32_t i; if (!SDDS_CheckDataset(SDDS_target, "SDDS_CopyLayout")) return(0); if (!SDDS_CheckDataset(SDDS_source, "SDDS_CopyLayout")) return(0); target = &SDDS_target->layout; source = &SDDS_source->layout; target->version = source->version; target->data_mode = source->data_mode; target->data_mode.no_row_counts = 0; target->data_mode.fixed_row_count = 0; target->layout_written = 0; target->byteOrderDeclared = 0; if (source->description) SDDS_CopyString(&target->description, source->description); if (source->contents) SDDS_CopyString(&target->contents, source->contents); SDDS_DeferSavingLayout(1); for (i=0; i<source->n_columns; i++) if (SDDS_DefineColumn(SDDS_target, source->column_definition[i].name, source->column_definition[i].symbol, source->column_definition[i].units, source->column_definition[i].description, source->column_definition[i].format_string, source->column_definition[i].type, source->column_definition[i].field_length)<0) { SDDS_SetError("Unable to define column (SDDS_CopyLayout)"); return(0); } for (i=0; i<source->n_parameters; i++) if (SDDS_DefineParameter(SDDS_target, source->parameter_definition[i].name, source->parameter_definition[i].symbol, source->parameter_definition[i].units, source->parameter_definition[i].description, source->parameter_definition[i].format_string, source->parameter_definition[i].type, source->parameter_definition[i].fixed_value)<0) { SDDS_SetError("Unable to define parameter (SDDS_CopyLayout)"); return(0); } for (i=0; i<source->n_associates; i++) if (SDDS_DefineAssociate(SDDS_target, source->associate_definition[i].name, source->associate_definition[i].filename, source->associate_definition[i].path, source->associate_definition[i].description, source->associate_definition[i].contents, source->associate_definition[i].sdds)<0) { SDDS_SetError("Unable to define associate (SDDS_CopyLayout)"); return(0); } for (i=0; i<source->n_arrays; i++) if (SDDS_DefineArray(SDDS_target, source->array_definition[i].name, source->array_definition[i].symbol, source->array_definition[i].units, source->array_definition[i].description, source->array_definition[i].format_string, source->array_definition[i].type, source->array_definition[i].field_length, source->array_definition[i].dimensions, source->array_definition[i].group_name)<0) { SDDS_SetError("Unable to define array (SDDS_CopyLayout)"); return(0); } SDDS_DeferSavingLayout(0); if (!SDDS_SaveLayout(SDDS_target)) { SDDS_SetError("Unable to save layout (SDDS_CopyLayout)"); return(0); } return(1); }
int main(int argc, char *argv[]) { char *filename=NULL; MPI_DATASET *MPI_dataset; SDDS_DATASET SDDS_dataset; char buf[256]; int32_t total_rows=37500000, i, j, mpi_code, cols=8, rows, columnOrder=0, ID_offset, myid, n_processors, collective_io=0, i_arg; double startTime =0; MPI_Comm comm; SCANNED_ARG *s_arg; MPI_Init(&argc,&argv); argc = scanargs(&s_arg, argc, argv); if (argc<2) bomb(NULL, USAGE); for (i_arg=1; i_arg<argc; i_arg++) { if (s_arg[i_arg].arg_type==OPTION) { switch (match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) { case SET_COLUMN_ORDER: columnOrder = 1; break; case SET_COLLECTIVE_IO: collective_io = 1; break; case SET_TOTAL_ROWS: if (s_arg[i_arg].n_items!=2) SDDS_Bomb("Invalid -totalrows syntax given!"); if (!get_long(&total_rows, s_arg[i_arg].list[1])) SDDS_Bomb("Invalid -totalrows value given!"); break; default: break; } } else if (!filename) filename = s_arg[i_arg].list[0]; else SDDS_Bomb("Too many files."); } /* 1. set the communicator for MPI IO */ SDDS_SetDefaultBufferSize(4000000); comm = MPI_COMM_WORLD; if (MPI_SUCCESS != (mpi_code=MPI_Comm_rank(comm, &myid))) SDDS_MPI_GOTO_ERROR(stderr, "MPI_Comm_rank failed", mpi_code, 1); if (MPI_SUCCESS != (mpi_code=MPI_Comm_size(comm, &n_processors))) SDDS_MPI_GOTO_ERROR(stderr, "MPI_Comm_size failed", mpi_code, 1); SDDS_MPI_Setup(&SDDS_dataset, 1, n_processors, myid, comm, 1); MPI_dataset = SDDS_dataset.MPI_dataset; /* 2. open file (all processors) */ /* 3. initialize output, right now, only write binary files (all processors) */ fprintf(stderr, "rank=%d, initialize input \n", myid); if (!SDDS_MPI_InitializeOutput(&SDDS_dataset, NULL, NULL, filename, SDDS_MPI_WRITE_ONLY, columnOrder)) SDDS_Bomb("Unable to initalize output"); MPI_dataset->collective_io = collective_io; for (i=0; i<cols; i++) { sprintf(buf,"col%d", i); if ( !SDDS_DefineSimpleColumn(&SDDS_dataset, buf, NULL, SDDS_DOUBLE)) SDDS_MPI_BOMB("SDDS define column and parameters failed.", &(MPI_dataset->MPI_file)); } if (!SDDS_SaveLayout(&SDDS_dataset)) SDDS_MPI_BOMB("SDDS define column and parameters failed.", &(MPI_dataset->MPI_file)); fprintf(stderr, "rank=%d, layout defined. \n", myid); startTime = MPI_Wtime(); if (!SDDS_WriteLayout(&SDDS_dataset)) SDDS_MPI_BOMB("SDDS_MPI_WriteLayout failed.", &(MPI_dataset->MPI_file)); fprintf(stderr, "rank=%d, total_rows=%d, layout written spent %f seconds. \n", myid, total_rows, MPI_Wtime() - startTime); rows = total_rows/n_processors; if (myid < (ID_offset=total_rows%(n_processors))) { rows ++; } if (!SDDS_StartPage(&SDDS_dataset, rows)) SDDS_MPI_BOMB("SDDS start page failed.", &MPI_dataset->MPI_file); /* 7. set data values */ for (i=0; i<rows; i++) { for (j=0; j<cols; j++) { sprintf(buf,"col%d", j); if (!SDDS_SetRowValues(&SDDS_dataset, SDDS_SET_BY_NAME|SDDS_PASS_BY_VALUE, i, buf, (double)i, NULL)) SDDS_MPI_BOMB("SDDS_SetRowValues failed.", &MPI_dataset->MPI_file); } } fprintf(stderr, "rank=%d, row set. \n", myid); startTime = MPI_Wtime(); if (!SDDS_WritePage(&SDDS_dataset)) SDDS_MPI_BOMB("SDDS_MPI_WritePage failed.", &MPI_dataset->MPI_file); fprintf(stderr, "rank=%d, page write spent %f. \n", myid, MPI_Wtime() - startTime); if (!SDDS_Terminate(&SDDS_dataset)) SDDS_PrintErrors(stderr, SDDS_EXIT_PrintErrors|SDDS_VERBOSE_PrintErrors); /* close file is done inside SDDS_MPI_Terminate*/ MPI_Finalize(); return 0; }
int32_t SDDS_AppendLayout(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, uint32_t mode) { SDDS_LAYOUT *source; int32_t i; if (!SDDS_CheckDataset(SDDS_target, "SDDS_AppendLayout")) return(0); if (!SDDS_CheckDataset(SDDS_source, "SDDS_AppendLayout")) return(0); source = &SDDS_source->layout; SDDS_DeferSavingLayout(1); for (i=0; i<source->n_columns; i++) if (SDDS_GetColumnIndex(SDDS_target, source->column_definition[i].name)<0 && SDDS_DefineColumn(SDDS_target, source->column_definition[i].name, source->column_definition[i].symbol, source->column_definition[i].units, source->column_definition[i].description, source->column_definition[i].format_string, source->column_definition[i].type, source->column_definition[i].field_length)<0) { SDDS_DeferSavingLayout(0); SDDS_SetError("Unable to define column (SDDS_AppendLayout)"); return(0); } for (i=0; i<source->n_parameters; i++) if (SDDS_GetParameterIndex(SDDS_target, source->parameter_definition[i].name)<0 && SDDS_DefineParameter(SDDS_target, source->parameter_definition[i].name, source->parameter_definition[i].symbol, source->parameter_definition[i].units, source->parameter_definition[i].description, source->parameter_definition[i].format_string, source->parameter_definition[i].type, source->parameter_definition[i].fixed_value)<0) { SDDS_DeferSavingLayout(0); SDDS_SetError("Unable to define parameter (SDDS_AppendLayout)"); return(0); } for (i=0; i<source->n_associates; i++) if (SDDS_GetAssociateIndex(SDDS_target,source->associate_definition[i].name)<0 && SDDS_DefineAssociate(SDDS_target, source->associate_definition[i].name, source->associate_definition[i].filename, source->associate_definition[i].path, source->associate_definition[i].description, source->associate_definition[i].contents, source->associate_definition[i].sdds)<0) { SDDS_DeferSavingLayout(0); SDDS_SetError("Unable to define associate (SDDS_AppendLayout)"); return(0); } for (i=0; i<source->n_arrays; i++) if (SDDS_GetArrayIndex(SDDS_target, source->array_definition[i].name)<0 && SDDS_DefineArray(SDDS_target, source->array_definition[i].name, source->array_definition[i].symbol, source->array_definition[i].units, source->array_definition[i].description, source->array_definition[i].format_string, source->array_definition[i].type, source->array_definition[i].field_length, source->array_definition[i].dimensions, source->array_definition[i].group_name)<0) { SDDS_DeferSavingLayout(0); SDDS_SetError("Unable to define array (SDDS_AppendLayout)"); return(0); } SDDS_DeferSavingLayout(0); if (!SDDS_SaveLayout(SDDS_target)) { SDDS_SetError("Unable to save layout (SDDS_AppendLayout)"); return(0); } return(1); }