Source code for pyNastran.op2.tables.geom.mpt

"""defines readers for BDF objects in the OP2 MPT/MPTS table"""
#pylint: disable=C0111,C0103,C0301,W0612,R0914,R0201
from __future__ import (nested_scopes, generators, division, absolute_import,
                        print_function, unicode_literals)
from struct import Struct

from pyNastran.bdf.cards.materials import (CREEP, MAT1, MAT2, MAT3, MAT4, MAT5,
                                           MAT8, MAT9, MAT10, MAT11, MATHP)
from pyNastran.bdf.cards.material_deps import MATS1, MATT1, MATT4, MATT5
from pyNastran.bdf.cards.dynamic import NLPARM, TSTEPNL # TSTEP
from pyNastran.op2.tables.geom.geom_common import GeomCommon
#from pyNastran.bdf.cards.thermal.thermal import (CHBDYE, CHBDYG, CHBDYP, PCONV, PCONVM,
                                                 #PHBDY, CONV, CONVM, RADBC)
from pyNastran.bdf.cards.thermal.radiation import RADM


[docs]class MPT(GeomCommon): """defines methods for reading op2 materials & time-stepping methods""" def _read_mpt_4(self, data, ndata): return self._read_geom_4(self._mpt_map, data, ndata) def __init__(self): GeomCommon.__init__(self) self.big_materials = {} #F:\work\pyNastran\examples\Dropbox\move_tpl\chkout01.op2 self._mpt_map = { (1003, 10, 245) : ['CREEP', self._read_creep], # record 1 (103, 1, 77) : ['MAT1', self._read_mat1], # record 3-msc-dmap2014 (203, 2, 78) : ['MAT2', self._read_mat2], # record 3 (1403, 14, 122) : ['MAT3', self._read_mat3], # record 4 (2103, 21, 234) : ['MAT4', self._read_mat4], # record 5 (2203, 22, 235) : ['MAT5', self._read_mat5], # record 6 (2503, 25, 288) : ['MAT8', self._read_mat8], # record 7 (2603, 26, 300) : ['MAT9', self._read_mat9], # record 8 - buggy (2801, 28, 365) : ['MAT10', self._read_mat10], # record 9 (2903, 29, 371) : ['MAT11', self._read_mat11], # record ??? - NX specific - buggy? (1503, 15, 189) : ['???', self._read_fake], (4506, 45, 374) : ['MATHP', self._read_mathp], # record 11 (503, 5, 90) : ['MATS1', self._read_mats1], # record 12 (703, 7, 91) : ['MATT1', self._read_matt1], # record 13 - not done (803, 8, 102) : ['MATT2', self._read_matt2], # record 14 - not done (1503, 14, 189) : ['MATT3', self._read_matt3], # record 15 - not done (2303, 23, 237) : ['MATT4', self._read_matt4], # record 16 - not done (2403, 24, 238) : ['MATT5', self._read_matt5], # record 17 - not done (2703, 27, 301) : ['MATT9', self._read_matt9], # record 19 - not done (8802, 88, 413) : ['RADM', self._read_radm], # record 25 - not done # record 26 (3003, 30, 286) : ['NLPARM', self._read_nlparm], # record 27 (3104, 32, 350) : ['NLPCI', self._read_nlpci], # record 28 (3103, 31, 337) : ['TSTEPNL', self._read_tstepnl], # record 29 (3303, 33, 988) : ['MATT11', self._read_matt11], (903, 9, 336) : ['MATT8', self._read_matt8], (8902, 89, 423) : ['RADMT', self._read_radmt], (9002, 90, 410) : ['RADBND', self._read_radbnd], }
[docs] def add_op2_material(self, mat): #if mat.mid > 100000000: #raise RuntimeError('bad parsing...') self._add_structural_material_object(mat, allow_overwrites=False)
#print(str(mat)[:-1]) def _read_creep(self, data, n): """ CREEP(1003,10,245) - record 1 """ nmaterials = (len(data) - n) // 64 s = Struct(self._endian + b'i2f4ifi7f') for unused_i in range(nmaterials): edata = data[n:n+64] out = s.unpack(edata) (mid, T0, exp, form, tidkp, tidcp, tidcs, thresh, Type, ag1, ag2, ag3, ag4, ag5, ag6, ag7) = out if self.is_debug_file: self.binary_debug.write(' CREEP=%s\n' % str(out)) mat = CREEP.add_op2_data(out) self._add_creep_material_object(mat, allow_overwrites=False) n += 64 self.card_count['CREEP'] = nmaterials return n def _read_mat1(self, data, n): """ MAT1(103,1,77) - record 2 """ ntotal = 48 # 12*4 s = Struct(self._endian + b'i10fi') nmaterials = (len(data) - n) // ntotal for i in range(nmaterials): edata = data[n:n+48] out = s.unpack(edata) #(mid, E, G, nu, rho, A, tref, ge, St, Sc, Ss, mcsid) = out mat = MAT1.add_op2_data(out) self.add_op2_material(mat) n += ntotal self.card_count['MAT1'] = nmaterials return n def _read_mat2(self, data, n): """ MAT2(203,2,78) - record 3 """ ntotal = 68 # 17*4 s = Struct(self._endian + b'i15fi') nmaterials = (len(data) - n) // ntotal nbig_materials = 0 for unused_i in range(nmaterials): edata = data[n:n+68] out = s.unpack(edata) if self.is_debug_file: self.binary_debug.write(' MAT2=%s\n' % str(out)) (mid, g1, g2, g3, g4, g5, g6, rho, aj1, aj2, aj3, tref, ge, St, Sc, Ss, mcsid) = out #print("MAT2 = ",out) mat = MAT2.add_op2_data(out) if 0 < mid <= 1e8: # just a checker for out of range materials self.add_op2_material(mat) else: nbig_materials += 1 self.big_materials[mid] = mat n += ntotal ncards = nmaterials - nbig_materials if ncards: self.card_count['MAT2'] = ncards return n def _read_mat3(self, data, n): """ MAT3(1403,14,122) - record 4 """ s = Struct(self._endian + b'i8fi5fi') nmaterials = (len(data) - n) // 64 for i in range(nmaterials): out = s.unpack(data[n:n+64]) (mid, ex, eth, ez, nuxth, nuthz, nuzx, rho, gzx, blank, ax, ath, az, tref, ge, blank) = out if self.is_debug_file: self.binary_debug.write(' MAT3=%s\n' % str(out)) mat = MAT3.add_op2_data([mid, ex, eth, ez, nuxth, nuthz, nuzx, rho, gzx, ax, ath, az, tref, ge]) self.add_op2_material(mat) n += 64 self.card_count['MAT3'] = nmaterials return n def _read_mat4(self, data, n): """ MAT4(2103,21,234) - record 5 """ s = Struct(self._endian + b'i10f') nmaterials = (len(data) - n) // 44 for unused_i in range(nmaterials): out = s.unpack(data[n:n+44]) (mid, k, cp, rho, h, mu, hgen, refenth, tch, tdelta, qlat) = out mat = MAT4.add_op2_data(out) self._add_thermal_material_object(mat, allow_overwrites=False) n += 44 self.card_count['MAT4'] = nmaterials return n def _read_mat5(self, data, n): """ MAT5(2203,22,235) - record 6 """ s = Struct(self._endian + b'i9f') nmaterials = (len(data) - n) // 40 for unused_i in range(nmaterials): out = s.unpack(data[n:n+40]) (mid, k1, k2, k3, k4, k5, k6, cp, rho, hgen) = out if self.is_debug_file: self.binary_debug.write(' MAT5=%s\n' % str(out)) mat = MAT5.add_op2_data(out) self._add_thermal_material_object(mat, allow_overwrites=False) n += 40 self.card_count['MAT5'] = nmaterials return n def _read_mat8(self, data, n): """ MAT8(2503,25,288) - record 7 """ s = Struct(self._endian + b'i18f') nmaterials = (len(data) - n) // 76 for i in range(nmaterials): out = s.unpack(data[n:n+76]) #(mid, E1, E2, nu12, G12, G1z, G2z, rho, a1, a2, # tref, Xt, Xc, Yt, Yc, S, ge, f12, strn) = out mat = MAT8.add_op2_data(out) self.add_op2_material(mat) n += 76 self.card_count['MAT8'] = nmaterials return n def _read_mat9(self, data, n): """ MAT9(2603,26,300) - record 9 """ return len(data) if 1: ntotal = 140 # 35 s2 = Struct(self._endian + b'i 30f iiii') else: # pragma: no cover ntotal = 56 * 4 s1 = Struct(self._endian + b'i 21f 34i') s2 = Struct(self._endian + b'i 21f 34f') nmaterials = (len(data) - n) // ntotal #assert nmaterials % ntotal == 0, self.numwide for i in range(nmaterials): #self.show_data(data[n:n+ntotal], types='if') out = s2.unpack(data[n:n+ntotal]) if self.is_debug_file: self.binary_debug.write(' MAT9=%s\n' % str(out)) assert len(out) == 35, out #print(out) (mid, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, rho, a1, a2, a3, a4, a5, a6, tref, ge, blank1, blank2, blank3, blank4) = out assert blank1 == 0, blank1 data_in = [mid, [g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21], rho, [a1, a2, a3, a4, a5, a6], tref, ge] #print(data_in) mat = MAT9.add_op2_data(data_in) self.add_op2_material(mat) n += ntotal self.card_count['MAT9'] = nmaterials return n def _read_mat10(self, data, n): """ MAT10(2801,28,365) - record 9 Word Name Type Description 1 MID I Material identification number 2 BULK RS Bulk modulus 3 RHO RS Mass density 4 C RS Speed of sound 5 GE RS Structural damping coefficient """ ntotal = 20 # 5*4 s = Struct(self._endian + b'i4f') nmaterials = (len(data) - n) // ntotal assert nmaterials > 0, nmaterials for unused_i in range(nmaterials): edata = data[n:n+20] out = s.unpack(edata) (mid, bulk, rho, c, ge) = out assert mid > 0, out if self.is_debug_file: self.binary_debug.write(' MAT10=%s\n' % str(out)) mat = MAT10.add_op2_data(out) assert mat.mid > 0, mat self.add_op2_material(mat) n += 20 self.card_count['MAT10'] = nmaterials return n def _read_mat11(self, data, n): """ MAT11(2903,29,371) """ ntotal = 128 # 23*4 struc = Struct(self._endian + b'i 15f 16i') nmaterials = (len(data) - n) // ntotal assert nmaterials > 0, nmaterials for unused_i in range(nmaterials): edata = data[n:n+ntotal] out = struc.unpack(edata) (mid, e1, e2, e3, nu12, nu13, nu23, g12, g13, g23, rho, a1, a2, a3, tref, ge) = out[:16] if self.is_debug_file: self.binary_debug.write(' MA11=%s\n' % str(out)) mat = MAT11.add_op2_data(out) self.add_op2_material(mat) n += ntotal self.card_count['MAT11'] = nmaterials return n def _read_mat11_old(self, data, n): """ MAT11(2903,29,371) """ ntotal = 80 # 20*4 s = Struct(self._endian + b'i 15f 4s 4s 4s 4s') nmaterials = (len(data) - n) // ntotal assert nmaterials > 0, nmaterials for unused_i in range(nmaterials): edata = data[n:n+80] out = s.unpack(edata) (mid, e1, e2, e3, nu12, nu13, nu23, g12, g13, g23, rho, a1, a2, a3, tref, ge, blank1, blank2, blank3, blank4) = out if self.is_debug_file: self.binary_debug.write(' MAT11-old=%s\n' % str(out)) mat = MAT11.add_op2_data(out) assert mid > 0, mat self.add_op2_material(mat) n += 80 self.card_count['MAT11'] = nmaterials return n def _read_mathp(self, data, n): """ MATHP(4506,45,374) - Record 11 NX/MSC 1 MID I Material identification number 2 A10 RS Material constant related to distortional deformation 3 A01 RS Material constant related to distortional deformation 4 D1 RS Material constant related to volumetric deformation 5 RHO RS Mass density 6 ALPHA RS Coefficient of volumetric thermal expansion 7 TREF RS Reference temperature 8 GE RS Structural damping element coefficient 9 SF I ??? 10 NA I Order of the distortional strain energy polynomial function 11 ND I Order of the volumetric strain energy polynomial function 12 KP RS ??? 13 A20 RS Material constant related to distortional deformation 14 A11 RS Material constant related to distortional deformation 15 A02 RS Material constant related to distortional deformation 16 D2 RS Material constant related to volumetric deformation 17 A30 RS Material constant related to distortional deformation 18 A21 RS Material constant related to distortional deformation 19 A12 RS Material constant related to distortional deformation 20 A03 RS Material constant related to distortional deformation 21 D3 RS Material constant related to volumetric deformation 22 A40 RS Material constant related to distortional deformation 23 A31 RS Material constant related to distortional deformation 24 A22 RS Material constant related to distortional deformation 25 A13 RS Material constant related to distortional deformation 26 A04 RS Material constant related to distortional deformation 27 D4 RS Material constant related to volumetric deformation 28 A50 RS Material constant related to distortional deformation 29 A41 RS Material constant related to distortional deformation 30 A32 RS Material constant related to distortional deformation 31 A23 RS Material constant related to distortional deformation 32 A14 RS Material constant related to distortional deformation 33 A05 RS Material constant related to distortional deformation 34 D5 RS Material constant related to volumetric deformation 35 CONTFLG I Continuation flag CONTFLG =1 With continuation 36 TAB1 I TABLES1 identification number which defines tension/compression 37 TAB2 I TABLES1 identification number which defines equibiaxial tension 38 TAB3 I TABLES1 identification number which defines simple shear 39 TAB4 I TABLES1 identification number which defines pure shear 40 UNDEF(3) None 43 TAB5 I TABLES1 identification number which defines volumetric compression CONTFLG =0 Without continuation End CONTFLG """ nmaterials = 0 s1 = Struct(self._endian + b'i7f3i23fi') s2 = Struct(self._endian + b'8i') n2 = len(data) while n < n2: edata = data[n:n+140] out1 = s1.unpack(edata) n += 140 (mid, a10, a01, d1, rho, alpha, tref, ge, sf, na, nd, kp, a20, a11, a02, d2, a30, a21, a12, a03, d3, a40, a31, a22, a13, a04, d4, a50, a41, a32, a23, a14, a05, d5, continue_flag) = out1 if n == n2: # we have to hack the continue_flag because it's wrong... # C:\Users\sdoyle\Dropbox\move_tpl\ehq45.op2 continue_flag = 0 out1 = (mid, a10, a01, d1, rho, alpha, tref, ge, sf, na, nd, kp, a20, a11, a02, d2, a30, a21, a12, a03, d3, a40, a31, a22, a13, a04, d4, a50, a41, a32, a23, a14, a05, d5, continue_flag) data_in = [out1] if continue_flag: edata = data[n:n+32] # 7*4 out2 = s2.unpack(edata) n += 32 (tab1, tab2, tab3, tab4, x1, x2, x3, tab5) = out2 data_in.append(out2) mat = MATHP.add_op2_data(data_in) if self.is_debug_file: self.binary_debug.write(' MATHP=%s\n' % str(out1)) self._add_hyperelastic_material_object(mat) nmaterials += 1 assert nmaterials > 0, 'MATP nmaterials=%s' % nmaterials self.card_count['MATHP'] = nmaterials return n def _read_mats1(self, data, n): """ MATS1(503,5,90) - record 12 """ ntotal = 44 # 11*4 s = Struct(self._endian + b'3ifiiff3i') nmaterials = (len(data) - n) // ntotal for unused_i in range(nmaterials): edata = data[n:n+44] out = s.unpack(edata) (mid, tid, Type, h, yf, hr, limit1, limit2, a, bmat, c) = out assert a == 0, a assert bmat == 0, bmat assert c == 0, c data_in = [mid, tid, Type, h, yf, hr, limit1, limit2] if self.is_debug_file: self.binary_debug.write(' MATS1=%s\n' % str(out)) mat = MATS1.add_op2_data(data_in) self._add_material_dependence_object(mat, allow_overwrites=False) self.card_count['MATS1'] = nmaterials return n def _read_matt1(self, data, n): """ MATT1(703,7,91) checked NX-10.1, MSC-2016 """ s = Struct(self._endian + b'12i') ntotal = 48 # 12*4 ncards = (len(data) - n) // ntotal for unused_i in range(ncards): edata = data[n:n + ntotal] out = s.unpack(edata) if self.is_debug_file: self.binary_debug.write(' MATT1=%s\n' % str(out)) #(mid, tableid, ...., None) = out mat = MATT1.add_op2_data(out) self._add_material_dependence_object(mat) n += ntotal self.increase_card_count('MATT1', ncards) return n def _read_matt2(self, data, n): self.log.info('skipping MATT2 in MPT') return len(data) def _read_matt3(self, data, n): self.log.info('skipping MATT3 in MPT') return len(data) def _read_matt4(self, data, n): """ MATT4(2303,23,237) checked NX-10.1, MSC-2016 """ struct_7i = Struct(self._endian + b'7i') ntotal = 28 # 7*4 ncards = (len(data) - n) // ntotal for i in range(ncards): edata = data[n:n + ntotal] out = struct_7i.unpack(edata) if self.is_debug_file: self.binary_debug.write(' MATT4=%s\n' % str(out)) #(mid, tk, tcp, null, th, tmu, thgen) = out mat = MATT4.add_op2_data(out) self._add_material_dependence_object(mat) n += ntotal self.increase_card_count('MATT4', ncards) return n def _read_matt5(self, data, n): """ MATT5(2403,24,238) checked NX-10.1, MSC-2016 """ s = Struct(self._endian + b'10i') ntotal = 40 # 10*4 ncards = (len(data) - n) // ntotal for i in range(ncards): edata = data[n:n + ntotal] out = s.unpack(edata) if self.is_debug_file: self.binary_debug.write(' MATT4=%s\n' % str(out)) #(mid, tk1, tk2, tk3, tk4, tk5, tk6, tcp, null, thgen) = out mat = MATT5.add_op2_data(out) self._add_material_dependence_object(mat) n += ntotal self.increase_card_count('MATT5', ncards) return n # MATT8 - unused def _read_matt8(self, data, n): self.log.info('skipping MATT8 in MPT') return len(data) def _read_matt9(self, data, n): self.log.info('skipping MATT9 in MPT') return len(data) def _read_matt11(self, data, n): self.log.warning('skipping MATT11 in MPT') return len(data) # MBOLT # MBOLTUS # MSTACK # NLAUTO def _read_radbnd(self, data, n): self.log.info('skipping RADBND in MPT') return len(data) def _read_radm(self, data, n): """ RADM(8802,88,413) - record 25 .. todo:: add object """ struct_i = self.struct_i nmaterials = 0 ndata = len(data) while n < ndata: # 1*4 packs = [] edata = data[n:n+4] number, = struct_i.unpack(edata) n += 4 iformat = b'i %if' % (number) struct_i_nf = Struct(self._endian + iformat) #mid, absorb, emiss1, emiss2, ... ndata_per_pack = 1 + number nstr_per_pack = ndata_per_pack * 4 nfields = (ndata - n) // 4 npacks = nfields // ndata_per_pack for unused_ipack in range(npacks): edata = data[n:n+nstr_per_pack] pack = list(struct_i_nf.unpack(edata)) packs.append(pack) n += nstr_per_pack mat = RADM.add_op2_data(pack) self._add_thermal_bc_object(mat, mat.radmid) nmaterials += 1 self.card_count['RADM'] = nmaterials return n def _read_radmt(self, data, n): self.log.info('skipping RADMT in MPT') return len(data) def _read_nlparm(self, data, n): """ NLPARM(3003,30,286) - record 27 """ ntotal = 76 # 19*4 s = Struct(self._endian + b'iif5i3f3iffiff') nentries = (len(data) - n) // ntotal for unused_i in range(nentries): edata = data[n:n+76] out = s.unpack(edata) #(sid,ninc,dt,kMethod,kStep,maxIter,conv,intOut,epsU,epsP,epsW, # maxDiv,maxQn,maxLs,fStress,lsTol,maxBisect,maxR,rTolB) = out if self.is_debug_file: self.binary_debug.write(' NLPARM=%s\n' % str(out)) self._add_nlparm_object(NLPARM.add_op2_data(out)) n += ntotal self.card_count['NLPARM'] = nentries return n def _read_nlpci(self, data, n): self.log.info('skipping NLPCI in MPT') return len(data) def _read_tstepnl(self, data, n): """TSTEPNL(3103,31,337) - record 29""" ntotal = 88 # 19*4 s = Struct(self._endian + b'iif5i3f3if3i4f') nentries = (len(data) - n) // ntotal for unused_i in range(nentries): edata = data[n:n+88] out = s.unpack(edata) #(sid,ndt,dt,no,kMethod,kStep,maxIter,conv,epsU,epsP,epsW, # maxDiv,maxQn,maxLs,fStress,lsTol,maxBisect,adjust,mStep,rb,maxR,uTol,rTolB) = out method = out[4] if method in [4]: self.log.warning('method=4; skipping TSTEPNL=%r' % str(out)) else: self._add_tstepnl_object(TSTEPNL.add_op2_data(out)) n += ntotal self.card_count['TSTEPNL'] = nentries return n