FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
hecmw_part_log.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 <string.h>
9 #include <errno.h>
10 
11 #include "hecmw_msgno.h"
12 #include "hecmw_error.h"
13 #include "hecmw_malloc.h"
14 #include "hecmw_part_define.h"
15 #include "hecmw_part_log.h"
16 
17 static int is_init = 0;
18 
19 static int n_node_g = 0;
20 
21 static int n_elem_g = 0;
22 
23 static int *n_node = NULL;
24 
25 static int *nn_internal = NULL;
26 
27 static int *n_elem = NULL;
28 
29 static int *ne_internal = NULL;
30 
31 static int *n_neighbor_pe = NULL;
32 
33 static int n_domain = 0;
34 
35 static int depth = 0;
36 
37 static long long int n_edge = 0;
38 
39 static int n_edgecut = 0;
40 
41 static char part_type[HECMW_NAME_LEN] = "";
42 
43 static char part_method[HECMW_NAME_LEN] = "";
44 
45 static char part_contact[HECMW_NAME_LEN] = "";
46 
47 /*================================================================================================*/
48 
49 static void clean_log(void) {
50  HECMW_free(n_node);
51  HECMW_free(n_elem);
52  HECMW_free(nn_internal);
53  HECMW_free(ne_internal);
54  HECMW_free(n_neighbor_pe);
55 
56  n_node = NULL;
57  n_elem = NULL;
58  nn_internal = NULL;
59  ne_internal = NULL;
60 
61  is_init = 0;
62  n_node_g = 0;
63  n_elem_g = 0;
64  n_domain = 0;
65  depth = 0;
66  n_edge = 0;
67  n_edgecut = 0;
68  memset(part_type, '\0', HECMW_NAME_LEN);
69  memset(part_method, '\0', HECMW_NAME_LEN);
70 }
71 
72 extern int HECMW_part_init_log(int _n_domain) {
73  if (is_init) {
75  return 0;
76  } else {
77  is_init = 1;
78  }
79 
80  if (_n_domain < 1) {
82  goto error;
83  }
84 
85  n_domain = _n_domain;
86 
87  n_node = (int *)HECMW_calloc(n_domain, sizeof(int));
88  if (n_node == NULL) {
89  HECMW_set_error(errno, "");
90  goto error;
91  }
92 
93  n_elem = (int *)HECMW_calloc(n_domain, sizeof(int));
94  if (n_elem == NULL) {
95  HECMW_set_error(errno, "");
96  goto error;
97  }
98 
99  nn_internal = (int *)HECMW_calloc(n_domain, sizeof(int));
100  if (nn_internal == NULL) {
101  HECMW_set_error(errno, "");
102  goto error;
103  }
104 
105  ne_internal = (int *)HECMW_calloc(n_domain, sizeof(int));
106  if (ne_internal == NULL) {
107  HECMW_set_error(errno, "");
108  goto error;
109  }
110 
111  n_neighbor_pe = (int *)HECMW_calloc(n_domain, sizeof(int));
112  if (n_neighbor_pe == NULL) {
113  HECMW_set_error(errno, "");
114  goto error;
115  }
116 
117  return 0;
118 
119 error:
120  return -1;
121 }
122 
123 /*================================================================================================*/
124 
125 extern int HECMW_part_set_log_part_type(int _part_type) {
126  if (is_init == 0) {
128  goto error;
129  }
130 
131  switch (_part_type) {
133  strcpy(part_type, "NODE-BASED");
134  break;
135 
137  strcpy(part_type, "ELEMENT-BASED");
138  break;
139 
140  default:
142  goto error;
143  }
144 
145  return 0;
146 
147 error:
148  return -1;
149 }
150 
151 extern int HECMW_part_set_log_part_method(int _part_method) {
152  if (is_init == 0) {
154  return -1;
155  }
156 
157  switch (_part_method) {
159  strcpy(part_method, "RCB");
160  break;
161 
163  strcpy(part_method, "kMETIS");
164  break;
165 
167  strcpy(part_method, "pMETIS");
168  break;
169 
171  strcpy(part_method, "USER");
172  break;
173 
174  default:
176  return -1;
177  }
178 
179  return 0;
180 }
181 
182 extern int HECMW_part_set_log_part_depth(int _depth) {
183  if (is_init == 0) {
185  return -1;
186  }
187 
188  if (_depth < 1) {
190  return -1;
191  }
192 
193  depth = _depth;
194 
195  return 0;
196 }
197 
198 extern int HECMW_part_set_log_part_contact(int _part_contact) {
199  if (is_init == 0) {
201  return -1;
202  }
203 
204  switch (_part_contact) {
206  strcpy(part_contact, "AGGREGATE");
207  break;
208 
210  strcpy(part_contact, "DISTRIBUTE");
211  break;
212 
214  strcpy(part_contact, "SIMPLE");
215  break;
216 
218  strcpy(part_contact, "DEFAULT");
219  break;
220 
221  default:
222  strcpy(part_contact, "not set");
223  break;
224  }
225 
226  return 0;
227 }
228 
229 extern int HECMW_part_set_log_n_edgecut(long long int _n_edge, int _n_edgecut) {
230  if (is_init == 0) {
232  return -1;
233  }
234 
235  if (_n_edgecut < 0) {
236  HECMW_set_error(HECMW_PART_E_NEDGECUT_LOWER, "%d", _n_edgecut);
237  return -1;
238  }
239 
240  if (_n_edge < 1) {
242  return -1;
243  }
244 
245  n_edge = _n_edge;
246  n_edgecut = _n_edgecut;
247 
248  return 0;
249 }
250 
251 extern int HECMW_part_set_log_n_node_g(int _n_node_g) {
252  if (is_init == 0) {
254  return -1;
255  }
256 
257  if (_n_node_g < 1) {
258  HECMW_set_error(HECMW_PART_E_NNODE_MIN, "%d", _n_node_g);
259  return -1;
260  }
261 
262  n_node_g = _n_node_g;
263 
264  return 0;
265 }
266 
267 extern int HECMW_part_set_log_n_elem_g(int _n_elem_g) {
268  if (is_init == 0) {
270  return -1;
271  }
272 
273  if (_n_elem_g < 1) {
274  HECMW_set_error(HECMW_PART_E_NELEM_MIN, "%d", _n_elem_g);
275  return -1;
276  }
277 
278  n_elem_g = _n_elem_g;
279 
280  return 0;
281 }
282 
283 extern int HECMW_part_set_log_n_node(int domain, int _n_node) {
284  if (is_init == 0) {
286  return -1;
287  }
288 
289  if (domain < 0) {
291  return -1;
292  }
293  if (domain >= n_domain) {
295  return -1;
296  }
297 
298  if (_n_node < 1) {
300  return -1;
301  }
302 
303  n_node[domain] = _n_node;
304 
305  return 0;
306 }
307 
308 extern int HECMW_part_set_log_n_elem(int domain, int _n_elem) {
309  if (is_init == 0) {
311  return -1;
312  }
313 
314  if (domain < 0) {
316  return -1;
317  }
318  if (domain >= n_domain) {
320  return -1;
321  }
322 
323  if (_n_elem < 1) {
324  HECMW_set_error(HECMW_PART_E_NELEM_MIN, "%d", _n_elem);
325  return -1;
326  }
327 
328  n_elem[domain] = _n_elem;
329 
330  return 0;
331 }
332 
333 extern int HECMW_part_set_log_nn_internal(int domain, int _nn_internal) {
334  if (is_init == 0) {
336  return -1;
337  }
338 
339  if (domain < 0) {
341  return -1;
342  }
343  if (domain >= n_domain) {
345  return -1;
346  }
347 
348  if (_nn_internal < 0) {
350  return -1;
351  }
352  if (_nn_internal > n_node[domain]) {
354  return -1;
355  }
356 
357  nn_internal[domain] = _nn_internal;
358 
359  return 0;
360 }
361 
362 extern int HECMW_part_set_log_ne_internal(int domain, int _ne_internal) {
363  if (is_init == 0) {
365  return -1;
366  }
367 
368  if (domain < 0) {
370  return -1;
371  }
372  if (domain >= n_domain) {
374  return -1;
375  }
376 
377  if (_ne_internal < 0) {
378  HECMW_set_error(HECMW_PART_E_NEINT_MIN, "%d", _ne_internal);
379  return -1;
380  }
381 
382  if (_ne_internal > n_elem[domain]) {
383  HECMW_set_error(HECMW_PART_E_NEINT_MAX, "%d", _ne_internal);
384  return -1;
385  }
386 
387  ne_internal[domain] = _ne_internal;
388 
389  return 0;
390 }
391 
392 extern int HECMW_part_set_log_n_neighbor_pe(int domain, int _n_neighbor_pe) {
393  if (is_init == 0) {
395  return -1;
396  }
397 
398  if (domain < 0) {
400  return -1;
401  }
402  if (domain >= n_domain) {
404  return -1;
405  }
406 
407  if (_n_neighbor_pe < 0) {
409  return -1;
410  }
411 
412  n_neighbor_pe[domain] = _n_neighbor_pe;
413 
414  return 0;
415 }
416 
417 /*================================================================================================*/
418 
419 extern int HECMW_part_print_log(void) {
420  int i;
421  FILE *fp;
422 
423  if (is_init == 0) {
425  return -1;
426  }
427 
428  if ((fp = fopen(HECMW_PART_LOG_NAME, "w")) == NULL) {
429  HECMW_set_error(errno, "log file for partitioner");
430  return -1;
431  }
432 
433  fprintf(fp, "# log file for partitioner ( %s )\n", HECMW_get_date());
434  fprintf(fp, "\n");
435 
436  /* conditions */
437  fprintf(fp, "# conditions\n");
438  fprintf(fp, "number of sub-domains : %d\n", n_domain);
439  fprintf(fp, "partitioning type : %s\n", part_type);
440  fprintf(fp, "partitioning method : %s\n", part_method);
441  fprintf(fp, "depth of overlapping : %d\n", depth);
442  fprintf(fp, "contact partitioning : %s\n", part_contact);
443  if (n_domain == 1) {
444  fprintf(fp, "number of edgecut : ----- / -----\n");
445  } else {
446  fprintf(fp, "number of edgecut : %d / %lld\n", n_edgecut, n_edge);
447  }
448 
449  fprintf(fp, "\n");
450 
451  /* information of entire mesh */
452  fprintf(fp, "# information of entire mesh\n");
453  fprintf(fp, "number of nodes : %d\n", n_node_g);
454  fprintf(fp, "number of elements : %d\n", n_elem_g);
455 
456  fprintf(fp, "\n");
457 
458  /* information of distributed mesh */
459  fprintf(fp, "# information of distributed mesh\n");
460  fprintf(fp, "domain, nodes, int. nodes, elems, int. elems, neighbor PE\n");
461 
462  for (i = 0; i < n_domain; i++) {
463  fprintf(fp, "%6d %12d %12d %12d %12d %12d\n", i, n_node[i], nn_internal[i],
464  n_elem[i], ne_internal[i], n_neighbor_pe[i]);
465  }
466 
467  /* close file */
468  if (fclose(fp)) {
469  HECMW_set_error(HECMW_PART_E_FILE_CLOSE, "log file for partitioner");
470  return -1;
471  }
472 
473  return 0;
474 }
475 
476 extern void HECMW_part_finalize_log(void) { clean_log(); }
HECMW_LOG_WARN
#define HECMW_LOG_WARN
Definition: hecmw_log.h:17
hecmw_malloc.h
HECMW_PART_E_NNODE_MIN
#define HECMW_PART_E_NNODE_MIN
Definition: hecmw_part_define.h:135
HECMW_PART_E_LOG_INIT_NOT_YET
#define HECMW_PART_E_LOG_INIT_NOT_YET
Definition: hecmw_part_define.h:159
HECMW_PART_LOG_NAME
#define HECMW_PART_LOG_NAME
Definition: hecmw_part_define.h:15
HECMW_PART_E_FILE_CLOSE
#define HECMW_PART_E_FILE_CLOSE
Definition: hecmw_part_define.h:53
HECMW_get_date
char * HECMW_get_date(void)
Definition: hecmw_util.c:29
HECMW_log
int HECMW_log(int loglv, const char *fmt,...)
Definition: hecmw_log.c:260
HECMW_part_set_log_n_edgecut
int HECMW_part_set_log_n_edgecut(long long int _n_edge, int _n_edgecut)
Definition: hecmw_part_log.c:229
HECMW_PART_TYPE_ELEMENT_BASED
#define HECMW_PART_TYPE_ELEMENT_BASED
Definition: hecmw_part_define.h:25
HECMW_PART_E_NEDGECUT_LOWER
#define HECMW_PART_E_NEDGECUT_LOWER
Definition: hecmw_part_define.h:153
HECMW_PART_CONTACT_AGGREGATE
#define HECMW_PART_CONTACT_AGGREGATE
Definition: hecmw_part_define.h:39
HECMW_PART_E_NNINT_MIN
#define HECMW_PART_E_NNINT_MIN
Definition: hecmw_part_define.h:139
HECMW_PART_CONTACT_DEFAULT
#define HECMW_PART_CONTACT_DEFAULT
Definition: hecmw_part_define.h:37
HECMW_PART_METHOD_PMETIS
#define HECMW_PART_METHOD_PMETIS
Definition: hecmw_part_define.h:31
HECMW_PART_W_LOG_INIT_ALREADY
#define HECMW_PART_W_LOG_INIT_ALREADY
Definition: hecmw_part_define.h:161
hecmw_error.h
HECMW_PART_E_INVALID_PMETHOD
#define HECMW_PART_E_INVALID_PMETHOD
Definition: hecmw_part_define.h:119
HECMW_part_set_log_part_method
int HECMW_part_set_log_part_method(int _part_method)
Definition: hecmw_part_log.c:151
HECMW_PART_E_NNINT_MAX
#define HECMW_PART_E_NNINT_MAX
Definition: hecmw_part_define.h:141
HECMW_PART_E_INVALID_NDOMAIN
#define HECMW_PART_E_INVALID_NDOMAIN
Definition: hecmw_part_define.h:125
hecmw_part_cont_data::depth
int depth
Definition: hecmw_part_struct.h:26
HECMW_calloc
#define HECMW_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
HECMW_part_print_log
int HECMW_part_print_log(void)
Definition: hecmw_part_log.c:419
HECMW_PART_METHOD_RCB
#define HECMW_PART_METHOD_RCB
Definition: hecmw_part_define.h:27
HECMW_part_finalize_log
void HECMW_part_finalize_log(void)
Definition: hecmw_part_log.c:476
HECMW_NAME_LEN
#define HECMW_NAME_LEN
Definition: hecmw_config.h:70
hecmw_msgno.h
HECMW_part_init_log
int HECMW_part_init_log(int _n_domain)
Definition: hecmw_part_log.c:72
HECMW_part_set_log_n_elem
int HECMW_part_set_log_n_elem(int domain, int _n_elem)
Definition: hecmw_part_log.c:308
HECMW_part_set_log_part_depth
int HECMW_part_set_log_part_depth(int _depth)
Definition: hecmw_part_log.c:182
hecmw_part_cont_data::n_domain
int n_domain
Definition: hecmw_part_struct.h:24
hecmw_part_define.h
HECMW_PART_E_NELEM_MIN
#define HECMW_PART_E_NELEM_MIN
Definition: hecmw_part_define.h:143
HECMW_part_set_log_part_type
int HECMW_part_set_log_part_type(int _part_type)
Definition: hecmw_part_log.c:125
HECMW_strmsg
char * HECMW_strmsg(int msgno)
Definition: hecmw_msg.c:31
HECMW_PART_E_NEDGECUTA_LOWER
#define HECMW_PART_E_NEDGECUTA_LOWER
Definition: hecmw_part_define.h:155
HECMW_PART_E_DOMAIN_MAX
#define HECMW_PART_E_DOMAIN_MAX
Definition: hecmw_part_define.h:133
HECMW_part_set_log_n_node_g
int HECMW_part_set_log_n_node_g(int _n_node_g)
Definition: hecmw_part_log.c:251
HECMW_part_set_log_nn_internal
int HECMW_part_set_log_nn_internal(int domain, int _nn_internal)
Definition: hecmw_part_log.c:333
HECMW_PART_E_INVALID_PTYPE
#define HECMW_PART_E_INVALID_PTYPE
Definition: hecmw_part_define.h:117
HECMW_PART_E_NEINT_MAX
#define HECMW_PART_E_NEINT_MAX
Definition: hecmw_part_define.h:149
HECMW_part_set_log_n_neighbor_pe
int HECMW_part_set_log_n_neighbor_pe(int domain, int _n_neighbor_pe)
Definition: hecmw_part_log.c:392
HECMW_PART_E_NNEIGHBORPE_LOWER
#define HECMW_PART_E_NNEIGHBORPE_LOWER
Definition: hecmw_part_define.h:151
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_log.h
HECMW_part_set_log_n_node
int HECMW_part_set_log_n_node(int domain, int _n_node)
Definition: hecmw_part_log.c:283
HECMW_PART_METHOD_USER
#define HECMW_PART_METHOD_USER
Definition: hecmw_part_define.h:35
HECMW_set_error
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:37
HECMW_part_set_log_n_elem_g
int HECMW_part_set_log_n_elem_g(int _n_elem_g)
Definition: hecmw_part_log.c:267
HECMW_PART_E_INVALID_PDEPTH
#define HECMW_PART_E_INVALID_PDEPTH
Definition: hecmw_part_define.h:127
NULL
#define NULL
Definition: hecmw_io_nastran.c:30
HECMW_free
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
HECMW_part_set_log_ne_internal
int HECMW_part_set_log_ne_internal(int domain, int _ne_internal)
Definition: hecmw_part_log.c:362
HECMW_part_set_log_part_contact
int HECMW_part_set_log_part_contact(int _part_contact)
Definition: hecmw_part_log.c:198
HECMW_PART_E_DOMAIN_MIN
#define HECMW_PART_E_DOMAIN_MIN
Definition: hecmw_part_define.h:131
HECMW_PART_E_NEINT_MIN
#define HECMW_PART_E_NEINT_MIN
Definition: hecmw_part_define.h:147
HECMW_PART_METHOD_KMETIS
#define HECMW_PART_METHOD_KMETIS
Definition: hecmw_part_define.h:29
HECMW_PART_CONTACT_DISTRIBUTE
#define HECMW_PART_CONTACT_DISTRIBUTE
Definition: hecmw_part_define.h:41