30 #define NULL ((void*)0)
35 #define FIELD_BUFFER_SIZE 16 + 1
36 #define FIELD_NUMBER 10
37 #define LINE_BUFFER_SIZE (FIELD_BUFFER_SIZE * FIELD_NUMBER)
39 #define FIRST_FIELD_COLUMN 8
40 #define LAST_FIELD_COLUMN 8
41 #define SMALL_FIELD_COLUMN 8
42 #define LARGE_FIELD_COLUMN 16
43 #define LARGE_FIELD_LINE_FIELD_NUMBER 6
47 #define IFF_FIELD_NUMBER FIELD_NUMBER
48 #define IFF_FIELD_SIZE 16
49 #define IFF_FIELD_BUFFER_SIZE (IFF_FIELD_SIZE + 1)
50 #define IFF_SIZE (IFF_FIELD_BUFFER_SIZE * IFF_FIELD_NUMBER)
52 #define IFF_LAST_FIELD 9
90 #ifndef HECMW_FILENAME_LEN
91 #define HECMW_FILENAME_LEN 1023
94 #define FILE_STACK_SIZE 10
103 static int file_stack_pos;
107 static FILE* c_fp =
NULL;
109 static int c_lineno = 0;
116 static char* str_upr(
char* s);
119 static void set_error_of_field_convert(
const char* file_name,
int line_no,
120 int field_no,
const char* bulk_name,
121 const char* param_name,
122 const char* param_val,
int type);
125 static void set_error_of_blank_field(
const char* file_name,
int line_no,
126 int field_no,
const char* bulk_name,
127 const char* param_name);
133 static void skip_to_begin_bulk(FILE* fp,
int*
line_no);
136 static char* ngrp_name_by_GID(
int gid,
char* name,
size_t size);
139 static char* egrp_name_by_PID(
int pid,
char* name,
size_t size);
142 static char* egrp_name_by_SID(
int sid,
char* name,
size_t size);
145 static char* ngrp_name_by_SID_GID(
int sid,
int gid,
char* name,
size_t size);
148 static char* ngrp_name_by_SID(
int sid,
int sub_id,
char* name,
size_t size);
151 static char* matrial_name_by_MID(
int mid,
char* name,
size_t size);
154 static char* egrp_CTRIAX6_name_by_MID(
int mid,
char* name,
size_t size);
157 static int is_CTRIAX6_egrp_name(
char* name,
int* mid);
170 static void iff_init(
char* iff);
171 static void iff_clear(
char* iff);
172 static int iff_field_empty(
char* field);
173 static int iff_is_blank_field(
char* iff,
int no);
174 static char* iff_get_field(
char* iff,
int no);
175 static void iff_set_field(
char* iff,
int no,
char* field);
176 static void iff_regulize(
char* iff);
177 static void iff_copy(
char* dest,
char* src);
178 static char* iff_get_continuous_line_pointer(
char* iff);
179 static char* iff_get_pointing_line_pointer(
char* iff);
181 static int iff_is_parent(
char* iff);
182 static int iff_is_last(
char* iff);
183 static int iff_is_continuous_line(
char* iff);
184 static int iff_is_pointing_line(
char* iff);
186 static int iff_add_auto_pointer(
char* iff1,
char* iff2,
192 static int iff_field_to_int(
char* field,
int default_val,
int* val);
193 static int iff_field_to_uint(
char* field,
unsigned int default_val,
195 static int iff_field_to_double(
char* field,
double default_val,
197 static int iff_field_to_param(
char* field,
char type,
void* param,
198 void** next_param_pos);
202 static void iff_dump(
char* iff);
203 static void iff_dump_csv(
char* iff);
209 static void free_to_iff_format(
char* line,
char* iff);
210 static void small_to_iff_format(
char* line,
char* iff);
211 static void large_to_iff_format(
char* line1,
char* line2,
214 static char* get_fixed_token(
char* src,
char* token,
231 static int read_iff(FILE* fp,
char* iff,
int*
line_no);
243 static void iff_bulk_regist(
iff_bulk_t* bulk,
char* iff,
246 static int iff_bulk_is_completed(
iff_bulk_t* bulk);
251 static char* iff_bulk_get_name(
iff_bulk_t* bulk);
252 static char* iff_bulk_get_field(
iff_bulk_t* bulk,
int field_no);
253 static char* iif_bulk_get_param(
iff_bulk_t* bulk,
int param_no);
254 static char* iff_bulk_get_param_data(
iff_bulk_t* bulk,
int param_no,
258 static int iff_bulk_get_param_list(
iff_bulk_t* bulk,
const char* format,
262 static int iff_bulk_get_param_list_pattern(
iff_bulk_t* bulk,
const char* format,
263 int start_param_no,
int* size, ...);
265 static int iff_bulk_get_line_number(
iff_bulk_t* bulk);
266 static int iff_bulk_get_line_no(
iff_bulk_t* bulk,
int iff_pos);
270 static iff_node_t* iff_bulk_search_pointing_line(
272 static iff_node_t* iff_bulk_search_continuous_line(
283 static char* iff_bulk_get_name(
iff_bulk_t* bulk);
284 static char* iff_bulk_get_param(
iff_bulk_t* bulk,
int field_no);
285 static int iff_bulk_type(
const char* bulkname);
296 int sub_n[],
double data[]);
299 static int surface_elem_store(
int bulk_type,
unsigned int EID,
unsigned int PID,
300 unsigned int G[],
int G_number,
double THETA_MCID,
301 double ZOFFS,
double T[],
int T_number);
304 static int iff_bulk_parse_solid_elem(
iff_bulk_t* bulk,
int first_etype,
305 int second_etype,
int conv_table[],
306 int g_number,
int g_ness_number);
320 static iff_bulk_t* iff_bulk_list_search_pointing_bulk(
322 static iff_bulk_t* iff_bulk_list_search_continuous_bulk(
345 static void file_stack_init(
void);
346 static int file_stack_push(
char* fname, FILE* fp,
int lineno);
347 static int file_stack_pop(
char* fname,
size_t fname_len, FILE** fp,
int* lineno);
348 static int file_stack_clear(
void);
349 static int file_stack_check(
const char* fname);
352 static void nastran_file_init(
void);
353 static int nastran_file_open(
const char* filename);
354 static int nastran_file_close(
void);
361 static int read_nastran(
const char* filename);
369 #define CREATE_LIST_CODE(type) \
371 static int is_eq_##type(type a, type b); \
372 static void copy_##type(type* dest, type src); \
373 static void delete_##type(type a); \
375 typedef struct struct_list_node_##type { \
377 struct struct_list_node_##type* next; \
378 } t_list_node_##type; \
380 typedef struct struct_list_##type { \
381 t_list_node_##type* root; \
382 t_list_node_##type *current, *next; \
385 static void list_init_##type(t_list_##type* list) { list->root = NULL; } \
387 static void list_clear_##type(t_list_##type* list) { \
388 t_list_node_##type* t; \
389 t_list_node_##type* node = list->root; \
392 delete_##type(node->data); \
398 static t_list_node_##type* list_add_##type(t_list_##type* list, type d) { \
399 t_list_node_##type* node; \
400 node = HECMW_malloc(sizeof(t_list_node_##type)); \
401 copy_##type(&node->data, d); \
404 node->next = list->root; \
412 static t_list_node_##type* list_search_##type(t_list_##type* list, \
414 static t_list_##type* list_s; \
415 if (list != NULL) { \
416 list->current = list->root; \
419 while (list_s->current) { \
420 if (is_eq_##type(list_s->current->data, data)) return list_s->current; \
421 list_s->current = list_s->current->next; \
426 static void list_scan_start_##type(t_list_##type* list) { \
427 list->next = list->current = list->root; \
430 static int list_scan_next_##type(t_list_##type* list) { \
431 t_list_node_##type* t; \
432 if (list->next == NULL) return 0; \
435 list->next = list->next->next; \
441 static void list_get_current_data_##type(t_list_##type* list, type* data) { \
442 *data = list->current->data; \
445 static t_list_node_##type* list_get_current_node_##type( \
446 t_list_##type* list) { \
447 return list->current; \
450 static int list_operation_##type(t_list_##type* list, int (*foo)(type)) { \
451 list_scan_start_##type((list)); \
452 while (list_scan_next_##type((list))) { \
453 int err = (*(foo))(list->current->data); \
454 if (err) return err; \
465 static char* str_upr(
char* s) {
468 if (
'a' <= *p && *p <
'A') *p += (
'A' -
'a');
478 static void set_error_of_field_convert(
const char* file_name,
int line_no,
479 int field_no,
const char* bulk_name,
480 const char* param_name,
481 const char* param_val,
int type) {
490 snprintf(type_s,
sizeof(type_s),
"string");
496 snprintf(type_s,
sizeof(type_s),
"integer");
500 snprintf(type_s,
sizeof(type_s),
"real");
503 snprintf(type_s,
sizeof(type_s),
"blank");
512 size_t len = snprintf(val_str,
sizeof(val_str),
"H");
514 len += snprintf(val_str + len,
sizeof(val_str) - len,
"%x", param_val[i]);
517 snprintf(val_str,
sizeof(val_str),
"NULL");
519 snprintf(line,
sizeof(line),
"%s:%d:", file_name,
line_no);
520 snprintf(msg,
sizeof(msg),
521 "Cannot convert '%s'(%s) to '%s' value ('%s' (field.%d) in '%s')",
522 param_val, val_str, type_s, param_name, field_no, bulk_name);
529 static void set_error_of_blank_field(
const char* file_name,
int line_no,
530 int field_no,
const char* bulk_name,
531 const char* param_name) {
535 snprintf(line,
sizeof(line),
"%s:%d:", file_name,
line_no);
536 snprintf(msg,
sizeof(msg),
"Cannot be blank field ('%s' (no.%d) in '%s')", param_name,
537 field_no, bulk_name);
546 #define REMOVE_CR_MAX_LINE 256
548 static void remove_cr(
char* line) {
552 if (*p ==
'\n' || *p == 0xd) {
567 static void skip_to_begin_bulk(FILE* fp,
int*
line_no) {
572 if (strncmp(line,
"BEGIN BULK",
sizeof(
"BEGIN BULK") - 1) == 0)
return;
580 static char* ngrp_name_by_GID(
int gid,
char*
name,
size_t size) {
581 snprintf(
name, size,
"G%d", gid);
589 static char* egrp_name_by_PID(
int pid,
char*
name,
size_t size) {
590 snprintf(
name, size,
"P%d", pid);
598 static char* create_SID_grp_name(
char*
name,
size_t size) {
599 static int SID_counter = 1;
600 snprintf(
name, size,
"SID%d", SID_counter);
609 static char* egrp_name_by_SID(
int sid,
char*
name,
size_t size) {
611 create_SID_grp_name(
name, size);
619 static char* ngrp_name_by_SID_GID(
int sid,
int gid,
char*
name,
size_t size) {
621 create_SID_grp_name(
name, size);
629 static char* ngrp_name_by_SID(
int sid,
int sub_id,
char*
name,
size_t size) {
631 create_SID_grp_name(
name, size);
639 static char* matrial_name_by_MID(
int mid,
char*
name,
size_t size) {
640 snprintf(
name, size,
"M%d", mid);
648 #define CTRIAX6_EGRP_NAME_HEADER "CTRIAX6-"
650 static char* egrp_CTRIAX6_name_by_MID(
int mid,
char*
name,
size_t size) {
659 static int is_CTRIAX6_egrp_name(
char*
name,
int* mid) {
663 if (*s != *p)
return 0;
697 if (*p !=
' ') fg = 0;
730 static void iff_init(
char* iff) { iff_clear(iff); }
736 static void iff_clear(
char* iff) { memset(iff, 0,
IFF_SIZE); }
742 static int iff_field_empty(
char* field) {
return (field[0] == 0); }
748 static int iff_is_blank_field(
char* iff,
int no) {
749 char* field = iff_get_field(iff, no);
750 return field[0] == 0;
757 static char* iff_get_field(
char* iff,
int no) {
771 static void iff_set_field(
char* iff,
int no,
char* field) {
773 char *start_p, *p, *s;
787 if (*s !=
' ') fg = 1;
798 if (p == start_p)
return;
806 }
while (p != start_p);
813 static void iff_regulize(
char* iff) {
832 if (p == iff)
return;
855 if (last_field[0] ==
'*') {
856 if (last_field[1] == 0)
867 static void iff_copy(
char* dest,
char* src) { memcpy(dest, src,
IFF_SIZE); }
875 static int iff_is_continuous_line(
char* iff) {
876 char* f = iff_get_field(iff, 0);
878 return (f[0] ==
'+');
885 static int iff_is_pointing_line(
char* iff) {
887 return !iff_field_empty(f);
894 static char* iff_get_continuous_line_pointer(
char* iff) {
895 char* f = iff_get_field(iff, 0);
897 if (iff_field_empty(f))
return NULL;
912 static char* iff_get_pointing_line_pointer(
char* iff) {
914 if (iff_field_empty(f))
925 static int iff_is_parent(
char* iff) {
926 char* field = iff_get_field(iff, 0);
927 return (field[0] !=
'+');
934 static int iff_is_last(
char* iff) {
935 return (iff_get_pointing_line_pointer(iff) ==
NULL);
943 static int iff_add_auto_pointer(
char* iff1,
char* iff2,
int* counter) {
944 if (iff_is_blank_field(iff2, 0)) {
947 snprintf(pointer,
sizeof(pointer),
"+%d", *counter);
950 iff_set_field(iff2, 0, pointer);
961 static int iff_field_to_uint(
char* field,
unsigned int default_val,
965 if (field ==
NULL || (field && *field == 0)) {
970 *val = strtoul(field, &endptr, 10);
984 static int iff_field_to_int(
char* field,
int default_val,
int* val) {
987 if (field ==
NULL || (field && *field == 0)) {
992 *val = strtol(field, &endptr, 10);
1006 static int iff_field_to_double(
char* field,
double default_val,
double* val) {
1011 if (field ==
NULL || (field && *field == 0)) {
1016 *val = strtod(field, &endptr);
1025 if (*p ==
'+' || *p ==
'-') {
1036 *val = strtod(buf, &endptr);
1051 static int iff_field_to_param(
char* field,
char type,
void* param,
1052 void** next_param_pos) {
1061 R = iff_field_to_int(field, *((
int*)param), (
int*)param);
1062 p_int = (
int*)param;
1067 R = iff_field_to_uint(field, *((
unsigned int*)param),
1068 (
unsigned int*)param);
1069 p_int = (
int*)param;
1074 R = iff_field_to_double(field, *((
double*)param), (
double*)param);
1075 p_double = (
double*)param;
1080 if (field ==
NULL || field[0] == 0)
1084 snprintf((
char*)param, param_len,
"%s", field);
1096 if (next_param_pos) {
1097 *next_param_pos = param;
1107 static void iff_dump(
char* iff) {
1132 static void iff_dump_csv(
char* iff) {
1136 f = iff_get_field(iff, i);
1150 static void free_to_iff_format(
char* line,
char* iff) {
1154 char *line_p, *token_p;
1164 if (*line_p ==
',') {
1167 printf(
"?ե???????¿??????);
1170 iff_set_field(iff, i, token);
1180 if (i > 0 && i < FIELD_NUMBER) {
1182 iff_set_field(iff, i, token);
1188 /* ------------------------------------------------------------------------------------------------
1192 static void small_to_iff_format(char* line, char* iff) {
1194 char token[SMALL_FIELD_COLUMN + 1];
1200 if (get_fixed_token(line, token, FIRST_FIELD_COLUMN)) {
1201 iff_set_field(iff, i, token);
1204 printf("?ե???????¿??????);
1211 iff_set_field(iff, i, token);
1223 static void large_to_iff_format(
char* line1,
char* line2,
char* iff) {
1237 iff_set_field(iff, i, token);
1246 iff_set_field(iff, i, token);
1262 iff_set_field(iff, i, token);
1271 iff_set_field(iff, i, token);
1281 static char* get_fixed_token(
char* src,
char* token,
int field_size) {
1284 static char* src_p =
NULL;
1286 if (src) src_p = src;
1288 if (src_p ==
NULL || *src_p == 0 || *src_p ==
'\n')
return NULL;
1292 for (j = 0; j < field_size && *src_p != 0; j++, src_p++, token_p++) {
1308 iff_node_init(node);
1322 static void iff_node_init(
iff_node_t* node) {
1323 iff_init(node->
iff);
1333 iff_copy(node->
iff, iff);
1342 #define read_iff_error -1
1343 #define read_iff_comment 0
1344 #define read_iff_success 1
1345 #define read_iff_eof 2
1347 static int read_iff(FILE* fp,
char* iff,
int*
line_no) {
1351 char* fg = fgets(line1,
IFF_SIZE - 1, fp);
1357 switch (field_format_judge(line1)) {
1359 free_to_iff_format(line1, iff);
1362 small_to_iff_format(line1, iff);
1366 if (!fgets(line2,
IFF_SIZE - 1, fp)) {
1371 large_to_iff_format(line1, line2, iff);
1388 static void iff_bulk_init(
iff_bulk_t* bulk) {
1400 iff_bulk_init(bulk);
1409 static void iff_bulk_free(
iff_bulk_t* bulk) {
1415 iff_node_free(node);
1431 new_node = iff_node_create();
1432 iff_node_set(new_node, iff,
line_no);
1466 static int iff_bulk_is_completed(
iff_bulk_t* bulk) {
1481 static char* iff_bulk_get_name(
iff_bulk_t* bulk) {
1491 static char* iff_bulk_get_field(
iff_bulk_t* bulk,
int field_no) {
1500 while (node && i < line) {
1504 if (i < line)
return NULL;
1506 return iff_get_field(node->
iff, n);
1514 static char* iff_bulk_get_param(
iff_bulk_t* bulk,
int param_no) {
1518 int line = param_no / N;
1519 int n = param_no % N + 1;
1523 while (node && i < line) {
1529 return iff_get_field(node->
iff, n);
1537 static char* iff_bulk_get_param_data(
iff_bulk_t* bulk,
int param_no,
1538 int*
line_no,
int* field_no) {
1542 int line = param_no / N;
1543 int n = param_no % N + 1;
1547 while (node && i < line) {
1551 if (node ==
NULL)
return 0;
1557 return iff_get_field(node->
iff, n);
1567 static int get_number_in_str(
char** pp) {
1573 while (*p >=
'0' && *p <=
'9') {
1588 static int iff_bulk_get_param_list(
iff_bulk_t* bulk,
const char* format,
1611 int read_param_count;
1613 va_start(ap, result);
1618 read_param_count = 0;
1636 arr_n = get_number_in_str(&nf);
1641 }
else if (*nf ==
'/') {
1643 ness_n = get_number_in_str(&nf);
1644 if (!ness) ness_n = 0;
1654 param = va_arg(ap,
void*);
1655 param_name_p = va_arg(ap,
char*);
1658 for (i = 0; i < arr_n; i++) {
1659 field = iff_bulk_get_param_data(bulk, param_pos, &
line_no, &field_no);
1661 R = iff_field_to_param(field, type, param, ¶m);
1665 snprintf(param_name,
sizeof(param_name),
"%s%d", param_name_p, i + 1);
1667 snprintf(param_name,
sizeof(param_name),
"%s", param_name_p);
1668 set_error_of_field_convert(grid_filename,
line_no, field_no,
1669 iff_bulk_get_name(bulk), param_name, field,
1672 }
else if (i < ness_n && R == 2) {
1674 snprintf(param_name,
sizeof(param_name),
"%s%d", param_name_p, i + 1);
1676 snprintf(param_name,
sizeof(param_name),
"%s", param_name_p);
1677 set_error_of_blank_field(grid_filename,
line_no, field_no,
1678 iff_bulk_get_name(bulk), param_name);
1700 static int iff_bulk_get_param_list_pattern(
iff_bulk_t* bulk,
const char* format,
1701 int start_param_pos,
int* size,
1703 #define GPLP_PARAM_LIST_SIZE 50
1721 int param_list_size;
1738 str_upr((
char*)format);
1739 param_list_size = strlen((
char*)format);
1743 for (i = 0; i < param_list_size; i++) {
1744 param_list[i] = va_arg(ap,
void**);
1745 param_name_head[i] = va_arg(ap,
char*);
1750 data_size = iff_bulk_get_line_number(bulk) / param_list_size;
1751 for (i = 0; i < param_list_size; i++) {
1752 switch (format[i]) {
1754 type_size =
sizeof(int);
1757 type_size =
sizeof(
unsigned int);
1760 type_size =
sizeof(double);
1766 param_list_p[i] = *param_list[i];
1769 param_pos = start_param_pos;
1774 for (i = 0; i < param_list_size; i++) {
1775 field = iff_bulk_get_param_data(bulk, param_pos, &
line_no, &field_no);
1776 if (field ==
NULL || field[0] == 0) {
1782 param = param_list_p[i];
1783 r = iff_field_to_param(field, type, param, ¶m);
1785 param_list_p[i] = param;
1786 }
else if (r == 0) {
1787 snprintf(param_name,
sizeof(param_name),
"%s%d", param_name_head[i], index + 1);
1788 set_error_of_field_convert(grid_filename,
line_no, field_no,
1789 iff_bulk_get_name(bulk), param_name, field,
1793 if (state != 0 && state != r) {
1794 snprintf(param_name,
sizeof(param_name),
"%s%d", param_name_head[i], index + 1);
1795 set_error_of_field_convert(grid_filename,
line_no, field_no,
1796 iff_bulk_get_name(bulk), param_name, field,
1810 #undef GPLP_PARAM_LIST_SIZE
1817 static int iff_bulk_get_line_number(
iff_bulk_t* bulk) {
1833 static int iff_bulk_get_line_no(
iff_bulk_t* bulk,
int iff_pos) {
1838 if (i == iff_pos)
return node->
line_no;
1850 char* line_pointer) {
1859 if (node && iff_is_pointing_line(node->
iff)) {
1860 p = iff_get_pointing_line_pointer(node->
iff);
1861 if (strcmp(p, line_pointer) == 0) {
1874 char* line_pointer) {
1881 if (node && iff_is_continuous_line(node->
iff)) {
1882 p = iff_get_continuous_line_pointer(node->
iff);
1883 if (strcmp(p, line_pointer) == 0) {
1895 static void iff_bulk_dump(
iff_bulk_t* bulk) {
1900 iff_dump(node->
iff);
1917 #define GENERATE_CODE(name) static int iff_bulk_parse_##name(iff_bulk_t* bulk);
1938 #undef GENERATE_CODE
1940 #define GENERATE_CODE(name) BULK_TYPE_##name,
1952 #undef GENERATE_CODE
1954 #define BULK_TYPE_NUMBER BULK_TYPE_UNKNOWN
1956 #define GENERATE_CODE(name) #name,
1958 static char* bulk_type_name[] = {
1965 #undef GENERATE_CODE
1969 static int iff_bulk_type(
const char* bulkname) {
1973 if (0 == strcmp(bulkname, bulk_type_name[i]))
return i;
1976 return BULK_TYPE_UNKNOWN;
1979 static int iff_bulk_parse(
iff_bulk_t* bulk) {
1983 bulkname = iff_bulk_get_name(bulk);
1987 no = iff_bulk_type(bulkname);
1989 #define GENERATE_CODE(name) \
1990 case BULK_TYPE_##name: \
1991 return iff_bulk_parse_##name(bulk);
2025 typedef struct ST_PSHELL_MID2 {
2028 struct ST_PSHELL_MID2* next;
2031 typedef struct ST_PSHELLMID2_LIST { pshell_mid2_t* root; } pshell_mid2_list_t;
2033 static pshell_mid2_list_t pshell_mid2_list;
2034 static int pshell_mid2_list_init_fg = 0;
2036 static void pshell_mid2_list_init(
void);
2037 static void pshell_mid2_list_clear(
void);
2038 static void pshell_mid2_list_regist(
int pid,
int mid2);
2039 static int pshell_mid2_list_get_mid2_by_pid(
int pid,
int* mid2);
2043 static void pshell_mid2_list_init(
void) {
2044 pshell_mid2_list.root =
NULL;
2045 pshell_mid2_list_init_fg = 1;
2048 static void pshell_mid2_list_clear(
void) {
2049 pshell_mid2_t* node = pshell_mid2_list.root;
2050 pshell_mid2_t* next;
2057 pshell_mid2_list.root =
NULL;
2060 static void pshell_mid2_list_regist(
int pid,
int mid2) {
2061 pshell_mid2_t* node;
2069 if (!pshell_mid2_list_init_fg) {
2070 pshell_mid2_list_init();
2073 if (pshell_mid2_list.root) {
2074 node->next = pshell_mid2_list.root;
2078 pshell_mid2_list.root = node;
2081 static int pshell_mid2_list_get_mid2_by_pid(
int pid,
int* mid2) {
2082 pshell_mid2_t* node = pshell_mid2_list.root;
2085 if (node->PID == pid) {
2098 static int check_order_of_elem(
int result[],
int G_start_pos,
int G_number,
2101 int first_order = 0;
2102 int* r = &(result[G_start_pos]);
2104 for (i = 0; i < G_ness; i++, r++) {
2110 for (; i < G_number; i++, r++) {
2127 int sub_n[],
double data[]) {
2128 #define cms_malloc(p, size) \
2130 (p) = HECMW_malloc((size)); \
2131 if ((p) == NULL) { \
2132 HECMW_set_error(errno, ""); \
2138 struct hecmw_io_matitem* matitem;
2139 struct hecmw_io_matsubitem* matsubitem;
2148 for (i = 0; i <
item_n; i++) {
2149 matitem[i].item = i + 1;
2150 matitem[i].nval = sub_n[i];
2153 cms_malloc(matsubitem->val,
sizeof(*(matsubitem->val)) * sub_n[i]);
2155 for (j = 0; j < sub_n[i]; j++) {
2156 matsubitem->val[j] =
data[d_count];
2159 matsubitem->temp =
data[d_count];
2162 matsubitem->next =
NULL;
2163 matitem[i].subitem = matsubitem;
2166 snprintf(mat->
name,
sizeof(mat->
name),
"%s", name);
2168 mat->
item = matitem;
2180 static int iff_bulk_parse_MAT1(
iff_bulk_t* bulk) {
2181 #define BULK_PARAM_NUMBER 12
2194 char format[] =
"UDdDDDdddddu";
2199 E = G = NU = RHO = A = TREF = GE = ST = SC = SS = 0.0;
2202 iff_bulk_get_param_list(bulk, format, result, &MID,
"MID", &E,
"E", &G,
"G",
2203 &NU,
"NU", &RHO,
"RHO", &A,
"A", &TREF,
"TREF", &GE,
2204 "GE", &ST,
"ST", &SC,
"SC", &SS,
"SS", &MCSID,
2212 int sub_n[
item_n] = {2, 1, 1};
2215 matrial_name_by_MID(MID,
name,
sizeof(
name));
2233 #undef BULK_PARAM_NUMBER
2240 static int iff_bulk_parse_MAT4(
iff_bulk_t* bulk) {
2241 #define BULK_PARAM_NUMBER 11
2255 char format[] =
"Udddddddddd";
2259 iff_bulk_get_param_list(bulk, format, result, &MID,
"MID", &K,
"K", &CP,
"CP",
2260 &r,
"rho", &H,
"H", &m,
"m", &HGEN,
"HGEN", &REFENTH,
2261 "REFENTH", &TCH,
"TCH", &TDELTA,
"TDELTA", &QLAT,
2269 int sub_n[
item_n] = {1, 1, 1};
2272 matrial_name_by_MID(MID,
name,
sizeof(
name));
2289 #undef BULK_PARAM_NUMBER
2303 static void init_section_rec(section_rec* a) {
2304 memset(a, 0,
sizeof(section_rec));
2309 static int is_eq_section_rec(section_rec a, section_rec b) {
2310 return (strcmp(a.egrp, b.egrp) == 0);
2313 static void copy_section_rec(section_rec* dest, section_rec src) {
2314 memcpy(dest, &src,
sizeof(section_rec));
2317 static void delete_section_rec(section_rec a) { }
2319 static t_list_section_rec section_list;
2325 static void section_list_init(
void) { list_init_section_rec(§ion_list); }
2330 return (list_add_section_rec(§ion_list, *
sect) ==
NULL);
2335 static int section_list_finalize(
void) {
2336 list_scan_start_section_rec(§ion_list);
2337 while (list_scan_next_section_rec(§ion_list)) {
2338 section_rec* rec = §ion_list.current->data;
2345 list_clear_section_rec(§ion_list);
2354 static int iff_bulk_parse_PROD(
iff_bulk_t* bulk) {
2355 #define BULK_PARAM_NUMBER 6
2364 char format[] =
"UUdddd";
2369 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID,
"MID", &A,
2370 "A", &J,
"J", &C,
"C", &NSM,
"NSM");
2372 snprintf(
sect.egrp,
sizeof(
sect.egrp),
"%s", egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)));
2373 snprintf(
sect.material,
sizeof(
sect.material),
"%s", matrial_name_by_MID(MID, grp_name,
sizeof(grp_name)));
2382 if (section_list_regist(&
sect))
return -1;
2386 #undef BULK_PARAM_NUMBER
2393 static int iff_bulk_parse_PSHELL(
iff_bulk_t* bulk) {
2394 #define BULK_PARAM_NUMBER 11
2407 char format[] =
"Uudiduddddi";
2422 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID1,
"MID1", &T,
2423 "T", &MID2,
"MID2", &_12I_T_3,
"12I/T^3", &MID3,
2424 "MID3", &TS_S,
"TS/S", &NSM,
"NSM", &Z1,
"Z1", &Z2,
2425 "Z2", &MID4,
"MID4");
2427 snprintf(
sect.egrp,
sizeof(
sect.egrp),
"%s", egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)));
2428 snprintf(
sect.material,
sizeof(
sect.material),
"%s", matrial_name_by_MID(MID1, grp_name,
sizeof(grp_name)));
2434 else if (MID2 == -1)
2437 if (MID2 == 0 || MID2 == -1)
2451 if (section_list_regist(&
sect))
return -1;
2455 pshell_mid2_list_regist(PID, MID2);
2459 #undef BULK_PARAM_NUMBER
2466 static int iff_bulk_parse_PSOLID(
iff_bulk_t* bulk) {
2467 #define BULK_PARAM_NUMBER 7
2477 char format[] =
"UUissss";
2488 snprintf(FCTN,
sizeof(FCTN),
"%s",
"SMECH");
2490 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID,
"MID",
2491 &CORDM,
"CORDM", IN,
"IN", STRESS,
"STRESS", ISOP,
2492 "ISOP", FCTN,
"FCTN");
2496 snprintf(
sect.egrp,
sizeof(
sect.egrp),
"%s", egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)));
2497 snprintf(
sect.material,
sizeof(
sect.material),
"%s", matrial_name_by_MID(MID, grp_name,
sizeof(grp_name)));
2506 if (section_list_regist(&
sect))
return -1;
2510 #undef BULK_PARAM_NUMBER
2520 static int iff_bulk_parse_CROD(
iff_bulk_t* bulk) {
2522 #define BULK_PARAM_NUMBER (2 + G_NUMBER)
2528 char format[20] =
"UUU2";
2533 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", G,
"G");
2539 if (
HECMW_io_add_egrp(egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)), 1, EID_List) == -1)
2547 #undef BULK_PARAM_NUMBER
2554 static int iff_bulk_parse_CBAR(
iff_bulk_t* bulk) {
return -1; }
2560 static int iff_bulk_parse_CBEAM(
iff_bulk_t* bulk) {
return -1; }
2571 static int surface_elem_store(
int bulk_type,
unsigned int EID,
unsigned int PID,
2572 unsigned int G[],
int G_number,
double THETA_MCID,
2573 double ZOFFS,
double T[],
int T_number) {
2581 switch (bulk_type) {
2582 case BULK_TYPE_CTRIA3:
2585 case BULK_TYPE_CTRIA6:
2588 case BULK_TYPE_CQUAD4:
2591 case BULK_TYPE_CQUAD8:
2605 if (
HECMW_io_add_egrp(egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)), 1, EID_List) == -1)
2615 static int surface_elem_type_decide(
void) {
2619 pshell_mid2_t* node;
2622 node = pshell_mid2_list.root;
2624 egrp_name_by_PID(
node->PID, grp_name,
sizeof(grp_name));
2627 for (i = 0; i < id_array->
n; i++) {
2630 if (
node->MID2 >= 1) {
2631 switch (elem->
type) {
2652 pshell_mid2_list_clear();
2660 static int iff_bulk_parse_CTRIA3(
iff_bulk_t* bulk) {
2663 #define BULK_PARAM_NUMBER (2 + 3 + 2 + 3)
2673 char format[] =
"UUU3dd_3d3";
2676 T[0] = T[1] = T[2] = 0.0;
2678 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2679 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2690 if (surface_elem_store(BULK_TYPE_CTRIA3, EID, PID, G, 3, THETA_MCID, ZOFFS, T,
2696 #undef BULK_PARAM_NUMBER
2703 static int iff_bulk_parse_CTRIA6(
iff_bulk_t* bulk) {
2707 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 2 + 3)
2717 int conv_table[] = {1, 2, 3, 5, 6, 4};
2720 char format[] =
"UUU6dd_3d3";
2723 T[0] = T[1] = T[2] = 0.0;
2725 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2726 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2737 for (i = 0; i <
G_NUMBER; i++)
node[i] = G[conv_table[i] - 1];
2739 if (surface_elem_store(BULK_TYPE_CTRIA6, EID, PID,
node,
G_NUMBER, THETA_MCID,
2745 #undef BULK_PARAM_NUMBER
2754 static int iff_bulk_parse_CQUAD4(
iff_bulk_t* bulk) {
2759 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 2 + T_NUMBER)
2770 char format[] =
"UUU4dd_2d4";
2773 T[0] = T[1] = T[2] = T[3] = 0.0;
2775 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2776 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2788 if (surface_elem_store(BULK_TYPE_CQUAD4, EID, PID, G,
G_NUMBER, THETA_MCID,
2794 #undef BULK_PARAM_NUMBER
2803 static int iff_bulk_parse_CQUAD8(
iff_bulk_t* bulk) {
2808 #define BULK_PARAM_NUMBER (2 + G_NUMBER + T_NUMBER + 2)
2819 char format[] =
"UUU8d4dd";
2822 T[0] = T[1] = T[2] = T[3] = 0.0;
2824 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2825 "G", T,
"T", &THETA_MCID,
"THETA/MCID", &ZOFFS,
2837 if (surface_elem_store(BULK_TYPE_CQUAD8, EID, PID, G,
G_NUMBER, THETA_MCID,
2843 #undef BULK_PARAM_NUMBER
2855 static int iff_bulk_parse_solid_elem(
iff_bulk_t* bulk,
int first_etype,
2856 int second_etype,
int conv_table[],
2857 int g_number,
int g_ness_number) {
2858 #define G_LIST_SIZE 100
2859 #define BULK_PARAM_LIST_SIZE (2 + G_LIST_SIZE)
2876 snprintf(format,
sizeof(format),
"UUU%d/%d", g_number, g_ness_number);
2878 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2881 order = check_order_of_elem(result, 2, g_number, g_ness_number);
2885 for (i = 0; i < g_number; i++)
node[i] = G[conv_table[i] - 1];
2890 }
else if (order == 2) {
2899 if (
HECMW_io_add_egrp(egrp_name_by_PID(PID, grp_name,
sizeof(grp_name)), 1, EID_List) == -1)
2907 #undef BULK_PARAM_LIST_SIZE
2914 static int iff_bulk_parse_CTETRA(
iff_bulk_t* bulk) {
2915 int conv_table[] = {1, 2, 3, 4, 6, 7, 5, 8, 9, 10};
2924 static int iff_bulk_parse_CPENTA(
iff_bulk_t* bulk) {
2925 int conv_table[] = {1, 2, 3, 4, 5, 6, 8, 9, 7, 14, 15, 13, 10, 11, 12};
2934 static int iff_bulk_parse_CHEXA(
iff_bulk_t* bulk) {
2935 int conv_table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2936 11, 12, 17, 18, 19, 20, 13, 14, 15, 16};
2948 static int iff_bulk_parse_CTRIAX6(
iff_bulk_t* bulk) {
2950 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 1)
2953 int conv_table[] = {1, 3, 5, 4, 6, 2};
2962 char format[20] =
"UUU6d";
2965 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &MID,
"MID", G,
2970 for (i = 0; i <
G_NUMBER; i++)
node[i] = G[conv_table[i] - 1];
2982 egrp_CTRIAX6_name_by_MID(MID, grp_name,
sizeof(grp_name));
2988 snprintf(
sect.egrp,
sizeof(
sect.egrp),
"%s", grp_name);
2989 snprintf(
sect.material,
sizeof(
sect.material),
"%s", matrial_name_by_MID(MID, mat_name,
sizeof(mat_name)));
3008 #undef BULK_PARAM_NUMBER
3013 static int iff_bulk_parse_GRID(
iff_bulk_t* bulk) {
3014 #define BULK_PARAM_NUMBER 8
3016 unsigned int ID = 0;
3017 unsigned int CP = 0;
3019 unsigned int CDI = 0;
3020 unsigned int PS = 0;
3023 char format[] =
"UUD3uuu";
3028 X[0] = X[1] = X[2] = 0.0;
3030 iff_bulk_get_param_list(bulk, format, result, &ID,
"ID", &CP,
"CP", X,
"X",
3031 &CDI,
"CDI", &PS,
"PS", &SEID,
"SEID");
3041 #undef BULK_PARAM_NUMBER
3053 static int iff_bulk_parse_INCLUDE(
iff_bulk_t* bulk) {
3072 strncat(buff, iff_get_field(iff, i),
sizeof(buff) - strlen(buff) - 1);
3088 }
else if (*bp ==
'\'') {
3101 printf(
"Include %s ==================================\n", filename);
3103 errcode = nastran_file_open(filename);
3128 iff_bulk_free(node);
3161 static iff_bulk_t* iff_bulk_list_search_pointing_bulk(
3166 if (iff_bulk_search_pointing_line(node, line_pointer))
return node;
3177 static iff_bulk_t* iff_bulk_list_search_continuous_bulk(
3182 if (iff_bulk_search_continuous_line(node, line_pointer))
return node;
3221 #define TRYAL_NUMBER 20
3223 static int iff_bulk_list_after_operation(
iff_bulk_list_t* bulk_list) {
3228 while (!iff_bulk_list_is_empty(bulk_list)) {
3232 if (iff_bulk_is_completed(bulk)) {
3233 if (iff_bulk_parse(bulk)) {
3234 iff_bulk_list_remove(bulk_list, bulk);
3235 iff_bulk_free(bulk);
3265 printf(
" Bulk List Dump ==============\n");
3268 iff_bulk_dump(node);
3270 printf(
"==============\n");
3288 if (iff_is_parent(iff)) {
3289 bulk1 = iff_bulk_create();
3290 iff_bulk_regist(bulk1, iff,
line_no);
3291 iff_bulk_list_regist(bulk_list, bulk1);
3292 }
else if (iff_is_continuous_line(iff)) {
3293 bulk1 = iff_bulk_list_search_pointing_bulk(
3294 bulk_list, iff_get_continuous_line_pointer(iff));
3296 iff_bulk_regist(bulk1, iff,
line_no);
3298 bulk1 = iff_bulk_create();
3299 iff_bulk_regist(bulk1, iff,
line_no);
3300 iff_bulk_list_regist(bulk_list, bulk1);
3306 if (iff_is_pointing_line(iff)) {
3307 pointer = iff_get_pointing_line_pointer(iff);
3308 bulk2 = iff_bulk_list_search_continuous_bulk(bulk_list, pointer);
3310 iff_bulk_move_append(bulk1, bulk2);
3311 iff_bulk_list_remove(bulk_list, bulk2);
3312 iff_bulk_free(bulk2);
3316 if (iff_bulk_is_completed(bulk1)) {
3317 int rcode = iff_bulk_parse(bulk1);
3318 iff_bulk_list_remove(bulk_list, bulk1);
3319 iff_bulk_free(bulk1);
3334 static void file_stack_init() { file_stack_pos = 0; }
3340 static int file_stack_push(
char* fname, FILE* fp,
int lineno) {
3346 file_stack[file_stack_pos].
fp = fp;
3347 snprintf(file_stack[file_stack_pos].filename,
sizeof(file_stack[file_stack_pos].filename),
"%s", fname);
3348 file_stack[file_stack_pos].
lineno = lineno;
3358 static int file_stack_pop(
char* fname,
size_t fname_len, FILE** fp,
int* lineno) {
3359 if (file_stack_pos <= 0) {
3366 *fp = file_stack[file_stack_pos].
fp;
3367 snprintf(fname, fname_len,
"%s", file_stack[file_stack_pos].filename);
3368 *lineno = file_stack[file_stack_pos].
lineno;
3377 static int file_stack_clear() {
3381 for (i = 0; i < file_stack_pos; i++) {
3382 fclose(file_stack[i].fp);
3385 fg = (file_stack_pos != 0);
3395 static int file_stack_check(
const char* fname) {
3397 for (i = 0; i < file_stack_pos; i++) {
3398 if (strcmp(fname, file_stack[i].filename) == 0)
return -1;
3410 static void nastran_file_init() {
3422 static int nastran_file_open(
const char* filename) {
3425 if (file_stack_check(filename)) {
3427 printf(
"???顼??¿?ť????ץ????褦?Ȥ???\n");
3431 fp = fopen(filename,
"r");
3441 if (file_stack_push(c_filename, c_fp, c_lineno)) {
3450 snprintf(c_filename,
sizeof(c_filename),
"%s", filename);
3462 static int nastran_file_close() {
3475 if (file_stack_pop(c_filename,
sizeof(c_filename), &c_fp, &c_lineno)) {
3478 snprintf(c_filename,
sizeof(c_filename),
"%s",
"Unknown");
3496 static int read_nastran(
const char* filename) {
3515 int auto_pointer_counter = 1;
3517 iff_bulk_list_init(&bulk_list);
3519 if (nastran_file_open(filename))
return -1;
3521 skip_to_begin_bulk(c_fp, &c_lineno);
3526 read_fg = read_iff(c_fp, iff1, &c_lineno);
3528 iff1_lineno = c_lineno;
3533 next_read_fg = read_iff(c_fp, iff2, &c_lineno);
3534 switch (next_read_fg) {
3536 if (iff_add_auto_pointer(iff1, iff2, &auto_pointer_counter))
return -1;
3543 iff_operation(&bulk_list, iff1, iff1_lineno);
3551 if (nastran_file_close() != 0) end_fg = 0;
3557 iff1_lineno = c_lineno;
3558 read_fg = next_read_fg;
3561 iff_bulk_list_after_operation(&bulk_list);
3563 iff_bulk_list_clear(&bulk_list);
3593 nastran_file_init();
3594 section_list_init();
3596 if (read_nastran(filename))
return -1;
3598 if (surface_elem_type_decide())
return -1;
3599 if (section_list_finalize())
return -1;
3617 if (local_mesh ==
NULL)
return NULL;
3620 snprintf(grid_filename,
sizeof(grid_filename),
"%s",
"Unknown");
#define HECMW_FILENAME_LEN
int HECMW_set_error(int errorno, const char *fmt,...)
struct hecmw_io_egrp * HECMW_io_get_egrp(const char *name)
int HECMW_io_add_ngrp(const char *name, int nnode, int *node)
struct hecmw_io_section * HECMW_io_add_sect(struct hecmw_io_section *sect)
struct hecmw_io_id_array * HECMW_io_get_elem_in_egrp(const char *name)
int HECMW_io_add_egrp(const char *name, int nelem, int *elem)
struct hecmw_io_element * HECMW_io_get_elem(int id)
struct hecmw_io_material * HECMW_io_add_mat(const char *name, struct hecmw_io_material *mat)
struct hecmwST_local_mesh * HECMW_io_make_local_mesh(void)
struct hecmw_io_element * HECMW_io_add_elem(int id, int type, int *node, int nmatitem, double *matitem)
int HECMW_io_pre_process(void)
struct hecmw_io_node * HECMW_io_add_node(int id, double x, double y, double z)
int HECMW_io_post_process(void)
int HECMW_io_set_gridfile(char *gridfile)
int HECMW_io_finalize(void)
#define LARGE_FIELD_COLUMN
struct ST_IFF_BULK iff_bulk_t
#define BULK_PARAM_NUMBER
#define LARGE_FIELD_LINE_FIELD_NUMBER
struct ST_FILE_STACK file_stack_t
struct ST_IFF_NODE iff_node_t
#define cms_malloc(p, size)
#define GPLP_PARAM_LIST_SIZE
#define CTRIAX6_EGRP_NAME_HEADER
#define IFF_FIELD_BUFFER_SIZE
#define SMALL_FIELD_COLUMN
#define BULK_PARAM_LIST_SIZE
#define GENERATE_CODE(name)
#define REMOVE_CR_MAX_LINE
#define FIRST_FIELD_COLUMN
enum ENUM_FIELD_FORMAT field_format_t
#define LAST_FIELD_COLUMN
#define CREATE_LIST_CODE(type)
struct ST_IFF_BULK_LIST iff_bulk_list_t
struct hecmwST_local_mesh * HECMW_get_nastran_mesh(const char *filename)
int HECMW_read_nastran_mesh(const char *filename)
#define HECMW_malloc(size)
#define HECMW_IO_HEC_E0001
#define HECMW_SECT_TYPE_SOLID
#define HECMW_SECT_OPT_PSTRAIN
#define HECMW_SECT_TYPE_SHELL
#define HECMW_SECT_OPT_PSTRESS
#define HECMW_SECT_OPT_ASYMMETRY
#define HECMW_assert(cond)
char filename[HECMW_FILENAME_LEN+1]
iff_node_t * iff_node_last
iff_node_t * iff_node_root
struct ST_IFF_BULK * next_bulk
struct ST_IFF_NODE * next
struct hecmw_io_material * next
struct hecmw_io_material::hecmw_io_matitem * item
char name[HECMW_NAME_LEN+1]
struct hecmw_io_section * next
union hecmw_io_section::hecmw_io_section_item sect
struct hecmw_io_section::hecmw_io_section_item::hecmw_io_section_solid solid
struct hecmw_io_section::hecmw_io_section_item::hecmw_io_section_shell shell