Source code for pyNastran.bdf.cards.test.test_coords

from __future__ import print_function
from numpy import array, allclose, array_equal, cross
import unittest

from pyNastran.bdf.bdf import BDF, BDFCard, CORD1R, CORD1C, CORD1S, CORD2R, CORD2C, CORD2S
from pyNastran.bdf.utils import TransformLoadWRT

bdf = BDF(debug=False)  # don't load this up with stuff
[docs]class TestCoords(unittest.TestCase):
[docs] def test_same(self): grids = [ [1, 0, 0., 0., 1.], [2, 0, 0., 1., 0.], [3, 0, 1., 0., 0.], [4, 0, 1., 1., 1.], [5, 0, 1., 1., 0.], ] grids_expected = grids coords = [] self.getNodes(grids, grids_expected, coords)
[docs] def test_shift(self): grids = [ [1, 1, 0., 0., 1.], [2, 1, 0., 1., 0.], [3, 1, 1., 0., 0.], [4, 1, 1., 1., 1.], [5, 1, 1., 1., 0.], ] grids_expected = [ [1, 1, 1., 1., 2.], [2, 1, 1., 2., 1.], [3, 1, 2., 1., 1.], [4, 1, 2., 2., 2.], [5, 1, 2., 2., 1.], ] coords = [ # cid,rid, origin, zaxis, xaxis [1, 0, [1., 1., 1.], [1., 1., 2.], [2., 1., 1.]], ] self.getNodes(grids, grids_expected, coords)
[docs] def test_rotate(self): grids = [ [1, 1, 0., 0., 1.], [2, 1, 0., 1., 0.], [3, 1, 1., 0., 0.], [4, 1, 1., 1., 1.], [5, 1, 1., 1., 0.], ] grids_expected = [ # y z x [1, 1., 1., 0., 0.], [2, 1., 0., -1., 0.], [3, 1., 0., 0., 1.], [4, 1., 1., -1., 1.], [5, 1., 0., -1., 1.], ] coords = [ # cid, rid, origin, zaxis, xaxis [1, 0, [0., 0., 0.], [1., 0., 0.], [0., 0., 1.]], ] self.getNodes(grids, grids_expected, coords)
[docs] def test_rotate2(self): grids = [ [1, 1, 0., 0., 1.], # nid, cid, x,y,z [2, 1, 0., 1., 0.], [3, 1, 1., 0., 0.], [4, 1, 1., 1., 1.], [5, 1, 1., 1., 0.], ] grids_expected = [ [1, 1, 0., 0., -1.], [2, 1, 0., -1., 0.], [3, 1, 1., 0., 0.], [4, 1, 1., -1., -1.], [5, 1, 1., -1., 0.], ] coords = [ # cid, rid, origin, zaxis xaxis [1, 0, [0., 0., 0.], [0., 0., -1.], [1., 0., 0.]], ] self.getNodes(grids, grids_expected, coords)
[docs] def test_rotate3(self): grids = [ [1, 1, 0., 0., 1.], [2, 1, 0., 1., 0.], [3, 1, 1., 0., 0.], [4, 1, 1., 1., 1.], [5, 1, 1., 1., 0.], ] grids_expected = [ [1, 1, 0., 0., -1.], [2, 1, 0., 1., 0.], [3, 1, -1., 0., 0.], [4, 1, -1., 1., -1.], [5, 1, -1., 1., 0.], ] coords = [ # cid, rid, origin, zaxis xaxis [1, 0, [0., 0., 0.], [0., 0., -1.], [-1., 0., 0.]], ] self.getNodes(grids, grids_expected, coords)
[docs] def test_rid_1(self): grids = [ [1, 2, 10., 5., 3.], # nid, cid, x,y,z [2, 3, 10., 5., 3.], ] grids_expected = [ [1, 1, 11., 6., 4.], [2, 1, 11., 6., 4.], ] coords = [ # cid, rid, origin, zaxis xaxis [1, 0, [0., 0., 0.], [0., 0., 1.], [1., 0., 0.]], # cid=1 [2, 1, [1., 1., 1.], [1., 1., 2.], [2., 1., 1.]], # cid=2 #[2, 1, [0., 0., 0.], [0., 0., 1.], [1., 0., 0.]], # cid=2,equiv [3, 0, [1., 1., 1.], [1., 1., 2.], [2., 1., 1.]], # cid=3 #[3, 0, [0., 0., 0.], [0., 0., 1.], [1., 0., 0.]], # cid=3,equiv ] self.getNodes(grids, grids_expected, coords)
[docs] def test_cord1r_01(self): lines = ['cord1r,2,1,4,3'] card = bdf.process_card(lines) card = BDFCard(card) size = 8 card = CORD1R(card) self.assertEqual(card.Cid(), 2) self.assertEqual(card.Rid(), 0) card.write_card(size, 'dummy') card.raw_fields()
[docs] def test_cord2c_01(self): lines = [ 'CORD2C* 3 0 0. 0.', '* 0. 0. 0. 1.*', '* 1. 0. 1.' ] model = BDF(debug=False) card = model.process_card(lines) card = BDFCard(card) card = CORD2C(card) model.add_coord(card) lines = [ 'CORD2R 4 3 10. 0. 5. 10. 90. 5.', ' 10. 0. 6.' ] card = model.process_card(lines) card = BDFCard(card) card = CORD2R(card) model.add_coord(card) model.cross_reference() cord2r = model.Coord(3) self.assertEqual(cord2r.Cid(), 3) self.assertEqual(cord2r.Rid(), 0) cord2r = model.Coord(4) self.assertEqual(cord2r.Cid(), 4) self.assertEqual(cord2r.Rid(), 3) self.assertTrue(allclose(cord2r.i, array([0., 0., 1.]))) delta = cord2r.j - array([1., 1., 0.]) / 2**0.5 self.assertTrue(allclose(cord2r.j, array([1., 1., 0.]) / 2**0.5), str(delta)) delta = cord2r.k - array([-1., 1., 0.]) / 2**0.5 self.assertTrue(allclose(cord2r.k, array([-1., 1., 0.]) / 2**0.5), str(delta))
[docs] def test_grid_01(self): model = BDF(debug=False) cards = [ #['CORD1R', 1, 1, 2, 3], # fails on self.k ['GRID', 1, 0, 0., 0., 0.], ['GRID', 2, 0, 1., 0., 0.], ['GRID', 4, 0, 1., 2., 3.], ] for card in cards: model.add_card(card, card[0], comment='comment', is_list=True) #+------+-----+----+----+----+----+----+----+------+ #| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #+======+=====+====+====+====+====+====+====+======+ #| GRID | NID | CP | X1 | X2 | X3 | CD | PS | SEID | #+------+-----+----+----+----+----+----+----+------+ node = model.Node(4) self.assertEqual(node.get_field(1), 4) self.assertEqual(node.get_field(2), 0) self.assertEqual(node.get_field(3), 1.) self.assertEqual(node.get_field(4), 2.) self.assertEqual(node.get_field(5), 3.) node.update_field(1, 5) node.update_field(2, 6) node.update_field(3, 7.) node.update_field(4, 8.) node.update_field(5, 9.) with self.assertRaises(KeyError): node.update_field(9, 'dummy') self.assertEqual(node.get_field(1), 5) self.assertEqual(node.get_field(2), 6) self.assertEqual(node.get_field(3), 7.) self.assertEqual(node.get_field(4), 8.) self.assertEqual(node.get_field(5), 9.) with self.assertRaises(KeyError): node.get_field(9)
[docs] def test_cord1_01(self): model = BDF(debug=False) cards = [ ['CORD1R', 1, 1, 2, 3], # fails on self.k ['GRID', 1, 0, 0., 0., 0.], ['GRID', 2, 0, 1., 0., 0.], ['GRID', 3, 0, 1., 1., 0.], ] for card in cards: model.add_card(card, card[0], comment='comment', is_list=True) c1 = model.Coord(1) self.assertEqual(c1.G1(), 1) self.assertEqual(c1.G2(), 2) self.assertEqual(c1.G3(), 3) model.cross_reference() self.assertEqual(c1.G1(), 1) self.assertEqual(c1.G2(), 2) self.assertEqual(c1.G3(), 3) self.assertEqual(c1.node_ids, [1, 2, 3])
[docs] def test_cord2_bad_01(self): model = BDF(debug=False) cards = [ ['CORD2R', 1, 0, 0., 0., 0., 0., 0., 0., 0., 0., 0.], # fails on self.k ['CORD2R', 2, 0, 0., 0., 0., 1., 0., 0., 0., 0., 0.], # fails on normalize self.j ['CORD2R', 3, 0, 0., 0., 0., 1., 0., 0., 1., 1., 0.], # passes ['CORD2R', 4, 0, 0., 1., 0., 1., 0., 0., 1., 1., 0.], # passes ['CORD2R', 5, 4, 0., 1., 0., 1., 0., 0., 1., 1., 0.], # passes ] for card in cards: cid = card[1] if cid in [1, 2]: with self.assertRaises(RuntimeError): model.add_card(card, card[0], is_list=True) else: model.add_card(card, card[0], is_list=True) # this runs because it's got rid=0 cord4 = model.Coord(4) cord4.transform_node_to_global([0., 0., 0.]) # this doesn't run because rid != 0 cord5 = model.Coord(5) with self.assertRaises(RuntimeError): cord5.transform_node_to_global([0., 0., 0.]) model.cross_reference()
[docs] def test_cord2_rcs_01(self): """ all points are located at <30,40,50> """ model = BDF(debug=False) cards = [ [ #'$ Femap with NX Nastran Coordinate System 10 : rectangular defined in a rectangular', 'CORD2R* 10 0 10. 5.', '* 3. 10.3420201433 4.53015368961 3.81379768136* ', '* 10.7198463104 5.68767171433 3.09449287122',], [ #'$ Femap with NX Nastran Coordinate System 11 : cylindrical defined in rectangular', 'CORD2C* 11 0 7. 3.', '* 9. 7.64278760969 2.73799736977 9.71984631039* ', '* 7.75440650673 3.37968226211 8.46454486422',], [ #'$ Femap with NX Nastran Coordinate System 12 : spherical defined in rectangular', 'CORD2S* 12 0 12. 8.', '* 5. 12.6427876097 7.86697777844 5.75440650673* ', '* 12.6634139482 8.58906867688 4.53861076379',], [ 'GRID* 10 10 42.9066011565 34.2422137135', '* 28.6442730262 0',], [ 'GRID* 11 11 48.8014631871 78.8394787869', '* 34.6037164304 0',], [ 'GRID* 12 12 58.0775343829 44.7276544324', '* 75.7955331161 0',], ] for lines in cards: card = model.process_card(lines) model.add_card(card, card[0]) model.cross_reference() for nid in model.nodes: a = array([30., 40., 50.]) b = model.Node(nid).Position() self.assertTrue(allclose(array([30.,40.,50.]), model.Node(nid).Position()), str(a - b))
[docs] def test_cord2_rcs_02(self): """ all points are located at <30,40,50> """ model = BDF(debug=False) cards = [ [ 'CORD2C* 1 0 0. 0.', '* 0. 0. 0. 1.* ', '* 1. 0. 1.',], [ #'$ Femap with NX Nastran Coordinate System 20 : rectangular defined in cylindrical', 'CORD2R* 20 1 7. 20.', '* -6. 7.07106781187 28.1301023542 -6.* ', '* 7.70710678119 20. -5.29289321881',], [ #'$ Femap with NX Nastran Coordinate System 21 : cylindrical defined in cylindrical', 'CORD2C* 21 1 15. -30.', '* 12. 14.6565766735 -30.3177805524 12.9355733712* ', '* 14.6234241583 -26.4257323272 11.9304419665',], [ #'$ Femap with NX Nastran Coordinate System 22 : spherical defined in cylindrical', 'CORD2S* 22 1 5. -75.', '* 20. 5.66032384035 -82.9319986389 19.8502545865* ', '* 4.88876051026 -73.8006653677 19.0116094889',], [ 'GRID* 20 20 64.2559135157 -14.9400459772', '* 27.3271005317 0',], [ 'GRID* 21 21 52.8328862418 -28.8729017195', '* 34.615939507 0',], [ 'GRID* 22 22 61.1042111232 158.773483595', '* -167.4951724 0',], ] for lines in cards: card = model.process_card(lines) model.add_card(card, card[0]) model.cross_reference() for nid in model.nodes: a = array([30., 40., 50.]) b = model.Node(nid).Position() self.assertTrue(allclose(array([30., 40., 50.]), model.Node(nid).Position()), str(a - b))
[docs] def test_cord2_rcs_03(self): """ all points are located at <30,40,50> """ model = BDF(debug=False) cards = [ [ 'CORD2S* 2 0 0. 0.', '* 0. 0. 0. 1.* ', '* 1. 0. 1.',], [ #'$ Femap with NX Nastran Coordinate System 30 : rectangular in spherical', 'CORD2R* 30 2 14. 30.', '* 70. 13.431863852 32.1458443949 75.2107442927* ', '* 14.4583462334 33.4569982885 68.2297989286',], [ #'$ Femap with NX Nastran Coordinate System 31 : cylindrical in spherical', 'CORD2C* 31 2 3. 42.', '* -173. 2.86526881213 45.5425615252 159.180363517* ', '* 3.65222385965 29.2536614627 -178.631312271',], [ #'$ Femap with NX Nastran Coordinate System 32 : spherical in spherical', 'CORD2S* 32 2 22. 14.', '* 85. 22.1243073983 11.9537753718 77.9978191005* ', '* 21.0997242967 13.1806120497 88.4824763008',], [ 'GRID* 30 30 40.7437952957 -23.6254877994', '* -33.09784854 0',], [ 'GRID* 31 31 62.9378078196 15.9774797923', '* 31.0484428362 0',], [ 'GRID* 32 32 53.8270847449 95.8215692632', '* 159.097767463 0',], ] for lines in cards: card = model.process_card(lines) model.add_card(card, card[0]) model.cross_reference() for nid in model.nodes: a = array([30.,40.,50.]) b = model.Node(nid).Position() self.assertTrue(allclose(array([30., 40., 50.]), model.Node(nid).Position()), str(a - b))
[docs] def test_cord1c_01(self): lines = ['cord1c,2,1,4,3'] card = bdf.process_card(lines) card = BDFCard(card) size = 8 card = CORD1C(card) self.assertEqual(card.Cid(), 2) self.assertEqual(card.Rid(), 0) card.write_card(size, 'dummy') card.raw_fields()
[docs] def test_cord1s_01(self): lines = ['cord1s,2,1,4,3'] card = bdf.process_card(lines) card = BDFCard(card) size = 8 card = CORD1S(card) self.assertEqual(card.Cid(), 2) self.assertEqual(card.Rid(), 0) card.write_card(size, 'dummy') card.raw_fields()
[docs] def test_cord2r_02(self): grid = ['GRID 20143 7 -9.31-4 .11841 .028296'] coord = [ 'CORD2R 7 1.135 .089237 -.0676 .135 .089237 -.0676', ' 1.135 .089237 .9324' ] model = BDF(debug=False) card = model.process_card(grid) model.add_card(card, card[0]) card = model.process_card(coord) model.add_card(card, card[0]) model.cross_reference() coord = model.Coord(7) #print(coord.origin) #print(coord.i, coord.j, coord.k) g = model.Node(20143) #print(g.Position(debug=False)) xyz = g.Position() # by running it through Patran... #GRID 20143 1.1067 .207647 -.068531 expected = array([1.106704, .207647, -0.068531]) diff = xyz - expected msg = '\nexpected=%s \nactual =%s \ndiff =%s' % (expected, xyz, diff) assert allclose(diff, 0.), msg coord = model.Coord(7) coord.beta_n(1) coord.beta_n(2) coord.beta_n(3) coord.beta_n(6) self.assertTrue(array_equal(coord.T(), coord.beta_n(2)))
[docs] def getNodes(self, grids, grids_expected, coords): model = BDF(debug=False) for grid in grids: (nid, cid, x, y, z) = grid model.add_card(['GRID', nid, cid, x, y, z], 'GRID') for coord in coords: (cid, rid, x, y, z) = coord model.add_card(['CORD2R', cid, rid] + x + y + z, 'CORD2R') coordObj = model.Coord(cid) model.cross_reference() for (i, grid) in enumerate(grids_expected): (nid, cid, x, y, z) = grid node = model.Node(nid) pos = node.Position() n = array([x, y, z]) msg = 'i=%s expected=%s actual=%s\n' % (i, n, pos) msg += 'n=%s grid=\n%s' % (nid, node) coord = node.cp msg += 'n=%s coord=\n%s' % (node.nid, coord) while coord.rid: msg += 'n=%s rcoord=\n%s' % (node.nid, coord.rid) coord = coord.rid assert allclose(n, pos), msg
[docs] def test_A(self): cid0 = CORD2R() Lx = 2. Ly = 0. Lz = 3. Fy = 1. origin = array([-Lx, 0., -Lz]) z_axis = origin + array([0., 0., 1.]) xz_plane = origin + array([1., 0., 1.]) rid = 0 data = [1, rid] + list(origin) + list(z_axis) + list(xz_plane) Fxyz = [0., -Fy, 0.] Mxyz = [0., 0., 0.] cid_new = CORD2R(data=data) model = None Fxyz_local, Mxyz_local = TransformLoadWRT(Fxyz, Mxyz, cid0, cid_new, model, is_cid_int=False) r = array([Lx, Ly, Lz]) F = array([0., -Fy, 0.]) M = cross(r, F) self.assertTrue(array_equal(Fxyz_local, F)), "expected=%s actual=%s" % (F, Fxyz_local) self.assertTrue(array_equal(Mxyz_local, cross(r, F))), "expected=%s actual=%s" % (M, Mxyz_local)
[docs] def test_B(self): cid0 = CORD2R() Lx = 2. Ly = 3. Lz = 5. Fy = 1.5 origin = array([-Lx, -Ly, -Lz]) z_axis = origin + array([0., 0., 1.]) xz_plane = origin + array([1., 0., 1.]) rid = 0 data = [1, rid] + list(origin) + list(z_axis) + list(xz_plane) Fxyz = [0., -Fy, 0.] Mxyz = [0., 0., 0.] cid_new = CORD2R(data=data) model = None Fxyz_local, Mxyz_local = TransformLoadWRT(Fxyz, Mxyz, cid0, cid_new, model, is_cid_int=False) r = array([Lx, Ly, Lz]) F = array([0., -Fy, 0.]) M = cross(r, F) self.assertTrue(array_equal(Fxyz_local, F)), "expected=%s actual=%s" % (F, Fxyz_local) self.assertTrue(array_equal(Mxyz_local, cross(r, F))), "expected=%s actual=%s" % (M, Mxyz_local)
if __name__ == '__main__': # pragma: no cover unittest.main()