You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I'm getting an exception when reading ascii OP4 files using the op4.load function. This happens with files containing floating point numbers that don't have an "E" before the exponent, because these strings can't be converted to Python floats. The exception is shown below, and originates in the op4.op4 _put_ascii_values method. I patched op4.py to deal with this case (attached in the zip file as op4_patched.py): I just insert an E to get the float conversion to work; it looks like there are other methods in op4 that could be affected.
The offending op4 matrix is in the attached zip file (test.op4).
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:2291, in load(filename, namelist, into, justmatrix, sparse)
2289 filename = guitools.get_file_name(filename, read=True)
2290 if into == "dct":
-> 2291 return OP4().dctload(filename, namelist, justmatrix, sparse)
2292 elif into == "list":
2293 return OP4().listload(filename, namelist, sparse)
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:1779, in OP4.dctload(self, filename, namelist, justmatrix, sparse)
1777 loadfunc = self._loadop4_binary
1778 while 1:
-> 1779 name, X, form, mtype = loadfunc(patternlist=namelist, sparse=sparse)
1780 if not name:
1781 break
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:718, in OP4._loadop4_ascii(self, patternlist, listonly, sparse)
715 sparse, sparsefunc = OP4._get_sparsefunc(sparse)
717 rdfunc, funcs = self._get_funcs("ascii", rows, r,
mtype, sparse, c >= cols)
--> 718 X = rdfunc(wper, r, c, abs(rows), cols, line, numlen, perline, linelen, funcs)
720 if sparsefunc and sp.issparse(X):
721 X = sparsefunc(X)
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:496, in OP4._rd_bigmat_ascii(self, wper, r, c, rows, cols, line, numlen, perline, linelen, funcs)
494 L //= wper
495 s = self._get_ascii_block(L, perline, linelen)
--> 496 put(X, r, c, s, L, numlen)
497 line = self._fileh.readline()
498 c = int(line[c_slice]) - 1
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:402, in OP4._put_ascii_values(X, r, c, s, L, numlen)
400 for i in range(L):
401 b = a + numlen
--> 402 X[r + i, c] = s[a:b]
403 a = b
ValueError: could not convert string to float: ' 1.679082097391476-318'
The text was updated successfully, but these errors were encountered:
Thank you @meshing-monkey for the report! :-) I'll look into this. Note that it might take me a few weeks to really dig in.
I'm curious, was this file written by Nastran? If so, which flavor / version? (This is the first time I've seen this float format in an op4 file, doh!)
Hello,
I'm getting an exception when reading ascii OP4 files using the op4.load function. This happens with files containing floating point numbers that don't have an "E" before the exponent, because these strings can't be converted to Python floats. The exception is shown below, and originates in the op4.op4 _put_ascii_values method. I patched op4.py to deal with this case (attached in the zip file as op4_patched.py): I just insert an E to get the float conversion to work; it looks like there are other methods in op4 that could be affected.
The offending op4 matrix is in the attached zip file (test.op4).
ValueError Traceback (most recent call last)
Cell In[2], line 1
----> 1 mk = op4.load('test.op4')
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:2291, in load(filename, namelist, into, justmatrix, sparse)
2289 filename = guitools.get_file_name(filename, read=True)
2290 if into == "dct":
-> 2291 return OP4().dctload(filename, namelist, justmatrix, sparse)
2292 elif into == "list":
2293 return OP4().listload(filename, namelist, sparse)
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:1779, in OP4.dctload(self, filename, namelist, justmatrix, sparse)
1777 loadfunc = self._loadop4_binary
1778 while 1:
-> 1779 name, X, form, mtype = loadfunc(patternlist=namelist, sparse=sparse)
1780 if not name:
1781 break
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:718, in OP4._loadop4_ascii(self, patternlist, listonly, sparse)
715 sparse, sparsefunc = OP4._get_sparsefunc(sparse)
717 rdfunc, funcs = self._get_funcs("ascii", rows, r,
mtype, sparse, c >= cols)
--> 718 X = rdfunc(wper, r, c, abs(rows), cols, line, numlen, perline, linelen, funcs)
720 if sparsefunc and sp.issparse(X):
721 X = sparsefunc(X)
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:496, in OP4._rd_bigmat_ascii(self, wper, r, c, rows, cols, line, numlen, perline, linelen, funcs)
494 L //= wper
495 s = self._get_ascii_block(L, perline, linelen)
--> 496 put(X, r, c, s, L, numlen)
497 line = self._fileh.readline()
498 c = int(line[c_slice]) - 1
File ~\AppData\Local\anaconda3\Lib\site-packages\pyyeti\nastran\op4.py:402, in OP4._put_ascii_values(X, r, c, s, L, numlen)
400 for i in range(L):
401 b = a + numlen
--> 402 X[r + i, c] = s[a:b]
403 a = b
ValueError: could not convert string to float: ' 1.679082097391476-318'
The text was updated successfully, but these errors were encountered: