42 {
44 int32_t i, j, k, row, str_len;
45 SCANNED_ARG *s_arg;
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;
50 double ****data;
51
52 input_file = output_root = NULL;
55
56 if (argc < 2) {
57 fprintf(stderr, "%s", USAGE_MESSAGE);
58 exit(EXIT_FAILURE);
59 }
60
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;
65
66 snprintf(output1, sizeof(output1), "%s.yz", output_root);
67 snprintf(output2, sizeof(output2), "%s.xz", output_root);
68
69 data = NULL;
72 exit(EXIT_FAILURE);
73 }
74
76 for (i = 0; i < column_names; i++) {
78 output_column =
SDDS_Realloc(output_column, (output_columns + 1) *
sizeof(*output_column));
79 if (!output_column) {
80 fprintf(stderr, "Memory allocation failed for output_column.\n");
81 exit(EXIT_FAILURE);
82 }
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);
87 exit(EXIT_FAILURE);
88 }
89 strncpy(output_column[output_columns], column_name[i], str_len - 2);
90 output_column[output_columns][str_len - 2] = '\0';
91 output_columns++;
92 }
93 }
94
95 data = malloc(sizeof(*data) * output_columns);
96 if (!data) {
97 fprintf(stderr, "Memory allocation failed for data.\n");
98 exit(EXIT_FAILURE);
99 }
100
102 if (page == 0) {
116 exit(EXIT_FAILURE);
117 }
118 setup_output_file(&sdds_out1, output1, 1, output_columns, output_column);
119 setup_output_file(&sdds_out2, output2, 0, output_columns, output_column);
120
121 for (i = 0; i < output_columns; i++) {
122 data[i] = malloc(z_dim * sizeof(**data));
123 if (!data[i]) {
124 fprintf(stderr, "Memory allocation failed for data[%d].\n", i);
125 free_data_memory(data, output_columns, z_dim, y_dim);
126 exit(EXIT_FAILURE);
127 }
128 for (j = 0; j < z_dim; j++) {
129 data[i][j] = malloc(y_dim * sizeof(***data));
130 if (!data[i][j]) {
131 fprintf(stderr, "Memory allocation failed for data[%d][%d].\n", i, j);
132 free_data_memory(data, output_columns, z_dim, y_dim);
133 exit(EXIT_FAILURE);
134 }
135 }
136 }
137 }
138
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);
146 exit(EXIT_FAILURE);
147 }
148 }
149 }
150 page++;
151 }
152
155 free_data_memory(data, output_columns, z_dim, y_dim);
156 exit(EXIT_FAILURE);
157 }
158
159 if (page != z_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);
162 exit(EXIT_FAILURE);
163 }
164
165
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,
176 NULL)) {
178 free_data_memory(data, output_columns, z_dim, y_dim);
179 exit(EXIT_FAILURE);
180 }
181
182 for (i = 0; i < output_columns; i++) {
183 row = 0;
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);
192 exit(EXIT_FAILURE);
193 }
194 row++;
195 }
196 }
197 }
198
201 free_data_memory(data, output_columns, z_dim, y_dim);
202 exit(EXIT_FAILURE);
203 }
204 }
205
208 free_data_memory(data, output_columns, z_dim, y_dim);
209 exit(EXIT_FAILURE);
210 }
211
212
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,
223 NULL)) {
225 free_data_memory(data, output_columns, z_dim, y_dim);
226 exit(EXIT_FAILURE);
227 }
228
229 for (i = 0; i < output_columns; i++) {
230 row = 0;
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);
239 exit(EXIT_FAILURE);
240 }
241 row++;
242 }
243 }
244 }
245
248 free_data_memory(data, output_columns, z_dim, y_dim);
249 exit(EXIT_FAILURE);
250 }
251 }
252
253 free_data_memory(data, output_columns, z_dim, y_dim);
254
257 exit(EXIT_FAILURE);
258 }
259
260 return EXIT_SUCCESS;
261}
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_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table 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.
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.