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);
130 static void remove_cr(
char* line);
133 static void skip_to_begin_bulk(FILE* fp,
int*
line_no);
136 static char* ngrp_name_by_GID(
int gid,
char* name);
139 static char* egrp_name_by_PID(
int pid,
char* name);
142 static char* egrp_name_by_SID(
int sid,
char* name);
145 static char* ngrp_name_by_SID_GID(
int sid,
int gid,
char* name);
148 static char* ngrp_name_by_SID(
int sid,
int sub_id,
char* name);
151 static char* matrial_name_by_MID(
int mid,
char* name);
154 static char* egrp_CTRIAX6_name_by_MID(
int mid,
char* name);
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, 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 strcpy(type_s,
"string");
496 strcpy(type_s,
"integer");
500 strcpy(type_s,
"real");
503 strcpy(type_s,
"blank");
512 strcpy(val_str,
"H");
514 sprintf(s,
"%x", param_val[i]);
518 strcpy(val_str,
"NULL");
520 sprintf(line,
"%s:%d:", file_name,
line_no);
522 "Cannot convert '%s'(%s) to '%s' value ('%s' (field.%d) in '%s')",
523 param_val, val_str, type_s, param_name, field_no, bulk_name);
530 static void set_error_of_blank_field(
const char* file_name,
int line_no,
531 int field_no,
const char* bulk_name,
532 const char* param_name) {
536 sprintf(line,
"%s:%d:", file_name,
line_no);
537 sprintf(msg,
"Cannot be blank field ('%s' (no.%d) in '%s')", param_name,
538 field_no, bulk_name);
547 #define REMOVE_CR_MAX_LINE 256
549 static void remove_cr(
char* line) {
553 if (*p ==
'\n' || *p == 0xd) {
568 static void skip_to_begin_bulk(FILE* fp,
int*
line_no) {
573 if (strncmp(line,
"BEGIN BULK",
sizeof(
"BEGIN BULK") - 1) == 0)
return;
581 static char* ngrp_name_by_GID(
int gid,
char*
name) {
582 sprintf(
name,
"G%d", gid);
590 static char* egrp_name_by_PID(
int pid,
char*
name) {
591 sprintf(
name,
"P%d", pid);
599 static char* create_SID_grp_name(
char*
name) {
600 static int SID_counter = 1;
601 sprintf(
name,
"SID%d", SID_counter);
610 static char* egrp_name_by_SID(
int sid,
char*
name) {
612 create_SID_grp_name(
name);
620 static char* ngrp_name_by_SID_GID(
int sid,
int gid,
char*
name) {
622 create_SID_grp_name(
name);
630 static char* ngrp_name_by_SID(
int sid,
int sub_id,
char*
name) {
632 create_SID_grp_name(
name);
640 static char* matrial_name_by_MID(
int mid,
char*
name) {
641 sprintf(
name,
"M%d", mid);
649 #define CTRIAX6_EGRP_NAME_HEADER "CTRIAX6-"
651 static char* egrp_CTRIAX6_name_by_MID(
int mid,
char*
name) {
660 static int is_CTRIAX6_egrp_name(
char*
name,
int* mid) {
664 if (*s != *p)
return 0;
698 if (*p !=
' ') fg = 0;
731 static void iff_init(
char* iff) { iff_clear(iff); }
737 static void iff_clear(
char* iff) { memset(iff, 0,
IFF_SIZE); }
743 static int iff_field_empty(
char* field) {
return (field[0] == 0); }
749 static int iff_is_blank_field(
char* iff,
int no) {
750 char* field = iff_get_field(iff, no);
751 return field[0] == 0;
758 static char* iff_get_field(
char* iff,
int no) {
772 static void iff_set_field(
char* iff,
int no,
char* field) {
774 char *start_p, *p, *s;
788 if (*s !=
' ') fg = 1;
799 if (p == start_p)
return;
807 }
while (p != start_p);
814 static void iff_regulize(
char* iff) {
833 if (p == iff)
return;
856 if (last_field[0] ==
'*') {
857 if (last_field[1] == 0)
868 static void iff_copy(
char* dest,
char* src) { memcpy(dest, src,
IFF_SIZE); }
876 static int iff_is_continuous_line(
char* iff) {
877 char* f = iff_get_field(iff, 0);
879 return (f[0] ==
'+');
886 static int iff_is_pointing_line(
char* iff) {
888 return !iff_field_empty(f);
895 static char* iff_get_continuous_line_pointer(
char* iff) {
896 char* f = iff_get_field(iff, 0);
898 if (iff_field_empty(f))
return NULL;
913 static char* iff_get_pointing_line_pointer(
char* iff) {
915 if (iff_field_empty(f))
926 static int iff_is_parent(
char* iff) {
927 char* field = iff_get_field(iff, 0);
928 return (field[0] !=
'+');
935 static int iff_is_last(
char* iff) {
936 return (iff_get_pointing_line_pointer(iff) ==
NULL);
944 static int iff_add_auto_pointer(
char* iff1,
char* iff2,
int* counter) {
945 if (iff_is_blank_field(iff2, 0)) {
948 sprintf(pointer,
"+%d", *counter);
951 iff_set_field(iff2, 0, pointer);
962 static int iff_field_to_uint(
char* field,
unsigned int default_val,
966 if (field ==
NULL || (field && *field == 0)) {
971 *val = strtoul(field, &endptr, 10);
985 static int iff_field_to_int(
char* field,
int default_val,
int* val) {
988 if (field ==
NULL || (field && *field == 0)) {
993 *val = strtol(field, &endptr, 10);
1007 static int iff_field_to_double(
char* field,
double default_val,
double* val) {
1012 if (field ==
NULL || (field && *field == 0)) {
1017 *val = strtod(field, &endptr);
1026 if (*p ==
'+' || *p ==
'-') {
1037 *val = strtod(buf, &endptr);
1052 static int iff_field_to_param(
char* field,
char type,
void* param,
1053 void** next_param_pos) {
1062 R = iff_field_to_int(field, *((
int*)param), (
int*)param);
1063 p_int = (
int*)param;
1068 R = iff_field_to_uint(field, *((
unsigned int*)param),
1069 (
unsigned int*)param);
1070 p_int = (
int*)param;
1075 R = iff_field_to_double(field, *((
double*)param), (
double*)param);
1076 p_double = (
double*)param;
1081 if (field ==
NULL || field[0] == 0)
1084 strcpy((
char*)param, field);
1095 if (next_param_pos) {
1096 *next_param_pos = param;
1106 static void iff_dump(
char* iff) {
1131 static void iff_dump_csv(
char* iff) {
1135 f = iff_get_field(iff, i);
1149 static void free_to_iff_format(
char* line,
char* iff) {
1153 char *line_p, *token_p;
1163 if (*line_p ==
',') {
1166 printf(
"?ե???????¿??????);
1169 iff_set_field(iff, i, token);
1179 if (i > 0 && i < FIELD_NUMBER) {
1181 iff_set_field(iff, i, token);
1187 /* ------------------------------------------------------------------------------------------------
1191 static void small_to_iff_format(char* line, char* iff) {
1193 char token[SMALL_FIELD_COLUMN + 1];
1199 if (get_fixed_token(line, token, FIRST_FIELD_COLUMN)) {
1200 iff_set_field(iff, i, token);
1203 printf("?ե???????¿??????);
1210 iff_set_field(iff, i, token);
1222 static void large_to_iff_format(
char* line1,
char* line2,
char* iff) {
1236 iff_set_field(iff, i, token);
1245 iff_set_field(iff, i, token);
1261 iff_set_field(iff, i, token);
1270 iff_set_field(iff, i, token);
1280 static char* get_fixed_token(
char* src,
char* token,
int field_size) {
1283 static char* src_p =
NULL;
1285 if (src) src_p = src;
1287 if (src_p ==
NULL || *src_p == 0 || *src_p ==
'\n')
return NULL;
1291 for (j = 0; j < field_size && *src_p != 0; j++, src_p++, token_p++) {
1307 iff_node_init(node);
1321 static void iff_node_init(
iff_node_t* node) {
1322 iff_init(node->
iff);
1332 iff_copy(node->
iff, iff);
1341 #define read_iff_error -1
1342 #define read_iff_comment 0
1343 #define read_iff_success 1
1344 #define read_iff_eof 2
1346 static int read_iff(FILE* fp,
char* iff,
int*
line_no) {
1350 char* fg = fgets(line1,
IFF_SIZE - 1, fp);
1356 switch (field_format_judge(line1)) {
1358 free_to_iff_format(line1, iff);
1361 small_to_iff_format(line1, iff);
1365 if (!fgets(line2,
IFF_SIZE - 1, fp)) {
1370 large_to_iff_format(line1, line2, iff);
1387 static void iff_bulk_init(
iff_bulk_t* bulk) {
1399 iff_bulk_init(bulk);
1408 static void iff_bulk_free(
iff_bulk_t* bulk) {
1414 iff_node_free(node);
1430 new_node = iff_node_create();
1431 iff_node_set(new_node, iff,
line_no);
1465 static int iff_bulk_is_completed(
iff_bulk_t* bulk) {
1480 static char* iff_bulk_get_name(
iff_bulk_t* bulk) {
1490 static char* iff_bulk_get_field(
iff_bulk_t* bulk,
int field_no) {
1499 while (node && i < line) {
1503 if (i < line)
return NULL;
1505 return iff_get_field(node->
iff, n);
1513 static char* iff_bulk_get_param(
iff_bulk_t* bulk,
int param_no) {
1517 int line = param_no / N;
1518 int n = param_no % N + 1;
1522 while (node && i < line) {
1528 return iff_get_field(node->
iff, n);
1536 static char* iff_bulk_get_param_data(
iff_bulk_t* bulk,
int param_no,
1537 int*
line_no,
int* field_no) {
1541 int line = param_no / N;
1542 int n = param_no % N + 1;
1546 while (node && i < line) {
1550 if (node ==
NULL)
return 0;
1556 return iff_get_field(node->
iff, n);
1566 static int get_number_in_str(
char** pp) {
1572 while (*p >=
'0' && *p <=
'9') {
1587 static int iff_bulk_get_param_list(
iff_bulk_t* bulk,
const char* format,
1610 int read_param_count;
1612 va_start(ap, result);
1617 read_param_count = 0;
1635 arr_n = get_number_in_str(&nf);
1640 }
else if (*nf ==
'/') {
1642 ness_n = get_number_in_str(&nf);
1643 if (!ness) ness_n = 0;
1653 param = va_arg(ap,
void*);
1654 param_name_p = va_arg(ap,
char*);
1657 for (i = 0; i < arr_n; i++) {
1658 field = iff_bulk_get_param_data(bulk, param_pos, &
line_no, &field_no);
1660 R = iff_field_to_param(field, type, param, ¶m);
1664 sprintf(param_name,
"%s%d", param_name_p, i + 1);
1666 strcpy(param_name, param_name_p);
1667 set_error_of_field_convert(grid_filename,
line_no, field_no,
1668 iff_bulk_get_name(bulk), param_name, field,
1671 }
else if (i < ness_n && R == 2) {
1673 sprintf(param_name,
"%s%d", param_name_p, i + 1);
1675 strcpy(param_name, param_name_p);
1676 set_error_of_blank_field(grid_filename,
line_no, field_no,
1677 iff_bulk_get_name(bulk), param_name);
1699 static int iff_bulk_get_param_list_pattern(
iff_bulk_t* bulk,
const char* format,
1700 int start_param_pos,
int* size,
1702 #define GPLP_PARAM_LIST_SIZE 50
1720 int param_list_size;
1737 str_upr((
char*)format);
1738 param_list_size = strlen((
char*)format);
1742 for (i = 0; i < param_list_size; i++) {
1743 param_list[i] = va_arg(ap,
void**);
1744 param_name_head[i] = va_arg(ap,
char*);
1749 data_size = iff_bulk_get_line_number(bulk) / param_list_size;
1750 for (i = 0; i < param_list_size; i++) {
1751 switch (format[i]) {
1753 type_size =
sizeof(int);
1756 type_size =
sizeof(
unsigned int);
1759 type_size =
sizeof(double);
1765 param_list_p[i] = *param_list[i];
1768 param_pos = start_param_pos;
1773 for (i = 0; i < param_list_size; i++) {
1774 field = iff_bulk_get_param_data(bulk, param_pos, &
line_no, &field_no);
1775 if (field ==
NULL || field[0] == 0) {
1781 param = param_list_p[i];
1782 r = iff_field_to_param(field, type, param, ¶m);
1784 param_list_p[i] = param;
1785 }
else if (r == 0) {
1786 sprintf(param_name,
"%s%d", param_name_head[i], index + 1);
1787 set_error_of_field_convert(grid_filename,
line_no, field_no,
1788 iff_bulk_get_name(bulk), param_name, field,
1792 if (state != 0 && state != r) {
1793 sprintf(param_name,
"%s%d", param_name_head[i], index + 1);
1794 set_error_of_field_convert(grid_filename,
line_no, field_no,
1795 iff_bulk_get_name(bulk), param_name, field,
1809 #undef GPLP_PARAM_LIST_SIZE
1816 static int iff_bulk_get_line_number(
iff_bulk_t* bulk) {
1832 static int iff_bulk_get_line_no(
iff_bulk_t* bulk,
int iff_pos) {
1837 if (i == iff_pos)
return node->
line_no;
1849 char* line_pointer) {
1858 if (node && iff_is_pointing_line(node->
iff)) {
1859 p = iff_get_pointing_line_pointer(node->
iff);
1860 if (strcmp(p, line_pointer) == 0) {
1873 char* line_pointer) {
1880 if (node && iff_is_continuous_line(node->
iff)) {
1881 p = iff_get_continuous_line_pointer(node->
iff);
1882 if (strcmp(p, line_pointer) == 0) {
1894 static void iff_bulk_dump(
iff_bulk_t* bulk) {
1899 iff_dump(node->
iff);
1916 #define GENERATE_CODE(name) static int iff_bulk_parse_##name(iff_bulk_t* bulk);
1937 #undef GENERATE_CODE
1939 #define GENERATE_CODE(name) BULK_TYPE_##name,
1951 #undef GENERATE_CODE
1953 #define BULK_TYPE_NUMBER BULK_TYPE_UNKNOWN
1955 #define GENERATE_CODE(name) #name,
1957 static char* bulk_type_name[] = {
1964 #undef GENERATE_CODE
1968 static int iff_bulk_type(
const char* bulkname) {
1972 if (0 == strcmp(bulkname, bulk_type_name[i]))
return i;
1975 return BULK_TYPE_UNKNOWN;
1978 static int iff_bulk_parse(
iff_bulk_t* bulk) {
1982 bulkname = iff_bulk_get_name(bulk);
1986 no = iff_bulk_type(bulkname);
1988 #define GENERATE_CODE(name) \
1989 case BULK_TYPE_##name: \
1990 return iff_bulk_parse_##name(bulk);
2024 typedef struct ST_PSHELL_MID2 {
2027 struct ST_PSHELL_MID2* next;
2030 typedef struct ST_PSHELLMID2_LIST { pshell_mid2_t* root; } pshell_mid2_list_t;
2032 static pshell_mid2_list_t pshell_mid2_list;
2033 static int pshell_mid2_list_init_fg = 0;
2035 static void pshell_mid2_list_init(
void);
2036 static void pshell_mid2_list_clear(
void);
2037 static void pshell_mid2_list_regist(
int pid,
int mid2);
2038 static int pshell_mid2_list_get_mid2_by_pid(
int pid,
int* mid2);
2042 static void pshell_mid2_list_init(
void) {
2043 pshell_mid2_list.root =
NULL;
2044 pshell_mid2_list_init_fg = 1;
2047 static void pshell_mid2_list_clear(
void) {
2048 pshell_mid2_t* node = pshell_mid2_list.root;
2049 pshell_mid2_t* next;
2056 pshell_mid2_list.root =
NULL;
2059 static void pshell_mid2_list_regist(
int pid,
int mid2) {
2060 pshell_mid2_t* node;
2068 if (!pshell_mid2_list_init_fg) {
2069 pshell_mid2_list_init();
2072 if (pshell_mid2_list.root) {
2073 node->next = pshell_mid2_list.root;
2077 pshell_mid2_list.root = node;
2080 static int pshell_mid2_list_get_mid2_by_pid(
int pid,
int* mid2) {
2081 pshell_mid2_t* node = pshell_mid2_list.root;
2084 if (node->PID == pid) {
2097 static int check_order_of_elem(
int result[],
int G_start_pos,
int G_number,
2100 int first_order = 0;
2101 int* r = &(result[G_start_pos]);
2103 for (i = 0; i < G_ness; i++, r++) {
2109 for (; i < G_number; i++, r++) {
2126 int sub_n[],
double data[]) {
2127 #define cms_malloc(p, size) \
2129 (p) = HECMW_malloc((size)); \
2130 if ((p) == NULL) { \
2131 HECMW_set_error(errno, ""); \
2137 struct hecmw_io_matitem* matitem;
2138 struct hecmw_io_matsubitem* matsubitem;
2147 for (i = 0; i <
item_n; i++) {
2148 matitem[i].item = i + 1;
2149 matitem[i].nval = sub_n[i];
2152 cms_malloc(matsubitem->val,
sizeof(*(matsubitem->val)) * sub_n[i]);
2154 for (j = 0; j < sub_n[i]; j++) {
2155 matsubitem->val[j] =
data[d_count];
2158 matsubitem->temp =
data[d_count];
2161 matsubitem->next =
NULL;
2162 matitem[i].subitem = matsubitem;
2165 strcpy(mat->
name, name);
2167 mat->
item = matitem;
2179 static int iff_bulk_parse_MAT1(
iff_bulk_t* bulk) {
2180 #define BULK_PARAM_NUMBER 12
2193 char format[] =
"UDdDDDdddddu";
2198 E = G = NU = RHO = A = TREF = GE = ST = SC = SS = 0.0;
2201 iff_bulk_get_param_list(bulk, format, result, &MID,
"MID", &E,
"E", &G,
"G",
2202 &NU,
"NU", &RHO,
"RHO", &A,
"A", &TREF,
"TREF", &GE,
2203 "GE", &ST,
"ST", &SC,
"SC", &SS,
"SS", &MCSID,
2211 int sub_n[
item_n] = {2, 1, 1};
2214 matrial_name_by_MID(MID,
name);
2232 #undef BULK_PARAM_NUMBER
2239 static int iff_bulk_parse_MAT4(
iff_bulk_t* bulk) {
2240 #define BULK_PARAM_NUMBER 11
2254 char format[] =
"Udddddddddd";
2258 iff_bulk_get_param_list(bulk, format, result, &MID,
"MID", &K,
"K", &CP,
"CP",
2259 &r,
"rho", &H,
"H", &m,
"m", &HGEN,
"HGEN", &REFENTH,
2260 "REFENTH", &TCH,
"TCH", &TDELTA,
"TDELTA", &QLAT,
2268 int sub_n[
item_n] = {1, 1, 1};
2271 matrial_name_by_MID(MID,
name);
2288 #undef BULK_PARAM_NUMBER
2302 static void init_section_rec(section_rec* a) {
2303 memset(a, 0,
sizeof(section_rec));
2308 static int is_eq_section_rec(section_rec a, section_rec b) {
2309 return (strcmp(a.egrp, b.egrp) == 0);
2312 static void copy_section_rec(section_rec* dest, section_rec src) {
2313 memcpy(dest, &src,
sizeof(section_rec));
2316 static void delete_section_rec(section_rec a) { }
2318 static t_list_section_rec section_list;
2324 static void section_list_init(
void) { list_init_section_rec(§ion_list); }
2329 return (list_add_section_rec(§ion_list, *
sect) ==
NULL);
2334 static int section_list_finalize(
void) {
2335 list_scan_start_section_rec(§ion_list);
2336 while (list_scan_next_section_rec(§ion_list)) {
2337 section_rec* rec = §ion_list.current->data;
2344 list_clear_section_rec(§ion_list);
2353 static int iff_bulk_parse_PROD(
iff_bulk_t* bulk) {
2354 #define BULK_PARAM_NUMBER 6
2363 char format[] =
"UUdddd";
2368 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID,
"MID", &A,
2369 "A", &J,
"J", &C,
"C", &NSM,
"NSM");
2371 strcpy(
sect.egrp, egrp_name_by_PID(PID, grp_name));
2372 strcpy(
sect.material, matrial_name_by_MID(MID, grp_name));
2381 if (section_list_regist(&
sect))
return -1;
2385 #undef BULK_PARAM_NUMBER
2392 static int iff_bulk_parse_PSHELL(
iff_bulk_t* bulk) {
2393 #define BULK_PARAM_NUMBER 11
2406 char format[] =
"Uudiduddddi";
2421 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID1,
"MID1", &T,
2422 "T", &MID2,
"MID2", &_12I_T_3,
"12I/T^3", &MID3,
2423 "MID3", &TS_S,
"TS/S", &NSM,
"NSM", &Z1,
"Z1", &Z2,
2424 "Z2", &MID4,
"MID4");
2426 strcpy(
sect.egrp, egrp_name_by_PID(PID, grp_name));
2427 strcpy(
sect.material, matrial_name_by_MID(MID1, grp_name));
2433 else if (MID2 == -1)
2436 if (MID2 == 0 || MID2 == -1)
2450 if (section_list_regist(&
sect))
return -1;
2454 pshell_mid2_list_regist(PID, MID2);
2458 #undef BULK_PARAM_NUMBER
2465 static int iff_bulk_parse_PSOLID(
iff_bulk_t* bulk) {
2466 #define BULK_PARAM_NUMBER 7
2476 char format[] =
"UUissss";
2487 strcpy(FCTN,
"SMECH");
2489 iff_bulk_get_param_list(bulk, format, result, &PID,
"PID", &MID,
"MID",
2490 &CORDM,
"CORDM", IN,
"IN", STRESS,
"STRESS", ISOP,
2491 "ISOP", FCTN,
"FCTN");
2495 strcpy(
sect.egrp, egrp_name_by_PID(PID, grp_name));
2496 strcpy(
sect.material, matrial_name_by_MID(MID, grp_name));
2505 if (section_list_regist(&
sect))
return -1;
2509 #undef BULK_PARAM_NUMBER
2519 static int iff_bulk_parse_CROD(
iff_bulk_t* bulk) {
2521 #define BULK_PARAM_NUMBER (2 + G_NUMBER)
2527 char format[20] =
"UUU2";
2532 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", G,
"G");
2546 #undef BULK_PARAM_NUMBER
2553 static int iff_bulk_parse_CBAR(
iff_bulk_t* bulk) {
return -1; }
2559 static int iff_bulk_parse_CBEAM(
iff_bulk_t* bulk) {
return -1; }
2570 static int surface_elem_store(
int bulk_type,
unsigned int EID,
unsigned int PID,
2571 unsigned int G[],
int G_number,
double THETA_MCID,
2572 double ZOFFS,
double T[],
int T_number) {
2580 switch (bulk_type) {
2581 case BULK_TYPE_CTRIA3:
2584 case BULK_TYPE_CTRIA6:
2587 case BULK_TYPE_CQUAD4:
2590 case BULK_TYPE_CQUAD8:
2614 static int surface_elem_type_decide(
void) {
2618 pshell_mid2_t* node;
2621 node = pshell_mid2_list.root;
2623 egrp_name_by_PID(
node->PID, grp_name);
2626 for (i = 0; i < id_array->
n; i++) {
2629 if (
node->MID2 >= 1) {
2630 switch (elem->
type) {
2651 pshell_mid2_list_clear();
2659 static int iff_bulk_parse_CTRIA3(
iff_bulk_t* bulk) {
2662 #define BULK_PARAM_NUMBER (2 + 3 + 2 + 3)
2672 char format[] =
"UUU3dd_3d3";
2675 T[0] = T[1] = T[2] = 0.0;
2677 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2678 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2689 if (surface_elem_store(BULK_TYPE_CTRIA3, EID, PID, G, 3, THETA_MCID, ZOFFS, T,
2695 #undef BULK_PARAM_NUMBER
2702 static int iff_bulk_parse_CTRIA6(
iff_bulk_t* bulk) {
2706 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 2 + 3)
2716 int conv_table[] = {1, 2, 3, 5, 6, 4};
2719 char format[] =
"UUU6dd_3d3";
2722 T[0] = T[1] = T[2] = 0.0;
2724 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2725 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2736 for (i = 0; i <
G_NUMBER; i++)
node[i] = G[conv_table[i] - 1];
2738 if (surface_elem_store(BULK_TYPE_CTRIA6, EID, PID,
node,
G_NUMBER, THETA_MCID,
2744 #undef BULK_PARAM_NUMBER
2753 static int iff_bulk_parse_CQUAD4(
iff_bulk_t* bulk) {
2758 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 2 + T_NUMBER)
2769 char format[] =
"UUU4dd_2d4";
2772 T[0] = T[1] = T[2] = T[3] = 0.0;
2774 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2775 "G", &THETA_MCID,
"THETA/MCID", &ZOFFS,
"ZOFFS", T,
2787 if (surface_elem_store(BULK_TYPE_CQUAD4, EID, PID, G,
G_NUMBER, THETA_MCID,
2793 #undef BULK_PARAM_NUMBER
2802 static int iff_bulk_parse_CQUAD8(
iff_bulk_t* bulk) {
2807 #define BULK_PARAM_NUMBER (2 + G_NUMBER + T_NUMBER + 2)
2818 char format[] =
"UUU8d4dd";
2821 T[0] = T[1] = T[2] = T[3] = 0.0;
2823 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2824 "G", T,
"T", &THETA_MCID,
"THETA/MCID", &ZOFFS,
2836 if (surface_elem_store(BULK_TYPE_CQUAD8, EID, PID, G,
G_NUMBER, THETA_MCID,
2842 #undef BULK_PARAM_NUMBER
2854 static int iff_bulk_parse_solid_elem(
iff_bulk_t* bulk,
int first_etype,
2855 int second_etype,
int conv_table[],
2856 int g_number,
int g_ness_number) {
2857 #define G_LIST_SIZE 100
2858 #define BULK_PARAM_LIST_SIZE (2 + G_LIST_SIZE)
2875 sprintf(format,
"UUU%d/%d", g_number, g_ness_number);
2877 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &PID,
"PID", G,
2880 order = check_order_of_elem(result, 2, g_number, g_ness_number);
2884 for (i = 0; i < g_number; i++)
node[i] = G[conv_table[i] - 1];
2889 }
else if (order == 2) {
2906 #undef BULK_PARAM_LIST_SIZE
2913 static int iff_bulk_parse_CTETRA(
iff_bulk_t* bulk) {
2914 int conv_table[] = {1, 2, 3, 4, 6, 7, 5, 8, 9, 10};
2923 static int iff_bulk_parse_CPENTA(
iff_bulk_t* bulk) {
2924 int conv_table[] = {1, 2, 3, 4, 5, 6, 8, 9, 7, 14, 15, 13, 10, 11, 12};
2933 static int iff_bulk_parse_CHEXA(
iff_bulk_t* bulk) {
2934 int conv_table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2935 11, 12, 17, 18, 19, 20, 13, 14, 15, 16};
2947 static int iff_bulk_parse_CTRIAX6(
iff_bulk_t* bulk) {
2949 #define BULK_PARAM_NUMBER (2 + G_NUMBER + 1)
2952 int conv_table[] = {1, 3, 5, 4, 6, 2};
2961 char format[20] =
"UUU6d";
2964 iff_bulk_get_param_list(bulk, format, result, &EID,
"EID", &MID,
"MID", G,
2969 for (i = 0; i <
G_NUMBER; i++)
node[i] = G[conv_table[i] - 1];
2981 egrp_CTRIAX6_name_by_MID(MID, grp_name);
2987 strcpy(
sect.egrp, grp_name);
2988 strcpy(
sect.material, matrial_name_by_MID(MID, mat_name));
3007 #undef BULK_PARAM_NUMBER
3012 static int iff_bulk_parse_GRID(
iff_bulk_t* bulk) {
3013 #define BULK_PARAM_NUMBER 8
3015 unsigned int ID = 0;
3016 unsigned int CP = 0;
3018 unsigned int CDI = 0;
3019 unsigned int PS = 0;
3022 char format[] =
"UUD3uuu";
3027 X[0] = X[1] = X[2] = 0.0;
3029 iff_bulk_get_param_list(bulk, format, result, &ID,
"ID", &CP,
"CP", X,
"X",
3030 &CDI,
"CDI", &PS,
"PS", &SEID,
"SEID");
3040 #undef BULK_PARAM_NUMBER
3052 static int iff_bulk_parse_INCLUDE(
iff_bulk_t* bulk) {
3071 strcat(buff, iff_get_field(iff, i));
3087 }
else if (*bp ==
'\'') {
3100 printf(
"Include %s ==================================\n", filename);
3102 errcode = nastran_file_open(filename);
3127 iff_bulk_free(node);
3160 static iff_bulk_t* iff_bulk_list_search_pointing_bulk(
3165 if (iff_bulk_search_pointing_line(node, line_pointer))
return node;
3176 static iff_bulk_t* iff_bulk_list_search_continuous_bulk(
3181 if (iff_bulk_search_continuous_line(node, line_pointer))
return node;
3220 #define TRYAL_NUMBER 20
3222 static int iff_bulk_list_after_operation(
iff_bulk_list_t* bulk_list) {
3227 while (!iff_bulk_list_is_empty(bulk_list)) {
3231 if (iff_bulk_is_completed(bulk)) {
3232 if (iff_bulk_parse(bulk)) {
3233 iff_bulk_list_remove(bulk_list, bulk);
3234 iff_bulk_free(bulk);
3264 printf(
" Bulk List Dump ==============\n");
3267 iff_bulk_dump(node);
3269 printf(
"==============\n");
3287 if (iff_is_parent(iff)) {
3288 bulk1 = iff_bulk_create();
3289 iff_bulk_regist(bulk1, iff,
line_no);
3290 iff_bulk_list_regist(bulk_list, bulk1);
3291 }
else if (iff_is_continuous_line(iff)) {
3292 bulk1 = iff_bulk_list_search_pointing_bulk(
3293 bulk_list, iff_get_continuous_line_pointer(iff));
3295 iff_bulk_regist(bulk1, iff,
line_no);
3297 bulk1 = iff_bulk_create();
3298 iff_bulk_regist(bulk1, iff,
line_no);
3299 iff_bulk_list_regist(bulk_list, bulk1);
3305 if (iff_is_pointing_line(iff)) {
3306 pointer = iff_get_pointing_line_pointer(iff);
3307 bulk2 = iff_bulk_list_search_continuous_bulk(bulk_list, pointer);
3309 iff_bulk_move_append(bulk1, bulk2);
3310 iff_bulk_list_remove(bulk_list, bulk2);
3311 iff_bulk_free(bulk2);
3315 if (iff_bulk_is_completed(bulk1)) {
3316 int rcode = iff_bulk_parse(bulk1);
3317 iff_bulk_list_remove(bulk_list, bulk1);
3318 iff_bulk_free(bulk1);
3333 static void file_stack_init() { file_stack_pos = 0; }
3339 static int file_stack_push(
char* fname, FILE* fp,
int lineno) {
3345 file_stack[file_stack_pos].
fp = fp;
3346 strcpy(file_stack[file_stack_pos].filename, fname);
3347 file_stack[file_stack_pos].
lineno = lineno;
3357 static int file_stack_pop(
char* fname, FILE** fp,
int* lineno) {
3358 if (file_stack_pos <= 0) {
3365 *fp = file_stack[file_stack_pos].
fp;
3366 strcpy(fname, file_stack[file_stack_pos].filename);
3367 *lineno = file_stack[file_stack_pos].
lineno;
3376 static int file_stack_clear() {
3380 for (i = 0; i < file_stack_pos; i++) {
3381 fclose(file_stack[i].fp);
3384 fg = (file_stack_pos != 0);
3394 static int file_stack_check(
const char* fname) {
3396 for (i = 0; i < file_stack_pos; i++) {
3397 if (strcmp(fname, file_stack[i].filename) == 0)
return -1;
3409 static void nastran_file_init() {
3421 static int nastran_file_open(
const char* filename) {
3424 if (file_stack_check(filename)) {
3426 printf(
"???顼??¿?ť????ץ????褦?Ȥ???\n");
3430 fp = fopen(filename,
"r");
3440 if (file_stack_push(c_filename, c_fp, c_lineno)) {
3449 strcpy(c_filename, filename);
3461 static int nastran_file_close() {
3474 if (file_stack_pop(c_filename, &c_fp, &c_lineno)) {
3477 strcpy(c_filename,
"Unknown");
3495 static int read_nastran(
const char* filename) {
3514 int auto_pointer_counter = 1;
3516 iff_bulk_list_init(&bulk_list);
3518 if (nastran_file_open(filename))
return -1;
3520 skip_to_begin_bulk(c_fp, &c_lineno);
3525 read_fg = read_iff(c_fp, iff1, &c_lineno);
3527 iff1_lineno = c_lineno;
3532 next_read_fg = read_iff(c_fp, iff2, &c_lineno);
3533 switch (next_read_fg) {
3535 if (iff_add_auto_pointer(iff1, iff2, &auto_pointer_counter))
return -1;
3542 iff_operation(&bulk_list, iff1, iff1_lineno);
3550 if (nastran_file_close() != 0) end_fg = 0;
3556 iff1_lineno = c_lineno;
3557 read_fg = next_read_fg;
3560 iff_bulk_list_after_operation(&bulk_list);
3562 iff_bulk_list_clear(&bulk_list);
3592 nastran_file_init();
3593 section_list_init();
3595 if (read_nastran(filename))
return -1;
3597 if (surface_elem_type_decide())
return -1;
3598 if (section_list_finalize())
return -1;
3616 if (local_mesh ==
NULL)
return NULL;
3619 strcpy(grid_filename,
"Unknown");