import unittest
import os
from numpy import array
import pyNastran
from pyNastran.bdf.bdf import BDF
from pyNastran.utils import object_methods
rootpath = pyNastran.__path__[0]
testpath = os.path.join(rootpath, 'bdf', 'test', 'unit')
[docs]class TestMass(unittest.TestCase):
[docs] def verify_pcomp_element(self, element, mass, area, centroid, normal):
#print(object_methods(element, 'all'))
self.assertAlmostEqual(element.Mass(), mass, msg='mass=%s expected=%s' % (element.Mass(), mass))
self.assertAlmostEqual(element.Area(), area, msg='area=%s expected=%s' % (element.Area(), area))
self.assertTrue(all(element.Centroid() == centroid), msg='centroid=%s expected=%s' % (element.Centroid(), centroid))
self.assertTrue(all(element.Normal() == normal), msg='normal=%s expected=%s' % (element.Normal(), normal))
with self.assertRaises(AttributeError):
element.Volume()
with self.assertRaises(AttributeError):
element.Length()
[docs] def verify_pshell_element(self, element, mass, area, centroid, normal, nsm):
#print(object_methods(element, 'all'))
self.assertAlmostEqual(element.Mass(), mass, msg='mass=%s expected=%s' % (element.Mass(), mass))
self.assertAlmostEqual(element.Area(), area, msg='area=%s expected=%s' % (element.Area(), area))
self.assertAlmostEqual(element.Nsm(), nsm, msg='nsm=%s expected=%s' % (element.Nsm(), nsm))
self.assertTrue(all(element.Centroid() == centroid), msg='centroid=%s expected=%s' % (element.Centroid(), centroid))
self.assertTrue(all(element.Normal() == normal), msg='normal=%s expected=%s' % (element.Normal(), normal))
with self.assertRaises(AttributeError):
element.Volume()
with self.assertRaises(AttributeError):
element.Length()
[docs] def verify_psolid_element(self, element, mass, volume, centroid, rho, E=None, G=None, nu=None):
#print(object_methods(element, 'all'))
self.assertAlmostEqual(element.Volume(), volume, msg='volume=%s expected=%s' % (element.Volume(), volume))
self.assertTrue(all(element.Centroid() == centroid), msg='centroid=%s expected=%s' % (element.Centroid(), centroid))
if rho:
self.assertAlmostEqual(element.Rho(), rho, msg='rho=%s expected=%s' % (element.Rho(), rho))
self.assertAlmostEqual(element.pid.Rho(), rho, msg='rho=%s expected=%s' % (element.pid.Rho(), rho))
self.assertEqual(element.pid.mid.type, 'MAT1', msg='mass=%s expected=%s' % (element.pid.mid.type, 'MAT1'))
self.assertAlmostEqual(element.pid.mid.Rho(), rho, msg='rho=%s expected=%s' % (element.pid.mid.Rho(), rho))
self.assertAlmostEqual(element.Mass(), mass, msg='mass=%s expected=%s' % (element.Mass(), mass))
if E:
self.assertAlmostEqual(element.E(), E, msg='E=%s expected=%s' % (element.E(), E))
self.assertAlmostEqual(element.pid.E(), E, msg='E=%s expected=%s' % (element.pid.E(), E))
self.assertAlmostEqual(element.pid.mid.E(), E, msg='E=%s expected=%s' % (element.pid.mid.E(), E))
if G:
self.assertAlmostEqual(element.G(), G, msg='G=%s expected=%s' % (element.G(), G))
self.assertAlmostEqual(element.pid.G(), G, msg='G=%s expected=%s' % (element.pid.G(), G))
self.assertAlmostEqual(element.pid.mid.G(), G, msg='G=%s expected=%s' % (element.pid.mid.G(), G))
if nu:
self.assertAlmostEqual(element.Nu(), nu, msg='nu=%s expected=%s' % (element.Nu(), nu))
self.assertAlmostEqual(element.pid.Nu(), nu, msg='nu=%s expected=%s' % (element.pid.Nu(), nu))
self.assertAlmostEqual(element.pid.mid.Nu(), nu, msg='nu=%s expected=%s' % (element.pid.mid.Nu(), nu))
with self.assertRaises(AttributeError):
element.Area()
with self.assertRaises(AttributeError):
element.Length()
[docs] def test_mass_shell_1(self): # passes
model = BDF(debug=False, log=None)
bdfname = os.path.join(testpath, 'test_mass.dat')
model.read_bdf(bdfname, include_dir=None, xref=True)
# quad - pcomp
quad = model.elements[1]
mass = 0.12
area = 1.0
centroid = array([.5, .5, 0.])
normal = array([.0, .0, 1.])
self.verify_pcomp_element(quad, mass, area, centroid, normal)
# quad - pshell, nsm=0
quad = model.elements[3]
mass = 0.0125
nsm = 0.
self.verify_pshell_element(quad, mass, area, centroid, normal, nsm)
# quad - pshell, nsm=1
quad = model.elements[5]
mass = 1.0125 # mass w/o nsm + 1.0 b/c area=1
nsm = 1.
self.verify_pshell_element(quad, mass, area, centroid, normal, nsm)
# tri - pcomp
tri = model.elements[2]
mass = 0.06
area = 0.5
centroid = array([2/3., 1/3., 0.])
normal = array([.0, .0, 1.])
self.verify_pcomp_element(tri, mass, area, centroid, normal)
# tri - pshell, nsm=0
tri = model.elements[4]
mass = 0.00625
nsm = 0.
self.verify_pshell_element(tri, mass, area, centroid, normal, nsm)
# tri - pshell, nsm=1
tri = model.elements[6]
mass = 0.50625 # mass w/o nsm + 0.5 b/c area=0.5
nsm = 1.
self.verify_pshell_element(tri, mass, area, centroid, normal, nsm)
[docs] def test_mass_solid_1(self): # passes
model = BDF(debug=False, log=None)
bdfname = os.path.join(testpath, 'test_mass.dat')
model.read_bdf(bdfname, include_dir=None, xref=True)
# hexa - psolid - nsm = 0
hexa = model.elements[7]
mass = 0.2
volume = 2. # l * w * h = 1 * 1 * 2
rho = 0.1
E = 1.0
G = 2.0
nu = 3.0
centroid = array([0.5, 0.5, 1.0])
self.verify_psolid_element(hexa, mass, volume, centroid, rho, E, G, nu)
# tetra - psolid
tetra = model.elements[8]
mass = 1/30.
volume = 1/3. # 1/3 * b * h = 1/3 * 0.5 * 2.0
rho = 0.1
E = 1.0
G = 2.0
nu = 3.0
centroid = array([0.5, 0.25, 0.5])
self.verify_psolid_element(tetra, mass, volume, centroid, rho, E, G, nu)
# penta - psolid
penta = model.elements[9]
mass = 0.1
volume = 1.0 # b * h = 0.5 * 2
rho = 0.1
E = 1.0
G = 2.0
nu = 3.0
centroid = array([2/3., 1/3., 1.])
self.verify_psolid_element(penta, mass, volume, centroid, rho, E, G, nu)
if __name__ == '__main__': # pragma: no cover
unittest.main()