32#define USAGE_MESSAGE "Usage: sdds3dconvert <inputFile> [<outputRoot>]\n" \
33 "Converts 3D Vorpal output data into SDDS format compatible with sddscontour.\n\n" \
35 " <inputFile> Path to the input SDDS file containing 3D Vorpal data.\n" \
36 " <outputRoot> (Optional) Root name for the output files. Defaults to <inputFile> name if not provided.\n\n" \
37 "Link date: " __DATE__ " " __TIME__ ", SVN revision: " SVN_VERSION "\n"
39static void setup_output_file(
SDDS_DATASET *sdds_out,
const char *output,
long yz,
long output_columns,
char **output_column);
40static void free_data_memory(
double ****data,
long output_columns,
long pages,
long ydim);
42int main(
int argc,
char **argv) {
44 int32_t i, j, k, row, str_len;
46 char *input_file, *output_root, output1[1024], output2[1024], tmp_col[256];
47 double xmin, xmax, ymin, ymax, zmin, zmax, x_interval, y_interval, z_interval;
48 int32_t x_dim, y_dim, z_dim, column_names, output_columns, page = 0;
49 char **column_name, **output_column;
52 input_file = output_root = NULL;
57 fprintf(stderr,
"%s", USAGE_MESSAGE);
61 column_names = output_columns = 0;
62 column_name = output_column = NULL;
63 input_file = s_arg[1].list[0];
64 output_root = (argc == 3) ? s_arg[2].list[0] : input_file;
66 snprintf(output1,
sizeof(output1),
"%s.yz", output_root);
67 snprintf(output2,
sizeof(output2),
"%s.xz", output_root);
76 for (i = 0; i < column_names; i++) {
78 output_column =
SDDS_Realloc(output_column, (output_columns + 1) *
sizeof(*output_column));
80 fprintf(stderr,
"Memory allocation failed for output_column.\n");
83 str_len = strlen(column_name[i]);
84 output_column[output_columns] = malloc(str_len - 1);
85 if (!output_column[output_columns]) {
86 fprintf(stderr,
"Memory allocation failed for output_column[%d].\n", output_columns);
89 strncpy(output_column[output_columns], column_name[i], str_len - 2);
90 output_column[output_columns][str_len - 2] =
'\0';
95 data = malloc(
sizeof(*data) * output_columns);
97 fprintf(stderr,
"Memory allocation failed for data.\n");
118 setup_output_file(&sdds_out1, output1, 1, output_columns, output_column);
119 setup_output_file(&sdds_out2, output2, 0, output_columns, output_column);
121 for (i = 0; i < output_columns; i++) {
122 data[i] = malloc(z_dim *
sizeof(**data));
124 fprintf(stderr,
"Memory allocation failed for data[%d].\n", i);
125 free_data_memory(data, output_columns, z_dim, y_dim);
128 for (j = 0; j < z_dim; j++) {
129 data[i][j] = malloc(y_dim *
sizeof(***data));
131 fprintf(stderr,
"Memory allocation failed for data[%d][%d].\n", i, j);
132 free_data_memory(data, output_columns, z_dim, y_dim);
139 for (i = 0; i < output_columns; i++) {
140 for (j = 1; j <= y_dim; j++) {
141 snprintf(tmp_col,
sizeof(tmp_col),
"%s_%d", output_column[i], j);
143 if (!data[i][page][j - 1]) {
145 free_data_memory(data, output_columns, z_dim, y_dim);
155 free_data_memory(data, output_columns, z_dim, y_dim);
160 free_data_memory(data, output_columns, z_dim, y_dim);
161 fprintf(stderr,
"Error: Page count (%d) does not match z-dimension size (%d).\n", page, z_dim);
166 for (page = 0; page < x_dim; page++) {
169 "origin1", xmin,
"origin2", ymin,
"origin3", zmin,
170 "max_ext1", xmax,
"max_ext2", ymax,
"max_ext3", zmax,
171 "delta1", x_interval,
"delta2", y_interval,
"delta3", z_interval,
172 "numPhysCells1", x_dim,
"numPhysCells2", y_dim,
"numPhysCells3", z_dim,
173 "Variable1Name",
"Y",
"Variable2Name",
"Z",
174 "ZMinimum", zmin,
"ZMaximum", zmax,
"ZInterval", z_interval,
"ZDimension", z_dim,
175 "YMinimum", ymin,
"YMaximum", ymax,
"YInterval", y_interval,
"YDimension", y_dim,
178 free_data_memory(data, output_columns, z_dim, y_dim);
182 for (i = 0; i < output_columns; i++) {
184 for (j = 0; j < y_dim; j++) {
185 for (k = 0; k < z_dim; k++) {
187 output_column[i], data[i][k][j][page],
188 "z", k * z_interval + zmin,
189 "y", j * y_interval + ymin, NULL)) {
191 free_data_memory(data, output_columns, z_dim, y_dim);
201 free_data_memory(data, output_columns, z_dim, y_dim);
208 free_data_memory(data, output_columns, z_dim, y_dim);
213 for (page = 0; page < y_dim; page++) {
216 "origin1", xmin,
"origin2", ymin,
"origin3", zmin,
217 "max_ext1", xmax,
"max_ext2", ymax,
"max_ext3", zmax,
218 "delta1", x_interval,
"delta2", y_interval,
"delta3", z_interval,
219 "numPhysCells1", x_dim,
"numPhysCells2", y_dim,
"numPhysCells3", z_dim,
220 "Variable1Name",
"X",
"Variable2Name",
"Z",
221 "ZMinimum", zmin,
"ZMaximum", zmax,
"ZInterval", z_interval,
"ZDimension", z_dim,
222 "XMinimum", xmin,
"XMaximum", xmax,
"XInterval", x_interval,
"XDimension", x_dim,
225 free_data_memory(data, output_columns, z_dim, y_dim);
229 for (i = 0; i < output_columns; i++) {
231 for (j = 0; j < x_dim; j++) {
232 for (k = 0; k < z_dim; k++) {
234 output_column[i], data[i][k][page][j],
235 "z", k * z_interval + zmin,
236 "x", j * x_interval + xmin, NULL)) {
238 free_data_memory(data, output_columns, z_dim, y_dim);
248 free_data_memory(data, output_columns, z_dim, y_dim);
253 free_data_memory(data, output_columns, z_dim, y_dim);
263static void free_data_memory(
double ****data,
long output_columns,
long z_dim,
long y_dim) {
267 for (i = 0; i < output_columns; i++) {
270 for (j = 0; j < z_dim; j++) {
273 for (k = 0; k < y_dim; k++) {
283static void setup_output_file(
SDDS_DATASET *sdds_out,
const char *output,
long yz,
long output_columns,
char **output_column) {
329 for (i = 0; i < output_columns; i++) {
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_SetRowValues(SDDS_DATASET *SDDS_dataset, int32_t mode, int64_t row,...)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_DefineSimpleColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *unit, int32_t type)
Defines a simple data column within the SDDS dataset.
int32_t SDDS_DefineSimpleParameter(SDDS_DATASET *SDDS_dataset, const char *name, const char *unit, int32_t type)
Defines a simple data parameter within the SDDS dataset.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
int wild_match(char *string, char *template)
Determine whether one string is a wildcard match for another.