Skip to content

Commit f119721

Browse files
committed
windows fixes
1 parent 13f709f commit f119721

File tree

2 files changed

+148
-76
lines changed

2 files changed

+148
-76
lines changed

pyansys/binary_reader.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import numpy as np
33
import warnings
44
import logging
5+
import ctypes
56

67
from pyansys import _parsefull
78
from pyansys import _rstHelper
@@ -208,7 +209,7 @@ class ResultReader(object):
208209
Object to control the reading of ANSYS results written to fortran file
209210
"""
210211

211-
def __init__(self, filename, logger=False):
212+
def __init__(self, filename, logger=False, load_geometry=True):
212213
"""
213214
Loads basic result information from result file and initializes result
214215
object.
@@ -258,7 +259,8 @@ def __init__(self, filename, logger=False):
258259
self.GetTimeValues()
259260

260261
# store geometry for later retrival
261-
self.StoreGeometry()
262+
if load_geometry:
263+
self.StoreGeometry()
262264

263265

264266
def ResultsProperties(self):
@@ -511,9 +513,15 @@ def StoreGeometry(self):
511513
'nodstr': nodstr}
512514

513515
# get the element description table
514-
#nelm = result.resultheader['nelm']
515516
f.seek((ptrEID + 2)*4)
516-
e_disp_table = np.fromfile(f, self.resultheader['endian'] + 'l', nelm)
517+
e_disp_table = np.empty(nelm, np.int32)
518+
e_disp_table[:] = np.fromfile(f, self.resultheader['endian'] + 'i8', nelm)
519+
520+
# get pointer to start of element table and adjust element pointers
521+
ptr = ptrEID + e_disp_table[0]
522+
e_disp_table -= e_disp_table[0]
523+
524+
517525
f.close()
518526

519527
# The following is stored for each element
@@ -537,6 +545,11 @@ def StoreGeometry(self):
537545

538546
elem = np.empty((nelm, 20), np.int32)
539547
elem[:] = -1
548+
549+
# load elements
550+
_rstHelper.LoadElements(self.filename, ptr, nelm, e_disp_table, elem,
551+
etype)
552+
540553

541554
#==============================================================================
542555
# old python
@@ -569,20 +582,25 @@ def StoreGeometry(self):
569582
# f.seek(32, 1)
570583
# rnodes = np.fromfile(f, self.resultheader['endian'] + 'i', nread)
571584
# elem[i, :nread] = rnodes
572-
573-
574-
_rstHelper.LoadElements(self.filename, ptrEID, nelm, e_disp_table,
575-
elem, etype)
576-
585+
586+
# import ctypes
587+
# e_disp_table = e_disp_table.astype(ctypes.c_long)
588+
# _rstHelper.LoadElements(self.filename, ptrEID, nelm, e_disp_table,
589+
# elem, etype)
577590

591+
# for i in range(nelm):
592+
# if not np.all(elem_linux[i] == elem[i]):
593+
# print i
594+
# break
595+
#
578596

579597
# store geometry dictionary
580598
self.geometry = {'nnum': nnum,
581599
'nodes': nloc,
582600
'etype': etype,
583601
'elem': elem,
584602
'enum': self.resultheader['eeqv'],
585-
'ekey': np.asarray(ekey, np.long)}
603+
'ekey': np.asarray(ekey, ctypes.c_long)}
586604

587605

588606
# store the reference array
@@ -663,7 +681,8 @@ def NodalStress(self, rnum):
663681
f.seek(element_rst_ptr*4)
664682

665683
# element index table
666-
ele_ind_table = np.fromfile(f, endian + 'l', nelm).astype(np.int32)
684+
# ele_ind_table = np.fromfile(f, endian + 'l', nelm).astype(np.int32)
685+
ele_ind_table = np.fromfile(f, endian + 'i8', nelm).astype(np.int32)
667686
ele_ind_table += element_rst_ptr
668687

669688
# Each element header contains 25 records for the individual results

pyansys/cython/_rstHelper.pyx

Lines changed: 118 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,114 @@
44

55
from libc.stdio cimport fopen, FILE, fclose, fread, fseek
66
from 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

105158
def AssembleEdges(int nelm, int [::1] etype, int [:, ::1] elem,

0 commit comments

Comments
 (0)