def test_sparse_read(): direc = "tests/nastran_op4_data/" fnames = glob(direc + "*.op4") + glob(direc + "*.other") for fname in fnames: m = op4.read(fname) if fname.endswith("cdbin_ascii_sparse_nonbigmat.op4"): # this has an all-zeros matrix that is written the same as # the dense format (so the sparse form is not used by # default) del m["c2"] m2 = op4.read(fname, sparse=None) m3 = op4.read(fname, sparse=True) m4 = op4.read(fname, sparse=False) m5 = op4.read(fname, sparse=(None, sp.coo_matrix.tocsr)) if "bigmat" in fname: for k, v in m.items(): assert sp.issparse(m2[k]) assert sp.isspmatrix_csr(m5[k]) assert np.all(m2[k].toarray() == v) assert np.all(m5[k].toarray() == v) else: for k, v in m.items(): assert np.all(m2[k] == v) assert np.all(m5[k] == v) for k, v in m.items(): assert sp.issparse(m3[k]) assert np.all(m3[k].toarray() == v) assert np.all(m4[k] == v)
def test_sparse_read(): direc = "tests/nastran_op4_data/" fnames = glob(direc + "*.op4") + glob(direc + "*.other") for fname in fnames: m = op4.read(fname) m2 = op4.read(fname, sparse=None) m3 = op4.read(fname, sparse=True) m4 = op4.read(fname, sparse=False) m5 = op4.read(fname, sparse=(None, sp.coo_matrix.tocsr)) if "bigmat" in fname: for k, v in m.items(): assert sp.issparse(m2[k]) assert sp.isspmatrix_csr(m5[k]) assert np.all(m2[k].toarray() == v) assert np.all(m5[k].toarray() == v) else: for k, v in m.items(): assert np.all(m2[k] == v) assert np.all(m5[k] == v) for k, v in m.items(): assert sp.issparse(m3[k]) assert np.all(m3[k].toarray() == v) assert np.all(m4[k] == v)
def test_asm2uset_2(): u, c, b = nastran.asm2uset("tests/nas2cam_extseout/reduced_bset_notall6.asm") m = op4.read("tests/nas2cam_extseout/reduced_bset_notall6.op4") assert u.shape[0] == 29 q = ~b assert ((np.diag(m["maa"]) == 1.0) == q).all()
def write_read(m, binary, sparse): f = tempfile.NamedTemporaryFile(delete=False) name = f.name f.close() try: op4.write(name, m, binary=binary, sparse=sparse) m2 = op4.read(name, sparse=None) finally: os.remove(name) return m2
def test_wtop4_2(): matfile = "tests/nastran_op4_data/r_c_rc.mat" m = matlab.loadmat(matfile) names = ["rmat", "cmat", "rcmat"] mats = [] wtdct = {} for nm in names: mats.append(m[nm]) wtdct[nm] = m[nm] # write(filename, names, matrices=None, # binary=True, digits=16, endian='') filenames = [ ["tests/nastran_op4_data/temp_ascii.op4", False, ""], ["tests/nastran_op4_data/temp_le.op4", True, "<"], ["tests/nastran_op4_data/temp_be.op4", True, ">"], ] for item in filenames: filename = item[0] binary = item[1] endian = item[2] op4.write(filename, names, mats, binary=binary, endian=endian) names2, sizes, forms, mtypes = op4.dir(filename, verbose=False) assert names2 == names dct = op4.load(filename) for nm in dct: assert np.allclose(m[nm], dct[nm][0]) op4.save(filename, wtdct, binary=binary, endian=endian) dct = op4.load(filename, into="dct") for nm in dct: assert np.allclose(m[nm], dct[nm][0]) dct = op4.read(filename) for nm in dct: assert np.allclose(m[nm], dct[nm]) op4.save(filename, wtdct, binary=binary, endian=endian) dct = op4.read(filename, into="dct") for nm in dct: assert np.allclose(m[nm], dct[nm]) # clean up: for item in filenames: os.remove(item[0])
def test_large_sparse(): data = [2.3, 5, -100.4] rows = [2, 500000, 3500000] cols = [3750000, 500000, 4999999] a = sp.csr_matrix((data, (rows, cols)), shape=(5000000, 5000000)) f = tempfile.NamedTemporaryFile(delete=False) name = f.name f.close() try: op4.write(name, dict(a=a)) a2 = op4.read(name, sparse=None) finally: os.remove(name) assert sp.issparse(a2["a"]) a2 = a2["a"].tocsr() for i, j, v in zip(rows, cols, data): assert np.allclose(a2[i, j], v)
def test_wtop4_single_2(): matfile = "tests/nastran_op4_data/r_c_rc.mat" m = matlab.loadmat(matfile) name = "rmat" mat = m[name] # write(filename, names, matrices=None, # binary=True, digits=16, endian='') filenames = [["tests/nastran_op4_data/temp_ascii.op4", False, ""]] for item in filenames: filename = item[0] binary = item[1] endian = item[2] op4.write(filename, name, mat, binary=binary, endian=endian) dct = op4.read(filename) for nm in dct: assert np.allclose(m[nm], dct[nm]) # clean up: for item in filenames: os.remove(item[0])
def test_premature_eof_warning(): a = np.random.randn(10, 10) f = tempfile.NamedTemporaryFile(delete=False) fname = f.name f.close() try: op4.write(fname, {"a": a}) bufr = open(fname, "rb").read() open(fname, "wb").write(bufr[:-6]) with assert_warns(RuntimeWarning) as cm: a2 = op4.read(fname) assert cm.warnings[0].message.args[0].startswith("Premature end-of-file") finally: os.remove(fname) assert (a2["a"] == a).all()
def test_large_rows_dense(): fname = "tests/nastran_op4_data/x100000.op4" m = op4.read(fname) x = np.zeros((100000, 1)) x[45678] = 1.0 assert np.allclose(m["x"], x)
def test_sparse_write(): fnames = [ "tests/nastran_op4_data/cdbin.op4", "tests/nastran_op4_data/rs.op4", "tests/nastran_op4_data/r_c_rc.op4", "tests/nastran_op4_data/double_bigmat_le.op4", "tests/nastran_op4_data/double_nonbigmat_be.op4", "tests/nastran_op4_data/single_dense_be.op4", # the nx nastran v9 version of the following files does not # make NR negative ... not really a big deal, but the tests # below would need to be changed. So, just using the pyYeti # versions directly (nastran read them fine) "tests/nastran_op4_data/big_bigmat_ascii.op4", "tests/nastran_op4_data/big_bigmat_binary.op4", "tests/nastran_op4_data/big_dense_ascii.op4", "tests/nastran_op4_data/big_dense_binary.op4", ] for fname in fnames: for rd_sparse in (True, False, None): m = op4.read(fname, sparse=rd_sparse) m2 = write_read(m, binary=True, sparse="dense") m3 = write_read(m, binary=False, sparse="dense") m4 = write_read(m, binary=False, sparse="nonbigmat") m5 = write_read(m, binary=True, sparse="nonbigmat") m6 = write_read(m, binary=False, sparse="bigmat") m7 = write_read(m, binary=True, sparse="bigmat") m8 = write_read(m, binary=False, sparse="auto") m9 = write_read(m, binary=True, sparse="auto") for k, v in m.items(): if rd_sparse: assert sp.issparse(v) elif rd_sparse is None and "bigmat" in fname: if "nonbigmat" in fname and not sp.issparse(v): # v could be dense if all zeros assert np.all(v == 0.0) else: assert sp.issparse(v) va = v.toarray() if sp.issparse(v) else v assert np.all(va == m2[k]) assert np.all(va == m3[k]) if sp.issparse(m4[k]): assert np.all(va == m4[k].A) else: assert np.allclose(va, m4[k]) assert np.all(m4[k] == 0.0) if sp.issparse(m5[k]): assert np.all(va == m5[k].A) else: assert np.allclose(va, m5[k]) assert np.all(m5[k] == 0.0) assert sp.issparse(m6[k]) assert np.all(va == m6[k].A) assert sp.issparse(m7[k]) assert np.all(va == m7[k].A) if rd_sparse or (rd_sparse is None and sp.issparse(v)): assert sp.issparse(m8[k]) assert np.all(va == m8[k].A) assert sp.issparse(m9[k]) assert np.all(va == m9[k].A) else: assert np.all(va == m8[k]) assert np.all(va == m9[k])
def test_cglf_moment_signs(): pth = os.path.dirname(inspect.getfile(cb)) pth = os.path.join(pth, "..") pth = os.path.join(pth, "tests") pth = os.path.join(pth, "cla_test_data") se = 101 uset, coords = nastran.bulk2uset(os.path.join(pth, "outboard.asm")) dct = op4.read(os.path.join(pth, "outboard.op4")) maa = dct["mxx"] kaa = dct["kxx"] atm = dct["mug1"] ltm = dct["mef1"] pch = os.path.join(pth, "outboard.pch") atm_labels = [ "Grid {:4d}-{:1d}".format(grid, dof) for grid, dof in nastran.rddtipch(pch) ] ltm_labels = [ "CBAR {:4d}-{:1d}".format(cbar, arg) for cbar, arg in nastran.rddtipch(pch, "tef1") ] nb = uset.shape[0] nq = maa.shape[0] - nb bset = np.arange(nb) qset = np.arange(nq) + nb ref = [600.0, 150.0, 150.0] g = 9806.65 # use addgrid to get coordinate transformations from lv to sc: cid = [1, 0, 0] A = [0, 0, 0] # define sc in terms of lv coords: # (all drawn out by hand) BC = [ [[0, 0, 1.0], [1.0, 0, 0]], # lv x is up [[0, 0, -1.0], [0, 1.0, 0]], # lv y is up [[-1.0, 0, 0.0], [0, 0, 1.0]], # lv z is up [[0, 0, -1.0], [-1.0, 0, 0]], # lv x is down [[0, 0, 1.0], [0, -1.0, 0]], # lv y is down [[0, -1.0, 0], [0, 0, -1.0]], # lv z is down ] Ts = [] nets = [] rb = n2p.rbgeom_uset(uset, ref) rbcglfa = [] for bc in BC: CI = n2p.mkusetcoordinfo([cid, A, *bc], None, {}) T = CI[2:] Ts.append(T) net = cb.mk_net_drms(maa, kaa, bset, uset=uset, ref=ref, g=g, sccoord=T) nets.append(net) rba = net.cglfa[:, :24] @ rb rbcglfa.append(rba) # sc rows: assert np.all(np.sign(rba[1, [1, 5]]) == np.sign(rba[3, [1, 5]])) assert np.all(np.sign(rba[2, [2, 4]]) == np.sign(rba[4, [2, 4]])) # lv rows: assert np.all(np.sign(rba[6, [1, 5]]) == np.sign(rba[8, [1, 5]])) assert np.all(np.sign(rba[7, [2, 4]]) == np.sign(rba[9, [2, 4]])) wh_sc = nets[0].weight_sc * nets[0].height_sc wh_lv = nets[0].weight_lv * nets[0].height_lv n = nets[0].cgatm_sc.shape[1] # x is down: cgdrm = np.vstack( ( # 5 s/c rows nets[0].cgatm_sc[:3], -nets[0].ifltma_sc[5] / wh_sc, nets[0].ifltma_sc[4] / wh_sc, # 5 l/v rows nets[0].cgatm_lv[:3], -nets[0].ifltma_lv[5] / wh_lv, nets[0].ifltma_lv[4] / wh_lv, # 4 RSS rows ... filled in during data recovery np.zeros((4, n)), ) ) assert np.allclose(cgdrm, nets[0].cglfa)
def test_sparse_write(): fnames = [ "tests/nastran_op4_data/cdbin.op4", "tests/nastran_op4_data/rs.op4", "tests/nastran_op4_data/r_c_rc.op4", "tests/nastran_op4_data/double_bigmat_le.op4", "tests/nastran_op4_data/double_nonbigmat_be.op4", "tests/nastran_op4_data/single_dense_be.op4", ] for fname in fnames: for rd_sparse in (True, False, None): m = op4.read(fname, sparse=rd_sparse) m2 = write_read(m, binary=True, sparse="dense") m3 = write_read(m, binary=False, sparse="dense") m4 = write_read(m, binary=False, sparse="nonbigmat") m5 = write_read(m, binary=True, sparse="nonbigmat") m6 = write_read(m, binary=False, sparse="bigmat") m7 = write_read(m, binary=True, sparse="bigmat") m8 = write_read(m, binary=False, sparse="auto") m9 = write_read(m, binary=True, sparse="auto") for k, v in m.items(): if rd_sparse: assert sp.issparse(v) elif rd_sparse is None and "bigmat" in fname: if "nonbigmat" in fname and not sp.issparse(v): # v could be dense if all zeros assert np.all(v == 0.0) else: assert sp.issparse(v) va = v.toarray() if sp.issparse(v) else v assert np.all(va == m2[k]) assert np.all(va == m3[k]) if sp.issparse(m4[k]): assert np.all(va == m4[k].A) else: assert np.allclose(va, m4[k]) assert np.all(m4[k] == 0.0) if sp.issparse(m5[k]): assert np.all(va == m5[k].A) else: assert np.allclose(va, m5[k]) assert np.all(m5[k] == 0.0) assert sp.issparse(m6[k]) assert np.all(va == m6[k].A) assert sp.issparse(m7[k]) assert np.all(va == m7[k].A) if rd_sparse or (rd_sparse is None and sp.issparse(v)): assert sp.issparse(m8[k]) assert np.all(va == m8[k].A) assert sp.issparse(m9[k]) assert np.all(va == m9[k].A) else: assert np.all(va == m8[k]) assert np.all(va == m9[k])