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

from __future__ import (nested_scopes, generators, division, absolute_import,
                        print_function, unicode_literals)
from six.moves import range
import unittest
from numpy import array

from pyNastran.bdf.bdf import PCOMP, MAT1, BDF

[docs]class TestShells(unittest.TestCase):
[docs] def _make_cquad4(self, model, rho, nu, G, E, t, nsm): eid = 10 pid = 20 mid = 30 n1 = 1 n2 = 2 n3 = 3 n4 = 4 A = 2. mid2 = mid3 = mid4 = twelveIt3 = tst = z1 = z2 = None mass = A * (t * rho + nsm) cards = [ ['grid', n1, 0, 0., 0., 0.], ['grid', n2, 0, 2., 0., 0.], ['grid', n3, 0, 2., 1., 0.], ['grid', n4, 0, 0., 1., 0.], ['cquad4', eid, pid, n1, n2, n3, n4], ['pshell', pid, mid, t, mid2, twelveIt3, mid3, tst, nsm, z1, z2], ['mat1', mid, E, G, nu, rho], ] for fields in cards: model.add_card(fields, fields[0], is_list=True) model.cross_reference() cquad4 = model.Element(eid) node_ids = cquad4.node_ids assert node_ids == [n1, n2, n3, n4], node_ids # cquad4 / pshell self.assertEqual(cquad4.Eid(), eid) self.assertEqual(cquad4.Pid(), pid) self.assertEqual(cquad4.Mid(), mid) self.assertEqual(cquad4.Nsm(), nsm) self.assertEqual(cquad4.Mass(), mass) self.assertAlmostEqual(cquad4.MassPerArea(), mass / A) self.assertEqual(cquad4.Area(), A) self.assertEqual(cquad4.Thickness(), t)
#self.assertEqual(cquad4.Rho(), rho) # removed because of PCOMP
[docs] def _make_ctria3(self, model, rho, nu, G, E, t, nsm): eid = 10 pid = 20 mid = 30 n1 = 1 n2 = 2 n3 = 3 mid2 = mid3 = mid4 = twelveIt3 = tst = z1 = z2 = None z0 = sb = ft = Tref = ge = lam = None sout = None theta0 = 0. theta1 = 30. theta2 = 60. theta3 = 90. A = 2. cards = [ ['grid', n1, 0, 0., 0., 0.], ['grid', n2, 0, 4., 0., 0.], ['grid', n3, 0, 4., 1., 0.], ['ctria3', eid, pid, n1, n2, n3], # A = 1/2 * 4 * 1 = 2. ['pshell', pid, mid, t, mid2, twelveIt3, mid3, tst, nsm, z1, z2, mid4], ['ctria3', eid + 1, pid + 1, n1, n2, n3], # A = 1/2 * 4 * 1 = 2. [ 'pcomp', pid + 1, z0, nsm, sb, ft, Tref, ge, lam, mid, t, theta0, sout, mid, 2 * t, theta1, sout, mid, 3 * t, theta2, sout, mid, 4 * t, theta3, sout, ], ['mat1', mid, E, G, nu, rho], ] for fields in cards: model.add_card(fields, fields[0], is_list=True) model.cross_reference() # ctria3 / pshell ctria3 = model.Element(eid) node_ids = ctria3.node_ids assert node_ids == [n1, n2, n3], node_ids mass = A * (t * rho + nsm) self.assertEqual(ctria3.Eid(), eid) self.assertEqual(ctria3.Pid(), pid) self.assertEqual(ctria3.Mid(), mid) self.assertEqual(ctria3.Nsm(), nsm) self.assertEqual(ctria3.Mass(), mass) self.assertAlmostEqual(ctria3.MassPerArea(), mass / A) self.assertEqual(ctria3.Area(), A) self.assertEqual(ctria3.Thickness(), t) self.assertEqual(ctria3.MassPerArea(), mass / A) # removed because of PCOMP # also no E, G, J, Nu, for the same reason # what about Mid #self.assertEqual(ctria3.Rho(), rho) # pshell pshell = model.Property(pid) self.assertEqual(pshell.Pid(), pid) self.assertEqual(pshell.Mid(), mid) self.assertEqual(pshell.Nsm(), nsm) self.assertEqual(pshell.Thickness(), t) self.assertEqual(pshell.Rho(), rho) self.assertEqual(pshell.z1, -t / 2.) self.assertEqual(pshell.z2, t / 2.) # ctria3 / pcomp ctria3 = model.Element(eid + 1) mass = A * (10 * t * rho + nsm) self.assertEqual(ctria3.Eid(), eid + 1) self.assertEqual(ctria3.Pid(), pid + 1) #self.assertEqual(ctria3.Mid(), mid) self.assertEqual(ctria3.Nsm(), nsm) self.assertAlmostEqual(ctria3.Mass(), mass) self.assertAlmostEqual(ctria3.MassPerArea(), mass / A) self.assertEqual(ctria3.Area(), A) self.assertEqual(ctria3.Thickness(), 10 * t) #self.assertEqual(ctria3.Rho(), rho) # pcomp pcomp = model.Property(pid + 1) self.assertEqual(pcomp.Pid(), pid + 1) self.assertEqual(pcomp.nPlies(), 4) self.assertEqual(pcomp.Mid(0), mid) self.assertEqual(pcomp.Nsm(), nsm) with self.assertRaises(IndexError): self.assertEqual(pcomp.Mid(-1), mid) self.assertEqual(pcomp.Mids(), [mid] * 4) self.assertEqual(pcomp.Mid(0), mid) self.assertEqual(pcomp.Mid(1), mid) self.assertEqual(pcomp.Mid(2), mid) self.assertEqual(pcomp.Mid(3), mid) with self.assertRaises(IndexError): self.assertEqual(pcomp.Mid(4), mid) with self.assertRaises(IndexError): self.assertEqual(pcomp.Thickness(-1), t) self.assertEqual(pcomp.Thickness(), 10 * t) self.assertEqual(pcomp.Thickness(0), t) self.assertEqual(pcomp.Thickness(1), 2 * t) self.assertEqual(pcomp.Thickness(2), 3 * t) self.assertEqual(pcomp.Thickness(3), 4 * t) with self.assertRaises(IndexError): self.assertEqual(pcomp.Thickness(4), 5*t) with self.assertRaises(IndexError): self.assertEqual(pcomp.Rho(-1), rho) self.assertEqual(pcomp.Rho(0), rho) self.assertEqual(pcomp.Rho(1), rho) self.assertEqual(pcomp.Rho(2), rho) self.assertEqual(pcomp.Rho(3), rho) with self.assertRaises(IndexError): self.assertEqual(pcomp.Rho(4), rho) with self.assertRaises(IndexError): self.assertEqual(pcomp.Theta(-1), 0.) self.assertEqual(pcomp.Theta(0), 0.) self.assertEqual(pcomp.Theta(1), 30.) self.assertEqual(pcomp.Theta(2), 60.) self.assertEqual(pcomp.Theta(3), 90.) with self.assertRaises(IndexError): self.assertEqual(pcomp.Theta(4), rho) self.assertEqual(pcomp.z0, -10*t/2.)
[docs] def test_PSHELL_01(self): """tests a CQUAD4 and a PSHELL""" rho = 0.1 nu = 0.3 G = None E = 1e7 t = 0.3 nsm = 0.0 model = BDF(debug=False) self._make_cquad4(model, rho, nu, G, E, t, nsm) model = BDF(debug=False) self._make_ctria3(model, rho, nu, G, E, t, nsm) nsm = 1.0 model = BDF(debug=False) self._make_cquad4(model, rho, nu, G, E, t, nsm) model = BDF(debug=False) self._make_ctria3(model, rho, nu, G, E, t, nsm)
[docs] def test_CQUAD4_01(self): model = BDF(debug=False) eid = 10 pid = 20 mid = 30 n1 = 1 n2 = 2 n3 = 3 n4 = 4 n5 = 5 n6 = 6 A = 2. t = rho = nsm = E = G = nu = 0.1 mid2 = mid3 = mid4 = twelveIt3 = tst = z1 = z2 = None mass = A * (t * rho + nsm) cards = [ ['grid', n1, 0, 0., 0., 0.], ['grid', n2, 0, 2., 0., 0.], ['grid', n3, 0, 2., 1., 0.], ['grid', n4, 0, 0., 1., 0.], ['grid', n5, 0, 0., 0., 0.], ['grid', n6, 0, 2., 0., 0.], ['cquad4', eid, pid, n1, n2, n3, n4], ['cquad4', eid+1, pid, n5, n6, n3, n4], ['pshell', pid, mid, t, mid2, twelveIt3, mid3, tst, nsm, z1, z2], ['mat1', mid, E, G, nu, rho], ] for fields in cards: model.add_card(fields, fields[0], is_list=True) # get node IDs without cross referencing eids = [10] nids = model.get_node_ids_with_elements(eids) assert nids == set([1, 2, 3, 4]), nids eids = [11] nids = model.get_node_ids_with_elements(eids) assert nids == set([3, 4, 5, 6]), nids eids = [10, 11] nids = model.get_node_ids_with_elements(eids) assert nids == set([1, 2, 3, 4, 5, 6]), nids # get node IDs with cross referencing model.cross_reference() eids = [10] nids = model.get_node_ids_with_elements(eids) assert nids == set([1, 2, 3, 4]), nids eids = [11] nids = model.get_node_ids_with_elements(eids) assert nids == set([3, 4, 5, 6]), nids eids = [10, 11] nids = model.get_node_ids_with_elements(eids) assert nids == set([1, 2, 3, 4, 5, 6]), nids
[docs] def test_PCOMP_01(self): """ asymmetrical, nsm=0.0 and nsm=1.0 """ #self.pid = data[0] #self.z0 = data[1] #self.nsm = data[2] #self.sb = data[3] #self.ft = data[4] #self.TRef = data[5] #self.ge = data[6] #self.lam = data[7] #Mid = data[8] #T = data[9] #Theta = data[10] #Sout = data[11] pid = 1 z0 = 0. nsm = 0. sb = 0. ft = 0. TRef = 0. ge = 0. lam = 'NO' # isSymmetrical YES/NO Mid = [1, 2, 3] Theta = [0., 10., 20.] T = [.1, .2, .3] Sout = [1, 1, 0] # 0-NO, 1-YES data = [pid, z0, nsm, sb, ft, TRef, ge, lam, Mid, T, Theta, Sout] p = PCOMP(data=data) self.assertFalse(p.isSymmetrical()) self.assertEqual(p.nPlies(), 3) self.assertAlmostEqual(p.Thickness(), 0.6) self.assertAlmostEqual(p.Thickness(0), 0.1) self.assertAlmostEqual(p.Thickness(1), 0.2) self.assertAlmostEqual(p.Thickness(2), 0.3) with self.assertRaises(IndexError): p.Thickness(3) self.assertAlmostEqual(p.Theta(0), 0.) self.assertAlmostEqual(p.Theta(1), 10.) self.assertAlmostEqual(p.Theta(2), 20.) with self.assertRaises(IndexError): p.Theta(3) self.assertEqual(p.Mid(0), 1) self.assertEqual(p.Mid(1), 2) self.assertEqual(p.Mid(2), 3) with self.assertRaises(IndexError): p.Mid(3) self.assertEqual(p.Mids(), [1, 2, 3]) self.assertEqual(p.sout(0), 'YES') self.assertEqual(p.sout(1), 'YES') self.assertEqual(p.sout(2), 'NO') with self.assertRaises(IndexError): p.sout(3) # material... #self.mid = data[0] #self.e = data[1] #self.g = data[2] #self.nu = data[3] #self.rho = data[4] #self.a = data[5] #self.TRef = data[6] #self.ge = data[7] #self.St = data[8] #self.Sc = data[9] #self.Ss = data[10] #self.Mcsid = data[11] mid = 1 E = None G = None nu = None rho = 1.0 a = None St = None Sc = None Ss = None Mcsid = None mat1 = [mid, E, G, nu, rho, a, TRef, ge, St, Sc, Ss, Mcsid] m = MAT1(data=mat1) for iply in range(len(p.plies)): mid = p.plies[iply][0] p.plies[iply][0] = m # MAT1 #p.mids = [m, m, m] #Rho self.assertAlmostEqual(p.Rho(0), 1.0) self.assertAlmostEqual(p.Rho(1), 1.0) self.assertAlmostEqual(p.Rho(2), 1.0) with self.assertRaises(IndexError): p.Rho(3) # MassPerArea self.assertAlmostEqual(p.MassPerArea(), 0.6) self.assertAlmostEqual(p.MassPerArea(0), 0.1) self.assertAlmostEqual(p.MassPerArea(1), 0.2) self.assertAlmostEqual(p.MassPerArea(2), 0.3) with self.assertRaises(IndexError): p.MassPerArea(3) #---------------------- # change the nsm to 1.0 p.nsm = 1.0 self.assertEqual(p.Nsm(), 1.0) # MassPerArea self.assertAlmostEqual(p.MassPerArea(), 1.6) self.assertAlmostEqual(p.MassPerArea(0, method='nplies'), 0.1+1/3.) self.assertAlmostEqual(p.MassPerArea(1, method='nplies'), 0.2+1/3.) self.assertAlmostEqual(p.MassPerArea(2, method='nplies'), 0.3+1/3.) self.assertAlmostEqual(p.MassPerArea(0, method='rho*t'), 0.1+1/6.) self.assertAlmostEqual(p.MassPerArea(1, method='rho*t'), 0.2+2/6.) self.assertAlmostEqual(p.MassPerArea(2, method='rho*t'), 0.3+3/6.) self.assertAlmostEqual(p.MassPerArea(0, method='t'), 0.1+1/6.) self.assertAlmostEqual(p.MassPerArea(1, method='t'), 0.2+2/6.) self.assertAlmostEqual(p.MassPerArea(2, method='t'), 0.3+3/6.) with self.assertRaises(IndexError): p.MassPerArea(3, method='nplies') z = p.get_z_locations() z_expected = array([0., T[0], T[0]+T[1], T[0]+T[1]+T[2]]) for za, ze in zip(z, z_expected): self.assertAlmostEqual(za, ze) #z0 = p.z0 = 1.0 z_expected = 1.0 + z_expected z = p.get_z_locations() for za, ze in zip(z, z_expected): self.assertAlmostEqual(za, ze)
[docs] def test_PCOMP_02(self): """ symmetrical, nsm=0.0 and nsm=1.0 """ pid = 1 z0 = 0. nsm = 0. sb = 0. ft = 0. TRef = 0. ge = 0. lam = 'SYM' # isSymmetrical SYM Mid = [1, 2, 3] Theta = [0., 10., 20.] T = [.1, .2, .3] Sout = [1, 1, 0] # 0-NO, 1-YES data = [pid, z0, nsm, sb, ft, TRef, ge, lam, Mid, T, Theta, Sout] p = PCOMP(data=data) self.assertTrue(p.isSymmetrical()) self.assertEqual(p.nPlies(), 6) self.assertAlmostEqual(p.Thickness(), 1.2) self.assertAlmostEqual(p.Thickness(0), 0.1) self.assertAlmostEqual(p.Thickness(1), 0.2) self.assertAlmostEqual(p.Thickness(2), 0.3) self.assertAlmostEqual(p.Thickness(3), 0.1) self.assertAlmostEqual(p.Thickness(4), 0.2) self.assertAlmostEqual(p.Thickness(5), 0.3) with self.assertRaises(IndexError): p.Thickness(6) self.assertAlmostEqual(p.Theta(0), 0.) self.assertAlmostEqual(p.Theta(1), 10.) self.assertAlmostEqual(p.Theta(2), 20.) self.assertAlmostEqual(p.Theta(3), 0.) self.assertAlmostEqual(p.Theta(4), 10.) self.assertAlmostEqual(p.Theta(5), 20.) with self.assertRaises(IndexError): p.Theta(6) self.assertEqual(p.Mid(0), 1) self.assertEqual(p.Mid(1), 2) self.assertEqual(p.Mid(2), 3) self.assertEqual(p.Mid(3), 1) self.assertEqual(p.Mid(4), 2) self.assertEqual(p.Mid(5), 3) with self.assertRaises(IndexError): p.Mid(6) self.assertEqual(p.Mids(), [1, 2, 3, 1, 2, 3]) self.assertEqual(p.sout(0), 'YES') self.assertEqual(p.sout(1), 'YES') self.assertEqual(p.sout(2), 'NO') self.assertEqual(p.sout(3), 'YES') self.assertEqual(p.sout(4), 'YES') self.assertEqual(p.sout(5), 'NO') with self.assertRaises(IndexError): p.sout(6) mid = 1 E = None G = None nu = None rho = 1.0 a = None St = None Sc = None Ss = None Mcsid = None mat1 = [mid, E, G, nu, rho, a, TRef, ge, St, Sc, Ss, Mcsid] m = MAT1(data=mat1) for iply in range(len(p.plies)): mid = p.plies[iply][0] p.plies[iply][0] = m # MAT1 #Rho self.assertAlmostEqual(p.Rho(0), 1.0) self.assertAlmostEqual(p.Rho(1), 1.0) self.assertAlmostEqual(p.Rho(2), 1.0) self.assertAlmostEqual(p.Rho(3), 1.0) self.assertAlmostEqual(p.Rho(4), 1.0) self.assertAlmostEqual(p.Rho(5), 1.0) with self.assertRaises(IndexError): p.Rho(6) # MassPerArea self.assertAlmostEqual(p.MassPerArea(), 1.2) self.assertAlmostEqual(p.MassPerArea(0), 0.1) self.assertAlmostEqual(p.MassPerArea(1), 0.2) self.assertAlmostEqual(p.MassPerArea(2), 0.3) self.assertAlmostEqual(p.MassPerArea(3), 0.1) self.assertAlmostEqual(p.MassPerArea(4), 0.2) self.assertAlmostEqual(p.MassPerArea(5), 0.3) with self.assertRaises(IndexError): p.MassPerArea(6) self.assertEqual(p.Nsm(), 0.0) #---------------------- # change the nsm to 1.0 p.nsm = 1.0 self.assertEqual(p.Nsm(), 1.0) # MassPerArea self.assertAlmostEqual(p.MassPerArea(), 2.2) self.assertAlmostEqual(p.MassPerArea(0, method='nplies'), 0.1+1/6.) self.assertAlmostEqual(p.MassPerArea(1, method='nplies'), 0.2+1/6.) self.assertAlmostEqual(p.MassPerArea(2, method='nplies'), 0.3+1/6.) self.assertAlmostEqual(p.MassPerArea(3, method='nplies'), 0.1+1/6.) self.assertAlmostEqual(p.MassPerArea(4, method='nplies'), 0.2+1/6.) self.assertAlmostEqual(p.MassPerArea(5, method='nplies'), 0.3+1/6.) with self.assertRaises(IndexError): p.MassPerArea(6)
if __name__ == '__main__': # pragma: no cover unittest.main()