FrontISTR  5.7.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  strcpy(ctrl_file_name, 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) {
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  strcpy(name, 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) {
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  strcpy(name, 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  strcpy(cont_data->ucd_file_name, "\0");
441  strcpy(cont_data->part_file_name, "\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  if (cont_data->is_print_ucd < 0) return -1;
469  break;
470 
471  case HECMW_PARTLEX_K_CONTACT: /* CONTACT */
472  cont_data->contact = part_cont_contact();
473  if (cont_data->contact < 0) return -1;
474  break;
475 
476  case HECMW_PARTLEX_K_PART: /* PART */
477  cont_data->is_print_part = part_cont_part(cont_data->part_file_name);
478  if (cont_data->is_print_part < 0) return -1;
479  break;
480 
481  default:
482  HECMW_log(HECMW_LOG_ERROR, "%s %s (%s)",
484  "in control data for partitioner", HECMW_partlex_get_text());
485  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
486  "part_cont_partition", HECMW_partlex_get_text());
487  return -1;
488  }
489 
490  token = HECMW_partlex_next_token();
491  if (token != ',' && token != HECMW_PARTLEX_NL && token != EOF) {
492  HECMW_log(HECMW_LOG_ERROR, "%s %s (%s)",
494  "in control file for partitioner", HECMW_partlex_get_text());
495  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
496  "part_cont_partition", HECMW_partlex_get_text());
497  return -1;
498  } else {
499  if (token == HECMW_PARTLEX_NL || token == EOF) break;
500  }
501  }
502 
503  /* check data */
504  if (cont_data->type < 0) {
506  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
507  "part_cont_partition");
508  return -1;
509  }
510 
511 #ifndef HECMW_PART_WITH_METIS
512  if (cont_data->method == HECMW_PART_METHOD_PMETIS) {
514  HECMW_log(HECMW_LOG_DEBUG, "%s:%d", __FILE__, __LINE__);
515  return -1;
516  }
517 
518  if (cont_data->method == HECMW_PART_METHOD_KMETIS) {
520  HECMW_log(HECMW_LOG_DEBUG, "%s:%d", __FILE__, __LINE__);
521  return -1;
522  }
523 #endif
524 
527 
528  if (cont_data->method < 0) {
530  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
531  "part_cont_partition");
532  return -1;
533  }
535  cont_data->method == HECMW_PART_METHOD_KMETIS ||
537 
538  if (cont_data->n_domain <= 0) {
540  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
541  "part_cont_partition");
542  return -1;
543  }
544 
545  if (cont_data->depth < 0) {
546  cont_data->depth = 1;
547  }
548 
549  if (cont_data->is_print_ucd < 0) {
550  cont_data->is_print_ucd = 0;
551  }
552 
553  if (cont_data->is_print_part < 0) {
554  cont_data->is_print_part = 0;
555  }
556 
557  if (cont_data->method == HECMW_PART_METHOD_USER) {
558  cont_data->is_print_part = 0;
559  }
560 
561  /* partitioning directions ( option for RCB ) */
562  if (cont_data->method == HECMW_PART_METHOD_RCB) {
563  if (token == EOF) {
565  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
566  "part_cont_partition");
567  return -1;
568  }
569  part_cont_rcb_opt(cont_data);
570  }
571 
572  if (token == EOF) {
573  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
575  "control file for partitioner");
576  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
577  "part_cont_partition");
578  return -1;
579  } else {
580  return 0;
581  }
582 }
583 
584 /*----------------------------------------------------------------------------*/
585 /* get control data */
586 /*----------------------------------------------------------------------------*/
587 static int part_get_control(struct hecmw_part_cont_data *cont_data) {
588  int token, stat;
589  FILE *fp;
590 
591  if (args_subdomain){
593  cont_data->method = HECMW_PART_METHOD_KMETIS; /*HECMW_PART_METHOD_RCB; HECMW_PART_METHOD_PMETIS;*/
594  cont_data->n_domain = args_subdomain;
595  cont_data->depth = 1;
596  cont_data->is_print_ucd = 0;
598  cont_data->is_print_part= 0;
599  return 0;
600  }
601 
602  /* open file */
603  if (strlen(ctrl_file_name) == 0) {
604  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
606  "control file name for partitioner is not set");
607  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
608  "part_get_control");
609  return -1;
610  }
611  if ((fp = fopen(ctrl_file_name, "r")) == NULL) {
612  HECMW_log(HECMW_LOG_ERROR, "%s (%s)", HECMW_strmsg(errno),
613  "control file for partitioner");
614  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
615  "part_get_control");
616  return -1;
617  }
618 
619  /* initialize lex */
620  stat = HECMW_partlex_set_input(fp);
621  if (stat) {
622  return -1;
623  }
624 
625  /* get control data */
626  while ((token = HECMW_partlex_next_token())) {
627  switch (token) {
628  case HECMW_PARTLEX_H_PARTITION: /* !PARTITION */
629  token = HECMW_partlex_next_token();
630  switch (token) {
631  case ',': /* normal */
632  if (part_cont_partition(cont_data)) return -1;
633  break;
634 
635  case HECMW_PARTLEX_NL: /* no option */
641  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s", __FILE__, __LINE__,
642  "part_cont_partition");
643  return -1;
644 
645  default: /* invalid delimiter */
646  HECMW_log(HECMW_LOG_ERROR, "%s (%s)",
649  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
650  "part_cont_partition", HECMW_partlex_get_text());
651  return -1;
652  }
653  break;
654 
655  case HECMW_PARTLEX_NL: /* new line */
656  break;
657 
658  case 'x':
659  case 'y':
660  case 'z':
661  switch (cont_data->method) {
663  if (cont_data->n_domain > 1) {
666  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
667  "part_cont_partition", HECMW_partlex_get_text());
668  return -1;
669  } else {
670  break;
671  }
672 
678  break;
679 
680  default:
683  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
684  "part_cont_partition", HECMW_partlex_get_text());
685  return -1;
686  }
687  while ((token = HECMW_partlex_next_token()) &&
688  token != HECMW_PARTLEX_NL) {
689  }
690  goto finalize;
691 
692  default:
694  HECMW_log(HECMW_LOG_DEBUG, "%s:%d:%s (%s)", __FILE__, __LINE__,
695  "part_cont_partition", HECMW_partlex_get_text());
696  return -1;
697  }
698  }
699 
700 /* close file */
701 finalize:
702  if (fclose(fp)) {
704  "control file for partitioner");
705  return -1;
706  }
707 
708  return 0;
709 }
710 
711 /*============================================================================*/
712 
715 
716  /* allocate structure for control data */
718  sizeof(struct hecmw_part_cont_data));
719  if (cont_data == NULL) {
721  return NULL;
722  }
723  cont_data->rcb_axis = NULL;
724 
725  /* get control data via file */
726  if (part_get_control(cont_data)) {
728  return NULL;
729  }
730 
731  return cont_data;
732 }
733 
734 /*================================================================================================*/
735 
737  if (cont_data->rcb_axis) {
738  HECMW_free(cont_data->rcb_axis);
739  }
741 }
HECMW_LOG_WARN
#define HECMW_LOG_WARN
Definition: hecmw_log.h:17
HECMW_PARTLEX_V_DEFAULT
#define HECMW_PARTLEX_V_DEFAULT
Definition: hecmw_partlex.h:51
HECMW_PART_E_CTRL_DEPTH_NOEQ
#define HECMW_PART_E_CTRL_DEPTH_NOEQ
Definition: hecmw_part_define.h:91
HECMW_PART_E_CTRL_TYPE_INVAL
#define HECMW_PART_E_CTRL_TYPE_INVAL
Definition: hecmw_part_define.h:67
HECMW_PART_E_CTRL_METHOD_NOEQ
#define HECMW_PART_E_CTRL_METHOD_NOEQ
Definition: hecmw_part_define.h:75
HECMW_partlex_get_number
double HECMW_partlex_get_number(void)
HECMW_PART_E_CTRL_RCB_INVAL
#define HECMW_PART_E_CTRL_RCB_INVAL
Definition: hecmw_part_define.h:101
HECMW_PART_E_FILE_CLOSE
#define HECMW_PART_E_FILE_CLOSE
Definition: hecmw_part_define.h:53
HECMW_partlex_next_token
int HECMW_partlex_next_token(void)
HECMW_PART_E_CTRL_NODEF_KMETIS
#define HECMW_PART_E_CTRL_NODEF_KMETIS
Definition: hecmw_part_define.h:79
HECMW_PARTLEX_V_ELEMENT_BASED
#define HECMW_PARTLEX_V_ELEMENT_BASED
Definition: hecmw_partlex.h:39
HECMW_PART_RCB_Y_AXIS
#define HECMW_PART_RCB_Y_AXIS
Definition: hecmw_part_define.h:47
HECMW_LOG_DEBUG
#define HECMW_LOG_DEBUG
Definition: hecmw_log.h:21
HECMW_PARTLEX_NAME
#define HECMW_PARTLEX_NAME
Definition: hecmw_partlex.h:17
HECMW_malloc
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
HECMW_PART_E_CTRL_PART_INVAL
#define HECMW_PART_E_CTRL_PART_INVAL
Definition: hecmw_part_define.h:115
HECMW_log
int HECMW_log(int loglv, const char *fmt,...)
Definition: hecmw_log.c:260
HECMW_PART_E_CTRL_TYPE_NOEQ
#define HECMW_PART_E_CTRL_TYPE_NOEQ
Definition: hecmw_part_define.h:69
HECMW_PARTLEX_K_DEPTH
#define HECMW_PARTLEX_K_DEPTH
Definition: hecmw_partlex.h:29
HECMW_PART_TYPE_ELEMENT_BASED
#define HECMW_PART_TYPE_ELEMENT_BASED
Definition: hecmw_part_define.h:25
HECMW_PARTLEX_V_NODE_BASED
#define HECMW_PARTLEX_V_NODE_BASED
Definition: hecmw_partlex.h:37
HECMW_PART_CONTACT_AGGREGATE
#define HECMW_PART_CONTACT_AGGREGATE
Definition: hecmw_part_define.h:39
HECMW_PART_CONTACT_DEFAULT
#define HECMW_PART_CONTACT_DEFAULT
Definition: hecmw_part_define.h:37
HECMW_PARTLEX_V_AGGREGATE
#define HECMW_PARTLEX_V_AGGREGATE
Definition: hecmw_partlex.h:53
HECMW_PART_E_TOO_LONG_FNAME
#define HECMW_PART_E_TOO_LONG_FNAME
Definition: hecmw_part_define.h:55
HECMW_PARTLEX_K_METHOD
#define HECMW_PARTLEX_K_METHOD
Definition: hecmw_partlex.h:25
HECMW_PART_METHOD_PMETIS
#define HECMW_PART_METHOD_PMETIS
Definition: hecmw_part_define.h:31
HECMW_PART_E_CTRL_DOMAIN_NOEQ
#define HECMW_PART_E_CTRL_DOMAIN_NOEQ
Definition: hecmw_part_define.h:85
hecmw_part_cont_data
Definition: hecmw_part_struct.h:23
HECMW_part_get_control
struct hecmw_part_cont_data * HECMW_part_get_control(void)
Definition: hecmw_part_get_control.c:713
HECMW_PART_E_CTRL_NO_TYPE
#define HECMW_PART_E_CTRL_NO_TYPE
Definition: hecmw_part_define.h:65
HECMW_PART_E_CTRL_DOMAIN_INVAL
#define HECMW_PART_E_CTRL_DOMAIN_INVAL
Definition: hecmw_part_define.h:83
HECMW_PART_E_CTRL_NO_METHOD
#define HECMW_PART_E_CTRL_NO_METHOD
Definition: hecmw_part_define.h:71
HECMW_PART_E_NULL_POINTER
#define HECMW_PART_E_NULL_POINTER
Definition: hecmw_part_define.h:57
HECMW_PARTLEX_V_PMETIS
#define HECMW_PARTLEX_V_PMETIS
Definition: hecmw_partlex.h:45
HECMW_PART_W_CTRL_RCB_MANY_DIR
#define HECMW_PART_W_CTRL_RCB_MANY_DIR
Definition: hecmw_part_define.h:105
HECMW_PART_E_CTRL_RCB_FEW_DIR
#define HECMW_PART_E_CTRL_RCB_FEW_DIR
Definition: hecmw_part_define.h:103
HECMW_PART_E_INVALID_TOKEN
#define HECMW_PART_E_INVALID_TOKEN
Definition: hecmw_part_define.h:63
HECMW_partlex_get_text
char * HECMW_partlex_get_text(void)
HECMW_PART_METHOD_RCB
#define HECMW_PART_METHOD_RCB
Definition: hecmw_part_define.h:27
HECMW_part_free_control
void HECMW_part_free_control(struct hecmw_part_cont_data *cont_data)
Definition: hecmw_part_get_control.c:736
HECMW_PART_E_CTRL_UCD_INVAL
#define HECMW_PART_E_CTRL_UCD_INVAL
Definition: hecmw_part_define.h:97
HECMW_LOG_ERROR
#define HECMW_LOG_ERROR
Definition: hecmw_log.h:15
HECMW_PARTLEX_V_RCB
#define HECMW_PARTLEX_V_RCB
Definition: hecmw_partlex.h:41
HECMW_PART_E_CTRL_NO_DOMAIN
#define HECMW_PART_E_CTRL_NO_DOMAIN
Definition: hecmw_part_define.h:81
hecmw_io.h
hecmw_part_struct.h
HECMW_PARTLEX_INT
#define HECMW_PARTLEX_INT
Definition: hecmw_partlex.h:13
HECMW_PART_E_INV_ARG
#define HECMW_PART_E_INV_ARG
Definition: hecmw_part_define.h:61
HECMW_PARTLEX_K_TYPE
#define HECMW_PARTLEX_K_TYPE
Definition: hecmw_partlex.h:23
HECMW_PARTLEX_V_USER
#define HECMW_PARTLEX_V_USER
Definition: hecmw_partlex.h:49
hecmw_part_define.h
HECMW_PART_E_CTRL_RCB_NODIR
#define HECMW_PART_E_CTRL_RCB_NODIR
Definition: hecmw_part_define.h:107
HECMW_strmsg
char * HECMW_strmsg(int msgno)
Definition: hecmw_msg.c:31
hecmw_partlex.h
HECMW_part_set_subdomains
int HECMW_part_set_subdomains(int n_domain)
Definition: hecmw_part_get_control.c:24
HECMW_PARTLEX_K_DOMAIN
#define HECMW_PARTLEX_K_DOMAIN
Definition: hecmw_partlex.h:27
HECMW_PARTLEX_K_UCD
#define HECMW_PARTLEX_K_UCD
Definition: hecmw_partlex.h:31
HECMW_PART_W_CTRL_DIR_WORCB
#define HECMW_PART_W_CTRL_DIR_WORCB
Definition: hecmw_part_define.h:109
HECMW_PARTLEX_K_CONTACT
#define HECMW_PARTLEX_K_CONTACT
Definition: hecmw_partlex.h:33
HECMW_PARTLEX_NL
#define HECMW_PARTLEX_NL
Definition: hecmw_partlex.h:11
HECMW_PART_E_CTRL_UCD_TOO_LONG
#define HECMW_PART_E_CTRL_UCD_TOO_LONG
Definition: hecmw_part_define.h:93
HECMW_PART_RCB_X_AXIS
#define HECMW_PART_RCB_X_AXIS
Definition: hecmw_part_define.h:45
HECMW_PARTLEX_FILENAME
#define HECMW_PARTLEX_FILENAME
Definition: hecmw_partlex.h:19
HECMW_PART_E_CTRL_NODEF_PMETIS
#define HECMW_PART_E_CTRL_NODEF_PMETIS
Definition: hecmw_part_define.h:77
HECMW_PART_E_CTRL_METHOD_INVAL
#define HECMW_PART_E_CTRL_METHOD_INVAL
Definition: hecmw_part_define.h:73
HECMW_PART_E_CTRL_UCD_NOEQ
#define HECMW_PART_E_CTRL_UCD_NOEQ
Definition: hecmw_part_define.h:95
HECMW_part_set_ctrl_file_name
int HECMW_part_set_ctrl_file_name(char *fname)
Definition: hecmw_part_get_control.c:29
HECMW_PART_E_INVALID_EOF
#define HECMW_PART_E_INVALID_EOF
Definition: hecmw_part_define.h:59
HECMW_PART_CONTACT_SIMPLE
#define HECMW_PART_CONTACT_SIMPLE
Definition: hecmw_part_define.h:43
HECMW_PART_TYPE_NODE_BASED
#define HECMW_PART_TYPE_NODE_BASED
Definition: hecmw_part_define.h:23
hecmw_part_get_control.h
HECMW_PART_E_CTRL_DEPTH_INVAL
#define HECMW_PART_E_CTRL_DEPTH_INVAL
Definition: hecmw_part_define.h:89
HECMW_PART_METHOD_USER
#define HECMW_PART_METHOD_USER
Definition: hecmw_part_define.h:35
HECMW_partlex_set_input
int HECMW_partlex_set_input(FILE *fp)
HECMW_set_error
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:37
HECMW_PARTLEX_V_SIMPLE
#define HECMW_PARTLEX_V_SIMPLE
Definition: hecmw_partlex.h:57
NULL
#define NULL
Definition: hecmw_io_nastran.c:30
HECMW_free
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
HECMW_PART_E_CTRL_PART_TOO_LONG
#define HECMW_PART_E_CTRL_PART_TOO_LONG
Definition: hecmw_part_define.h:111
HECMW_assert
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
HECMW_PART_E_CTRL_PART_NOEQ
#define HECMW_PART_E_CTRL_PART_NOEQ
Definition: hecmw_part_define.h:113
HECMW_FILENAME_LEN
#define HECMW_FILENAME_LEN
Definition: hecmw_config.h:72
HECMW_PARTLEX_K_PART
#define HECMW_PARTLEX_K_PART
Definition: hecmw_partlex.h:35
HECMW_PART_E_CTRL_CONTACT_INVAL
#define HECMW_PART_E_CTRL_CONTACT_INVAL
Definition: hecmw_part_define.h:99
HECMW_PART_E_CTRL_DOMAIN_POW
#define HECMW_PART_E_CTRL_DOMAIN_POW
Definition: hecmw_part_define.h:87
hecmw_util.h
HECMW_PARTLEX_H_PARTITION
#define HECMW_PARTLEX_H_PARTITION
Definition: hecmw_partlex.h:21
HECMW_PARTLEX_V_DISTRIBUTE
#define HECMW_PARTLEX_V_DISTRIBUTE
Definition: hecmw_partlex.h:55
HECMW_PARTLEX_V_KMETIS
#define HECMW_PARTLEX_V_KMETIS
Definition: hecmw_partlex.h:43
HECMW_PART_METHOD_KMETIS
#define HECMW_PART_METHOD_KMETIS
Definition: hecmw_part_define.h:29
HECMW_PART_RCB_Z_AXIS
#define HECMW_PART_RCB_Z_AXIS
Definition: hecmw_part_define.h:49
HECMW_PART_CONTACT_DISTRIBUTE
#define HECMW_PART_CONTACT_DISTRIBUTE
Definition: hecmw_part_define.h:41
cont_data
Definition: hecmw_vis_resampling.h:94