44
55from libc.stdio cimport fopen, FILE, fclose, fread, fseek
66from libc.stdio cimport SEEK_CUR, ftell, SEEK_SET
7+ from libc.string cimport memcpy
78
8- def LoadNodes (filename , int ptrLOC , int nnod , double [:, ::1] nodes ,
9- int [::1] nnum_arr ):
9+
10+ cdef inline double GetDouble(char * array) nogil:
11+ cdef double result
12+ memcpy(& result, array, sizeof(result))
13+ return result
14+
15+
16+ cdef inline int GetInt(char * array) nogil:
17+ cdef int result
18+ memcpy(& result, array, sizeof(result))
19+ return result
20+
21+ def LoadNodes (filename , int ptrLOC , int nnod , double [:, ::1] nloc ,
22+ int [::1] nnum ):
1023 """
1124 Function signature
12- def LoadNodes(filename, int ptrLOC, int nnod, double [:, ::1] nodes ,
13- int [::1] nnum_arr ):
25+ def LoadNodes(filename, int ptrLOC, int nnod, double [:, ::1] nloc ,
26+ int [::1] nnum ):
1427
1528 """
1629
1730 cdef int i
18- cdef int j = 0
31+ cdef int j
1932
20- # open file
21- cdef FILE* cfile
22- cdef bytes py_bytes = filename.encode()
23- cdef char * c_filename = py_bytes
24- cfile = fopen(c_filename, ' r' )
25-
26- # Seek to start of node information
27- fseek(cfile, (ptrLOC + 2 )* 4 , SEEK_CUR)
28-
29- cdef double val
33+ cdef bytes buf
34+ with open (filename, " rb" ) as f:
35+ f.seek((ptrLOC + 2 )* 4 )
36+ buf = f.read(nnod* 68 )
37+
38+ cdef char * p = buf
39+ cdef int loc
3040 for i in range (nnod):
31- fread(& val, sizeof(double ), 1 , cfile)
32- nnum_arr[i] = < int > val
33-
34- fread(& nodes[i, j], sizeof(double ), 6 , cfile)
3541
36- # skip next 3 ints
37- fseek(cfile, 12 , SEEK_CUR)
42+ # get node number (stored as double, cast to int)
43+ loc = i* 68
44+ nnum[i] = < int > GetDouble(& p[loc])
45+ loc += 8
46+ for j in range (6 ):
47+ nloc[i, j] = GetDouble(& p[loc + j* 8 ])
48+
49+
50+ # def LoadElements(filename, int ptrEID, int nelm, long [::1] e_disp_table,
51+ # int [:, ::1] elem, int [::1] etype):
52+ # """
53+ # The following is stored for each element
54+ # mat - material reference number
55+ # type - element type number
56+ # real - real constant reference number
57+ # secnum - section number
58+ # esys - element coordinate system
59+ # death - death flat (1 live, 0 dead)
60+ # solidm - solid model reference
61+ # shape - coded shape key
62+ # elnum - element number
63+ # baseeid - base element number
64+ # NODES - node numbers defining the element
65+ # """
66+ #
67+ # cdef int i
68+ # cdef int j = 0
69+ #
70+ # cdef FILE* cfile
71+ # cdef bytes py_bytes = filename.encode()
72+ # cdef char* c_filename = py_bytes
73+ # cfile = fopen(c_filename, 'r')
74+ #
75+ # cdef int nread
76+ # for i in range(nelm - 1):
77+ #
78+ # # seek to start of element information
79+ # fseek(cfile, (ptrEID + e_disp_table[i] + 3)*4, SEEK_SET)
80+ #
81+ # # Store element type
82+ # fread(&etype[i], sizeof(int), 1, cfile)
83+ #
84+ # # Seek and store element node numbers
85+ # fseek(cfile, 32, SEEK_CUR)
86+ #
87+ # # number of elements to read is dependent on the distance between
88+ # # element entries
89+ # nread = e_disp_table[i + 1] - e_disp_table[i] - 13
90+ # fread(&elem[i, j], sizeof(int), nread, cfile)
91+ #
92+ #
93+ # #==================
94+ # # last entry
95+ # #==================
96+ # i += 1
97+ # # get number to read from fortran nread entry
98+ # fseek(cfile, (ptrEID + e_disp_table[i])*4, SEEK_SET)
99+ # fread(&nread, sizeof(int), 1, cfile)
100+ # nread -= 10
101+ #
102+ # # Store element type
103+ # fseek(cfile, 8, SEEK_CUR)
104+ # fread(&etype[i], sizeof(int), 1, cfile)
105+ #
106+ # # Seek and store element node numbers
107+ # fseek(cfile, 32, SEEK_CUR)
108+ # fread(&elem[i, j], sizeof(int), nread, cfile)
109+ #
110+ # fclose(cfile)
38111
39- fclose(cfile)
40-
41-
42- def LoadElements (filename , int ptrEID , int nelm , long [::1] e_disp_table ,
43- int [:, ::1] elem , int [::1] etype ):
112+
113+ def LoadElements (filename , int ptr , int nelm ,
114+ int [::1] e_disp_table , int [:, ::1] elem , int [::1] etype ):
44115 """
45116 The following is stored for each element
46117 mat - material reference number
@@ -56,50 +127,32 @@ def LoadElements(filename, int ptrEID, int nelm, long [::1] e_disp_table,
56127 NODES - node numbers defining the element
57128 """
58129
59- cdef int i
60- cdef int j = 0
130+ cdef int i, j
61131
62- cdef FILE* cfile
63- cdef bytes py_bytes = filename.encode()
64- cdef char * c_filename = py_bytes
65- cfile = fopen(c_filename, ' r' )
66-
67- cdef int nread
68- for i in range (nelm - 1 ):
132+ cdef bytes buf
133+ with open (filename, " rb" ) as f:
134+ f.seek(ptr* 4 )
135+ buf = f.read((e_disp_table[nelm - 1 ] + 32 )* 4 )
69136
70- # seek to start of element information
71- fseek(cfile, (ptrEID + e_disp_table[i] + 3 )* 4 , SEEK_SET)
137+ cdef char * p = buf
138+ cdef int loc
139+
140+ cdef int val
141+ cdef int nread
142+ for i in range (nelm):
143+ # location in element table
144+ loc = e_disp_table[i]* 4
72145
73- # Store element type
74- fread(& etype[i], sizeof(int ), 1 , cfile)
75-
76- # Seek and store element node numbers
77- fseek(cfile, 32 , SEEK_CUR)
78-
79- # number of elements to read is dependent on the distance between
80- # element entries
81- nread = e_disp_table[i + 1 ] - e_disp_table[i] - 13
82- fread(& elem[i, j], sizeof(int ), nread, cfile)
146+ # determine number of nodes in element by getting entries in fortran header
147+ nread = GetInt(& p[loc])
83148
149+ # read in element type
150+ etype[i] = GetInt(& p[loc + 12 ])
84151
85- # ==================
86- # last entry
87- # ==================
88- i += 1
89- # get number to read from fortran nread entry
90- fseek(cfile, (ptrEID + e_disp_table[i])* 4 , SEEK_SET)
91- fread(& nread, sizeof(int ), 1 , cfile)
92- nread -= 10
93-
94- # Store element type
95- fseek(cfile, 8 , SEEK_CUR)
96- fread(& etype[i], sizeof(int ), 1 , cfile)
97-
98- # Seek and store element node numbers
99- fseek(cfile, 32 , SEEK_CUR)
100- fread(& elem[i, j], sizeof(int ), nread, cfile)
101-
102- fclose(cfile)
152+ # read in nodes
153+ for j in range (12 , nread + 2 ):
154+ elem[i, j - 12 ] = GetInt(& p[loc + 4 * j])
155+
103156
104157
105158def AssembleEdges (int nelm , int [::1] etype , int [:, ::1] elem ,
0 commit comments