FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_part_get_control.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <math.h>
9 #include <errno.h>
10 
11 #include "hecmw_util.h"
12 #include "hecmw_io.h"
13 
14 #include "hecmw_partlex.h"
15 #include "hecmw_part_define.h"
16 #include "hecmw_part_struct.h"
17 #include "hecmw_part_get_control.h"
18 
19 static char ctrl_file_name[HECMW_FILENAME_LEN] = "\0";
20 static int args_subdomain = 0;
21 
22 /*================================================================================================*/
23 
24 extern int HECMW_part_set_subdomains(int n_domain) {
25  args_subdomain = n_domain;
26  return 0;
27 }
28 
29 extern int HECMW_part_set_ctrl_file_name(char *fname) {
30  if (fname == NULL) {
31  HECMW_set_error(HECMW_PART_E_INV_ARG, "'fname' is NULL");
32  goto error;
33  }
34  if (strlen(fname) > HECMW_FILENAME_LEN) {
36  "control file for partitioner");
37  goto error;
38  }
39 
40  snprintf(ctrl_file_name, sizeof(ctrl_file_name), "%s", fname);
41 
42  return 0;
43 
44 error:
45  return -1;
46 }
47 
48 /*============================================================================*/
49 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
50 /* partitioning type < TYPE={ NODE-BASED | ELEMENT-BASED } > */
51 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
52 static int part_cont_type(void) {
53  int token;
54 
55  /* '=' */
56  token = HECMW_partlex_next_token();
57  if (token != '=') {
59  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
60  "part_cont_type", HECMW_partlex_get_text());
61  return -1;
62  }
63 
64  /* { NODE-BASED | ELEMENT-BASED } */
65  token = HECMW_partlex_next_token();
66  switch (token) {
67  case HECMW_PARTLEX_V_NODE_BASED: /* TYPE=NODE-BASED */
69 
70  case HECMW_PARTLEX_V_ELEMENT_BASED: /* TYPE=ELEMENT-BASED */
72 
73  default:
75  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
76  "part_cont_type", HECMW_partlex_get_text());
77  return -1;
78  }
79 }
80 
81 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
82 /* partitioning method < METHOD={ RCB | KMETIS | PMETIS | USER } > */
83 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
84 static int part_cont_method(void) {
85  int token;
86 
87  /* '=' */
88  token = HECMW_partlex_next_token();
89  if (token != '=') {
91  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
92  "part_cont_method", HECMW_partlex_get_text());
93  return -1;
94  }
95 
96  /* { RCB | KMETIS | PMETIS | USER } */
97  token = HECMW_partlex_next_token();
98  switch (token) {
99  case HECMW_PARTLEX_V_RCB: /* METHOD=RCB */
100  return HECMW_PART_METHOD_RCB;
101 
102  case HECMW_PARTLEX_V_KMETIS: /* METHOD=KMETIS */
104 
105  case HECMW_PARTLEX_V_PMETIS: /* METHOD=PMETIS */
107 
108  case HECMW_PARTLEX_V_USER: /* METHOD=USER */
109  return HECMW_PART_METHOD_USER;
110 
111  default:
113  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
114  "part_cont_method", HECMW_partlex_get_text());
115  return -1;
116  }
117 }
118 
119 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
120 /* number of sub-domains < DOMAIN=n > */
121 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
122 static int part_cont_domain(void) {
123  int token, domain;
124 
125  /* '=' */
126  token = HECMW_partlex_next_token();
127  if (token != '=') {
129  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
130  "part_cont_domain", HECMW_partlex_get_text());
131  return -1;
132  }
133 
134  /* n */
135  token = HECMW_partlex_next_token();
136  switch (token) {
137  case HECMW_PARTLEX_INT: /* DOMAIN=n */
138  domain = (int)HECMW_partlex_get_number();
139  if (domain < 1) {
142  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
143  "part_cont_domain", HECMW_partlex_get_text());
144  return -1;
145  }
146  return domain;
147 
148  default:
150  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
151  "part_cont_domain", HECMW_partlex_get_text());
152  return -1;
153  }
154 }
155 
156 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
157 /* depth of overlapping zone < DEPTH=n > */
158 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
159 static int part_cont_depth(void) {
160  int token, depth;
161 
162  /* '=' */
163  token = HECMW_partlex_next_token();
164  if (token != '=') {
166  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
167  "part_cont_depth", HECMW_partlex_get_text());
168  return -1;
169  }
170 
171  /* n */
172  token = HECMW_partlex_next_token();
173  switch (token) {
174  case HECMW_PARTLEX_INT: /* DEPTH=n */
175  depth = (int)HECMW_partlex_get_number();
176  if (depth < 1) {
178  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
179  "part_cont_depth", HECMW_partlex_get_text());
180  return -1;
181  }
182  return depth;
183 
184  default:
186  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
187  "part_cont_depth", HECMW_partlex_get_text());
188  return -1;
189  }
190 }
191 
192 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
193 /* ucd file name < UCD=filename > */
194 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
195 static int part_cont_ucd(char *name, size_t name_len) {
196  char *p;
197  int token, is_print_ucd = 0;
198 
199  /* '=' */
200  token = HECMW_partlex_next_token();
201  if (token != '=') {
203  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
204  "part_cont_ucd", HECMW_partlex_get_text());
205  return -1;
206  }
207 
208  /* filename */
209  token = HECMW_partlex_next_token();
210  switch (token) {
211  case HECMW_PARTLEX_NAME: /* UCD=filename */
212  case HECMW_PARTLEX_FILENAME: /* UCD=filename */
214  if (strlen(p) > HECMW_FILENAME_LEN) {
217  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
218  "part_cont_ucd", HECMW_partlex_get_text());
219  return -1;
220  }
221  snprintf(name, name_len, "%s", p);
222  is_print_ucd = 1;
223 
224  return is_print_ucd;
225 
226  default:
228  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
229  "part_cont_ucd", HECMW_partlex_get_text());
230  return -1;
231  }
232 
233  HECMW_assert(0);
234 
235  return -1;
236 }
237 
238 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
239 /* partitioning contact < CONTACT={ DEFAULT | AGGREGATE | DISTRIBUTE | SIMPLE }
240  * > */
241 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
242 static int part_cont_contact(void) {
243  int token;
244 
245  /* '=' */
246  token = HECMW_partlex_next_token();
247  if (token != '=') {
249  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
250  "part_cont_method", HECMW_partlex_get_text());
251  return -1;
252  }
253 
254  /* { DEFAULT | AGGREGATE | DISTRIBUTE | SIMPLE } */
255  token = HECMW_partlex_next_token();
256  switch (token) {
257  case HECMW_PARTLEX_V_DEFAULT: /* CONTACT=DEFAULT */
259 
260  case HECMW_PARTLEX_V_AGGREGATE: /* CONTACT=AGGREGATE */
262 
263  case HECMW_PARTLEX_V_DISTRIBUTE: /* CONTACT=DISTRIBUTE */
265 
266  case HECMW_PARTLEX_V_SIMPLE: /* CONTACT=SIMPLE */
268 
269  default:
271  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
272  "part_cont_method", HECMW_partlex_get_text());
273  return -1;
274  }
275 }
276 
277 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
278 /* part file name < PART=filename > */
279 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
280 static int part_cont_part(char *name, size_t name_len) {
281  char *p;
282  int token, is_print_part = 0;
283 
284  /* '=' */
285  token = HECMW_partlex_next_token();
286  if (token != '=') {
288  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
289  "part_cont_part", HECMW_partlex_get_text());
290  return -1;
291  }
292 
293  /* filename */
294  token = HECMW_partlex_next_token();
295  switch (token) {
296  case HECMW_PARTLEX_NAME: /* PART=filename */
297  case HECMW_PARTLEX_FILENAME: /* PART=filename */
299  if (strlen(p) > HECMW_FILENAME_LEN) {
302  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
303  "part_cont_part", HECMW_partlex_get_text());
304  return -1;
305  }
306  snprintf(name, name_len, "%s", p);
307  is_print_part = 1;
308 
309  return is_print_part;
310 
311  default:
313  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
314  "part_cont_part", HECMW_partlex_get_text());
315  return -1;
316  }
317 
318  HECMW_assert(0);
319 
320  return -1;
321 }
322 
323 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
324 /* partitioning directions for RCB partitioning < x, y, z > */
325 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
326 static int part_cont_rcb_divs(int n_domain) {
327  int base, rest, n;
328  int i;
329 
330  for (i = 0; i < n_domain; i++) {
331  n = (int)pow(2, i);
332  base = n_domain / n;
333  rest = n_domain % n;
334 
335  if ((base == 1) && (rest == 0)) return i;
336  if ((base == 0) && (rest == 1)) return 0;
337  if ((base == 1) && (rest > 0)) return -1;
338  }
339 
340  HECMW_assert(0);
341 
342  return 0;
343 }
344 
345 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
346 static int part_cont_rcb_opt(struct hecmw_part_cont_data *cont_data) {
347  int token;
348  int i;
349 
350  if (cont_data->n_domain == 1) {
351  cont_data->n_rcb_div = 0;
352  cont_data->rcb_axis = NULL;
353  return 0;
354  }
355 
356  /* number of decompositions */
357  cont_data->n_rcb_div = part_cont_rcb_divs(cont_data->n_domain);
358  if (cont_data->n_rcb_div < -1) {
360  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%d)", __FILE__, __LINE__,
361  "part_cont_rcb_opt", cont_data->n_domain);
362  return -1;
363  }
364 
365  /* partitioning directions */
366  cont_data->rcb_axis = (int *)HECMW_malloc(sizeof(int) * cont_data->n_rcb_div);
367  if (cont_data->rcb_axis == NULL) {
369  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
370  "part_cont_rcb_opt", "cont_data->rcb_axis");
371  return -1;
372  }
373 
374  for (i = 0; i < cont_data->n_rcb_div; i++) {
375  token = HECMW_partlex_next_token();
376 
377  switch (token) {
378  case 'x':
379  cont_data->rcb_axis[i] = HECMW_PART_RCB_X_AXIS;
380  break;
381 
382  case 'y':
383  cont_data->rcb_axis[i] = HECMW_PART_RCB_Y_AXIS;
384  break;
385 
386  case 'z':
387  cont_data->rcb_axis[i] = HECMW_PART_RCB_Z_AXIS;
388  break;
389 
390  default:
392  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
393  "part_cont_rcb_opt", HECMW_partlex_get_text());
394  HECMW_free(cont_data->rcb_axis);
395  return -1;
396  }
397 
398  token = HECMW_partlex_next_token();
399  if (token != ',' && token != HECMW_PARTLEX_NL && token) {
400  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
401  "part_cont_rcb_opt", HECMW_partlex_get_text());
402  HECMW_free(cont_data->rcb_axis);
403  return -1;
404  }
405 
406  if (i + 1 == cont_data->n_rcb_div) {
407  if (token == ',') {
409  while ((token = HECMW_partlex_next_token()) != HECMW_PARTLEX_NL) {
410  }
411  }
412  break;
413  } else {
414  if (token == HECMW_PARTLEX_NL || !token) {
416  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
417  "part_cont_rcb_opt");
418  HECMW_free(cont_data->rcb_axis);
419  return -1;
420  }
421  }
422  }
423 
424  return 0;
425 }
426 
427 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
428 /* control data for partitioner < !PARTITION > */
429 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
430 static int part_cont_partition(struct hecmw_part_cont_data *cont_data) {
431  int token;
432 
433  cont_data->type = -1;
434  cont_data->method = -1;
435  cont_data->n_domain = -1;
436  cont_data->depth = -1;
437  cont_data->is_print_ucd = -1;
438  cont_data->contact = -1;
439  cont_data->is_print_part= -1;
440  cont_data->ucd_file_name[0] = '\0';
441  cont_data->part_file_name[0] = '\0';
442 
443  while ((token = HECMW_partlex_next_token()) != HECMW_PARTLEX_NL ||
444  (token = HECMW_partlex_next_token())) {
445  switch (token) {
446  case HECMW_PARTLEX_K_TYPE: /* TYPE */
447  cont_data->type = part_cont_type();
448  if (cont_data->type < 0) return -1;
449  break;
450 
451  case HECMW_PARTLEX_K_METHOD: /* METHOD */
452  cont_data->method = part_cont_method();
453  if (cont_data->method < 0) return -1;
454  break;
455 
456  case HECMW_PARTLEX_K_DOMAIN: /* DOMAIN */
457  cont_data->n_domain = part_cont_domain();
458  if (cont_data->n_domain < 0) return -1;
459  break;
460 
461  case HECMW_PARTLEX_K_DEPTH: /* DEPTH */
462  cont_data->depth = part_cont_depth();
463  if (cont_data->depth < 0) return -1;
464  break;
465 
466  case HECMW_PARTLEX_K_UCD: /* UCD */
467  cont_data->is_print_ucd = part_cont_ucd(cont_data->ucd_file_name,
468  sizeof(cont_data->ucd_file_name));
469  if (cont_data->is_print_ucd < 0) return -1;
470  break;
471 
472  case HECMW_PARTLEX_K_CONTACT: /* CONTACT */
473  cont_data->contact = part_cont_contact();
474  if (cont_data->contact < 0) return -1;
475  break;
476 
477  case HECMW_PARTLEX_K_PART: /* PART */
478  cont_data->is_print_part = part_cont_part(cont_data->part_file_name,
479  sizeof(cont_data->part_file_name));
480  if (cont_data->is_print_part < 0) return -1;
481  break;
482 
483  default:
484  HECMW_log(HECMW_LOG_ERROR, "%s %s (%s)",
486  "in control data for partitioner", HECMW_partlex_get_text());
487  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
488  "part_cont_partition", HECMW_partlex_get_text());
489  return -1;
490  }
491 
492  token = HECMW_partlex_next_token();
493  if (token != ',' && token != HECMW_PARTLEX_NL && token != EOF) {
494  HECMW_log(HECMW_LOG_ERROR, "%s %s (%s)",
496  "in control file for partitioner", HECMW_partlex_get_text());
497  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
498  "part_cont_partition", HECMW_partlex_get_text());
499  return -1;
500  } else {
501  if (token == HECMW_PARTLEX_NL || token == EOF) break;
502  }
503  }
504 
505  /* check data */
506  if (cont_data->type < 0) {
508  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
509  "part_cont_partition");
510  return -1;
511  }
512 
513 #ifndef HECMW_PART_WITH_METIS
514  if (cont_data->method == HECMW_PART_METHOD_PMETIS) {
516  HECMW_log(HECMW_LOG_DEBUG, "%s:%d", __FILE__, __LINE__);
517  return -1;
518  }
519 
520  if (cont_data->method == HECMW_PART_METHOD_KMETIS) {
522  HECMW_log(HECMW_LOG_DEBUG, "%s:%d", __FILE__, __LINE__);
523  return -1;
524  }
525 #endif
526 
529 
530  if (cont_data->method < 0) {
532  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
533  "part_cont_partition");
534  return -1;
535  }
537  cont_data->method == HECMW_PART_METHOD_KMETIS ||
539 
540  if (cont_data->n_domain <= 0) {
542  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
543  "part_cont_partition");
544  return -1;
545  }
546 
547  if (cont_data->depth < 0) {
548  cont_data->depth = 1;
549  }
550 
551  if (cont_data->is_print_ucd < 0) {
552  cont_data->is_print_ucd = 0;
553  }
554 
555  if (cont_data->is_print_part < 0) {
556  cont_data->is_print_part = 0;
557  }
558 
559  if (cont_data->method == HECMW_PART_METHOD_USER) {
560  cont_data->is_print_part = 0;
561  }
562 
563  /* partitioning directions ( option for RCB ) */
564  if (cont_data->method == HECMW_PART_METHOD_RCB) {
565  if (token == EOF) {
567  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
568  "part_cont_partition");
569  return -1;
570  }
571  part_cont_rcb_opt(cont_data);
572  }
573 
574  if (token == EOF) {
575  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
577  "control file for partitioner");
578  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
579  "part_cont_partition");
580  return -1;
581  } else {
582  return 0;
583  }
584 }
585 
586 /*----------------------------------------------------------------------------*/
587 /* get control data */
588 /*----------------------------------------------------------------------------*/
589 static int part_get_control(struct hecmw_part_cont_data *cont_data) {
590  int token, stat;
591  FILE *fp;
592 
593  if (args_subdomain){
595  cont_data->method = HECMW_PART_METHOD_KMETIS; /*HECMW_PART_METHOD_RCB; HECMW_PART_METHOD_PMETIS;*/
596  cont_data->n_domain = args_subdomain;
597  cont_data->depth = 1;
598  cont_data->is_print_ucd = 0;
600  cont_data->is_print_part= 0;
601  return 0;
602  }
603 
604  /* open file */
605  if (strlen(ctrl_file_name) == 0) {
606  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
608  "control file name for partitioner is not set");
609  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
610  "part_get_control");
611  return -1;
612  }
613  if ((fp = fopen(ctrl_file_name, "r")) == NULL) {
614  HECMW_log(HECMW_LOG_ERROR, "%s (%s)", HECMW_strmsg(errno),
615  "control file for partitioner");
616  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
617  "part_get_control");
618  return -1;
619  }
620 
621  /* initialize lex */
622  stat = HECMW_partlex_set_input(fp);
623  if (stat) {
624  return -1;
625  }
626 
627  /* get control data */
628  while ((token = HECMW_partlex_next_token())) {
629  switch (token) {
630  case HECMW_PARTLEX_H_PARTITION: /* !PARTITION */
631  token = HECMW_partlex_next_token();
632  switch (token) {
633  case ',': /* normal */
634  if (part_cont_partition(cont_data)) return -1;
635  break;
636 
637  case HECMW_PARTLEX_NL: /* no option */
643  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
644  "part_cont_partition");
645  return -1;
646 
647  default: /* invalid delimiter */
648  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
651  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
652  "part_cont_partition", HECMW_partlex_get_text());
653  return -1;
654  }
655  break;
656 
657  case HECMW_PARTLEX_NL: /* new line */
658  break;
659 
660  case 'x':
661  case 'y':
662  case 'z':
663  switch (cont_data->method) {
665  if (cont_data->n_domain > 1) {
668  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
669  "part_cont_partition", HECMW_partlex_get_text());
670  return -1;
671  } else {
672  break;
673  }
674 
680  break;
681 
682  default:
685  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
686  "part_cont_partition", HECMW_partlex_get_text());
687  return -1;
688  }
689  while ((token = HECMW_partlex_next_token()) &&
690  token != HECMW_PARTLEX_NL) {
691  }
692  goto finalize;
693 
694  default:
696  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
697  "part_cont_partition", HECMW_partlex_get_text());
698  return -1;
699  }
700  }
701 
702 /* close file */
703 finalize:
704  if (fclose(fp)) {
706  "control file for partitioner");
707  return -1;
708  }
709 
710  return 0;
711 }
712 
713 /*============================================================================*/
714 
717 
718  /* allocate structure for control data */
720  sizeof(struct hecmw_part_cont_data));
721  if (cont_data == NULL) {
723  return NULL;
724  }
725  cont_data->rcb_axis = NULL;
726 
727  /* get control data via file */
728  if (part_get_control(cont_data)) {
730  return NULL;
731  }
732 
733  return cont_data;
734 }
735 
736 /*================================================================================================*/
737 
739  if (cont_data->rcb_axis) {
740  HECMW_free(cont_data->rcb_axis);
741  }
743 }
#define HECMW_FILENAME_LEN
Definition: hecmw_config.h:74
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:33
#define NULL
int HECMW_log(int loglv, const char *fmt,...)
Definition: hecmw_log.c:260
#define HECMW_LOG_ERROR
Definition: hecmw_log.h:15
#define HECMW_LOG_WARN
Definition: hecmw_log.h:17
#define HECMW_LOG_DEBUG
Definition: hecmw_log.h:21
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
char * HECMW_strmsg(int msgno)
Definition: hecmw_msg.c:31
#define HECMW_PART_E_CTRL_DEPTH_NOEQ
#define HECMW_PART_E_FILE_CLOSE
#define HECMW_PART_E_CTRL_UCD_INVAL
#define HECMW_PART_METHOD_PMETIS
#define HECMW_PART_E_CTRL_UCD_NOEQ
#define HECMW_PART_E_CTRL_DOMAIN_POW
#define HECMW_PART_W_CTRL_RCB_MANY_DIR
#define HECMW_PART_RCB_Z_AXIS
#define HECMW_PART_RCB_Y_AXIS
#define HECMW_PART_E_CTRL_NODEF_KMETIS
#define HECMW_PART_E_CTRL_TYPE_INVAL
#define HECMW_PART_RCB_X_AXIS
#define HECMW_PART_E_CTRL_PART_TOO_LONG
#define HECMW_PART_E_TOO_LONG_FNAME
#define HECMW_PART_E_CTRL_RCB_FEW_DIR
#define HECMW_PART_E_CTRL_NO_METHOD
#define HECMW_PART_E_CTRL_PART_NOEQ
#define HECMW_PART_METHOD_RCB
#define HECMW_PART_E_CTRL_METHOD_NOEQ
#define HECMW_PART_E_CTRL_METHOD_INVAL
#define HECMW_PART_CONTACT_DEFAULT
#define HECMW_PART_E_INV_ARG
#define HECMW_PART_E_CTRL_NO_TYPE
#define HECMW_PART_E_CTRL_TYPE_NOEQ
#define HECMW_PART_E_CTRL_DOMAIN_NOEQ
#define HECMW_PART_TYPE_NODE_BASED
#define HECMW_PART_E_CTRL_RCB_NODIR
#define HECMW_PART_E_CTRL_RCB_INVAL
#define HECMW_PART_METHOD_KMETIS
#define HECMW_PART_E_CTRL_DOMAIN_INVAL
#define HECMW_PART_E_CTRL_DEPTH_INVAL
#define HECMW_PART_E_INVALID_TOKEN
#define HECMW_PART_E_CTRL_PART_INVAL
#define HECMW_PART_E_CTRL_NODEF_PMETIS
#define HECMW_PART_E_CTRL_CONTACT_INVAL
#define HECMW_PART_CONTACT_DISTRIBUTE
#define HECMW_PART_CONTACT_SIMPLE
#define HECMW_PART_E_INVALID_EOF
#define HECMW_PART_CONTACT_AGGREGATE
#define HECMW_PART_E_CTRL_UCD_TOO_LONG
#define HECMW_PART_METHOD_USER
#define HECMW_PART_E_CTRL_NO_DOMAIN
#define HECMW_PART_E_NULL_POINTER
#define HECMW_PART_W_CTRL_DIR_WORCB
#define HECMW_PART_TYPE_ELEMENT_BASED
void HECMW_part_free_control(struct hecmw_part_cont_data *cont_data)
int HECMW_part_set_ctrl_file_name(char *fname)
struct hecmw_part_cont_data * HECMW_part_get_control(void)
int HECMW_part_set_subdomains(int n_domain)
#define HECMW_PARTLEX_V_DEFAULT
Definition: hecmw_partlex.h:51
#define HECMW_PARTLEX_V_DISTRIBUTE
Definition: hecmw_partlex.h:55
#define HECMW_PARTLEX_FILENAME
Definition: hecmw_partlex.h:19
#define HECMW_PARTLEX_K_TYPE
Definition: hecmw_partlex.h:23
#define HECMW_PARTLEX_K_DOMAIN
Definition: hecmw_partlex.h:27
#define HECMW_PARTLEX_K_METHOD
Definition: hecmw_partlex.h:25
#define HECMW_PARTLEX_V_RCB
Definition: hecmw_partlex.h:41
#define HECMW_PARTLEX_K_UCD
Definition: hecmw_partlex.h:31
#define HECMW_PARTLEX_V_PMETIS
Definition: hecmw_partlex.h:45
#define HECMW_PARTLEX_INT
Definition: hecmw_partlex.h:13
char * HECMW_partlex_get_text(void)
#define HECMW_PARTLEX_V_SIMPLE
Definition: hecmw_partlex.h:57
#define HECMW_PARTLEX_K_PART
Definition: hecmw_partlex.h:35
#define HECMW_PARTLEX_NL
Definition: hecmw_partlex.h:11
int HECMW_partlex_set_input(FILE *fp)
#define HECMW_PARTLEX_V_AGGREGATE
Definition: hecmw_partlex.h:53
double HECMW_partlex_get_number(void)
#define HECMW_PARTLEX_V_NODE_BASED
Definition: hecmw_partlex.h:37
#define HECMW_PARTLEX_NAME
Definition: hecmw_partlex.h:17
#define HECMW_PARTLEX_K_CONTACT
Definition: hecmw_partlex.h:33
#define HECMW_PARTLEX_K_DEPTH
Definition: hecmw_partlex.h:29
#define HECMW_PARTLEX_H_PARTITION
Definition: hecmw_partlex.h:21
#define HECMW_PARTLEX_V_KMETIS
Definition: hecmw_partlex.h:43
int HECMW_partlex_next_token(void)
#define HECMW_PARTLEX_V_ELEMENT_BASED
Definition: hecmw_partlex.h:39
#define HECMW_PARTLEX_V_USER
Definition: hecmw_partlex.h:49
#define HECMW_assert(cond)
Definition: hecmw_util.h:40