class PropertiesShell(object): def __init__(self, model): """ Defines the ShellProperties object. :param self: the ShellProperties object :param model: the BDF object """ self.model = model self.pshell = PSHELL(self.model) self.pcomp = PCOMP(self.model) self.pcompg = PCOMPG(self.model) self.n = 0 def allocate(self, card_count): ptypes = self._get_types(nlimit=False) self.model.log.debug('card_count = %s' % card_count) for ptype in ptypes: if ptype.type in card_count: self.model.log.debug(' allocate %s' % ptype.type) ptype.allocate(card_count[ptype.type]) del card_count[ptype.type] #else: #assert hasattr(etype, 'allocate'), '%s doesnt support allocate' % ptype.type def build(self): for prop in [self.pshell, self.pcomp, self.pcompg]: if hasattr(prop, 'n'): self.model.log.debug(' building %s' % prop.__class__.__name__) prop.build() self.n += prop.n npshell = self.pshell.n npcomp = self.pcomp.n npcompg = self.pcompg.n self.n = npshell + npcomp + npcompg pid = hstack([self.pshell.property_id, self.pcomp.property_id, self.pcompg.property_id]) unique_pids = unique(pid) #print unique_pids if len(unique_pids) != len(pid): raise RuntimeError('There are duplicate PSHELL/PCOMP IDs...') def rebuild(self): raise NotImplementedError() #========================================================================= def add_pshell(self, card, comment): self.pshell.add(card, comment) def add_pcomp(self, card, comment): self.pcomp.add(card, comment) def add_pcompg(self, card, comment): raise NotImplementedError(card) self.pcompg.add(card, comment) #========================================================================= def get_material_id_by_property_id(self, property_id): types = self._get_types(nlimit=True) _property_id = concatenate([ptype.property_id for ptype in types]) #print _property_id return _property_id def get_nonstructural_mass_by_property_id(self, property_id=None): return self._getmethod(property_id, 'get_nonstructural_mass_by_property_id') def get_mass_per_area_by_property_id(self, property_id=None): return self._getmethod(property_id, 'get_mass_per_area_by_property_id') def get_thickness_by_property_id(self, property_id=None): """ Gets the thickness of the PSHELLs/PCOMPs. :param self: the ShellProperties object :param property_id: the property IDs to consider (default=None -> all) """ return self._getmethod(property_id, 'get_thickness_by_property_id') def get_density_by_property_id(self, property_id=None): """ Gets the density of the PSHELLs/PCOMPs. :param self: the ShellProperties object :param property_ids: the property IDs to consider (default=None -> all) """ return self._getmethod(property_id, 'get_density_by_property_id') def _getattr(self, property_id, method): TypeMap = { 'PSHELL': (self.pshell, self.pshell.property_id), 'PCOMP' : (self.pcomp, self.pcomp.property_id), 'PCOMPG': (self.pcompg, self.pcompg.property_id), } out = array([]) for Type, (ptype, pids) in sorted(iteritems(TypeMap)): for pid in pids: if pid in property_id: value = getattr(ptype, method) #assert len(value) == 1, value #print('pid =', pid, value) out = hstack([out, value]) #print("out = %s" % out) return out def _getmethod(self, property_id, method): #types = self._get_types(nlimit=True) #data = hstack([getattr(ptype, method)() for ptype in types] ) #if property_ids is None: #return data TypeMap = { 'PSHELL': (self.pshell, self.pshell.property_id), 'PCOMP' : (self.pcomp, self.pcomp.property_id), 'PCOMPG': (self.pcompg, self.pcompg.property_id), } #self.model.log.debug('property_id = %s' % property_id) n = len(property_id) out = full(n, nan, dtype='float64') for Type, (ptype, pids) in sorted(iteritems(TypeMap)): #self.model.log.debug('Type=%s pids=%s' % (Type, pids)) for pid in pids: if pid in property_id: value = getattr(ptype, method)([pid]) j = where(pid == property_id)[0] #assert len(value) == 1, value #self.model.log.debug('pid = %s %s' % (pid, value)) out[j] = value #self.model.log.debug("out = %s" % out) assert out.shape == (n, ), out.shape assert isnan(out) == False, out return out #_property_ids = hstack([ptype.property_id for ptype in types]) #assert isinstance(property_ids, ndarray), type(property_ids) #i = argsort(_property_ids) #j = searchsorted(property_ids, _property_ids[i]) #data_short = data[j] #return data_short #========================================================================= def _get_types(self, nlimit=True): types = [self.pshell, self.pcomp, self.pcompg] if nlimit: types2 = [] for ptype in types: if ptype.n: types2.append(ptype) types = types2 else: #self.model.log.debug('ptypes=%s' % types) pass return types def get_stats(self): msg = [] types = self._get_types() for prop in types: nprop = prop.n if nprop: msg.append(' %-8s: %i' % (prop.type, nprop)) return msg def write_bdf(self, f, size=8, property_id=None): f.write('$PROPERTIES_SHELL\n') types = self._get_types() for prop in types: #print('*SHELL', prop.type) prop.write_bdf(f, size=size, property_id=property_id)
def test_pcomp_02(self): """ symmetrical, nsm=0.0 and nsm=1.0 """ model = BDF() pid = 1 z0 = 0. nsm = 0. sb = 0. ft = 'HOFF' TRef = 0. ge = 0. lam = 'SYM' # isSymmetrical SYM Mid = [1,2,3] Theta = [0.,10.,20.] T = [.1,.2,.3] Sout = ['YES', 'YES', 'NO'] # 0-NO, 1-YES card = ['PCOMP', pid, z0, nsm, sb, ft, TRef, ge, lam, Mid[0], T[0], Theta[0], Sout[0], Mid[1], T[1], Theta[1], Sout[1], Mid[2], T[2], Theta[2], Sout[2]] card = BDFCard(card) p = PCOMP(model) p.add(card) p.build() self.assertTrue(p.is_symmetrical_by_property_id()) self.assertTrue(p.is_symmetrical_by_property_index()) self.assertEqual(p.get_nplies_by_property_id(), 6) self.assertAlmostEqual(p.get_thickness_by_property_id(), 1.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 0), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 1), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 2), 0.3) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 3), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 4), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 5), 0.3) with self.assertRaises(IndexError): p.Thickness(6) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 0), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 1), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 2), 20.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 3), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 4), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 5), 20.) with self.assertRaises(IndexError): p.get_theta_by_property_id_ply(pid, 6) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 0), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 1), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 2), 3) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 3), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 4), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 5), 3) with self.assertRaises(IndexError): p.get_material_id_by_property_id_ply(pid, 6) self.assertEqual(p.get_material_ids_by_property_id(), [1,2,3,1,2,3]) self.assertEqual(p.get_sout_by_property_id_ply(pid, 0), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 1), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 2), 'NO') self.assertEqual(p.get_sout_by_property_id_ply(pid, 3), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 4), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 5), 'NO') with self.assertRaises(IndexError): p.get_sout_by_property_id_ply(pid, 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)
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 = 'HILL' TRef = 0. ge = 0. #lam = 'NO' # isSymmetrical YES/NO lam = 'BEND' # isSymmetrical YES/NO Mid = [1,2,3] Theta = [0.,10.,20.] T = [.1,.2,.3] Sout = ['YES', 'YES', 'NO'] # 0-NO, 1-YES data = ['PCOMP', pid, z0, nsm, sb, ft, TRef, ge, lam, Mid[0], T[0], Theta[0], Sout[0], Mid[1], T[1], Theta[1], Sout[1], Mid[2], T[2], Theta[2], Sout[2],] model = BDF() card = BDFCard(data) p = PCOMP(model) #p = model.properties.pcomp p.add(card) p.build() #self.assertFalse(p.is_symmetrical()) self.assertEqual(p.get_nplies_by_property_id(), 3) self.assertAlmostEqual(p.get_thickness_by_property_id(pid), 0.6) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 0), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 1), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 2), 0.3) with self.assertRaises(IndexError): p.get_thickness_by_property_id_ply(pid, 3) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 0), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 1), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 2), 20.) with self.assertRaises(IndexError): p.get_theta_by_property_id_ply(pid, 3) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 0), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 1), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 2), 3) with self.assertRaises(IndexError): p.get_material_id_by_property_id_ply(pid, 3) print('get_material_ids_by_property_id = ', p.get_material_ids_by_property_id(pid)) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][0], 1) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][0], 1) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][1], 2) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][2], 3) self.assertEqual(p.get_sout_by_property_id_ply(pid, 0), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 1), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 2), 'NO') with self.assertRaises(IndexError): p.get_sout_by_property_id_ply(pid, 3) # material... mid = 1 E = 1e7 G = None nu = None rho = 1.0 a = None St = None Sc = None Ss = None Mcsid = None mat1 = ['MAT1', mid, E, G, nu, rho, a, TRef, ge, St, Sc, Ss, Mcsid] card = BDFCard(mat1) m = MAT1(model) m.allocate(1) m.add(card) m.build() #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.get_density_by_property_id_ply(pid, 0), 1.0) self.assertAlmostEqual(p.get_density_by_property_id_ply(pid, 1), 1.0) self.assertAlmostEqual(p.get_density_by_property_id_ply(pid, 2), 1.0) with self.assertRaises(IndexError): p.get_density_by_property_id_ply(pid, 3) # MassPerArea self.assertAlmostEqual(p.get_mass_per_area_by_property_id(), 0.6) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 0), 0.1) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 1), 0.2) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 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)
class PropertiesShell(object): def __init__(self, model): """ Defines the ShellProperties object. :param self: the ShellProperties object :param model: the BDF object """ self.model = model self.pshell = PSHELL(self.model) self.pcomp = PCOMP(self.model) self.pcompg = PCOMPG(self.model) self.n = 0 def allocate(self, card_count): ptypes = self._get_types(nlimit=False) self.model.log.debug('card_count = %s' % card_count) for ptype in ptypes: if ptype.type in card_count: self.model.log.debug(' allocate %s' % ptype.type) ptype.allocate(card_count[ptype.type]) del card_count[ptype.type] #else: #assert hasattr(etype, 'allocate'), '%s doesnt support allocate' % ptype.type def build(self): for prop in [self.pshell, self.pcomp, self.pcompg]: if hasattr(prop, 'n'): self.model.log.debug(' building %s' % prop.__class__.__name__) prop.build() self.n += prop.n npshell = self.pshell.n npcomp = self.pcomp.n npcompg = self.pcompg.n self.n = npshell + npcomp + npcompg pid = hstack([ self.pshell.property_id, self.pcomp.property_id, self.pcompg.property_id ]) unique_pids = unique(pid) #print unique_pids if len(unique_pids) != len(pid): raise RuntimeError('There are duplicate PSHELL/PCOMP IDs...') def rebuild(self): raise NotImplementedError() #========================================================================= def add_pshell(self, card, comment): self.pshell.add(card, comment) def add_pcomp(self, card, comment): self.pcomp.add(card, comment) def add_pcompg(self, card, comment): raise NotImplementedError(card) self.pcompg.add(card, comment) #========================================================================= def get_material_id_by_property_id(self, property_id): types = self._get_types(nlimit=True) _property_id = concatenate([ptype.property_id for ptype in types]) #print _property_id return _property_id def get_nonstructural_mass_by_property_id(self, property_id=None): return self._getmethod(property_id, 'get_nonstructural_mass_by_property_id') def get_mass_per_area_by_property_id(self, property_id=None): return self._getmethod(property_id, 'get_mass_per_area_by_property_id') def get_thickness_by_property_id(self, property_id=None): """ Gets the thickness of the PSHELLs/PCOMPs. :param self: the ShellProperties object :param property_id: the property IDs to consider (default=None -> all) """ return self._getmethod(property_id, 'get_thickness_by_property_id') def get_density_by_property_id(self, property_id=None): """ Gets the density of the PSHELLs/PCOMPs. :param self: the ShellProperties object :param property_ids: the property IDs to consider (default=None -> all) """ return self._getmethod(property_id, 'get_density_by_property_id') def _getattr(self, property_id, method): TypeMap = { 'PSHELL': (self.pshell, self.pshell.property_id), 'PCOMP': (self.pcomp, self.pcomp.property_id), 'PCOMPG': (self.pcompg, self.pcompg.property_id), } out = array([]) for Type, (ptype, pids) in sorted(iteritems(TypeMap)): for pid in pids: if pid in property_id: value = getattr(ptype, method) #assert len(value) == 1, value #print('pid =', pid, value) out = hstack([out, value]) #print("out = %s" % out) return out def _getmethod(self, property_id, method): #types = self._get_types(nlimit=True) #data = hstack([getattr(ptype, method)() for ptype in types] ) #if property_ids is None: #return data TypeMap = { 'PSHELL': (self.pshell, self.pshell.property_id), 'PCOMP': (self.pcomp, self.pcomp.property_id), 'PCOMPG': (self.pcompg, self.pcompg.property_id), } #self.model.log.debug('property_id = %s' % property_id) n = len(property_id) out = full(n, nan, dtype='float64') for Type, (ptype, pids) in sorted(iteritems(TypeMap)): #self.model.log.debug('Type=%s pids=%s' % (Type, pids)) for pid in pids: if pid in property_id: value = getattr(ptype, method)([pid]) j = where(pid == property_id)[0] #assert len(value) == 1, value #self.model.log.debug('pid = %s %s' % (pid, value)) out[j] = value #self.model.log.debug("out = %s" % out) assert out.shape == (n, ), out.shape assert isnan(out) == False, out return out #_property_ids = hstack([ptype.property_id for ptype in types]) #assert isinstance(property_ids, ndarray), type(property_ids) #i = argsort(_property_ids) #j = searchsorted(property_ids, _property_ids[i]) #data_short = data[j] #return data_short #========================================================================= def _get_types(self, nlimit=True): types = [self.pshell, self.pcomp, self.pcompg] if nlimit: types2 = [] for ptype in types: if ptype.n: types2.append(ptype) types = types2 else: #self.model.log.debug('ptypes=%s' % types) pass return types def get_stats(self): msg = [] types = self._get_types() for prop in types: nprop = prop.n if nprop: msg.append(' %-8s: %i' % (prop.type, nprop)) return msg def write_bdf(self, f, size=8, property_id=None): f.write('$PROPERTIES_SHELL\n') types = self._get_types() for prop in types: #print('*SHELL', prop.type) prop.write_bdf(f, size=size, property_id=property_id)
def test_pcomp_02(self): """ symmetrical, nsm=0.0 and nsm=1.0 """ model = BDF() pid = 1 z0 = 0. nsm = 0. sb = 0. ft = 'HOFF' TRef = 0. ge = 0. lam = 'SYM' # isSymmetrical SYM Mid = [1, 2, 3] Theta = [0., 10., 20.] T = [.1, .2, .3] Sout = ['YES', 'YES', 'NO'] # 0-NO, 1-YES card = [ 'PCOMP', pid, z0, nsm, sb, ft, TRef, ge, lam, Mid[0], T[0], Theta[0], Sout[0], Mid[1], T[1], Theta[1], Sout[1], Mid[2], T[2], Theta[2], Sout[2] ] card = BDFCard(card) p = PCOMP(model) p.add(card) p.build() self.assertTrue(p.is_symmetrical_by_property_id()) self.assertTrue(p.is_symmetrical_by_property_index()) self.assertEqual(p.get_nplies_by_property_id(), 6) self.assertAlmostEqual(p.get_thickness_by_property_id(), 1.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 0), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 1), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 2), 0.3) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 3), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 4), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 5), 0.3) with self.assertRaises(IndexError): p.Thickness(6) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 0), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 1), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 2), 20.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 3), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 4), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 5), 20.) with self.assertRaises(IndexError): p.get_theta_by_property_id_ply(pid, 6) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 0), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 1), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 2), 3) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 3), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 4), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 5), 3) with self.assertRaises(IndexError): p.get_material_id_by_property_id_ply(pid, 6) self.assertEqual(p.get_material_ids_by_property_id(), [1, 2, 3, 1, 2, 3]) self.assertEqual(p.get_sout_by_property_id_ply(pid, 0), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 1), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 2), 'NO') self.assertEqual(p.get_sout_by_property_id_ply(pid, 3), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 4), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 5), 'NO') with self.assertRaises(IndexError): p.get_sout_by_property_id_ply(pid, 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)
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 = 'HILL' TRef = 0. ge = 0. #lam = 'NO' # isSymmetrical YES/NO lam = 'BEND' # isSymmetrical YES/NO Mid = [1, 2, 3] Theta = [0., 10., 20.] T = [.1, .2, .3] Sout = ['YES', 'YES', 'NO'] # 0-NO, 1-YES data = [ 'PCOMP', pid, z0, nsm, sb, ft, TRef, ge, lam, Mid[0], T[0], Theta[0], Sout[0], Mid[1], T[1], Theta[1], Sout[1], Mid[2], T[2], Theta[2], Sout[2], ] model = BDF() card = BDFCard(data) p = PCOMP(model) #p = model.properties.pcomp p.add(card) p.build() #self.assertFalse(p.is_symmetrical()) self.assertEqual(p.get_nplies_by_property_id(), 3) self.assertAlmostEqual(p.get_thickness_by_property_id(pid), 0.6) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 0), 0.1) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 1), 0.2) self.assertAlmostEqual(p.get_thickness_by_property_id_ply(pid, 2), 0.3) with self.assertRaises(IndexError): p.get_thickness_by_property_id_ply(pid, 3) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 0), 0.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 1), 10.) self.assertAlmostEqual(p.get_theta_by_property_id_ply(pid, 2), 20.) with self.assertRaises(IndexError): p.get_theta_by_property_id_ply(pid, 3) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 0), 1) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 1), 2) self.assertEqual(p.get_material_id_by_property_id_ply(pid, 2), 3) with self.assertRaises(IndexError): p.get_material_id_by_property_id_ply(pid, 3) print('get_material_ids_by_property_id = ', p.get_material_ids_by_property_id(pid)) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][0], 1) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][0], 1) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][1], 2) self.assertEqual(p.get_material_ids_by_property_id(pid)[0][2], 3) self.assertEqual(p.get_sout_by_property_id_ply(pid, 0), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 1), 'YES') self.assertEqual(p.get_sout_by_property_id_ply(pid, 2), 'NO') with self.assertRaises(IndexError): p.get_sout_by_property_id_ply(pid, 3) # material... mid = 1 E = 1e7 G = None nu = None rho = 1.0 a = None St = None Sc = None Ss = None Mcsid = None mat1 = ['MAT1', mid, E, G, nu, rho, a, TRef, ge, St, Sc, Ss, Mcsid] card = BDFCard(mat1) m = MAT1(model) m.allocate(1) m.add(card) m.build() #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.get_density_by_property_id_ply(pid, 0), 1.0) self.assertAlmostEqual(p.get_density_by_property_id_ply(pid, 1), 1.0) self.assertAlmostEqual(p.get_density_by_property_id_ply(pid, 2), 1.0) with self.assertRaises(IndexError): p.get_density_by_property_id_ply(pid, 3) # MassPerArea self.assertAlmostEqual(p.get_mass_per_area_by_property_id(), 0.6) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 0), 0.1) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 1), 0.2) self.assertAlmostEqual(p.get_mass_per_area_by_property_id_iply(pid, 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)