def test_thermal_1(self): """tests various thermal cards""" model = BDF(debug=False) model.sol = 101 lines = [ 'SUBCASE 1', ' DISP(PLOT) = ALL', ' ANALYSIS = HEAT', 'BEGIN BULK', ] model.case_control_deck = CaseControlDeck(lines, log=None) model.add_grid(11, [0., 0., 0.]) model.add_grid(12, [1., 0., 0.]) model.add_grid(13, [1., 1., 0.]) model.add_grid(14, [0., 1., 0.]) model.add_grid(15, [0., 2., 0.]) eid = 1 pid = 1 mid = 1 nodes = [11, 12, 13, 14] model.add_cquad4(eid, pid, nodes, theta_mcid=0.0, zoffset=0., tflag=0, T1=1.0, T2=1.0, T3=1.0, T4=1.0, comment='') model.add_pshell(pid, mid1=1, t=0.1) eid = 10 nids = [11, 12, 13, 15] pid = 2 model.add_ctetra(eid, pid, nids) model.add_psolid(pid, mid) E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) eid = 2 Type = 'AREA3' chbdyg = CHBDYG(eid, Type, nodes, iview_front=0, ivew_back=0, rad_mid_front=0, rad_mid_back=0, comment='chbdyg') with self.assertRaises(ValueError): chbdyg.validate() Type = 'AREA4' chbdyg = model.add_chbdyg(eid, Type, nodes, iview_front=0, ivew_back=0, rad_mid_front=0, rad_mid_back=0, comment='chbdyg') chbdyg.raw_fields() eid = 3 eid2 = 4 side = 1 chbdye = model.add_chbdye(eid, eid2, side, iview_front=0, ivew_back=0, rad_mid_front=0, rad_mid_back=0, comment='chbdye') chbdye.raw_fields() eid = 4 g1 = 11 g2 = 12 pid = 10 chbdyp = model.add_chbdyp(eid, pid, Type, g1, g2, g0=0, gmid=None, ce=0, iview_front=0, ivew_back=0, rad_mid_front=0, rad_mid_back=0, e1=None, e2=None, e3=None, comment='chbdyp') chbdyp.raw_fields() phbdy = model.add_phbdy(pid, af=None, d1=None, d2=None, comment='phbdy') phbdy.raw_fields() #--------------------------- ta = 2 ta1 = 2 pconid = 11 conv = model.add_conv(eid, pconid, ta, film_node=0, cntrlnd=0, comment='conv') conv.raw_fields() pconv = model.add_pconv(pconid, mid, form=0, expf=0.0, ftype=0, tid=None, chlen=None, gidin=None, ce=0, e1=None, e2=None, e3=None, comment='pconv') pconv.raw_fields() pconid = 12 convm = model.add_convm(eid, pconid, ta1, film_node=0, cntmdot=0, ta2=None, mdot=1.0, comment='convm') convm.raw_fields() coef = 0.023 pconvm = model.add_pconvm(pconid, mid, coef, form=0, flag=0, expr=0.0, exppi=0.0, exppo=0.0, comment='pconvm') pconv.raw_fields() radmid = 42 absorb = 0.2 emissivity = 0.8 radm = model.add_radm(radmid, absorb, emissivity, comment='radm') radm.raw_fields() famb = 100. nodamb = 33 eids = [1] cntrlnd = 1000 radbc = model.add_radbc(nodamb, famb, cntrlnd, eids, comment='radbc') radbc.raw_fields() sid = 43 qvol = 17. control_point = 1001 elements = [1, 2] qvol = model.add_qvol(sid, qvol, control_point, elements, comment='qvol') qvol.raw_fields() q0 = 18. t_source = 19. eids = [2] qvect = model.add_qvect(sid, q0, eids, t_source, ce=0, vector_tableds=None, control_id=0, comment='qvect') qvect.raw_fields() q0 = 15.8 flag = 'POINT' grids = [-1] qhbdy = model.add_qhbdy(sid, flag, q0, grids, af=None, comment='qhbdy') qhbdy.raw_fields() qflux = 20. eids = [1] qbdy1 = model.add_qbdy1(sid, qflux, eids, comment='qbdy1') qbdy1.raw_fields() eid = 1 qfluxs = 12. qbdy2 = model.add_qbdy2(sid, eid, qfluxs, comment='qbdhy2') qbdy2.raw_fields() q0 = 14. cntrlnd = 57 eids = [1, 2] qbdy3 = model.add_qbdy3(sid, q0, cntrlnd, eids, comment='qbdy3') qbdy3.raw_fields() temperature = 13.3 model.add_tempd(sid, temperature, comment='tempd') temperatures = { 15: 37., 16: 38., } model.add_temp(sid, temperatures) #------------------------- bdf_filename = StringIO() bdf_filename2 = StringIO() bdf_filename3 = StringIO() bdf_filename4 = StringIO() model.validate() model._verify_bdf(xref=False) model.write_bdf(bdf_filename, encoding=None, size=8, is_double=False, interspersed=False, enddata=None, close=False) model.cross_reference() model.pop_xref_errors() model._verify_bdf(xref=True) model.write_bdf(bdf_filename2, encoding=None, size=16, is_double=False, interspersed=False, enddata=None, close=False) model.write_bdf(bdf_filename3, encoding=None, size=16, is_double=True, interspersed=False, enddata=None, close=False) write_bdf_symmetric(model, bdf_filename4, encoding=None, size=8, is_double=False, enddata=None, close=False, plane='xz') #model.cross_reference() #print(bdf_filename.getvalue()) bdf_filename2.seek(0) model2 = read_bdf(bdf_filename2, xref=False, debug=False) model2.safe_cross_reference() save_load_deck(model, punch=False)
def test_dvcrel1(self): """tests a DVCREL""" model = BDF(debug=False) oid = 10 eid = 100 cp_min = 0.01 cp_max = 1. desvar_id = 11 desvar_ids = 11 coeffs = 1.0 dvcrel1 = model.add_dvcrel1(oid, 'CONM2', eid, 'X2', desvar_ids, coeffs, cp_min, cp_max, c0=0., validate=True, comment='') label = 'X2_MASS' xinit = 0.1 xlb = 0.01 xub = 1.0 desvar = model.add_desvar(desvar_id, label, xinit, xlb, xub, comment='desvar') mass = 1. nid1 = 100 nid2 = 101 conm2 = model.add_conm2(eid, nid1, mass, cid=0, X=None, I=None, comment='conm2') model.add_grid(100, xyz=[1., 2., 3.]) model.add_grid(101, xyz=[2., 2., 4.]) eid = 101 pid = 102 x = [1., 0., 0.] g0 = None cbar = model.add_cbar(eid, pid, nid1, nid2, x, g0, offt='GGG', pa=0, pb=0, wa=None, wb=None, comment='cbar') oid = 11 equation_id = 100 dvcrel2 = model.add_dvcrel2(oid, 'CBAR', eid, 'X3', equation_id, desvar_ids, labels=None, cp_min=2., cp_max=4., validate=True, comment='dvcrel2') mid = 1000 dim = [1., 2., 0.1, 0.2] model.add_pbarl(pid, mid, 'T', dim, group='MSCBMLO', nsm=0.1, comment='pbarl') E = 30.e7 G = None nu = 0.3 mat1 = model.add_mat1(mid, E, G, nu, rho=0.1, comment='mat1') name = 'fx2' eqs = ['fx2(x) = x + 10.'] deqatn = model.add_deqatn(name, equation_id, eqs, comment='deqatn') dvcrel1.raw_fields() dvcrel2.raw_fields() dvcrel1.write_card(size=16) dvcrel2.write_card(size=16) dvcrel1.comment = '' dvcrel2.comment = '' desvar.comment = '' dvcrel1_msg = dvcrel1.write_card(size=8) dvcrel2_msg = dvcrel2.write_card(size=8) desvar_msg = desvar.write_card(size=8) model.validate() model.cross_reference() dvcrel1.raw_fields() dvcrel1.write_card(size=16) dvcrel1.write_card(size=8) dvcrel2.raw_fields() dvcrel2.write_card(size=16) dvcrel2.write_card(size=8) assert cbar.Mass() > 0, cbar.Mass() #------------------------------------------- dvcrel1_lines = dvcrel1_msg.split('\n') dvcrel2_lines = dvcrel2_msg.split('\n') desvar_lines = desvar_msg.split('\n') model2 = BDF(debug=False) model2.add_card(dvcrel1_lines, 'DVCREL1', is_list=False) model2.add_card(dvcrel2_lines, 'DVCREL2', is_list=False) model2.add_card(desvar_lines, 'DESVAR', is_list=False)
def test_loads_sum_05(self): """ tests: - 1=LOAD/PLOAD4 - 2=LOAD/PLOAD4/FORCE - 5=PLOAD4 - 6=PLOAD4 - 1001=PLOAD4 - 1002=1002 - 1003=PLOAD """ model = BDF(log=log, debug=False) bdf_filename = os.path.join(model_path, 'real', 'loads', 'loads.bdf') model.read_bdf(bdf_filename) p = 3. A = 1. n = array([0., 0., 1.]) F1001_expected = p * A * n r = array([0.5, 1.5, 0.]) p0 = array([0., 0., 0.]) M1001_expected = cross(r, F1001_expected) loadcase_id = 1001 eids = None nids = None F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F1001_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F1001_expected, F)) self.assertTrue( allclose(M1001_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M1001_expected, M)) loadcase_id = 1002 r = array([4., 2., 0.]) F1002_expected = array([0., 0., 1.]) M1002_expected = cross(r, F1002_expected) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) self.assertTrue( allclose(F1002_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F1002_expected, F)) self.assertTrue( allclose(M1002_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M1002_expected, M)) loadcase_id = 1 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F1001_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F1001_expected, F)) self.assertTrue( allclose(M1001_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M1001_expected, M)) loadcase_id = 2 F2_expected = F1001_expected + F1002_expected M2_expected = M1001_expected + M1002_expected F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F2_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F2_expected, F)) self.assertTrue( allclose(M2_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M2_expected, M)) F6_expected = 2. * (3. * F1001_expected + 13. * F1002_expected) M6_expected = 2. * (3. * M1001_expected + 13. * M1002_expected) F7_expected = 7. * 11. * F6_expected M7_expected = 7. * 11. * M6_expected if 0: # pragma: no cover loadcase_id = 6 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F6_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F6_expected, F)) self.assertTrue( allclose(M6_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M6_expected, M)) loadcase_id = 7 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F7_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F7_expected, F)) self.assertTrue( allclose(M7_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M7_expected, M)) loadcase_id = 5 p = 2. A = 1. n = array([0., 1., 1.]) / np.sqrt(2.) F5_expected = p * A * n r = array([0.5, 0.5, 0.]) M5_expected = cross(r, F5_expected) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F5_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F5_expected, F)) self.assertTrue( allclose(M5_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M5_expected, M)) #print('loadcase_id=%s F=%s M=%s' % (loadcase_id, F, M)) loadcase_id = 6 p = 2. A = 1. n = array([0., 0., 0.5]) / 0.5 F6_expected = p * A * n r = array([0.5, 0.5, 0.]) M6_expected = cross(r, F6_expected) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F6_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F6_expected, F)) self.assertTrue( allclose(M6_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M6_expected, M)) #print('loadcase_id=%s F=%s M=%s' % (loadcase_id, F, M)) loadcase_id = 1003 p = 9. A = 1. n = array([0., 0., 1.]) F1003_expected = p * A * n r = array([0.5, 0.5, 0.]) M1003_expected = cross(r, F1003_expected) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F1003_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F1003_expected, F)) self.assertTrue( allclose(M1003_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M1003_expected, M)) loadcase_id = 8 F8_expected = 2. * (3. * F7_expected + 2. * F1003_expected) M8_expected = 2. * (3. * M7_expected + 2. * M1003_expected) if 0: # pragma: no cover F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F8_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F8_expected, F)) self.assertTrue( allclose(M8_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M8_expected, M)) loadcase_id = 800 p = 3.5 A = 1. n = array([0., 0., 1.]) F800_expected = p * A * n r = array([3.5, 1.5, 0.]) M800_expected = cross(r, F800_expected) if 0: # pragma: no cover F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F800_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F800_expected, F)) self.assertTrue( allclose(M800_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M800_expected, M)) loadcase_id = 801 F801_expected = F800_expected M801_expected = M800_expected if 0: # pragma: no cover F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F801_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F801_expected, F)) self.assertTrue( allclose(M801_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M801_expected, M)) loadcase_id = 802 p = 3.5 A = 0.5 n = array([0., 0., 1.]) F802_expected = p * A * n rx = (3. + 4. + 4.) / 3. ry = (1. + 1. + 2.) / 3. r = array([rx, ry, 0.]) M802_expected = cross(r, F802_expected) if 0: # pragma: no cover F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F802_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F802_expected, F)) self.assertTrue( allclose(M802_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M802_expected, M)) bdf_file = StringIO() model.write_bdf(bdf_file, close=False) bdf_file.seek(0) model.write_bdf(bdf_file, size=16)
def test_cbeam_02(self): """CBEAM/PBEAML""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [0., 1., 0.]) mid = 1 E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu, rho=1.) #--------------------------------------------------------------- eid = 1 pid = 101 nids = [1, 2] x = [0., 0., 1.] g0 = None cbeam1 = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'BOX' xxb = [0.] dims = [[1., 2., 0.1, 0.1], [1., 2., 0.1, 0.1]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 2 pid = 102 x = None g0 = 3 cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'BOX' xxb = [0.] dims = [[1., 2., 0.1, 0.1]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 3 pid = 103 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'BAR' xxb = [0.] dims = [[2., 3.]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 4 pid = 104 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'ROD' xxb = [0.] dims = [[2.]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 5 pid = 105 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'TUBE' xxb = [0.] dims = [[2., 1.]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 6 pid = 106 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'L' xxb = [0.] dims = [[2., 2., 0.1, 0.1]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 7 pid = 107 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'T' xxb = [0.] dims = [[1., 2., 0.1, 0.2]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 8 pid = 108 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'T1' xxb = [0.] dims = [[1., 2., 0.2, 0.1]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 9 pid = 109 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') beam_type = 'T2' xxb = [0.] dims = [[1., 2., 0.2, 0.1]] pbeaml = model.add_pbeaml(pid, mid, beam_type, xxb, dims, nsm=None, so=None, comment='PBEAML') #--------------------------------------------------------------- eid = 10 pid = 110 x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=42, pb=5, wa=None, wb=None, sa=0, sb=0, comment='CBEAM') #pid : int #property id #mid : int #material id #xxb : List[float] #The percentage locations along the beam [0., ..., 1.] #so : List[str] #YES, YESA, NO #area : List[float] #area #i1, i2, i12, j : List[float] #moments of inertia #nsm : List[float] #nonstructural mass per unit length #c1/c2, d1/d2, e1/e2, f1/f2 : List[float] #the y/z locations of the stress recovery points #c1 - point C.y #c2 - point C.z xxb = [0.] so = [2.] area = [3.] i1 = [4.] i2 = [5.] i12 = [0.6] j = [7.] nsm = [0.08] c1 = [0.] c2 = [0.] d1 = [0.] d2 = [0.] e1 = [0.] e2 = [0.] f1 = [0.] f2 = [0.] pbeam = model.add_pbeam(pid, mid, xxb, so, area, i1, i2, i12, j, nsm, c1, c2, d1, d2, e1, e2, f1, f2, k1=1., k2=1., s1=0., s2=0., nsia=0., nsib=None, cwa=0., cwb=None, m1a=0., m2a=None, m1b=0., m2b=None, n1a=0., n2a=None, n1b=0., n2b=None, comment='pbeam') #print(pbeam) #--------------------------------------------------------------- model.validate() model.pop_parse_errors() model.pop_xref_errors() pbeaml.raw_fields() pbeaml.write_card_16() model._verify_bdf(xref=False) #---------------- model.cross_reference() model._verify_bdf(xref=True) model.mass_properties() pids_to_area = model.get_area_breakdown(property_ids=None, sum_bar_area=False) for pid, area in sorted(pids_to_area.items()): assert area > 0., 'pid=%s area=%s' % (pid, area) pids_to_mass, _mass_type_to_mass = model.get_mass_breakdown( property_ids=None) for pid, mass in sorted(pids_to_mass.items()): assert mass > 0., 'pid=%s mass=%s' % (pid, mass) #-------------------- model.uncross_reference() model._verify_bdf(xref=False) model.safe_cross_reference() model.uncross_reference()
def test_dvprel1(self): """tests a DESVAR, DVPREL1, DRESP1, DCONSTR""" model = BDF(debug=False) oid = 10 desvar_id = 12 desvar_ids = 12 Type = 'PSHELL' pid = 20 eid = 25 mid = 30 pname_fid = 'T' coeffs = 1. E = 30.e7 G = None nu = 0.3 nids = [1, 2, 3] label = 'T_SHELL' xinit = 0.1 xlb = 0.01 xub = 2.0 model.add_grid(1, xyz=[0., 0., 0.]) model.add_grid(2, xyz=[1., 0., 0.]) model.add_grid(3, xyz=[1., 1., 0.]) ctria3 = model.add_ctria3(eid, pid, nids, comment='ctria3') pshell = model.add_pshell(pid, mid1=30, t=0.1, comment='pshell') mat1 = model.add_mat1(mid, E, G, nu, rho=0.1, comment='mat1') desvar = model.add_desvar(desvar_id, label, xinit, xlb, xub, comment='desvar') dvprel1 = model.add_dvprel1(oid, Type, pid, pname_fid, desvar_ids, coeffs, p_min=None, p_max=1e20, c0=0.0, validate=True, comment='dvprel') deqation = 100 dvids = desvar_id labels = None dvprel2 = model.add_dvprel2(oid + 1, Type, pid, pname_fid, deqation, dvids, labels, p_min=None, p_max=1e20, validate=True, comment='') equation_id = 100 name = 'fstress' eqs = ['fstress(x) = x + 10.'] deqatn = model.add_deqatn(name, equation_id, eqs, comment='deqatn') #print(deqatn.object_attributes()) #print(deqatn.func_str) #print(deqatn) dresp_id = 42 label = 'STRESS1' response_type = 'STRESS' property_type = 'PSHELL' region = None atta = 9 attb = None atti = pid dresp1 = model.add_dresp1(dresp_id, label, response_type, property_type, region, atta, attb, atti, validate=True, comment='dresp1') dconstr = model.add_dconstr(oid, dresp_id, lid=-1.e20, uid=1.e20, lowfq=0., highfq=1.e20, comment='dconstr') desvar.write_card(size=8) desvar.write_card(size=16) dvprel1.write_card(size=8) dvprel1.write_card(size=16) dconstr.write_card(size=8) dconstr.write_card(size=16) dresp1.write_card(size=8) dresp1.write_card(size=16) dresp1.write_card(size=16, is_double=True) model.validate() #model._verify_bdf(xref=False) model.cross_reference() desvar.write_card(size=8) desvar.write_card(size=16) desvar.raw_fields() dvprel1.write_card(size=8) dvprel1.write_card(size=16) dvprel1.raw_fields() dconstr.write_card(size=8) dconstr.write_card(size=16) dconstr.raw_fields() dresp1.write_card(size=8) dresp1.write_card(size=16) dresp1.raw_fields() stringio = StringIO() model.write_bdf(stringio, close=False) stringio.getvalue()
def test_shells(self): """tests a CTRIA3/CQUAD4/PSHELL and CTRIA6/CQUAD8/CQUAD/PCOMP""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) model.add_grid(5, [.5, 0., 0.]) model.add_grid(6, [1., 0.5, 0.]) model.add_grid(7, [.5, 1., 0.]) model.add_grid(8, [0., .5, 0.]) model.add_grid(9, [.5, .5, 0.]) E = 30.e7 G = None nu = 0.3 model.add_mat1(1, E, G, nu, rho=0.1) model.add_mat1(2, E, G, nu, rho=0.1) model.add_mat1(3, E, G, nu, rho=0.1) pid = 1 nids = [1, 2, 3] model.add_ctria3(1, pid, nids) nids = [1, 2, 3, 4] model.add_cquad4(2, pid, nids) model.add_pshell(pid, mid1=2, t=0.1) pid = 2 nids = [1, 2, 3, 5, 6, 9] ctria6 = model.add_ctria6(3, pid, nids, comment='ctria6') nids = [1, 2, 3, 4, 5, 6, 7, 8] cquad8 = model.add_cquad8(4, pid, nids, comment='cquad8') nids = [1, 2, 3, 4, 5, 6, 7, 8, 9] cquad = model.add_cquad(5, pid, nids, comment='cquad') mids = [1, 2, 3] thicknesses = [0.1, 0.2, 0.3] pcomp = model.add_pcomp(pid, mids, thicknesses) assert pcomp.Thickness() == sum(thicknesses), thicknesses pcomp.lam = 'SYM' assert pcomp.Thickness() == sum(thicknesses) * 2, thicknesses model.validate() ctria6.raw_fields() ctria6.write_card(size=8) cquad8.raw_fields() cquad8.write_card(size=8) cquad.raw_fields() cquad.write_card(size=8) pcomp.raw_fields() pcomp.write_card(size=8) pcomp.write_card(size=16) pcomp.write_card(size=16, is_double=True) model._verify_bdf(xref=False) params = [('T1', 1.0), ('THETA1', 2.0), ('Z0', 3.0), ('SB', 4.0), ('TREF', 0.0), ('GE', 0.1)] make_dvprel_optimization(model, params, 'PCOMP', pid) #-------------------------------- model.cross_reference() model._verify_bdf(xref=True) model.get_area_breakdown(property_ids=None, stop_if_no_area=True) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=False) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=True) model.get_volume_breakdown(property_ids=None, stop_if_no_volume=True) model.update_model_by_desvars(xref=True) ctria6.raw_fields() ctria6.write_card(size=8) cquad8.raw_fields() cquad8.write_card(size=8) cquad.raw_fields() cquad.write_card(size=8) pcomp.raw_fields() pcomp.write_card(size=8) pcomp.write_card(size=16) pcomp.write_card(size=16, is_double=True) model._verify_bdf(xref=False)
def test_pbcomp(self): """tests a PBCOMP""" model = BDF(debug=False) pid = 100 mid = 101 y = [0., 1.] z = [0., 1.] c = [0., 1.] mids = [mid, mid] pbcomp = model.add_pbcomp(pid, mid, y, z, c, mids, area=0.0, i1=0.0, i2=0.0, i12=0.0, j=0.0, nsm=0.0, k1=1.0, k2=1.0, m1=0.0, m2=0.0, n1=0.0, n2=0.0, symopt=0, comment='pbcomp') pbcomp.validate() pbcomp.raw_fields() pbcomp.write_card() pbcomp.write_card(size=16) eid = 10 nids = [1, 5] x = [0., 0., 1.] g0 = None cbeam = model.add_cbeam(eid, pid, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=None, wb=None, sa=0, sb=0, comment='') E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) model.add_grid(1, [0., 0., 0.]) model.add_grid(5, [1., 0., 0.]) model.validate() model.pop_parse_errors() model.cross_reference() model.pop_xref_errors() save_load_deck(model)
def test_dvprel1(self): """tests a DESVAR, DVPREL1, DVPREL2, DRESP1, DRESP2, DRESP3, DCONSTR, DSCREEN, DCONADD""" model = BDF(debug=False) dvprel1_id = 10 desvar_id = 12 desvar_ids = 12 prop_type = 'PSHELL' pid = 20 eid = 25 mid = 30 pname_fid = 'T' coeffs = 1. E = 30.e7 G = None nu = 0.3 nids = [1, 2, 3] label = 'T_SHELL' xinit = 0.1 xlb = 0.01 xub = 2.0 p_max = 1e20 model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_ctria3(eid, pid, nids, comment='ctria3') model.add_pshell(pid, mid1=30, t=0.1, comment='pshell') model.add_mat1(mid, E, G, nu, rho=0.1, comment='mat1') desvar = model.add_desvar(desvar_id, label, xinit, xlb, xub, comment='desvar') dvprel1 = model.add_dvprel1(dvprel1_id, prop_type, pid, pname_fid, desvar_ids, coeffs, p_min=None, p_max=p_max, c0=0.0, validate=True, comment='dvprel1') dvprel2_id = dvprel1_id + 1 deqation = 100 dvids = desvar_id labels = None dvprel2 = model.add_dvprel2(dvprel2_id, prop_type, pid, pname_fid, deqation, dvids, labels, p_min=None, p_max=p_max, validate=True, comment='dvprel2') equation_id = 100 eqs = ['fstress(x) = x + 10.'] model.add_deqatn(equation_id, eqs, comment='deqatn') #print(deqatn.object_attributes()) #print(deqatn.func_str) #print(deqatn) dresp1_id = 42 label = 'STRESS1' response_type = 'STRESS' property_type = 'PSHELL' region = None atta = 9 attb = None atti = pid dresp1 = model.add_dresp1(dresp1_id, label, response_type, property_type, region, atta, attb, atti, validate=True, comment='dresp1') assert dresp1.rtype == dresp1.response_type assert dresp1.ptype == dresp1.property_type dresp1.rtype = response_type dresp1.ptype = property_type dconstr = model.add_dconstr(dresp1_id, dresp1_id, lid=-1.e20, uid=1.e20, lowfq=0., highfq=1.e20, comment='dconstr') params = { (0, 'DRESP1') : [42], (1, 'DESVAR') : [12], (3, 'DNODE') : [[100, 101], [1, 2]], } dresp2_id = 43 dequation = equation_id label = 'dresp2' region = None dresp2 = model.add_dresp2(dresp2_id, label, dequation, region, params, method='MIN', c1=100., c2=0.005, c3=None, comment='dresp2') dresp2.raw_fields() dresp3_id = 44 label = 'dresp3' group = 'cat' Type = 'dog' region = None params = { (0, 'DRESP1') : [42], (1, 'DESVAR') : [12], (2, 'DRESP2') : [dresp2_id], (2, 'DVPREL1') : [dvprel1_id], (3, 'DVPREL2') : [dvprel2_id], (3, 'DNODE') : [[100, 101], [1, 2]], } dresp3 = model.add_dresp3(dresp3_id, label, group, Type, region, params, comment='dresp3') dresp3.raw_fields() oid = 1001 dconstr = model.add_dconstr(oid, dresp1_id, lid=-1.e20, uid=1.e20, lowfq=0., highfq=1.e20, comment='dconstr1') oid = 1002 dconstr = model.add_dconstr(oid, dresp2_id, lid=-1.e20, uid=1.e20, lowfq=0., highfq=1.e20) oid = 1003 dconstr = model.add_dconstr(oid, dresp3_id, lid=-1.e20, uid=1.e20, lowfq=0., highfq=1.e20) oid = 45 dconstrs = [1001, 1002, 1003] dconadd = model.add_dconadd(oid, dconstrs, comment='dconadd') dscreen = model.add_dscreen('dunno', comment='dscreen') dscreen.raw_fields() #print(dresp3) grid = model.add_grid(100, [0., 0., 0.]) model.add_grid(101, [0., 0., 0.]) model.pop_parse_errors() desvar.write_card(size=8) desvar.write_card(size=16) dvprel1.write_card(size=8) dvprel1.write_card(size=16) dconstr.write_card(size=8) dconstr.write_card(size=16) dresp1.write_card(size=8) dresp1.write_card(size=16) dresp1.write_card(size=16, is_double=True) dresp2.write_card(size=8) dresp2.write_card(size=16) dresp2.write_card(size=16, is_double=True) dresp3.write_card(size=8) dresp3.write_card(size=16) dresp3.write_card(size=16, is_double=True) dvprel2.write_card(size=8) dvprel2.write_card(size=16) dvprel2.write_card(size=16, is_double=True) dconadd.write_card(size=8) dconadd.write_card(size=16) dconadd.write_card(size=16, is_double=True) dscreen.write_card(size=8) dscreen.write_card(size=16) dscreen.write_card(size=16, is_double=True) model.validate() model._verify_bdf(xref=False) model.cross_reference() model.pop_xref_errors() desvar.write_card(size=8) desvar.write_card(size=16) desvar.raw_fields() dvprel1.write_card(size=8) dvprel1.write_card(size=16) dvprel1.raw_fields() dconstr.write_card(size=8) dconstr.write_card(size=16) dconstr.raw_fields() dresp1.write_card(size=8) dresp1.write_card(size=16) dresp1.raw_fields() dresp2.write_card(size=8) dresp2.write_card(size=16) dresp2.write_card(size=16, is_double=True) dresp3.write_card(size=8) dresp3.write_card(size=16) dresp3.write_card(size=16, is_double=True) dvprel2.write_card(size=8) dvprel2.write_card(size=16) dvprel2.write_card(size=16, is_double=True) dconadd.write_card(size=8) dconadd.write_card(size=16) dconadd.write_card(size=16, is_double=True) grid.nid = 200 assert '200' in str(dresp3), dresp3 save_load_deck(model, run_convert=False)
def test_opt_2(self): """tests updating model based on DESVARs""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) eid = 1 pid_pshell = 1 nids = [1, 2, 3, 4] model.add_cquad4(eid, pid_pshell, nids) delta = 0.1 #--------------------------------------------------- model.add_pshell(pid_pshell, mid1=1, t=0.1) c2 = 0.5 t2 = 1.0 c0p = 0.1 # 0.1 + 0.5*1.0 = 0.6 tnew = c0p + c2 * (t2 + delta) model.add_desvar(2, 'T2', t2) desvars = [2] # desvar coeffs = [c2] prop_type = 'PSHELL' pname_fid = 'T' model.add_dvprel1(1, prop_type, pid_pshell, pname_fid, desvars, coeffs, p_min=None, p_max=1e20, c0=c0p, validate=True, comment='') #--------------------------------------------------- mid = 1 E = 1.0 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) c1 = 0.5 e1 = 110. c0m = 100. model.add_desvar(1, 'E1', e1) mat_type = 'MAT1' mp_name = 'E' coeffs = [c1] desvars = [1] # 100 + 0.5 * 110 = 100 + 55 = 155 enew = c0m + c1 * (e1 + delta) model.add_dvmrel1(2, mat_type, mid, mp_name, desvars, coeffs, mp_min=None, mp_max=1e20, c0=c0m, validate=True, comment='') #--------------------------------------------------- eid_conm2 = 2 nid = 1 mass = 0.1 model.add_conm2(eid_conm2, nid, mass, cid=0, X=None, I=None, comment='') c3 = 1.0 mass3 = 12. model.add_desvar(3, 'MASS', mass3) element_type = 'CONM2' cp_name = 'M' coeffs = [c3] desvars = [3] mass0 = 0. # ??? mass_new = mass0 + c3 * (mass3 + delta) model.add_dvcrel1(3, element_type, eid_conm2, cp_name, desvars, coeffs, cp_min=None, cp_max=1e20, c0=mass0, validate=True, comment='') #--------------------------------------------------- x14 = 37. model.add_desvar(4, 'X1', x14) element_type = 'CONM2' cp_name = 'X1' c4 = 1. x10 = 0. coeffs = [c4] desvars = [4] x1_new = x10 + c4 * (x14 + delta) model.add_dvcrel1(4, element_type, eid_conm2, cp_name, desvars, coeffs, cp_min=None, cp_max=1e20, c0=x10, validate=True, comment='') #--------------------------------------------------- pid_pcomp = 2 mids = [1] thicknesses = [1.] model.add_pcomp(pid_pcomp, mids, thicknesses, thetas=None, souts=None, nsm=0., sb=0., ft=None, tref=0., ge=0., lam=None, z0=None, comment='') t5 = 5. model.add_desvar(5, 'T5', t5) prop_type = 'PCOMP' pname_fid = 'T1' desvars = [5] # desvar coeffs = [1.0] tpcomp_new = t5 + delta model.add_dvprel1(5, prop_type, pid_pcomp, pname_fid, desvars, coeffs, p_min=None, p_max=1e20, c0=0., validate=True, comment='') #--------------------------------------------------- model.validate() model.cross_reference() model.update_model_by_desvars() assert model.properties[pid_pshell].t == tnew, 't=%s tnew=%s' % (model.properties[pid_pshell].t, tnew) assert model.materials[mid].e == enew, 'E=%s enew=%s' % (model.materials[mid].e, enew) assert model.Mass(eid_conm2).mass == mass_new, 'mass=%s mass_new=%s' % (model.Mass(eid_conm2).mass, mass_new) assert model.Mass(eid_conm2).X[0] == x1_new, 'X1=%s x1_new=%s' % (model.Mass(eid_conm2).mass, x1_new) assert model.properties[pid_pcomp].thicknesses[0] == tpcomp_new, 't=%s tnew=%s' % (model.properties[pid_pcomp].thicknesses[0], tpcomp_new)
def test_ptube_nsm(self): """tests a PTUBE for the NSM field""" model = BDF(debug=False) pid = 1 mid = 1 nsm = 1. OD1 = 2.0 ptube = model.add_ptube(pid, mid, OD1, t=None, nsm=nsm, OD2=None, comment='ptube') #print(ptube) E = 1.0 G = None nu = 0.3 rho = 0.0 mat1 = model.add_mat1(mid, E, G, nu, rho=rho) #---------------- card_lines = [ 'PTUBE 2 1 2. 1.', ] model.add_card(card_lines, 'PTUBE', comment='', is_list=False, has_none=True) model.pop_parse_errors() ptube2 = model.properties[2] #print(ptube.get_stats()) #------------------ model.cross_reference() assert ptube.Nsm() == 1.0 area = pi mpl = area * rho + nsm assert ptube.Area() == area, ptube.Area() # mass/L = area*rho + nsm assert ptube.MassPerLength() == 1.0, ptube.MassPerLength() rho = 10.0 mat1.rho = rho mpl = area * rho + nsm assert ptube2.MassPerLength() == mpl, ptube2.MassPerLength() eid = 100 nids = [10, 12] ctube = model.add_ctube(eid, pid, nids, comment='ctube') model.add_grid(10, [0., 0., 0.]) model.add_grid(12, [2., 0., 0.]) model.safe_cross_reference() model.uncross_reference() model.cross_reference() assert ctube.get_edge_ids() == [(10, 12)] mass, cg, inertia = mass_properties( model, element_ids=None, mass_ids=None, reference_point=None, sym_axis=None, scale=None, inertia_reference='cg') # L * (rho * a + nsm) A = pi * (OD1**2) / 4. mass_expected = 2.0 * (rho * A + nsm) assert np.allclose(mass, mass_expected), mass save_load_deck(model)
import unittest import os import pyNastran from pyNastran.bdf.bdf import BDF from numpy import array, array_equal, sqrt, sin, cos, radians root_path = pyNastran.__path__[0] #test_path = os.path.join(root_path, 'bdf', 'cards', 'test') comment_bad = 'this is a bad comment' comment_good = 'this is a good comment\n' model = BDF(debug=None) class TestAero(unittest.TestCase): """ The Aero cards are: * AEFACT * AELINK * AELIST * AEPARM * AESTAT * AESURF / AESURFS * AERO / AEROS * CSSCHD * CAERO1 / CAERO2 / CAERO3 / CAERO4 / CAERO5 * FLFACT * FLUTTER * GUST
def get_mass(self, nid1, nid2, xyz1, xyz2, eid, pid, mid, A, J, c, nsm, E, G, nu, rho, L): """tests a CROD and a CONROD""" model = BDF(debug=False) lines = ['conrod,%i, %i, %i, %i, %f, %f, %f, %f' % (eid, nid1, nid2, mid, A, J, c, nsm)] card = model._process_card(lines) cardi = BDFCard(card) conrod = CONROD.add_card(cardi) model._add_element_object(conrod) card = model.elements[eid] node_ids = card.node_ids assert node_ids == [nid1, nid2], node_ids # probably wrong assert conrod.get_edge_ids() == [(nid1, nid2)] lines = ['crod,%i, %i, %i, %i' % (eid+1, pid, nid1, nid2)] card = model._process_card(lines) cardi = BDFCard(card) crod = CROD.add_card(cardi) model._add_element_object(crod) card = model.elements[eid+1] node_ids = card.node_ids assert node_ids == [nid1, nid2], node_ids # probably wrong assert crod.get_edge_ids() == [(nid1, nid2)] lines = ['ctube,%i, %i, %i, %i' % (eid+2, pid+1, nid1, nid2)] card = model._process_card(lines) cardi = BDFCard(card) ctube = CTUBE.add_card(cardi) model._add_element_object(ctube) card = model.elements[eid+2] node_ids = card.node_ids assert node_ids == [nid1, nid2], node_ids # probably wrong assert ctube.get_edge_ids() == [(nid1, nid2)] lines = ['prod,%i, %i, %f, %f, %f, %f' % (pid, mid, A, J, c, nsm)] card = model._process_card(lines) cardi = BDFCard(card) prod = PROD.add_card(cardi) model._add_property_object(prod) #self.pid = integer(card, 1, 'pid') #self.mid = integer(card, 2, 'mid') #self.OD1 = double(card, 3, 'OD1') #self.t = double_or_blank(card, 4, 't', self.OD1 / 2.) #self.nsm = double_or_blank(card, 5, 'nsm', 0.0) #self.OD2 = double_or_blank(card, 6, 'OD2', self.OD1) OD1 = sqrt(4*A/pi) t = 0. OD2 = OD1 lines = ['ptube,%i, %i, %f, %f, %f, %f' % (pid+1, mid, OD1, t, nsm, OD2)] card = model._process_card(lines) cardi = BDFCard(card) ptube = PTUBE.add_card(cardi) model._add_property_object(ptube) lines = ['mat1,%i, %.2e, %.2e, %f, %f' % (mid, E, G, nu, rho)] card = model._process_card(lines) cardi = BDFCard(card) card = MAT1.add_card(cardi) model._add_structural_material_object(card) lines = ['grid,%i, %i, %f, %f, %f' % (nid1, 0, xyz1[0], xyz1[1], xyz1[2])] card = model._process_card(lines) cardi = BDFCard(card) card = GRID.add_card(cardi) model._add_node_object(card) lines = ['grid,%i, %i, %f, %f, %f' % (nid2, 0, xyz2[0], xyz2[1], xyz2[2])] card = model._process_card(lines) cardi = BDFCard(card) card = GRID.add_card(cardi) model._add_node_object(card) model.cross_reference() mass = L * (rho * A + nsm) # conrod self.assertEqual(conrod.eid, eid) self.assertEqual(conrod.Pid(), -10) self.assertEqual(conrod.Mid(), mid) self.assertEqual(conrod.Length(), L) self.assertEqual(conrod.Nsm(), nsm) self.assertEqual(conrod.Mass(), mass) self.assertEqual(conrod.E(), E) self.assertEqual(conrod.G(), G) self.assertEqual(conrod.Area(), A) self.assertEqual(conrod.J(), J) self.assertEqual(conrod.C(), c) self.assertEqual(conrod.Rho(), rho) # crod self.assertEqual(crod.eid, eid+1) self.assertEqual(crod.Pid(), pid) self.assertEqual(crod.Mid(), mid) self.assertEqual(crod.Length(), L) self.assertEqual(crod.Nsm(), nsm) self.assertEqual(crod.Mass(), mass) self.assertEqual(crod.E(), E) self.assertEqual(crod.G(), G) self.assertEqual(crod.Area(), A) self.assertEqual(crod.J(), J) self.assertEqual(crod.C(), c) self.assertEqual(crod.Rho(), rho) #self.assertEqual(crod.Nu(), nu) # prod self.assertEqual(prod.Pid(), pid) self.assertEqual(prod.Mid(), mid) self.assertEqual(prod.Nsm(), nsm) self.assertEqual(prod.E(), E) self.assertEqual(prod.G(), G) self.assertEqual(prod.Area(), A) self.assertEqual(prod.J(), J) self.assertEqual(prod.C(), c) self.assertEqual(prod.Rho(), rho) # ctube self.assertEqual(ctube.eid, eid+2) self.assertEqual(ctube.Pid(), pid+1) self.assertEqual(ctube.Mid(), mid) self.assertEqual(ctube.Length(), L) self.assertEqual(ctube.Nsm(), nsm) self.assertAlmostEqual(ctube.Mass(), mass, 5) self.assertEqual(ctube.E(), E) self.assertEqual(ctube.G(), G) self.assertAlmostEqual(ctube.Area(), A, 5) ctube.J() self.assertEqual(ctube.Rho(), rho) # ptube self.assertEqual(ptube.Pid(), pid+1) self.assertEqual(ptube.Mid(), mid) self.assertEqual(ptube.Nsm(), nsm) self.assertEqual(ptube.E(), E) self.assertEqual(ptube.G(), G) self.assertAlmostEqual(ptube.Area(), A, 5) ptube.J() self.assertEqual(ptube.Rho(), rho)
from io import StringIO from math import pi, sqrt import unittest import numpy as np from pyNastran.bdf.bdf import BDF, BDFCard from pyNastran.bdf.bdf import CROD, CONROD, PROD, CTUBE, PTUBE, GRID, MAT1 from pyNastran.bdf.cards.test.test_shells import make_dvprel_optimization from pyNastran.bdf.cards.test.utils import save_load_deck, mass_properties #from pyNastran.bdf.field_writer_8 import print_card_8 bdf = BDF(debug=False) class TestRods(unittest.TestCase): def test_crod_01(self): lines = ['CROD 10 100 10 2'] card = bdf._process_card(lines) cardi = BDFCard(card) size = 8 crod = CROD.add_card(cardi) crod.write_card(size, 'dummy') crod.raw_fields() self.assertEqual(crod.eid, 10) self.assertEqual(crod.Pid(), 100) node_ids = crod.node_ids assert node_ids == [10, 2], node_ids # probably wrong assert crod.get_edge_ids() == [(2, 10)] def test_prod_nsm(self):
def cart3d_to_nastran_model(cart3d_filename, log=None, debug=False): """ Converts a Cart3D file to Nastran format and returns a BDF() object. Parameters ---------- cart3d_filename : str path to the input Cart3D file log : log / None log : a logger object None : a log will be defined debug : bool True/False (used if log is not defined) Returns ------- bdf_model : BDF BDF() model object """ if isinstance(cart3d_filename, Cart3D): cart3d = cart3d_filename else: cart3d = read_cart3d(cart3d_filename, log=log, debug=debug, result_names=None) nodes = cart3d.nodes elements = cart3d.elements + 1 regions = cart3d.regions if regions.min() == 0: # bit of a hack to take an invalid cart3d model and make it # work in Nastran, which requires property_ids > 0 regions += 1 i = 0 nid = 1 cid = 0 model = BDF(log=log, debug=debug) for node in nodes: card = ['GRID', nid, cid] + list(node) model.add_card(card, 'GRID', is_list=True) nid += 1 eid = 1 for (n1, n2, n3), pid in zip(elements, regions): card = ['CTRIA3', eid, pid, n1, n2, n3] model.add_card(card, 'CTRIA3', is_list=True) #print(model.elements[eid]) eid += 1 t = 0.1 E = 1e7 nu = 0.3 for pid in unique(regions): mid = pid card = ['PSHELL', pid, mid, t] model.add_card(card, 'PSHELL', is_list=True) card = ['MAT1', mid, E, None, nu] model.add_card(card, 'MAT1', is_list=True) model.pop_parse_errors() return model
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 params = [ ('T', 1.0), (6, 2.0), # 12I/T3 (8, 3.0), # 'TST' ] make_dvprel_optimization(model, params, 'PSHELL', pid) # get node IDs with cross referencing model.cross_reference() model.update_model_by_desvars(xref=True) 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 save_load_deck(model)
def test_dvmrel1(self): """tests a DVMREL1""" model = BDF(debug=False) model.add_desvar(11, 'X11', 1.0) oid = 10 mid1 = 4 mp_min = 1e6 mp_max = 1e7 dvids = 11 coeffs = 1.0 dvmrel1_1 = model.add_dvmrel1(oid, 'MAT1', mid1, 'E', dvids, coeffs, mp_min=mp_min, mp_max=mp_max, c0=0., validate=True, comment='dmvrel') oid = 11 mid8 = 8 dvmrel1_8 = model.add_dvmrel1(oid, 'MAT8', mid8, 'NU12', dvids, coeffs, mp_min=0.25, mp_max=0.3, c0=0., validate=True, comment='dmvrel') oid = 12 mid10 = 10 dvmrel1_10 = model.add_dvmrel1(oid, 'MAT10', mid10, 'RHO', dvids, coeffs, mp_min=0.1, mp_max=0.2, c0=0., validate=True, comment='dmvrel') oid = 21 deqation = 42 mp_name = 'E' mat_type = 'MAT1' labels = [] dvmrel2_1 = model.add_dvmrel2(oid, mat_type, mid1, mp_name, deqation, dvids, labels, mp_min=None, mp_max=1e20, validate=True, comment='dvmrel') E = 30.e7 G = None nu = 0.3 #nids = [1, 2, 3] model.add_mat1(mid1, E, G, nu, rho=0.1, comment='mat1') e11 = 3e7 e22 = 0.2 * e11 nu12 = 0.3 mat8 = model.add_mat8(mid8, e11, e22, nu12, comment='mat8') #bulk = c ** 2. * rho bulk = None rho = 0.1 c = 4000. mat10 = model.add_mat10(mid10, bulk, rho, c, ge=0.0, comment='mat10') equation_id = 42 eqs = ['fstress(x) = x + 10.'] model.add_deqatn(equation_id, eqs, comment='deqatn') dvmrel1_1.raw_fields() dvmrel1_1.write_card(size=8) dvmrel1_1.write_card(size=16) dvmrel1_8.raw_fields() dvmrel1_8.write_card(size=8) dvmrel1_8.write_card(size=16) dvmrel1_10.raw_fields() dvmrel1_10.write_card(size=8) dvmrel1_10.write_card(size=16) dvmrel2_1.raw_fields() dvmrel2_1.write_card(size=8) dvmrel2_1.write_card(size=16) mat8.raw_fields() mat8.write_card(size=8) mat8.write_card(size=16) mat10.raw_fields() mat10.write_card(size=8) mat10.write_card(size=16) model.validate() model.cross_reference() dvmrel1_1.raw_fields() dvmrel1_8.raw_fields() dvmrel1_10.raw_fields() dvmrel2_1.raw_fields() mat8.raw_fields() mat10.raw_fields() save_load_deck(model, run_convert=False)
def test_cshear(self): """tests a PSHEAR/CSHEAR""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) eid = 10 pid = 20 mid = 30 t = 0.1 nids = [1, 2, 3, 4] cshear = model.add_cshear(eid, pid, nids, comment='cshear') pshear = model.add_pshear(pid, mid, t, nsm=0., f1=0., f2=0., comment='') dvids = [1] coeffs = 1.0 model.add_dvprel1(1, 'PSHEAR', pid, 'T', dvids, coeffs, p_min=None, p_max=1e20, c0=0.0, validate=True, comment='') model.add_desvar(1, 'T', 10.0) E = 30.e7 G = None nu = 0.3 mat1 = model.add_mat1(mid, E, G, nu, rho=0.1, comment='mat1') model.pop_parse_errors() model.validate() cshear.raw_fields() cshear.write_card(size=8) pshear.raw_fields() pshear.write_card(size=8) pshear.write_card(size=16) pshear.write_card(size=16, is_double=True) model.validate() model._verify_bdf(xref=False) model.cross_reference() model._verify_bdf(xref=True) model.mass_properties() cshear.write_card(size=8) pshear.write_card(size=8) model.update_model_by_desvars() save_load_deck(model)
def test_dvcrel1(self): """tests a DVCREL1, DVCREL2, DVGRID""" model = BDF(debug=False) oid = 10 conm2_eid = 100 cp_min = 0.01 cp_max = 1. desvar_id = 11 desvar_ids = 11 coeffs = 1.0 dvcrel1 = model.add_dvcrel1(oid, 'CONM2', conm2_eid, 'X2', desvar_ids, coeffs, cp_min, cp_max, c0=0., validate=True, comment='dvcrel') dvcrel1.Type = 'CONM2' assert dvcrel1.Type == dvcrel1.element_type #dvcrel1.pMax = p_max #dvcrel1.pMin = None label = 'X2_MASS' xinit = 0.1 xlb = 0.01 xub = 1.0 desvar = model.add_desvar(desvar_id, label, xinit, xlb, xub, comment='desvar') mass = 1. nid1 = 100 nid2 = 101 unused_conm2 = model.add_conm2(conm2_eid, nid1, mass, cid=0, X=None, I=None, comment='conm2') model.add_grid(100, [1., 2., 3.]) model.add_grid(101, [2., 2., 4.]) eid = 101 pid = 102 x = [1., 0., 0.] g0 = None cbar = model.add_cbar(eid, pid, [nid1, nid2], x, g0, offt='GGG', pa=0, pb=0, wa=None, wb=None, comment='cbar') oid = 11 equation_id = 100 dvcrel2 = model.add_dvcrel2(oid, 'CBAR', eid, 'X3', equation_id, desvar_ids, labels=None, cp_min=2., cp_max=4., validate=True, comment='dvcrel2') dvcrel2.Type = 'CBAR' assert dvcrel2.Type == dvcrel2.element_type mid = 1000 dim = [1., 2., 0.1, 0.2] model.add_pbarl(pid, mid, 'T', dim, group='MSCBML0', nsm=0.1, comment='pbarl') E = 30.e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu, rho=0.1, comment='mat1') eqs = ['fx2(x) = x + 10.'] deqatn = model.add_deqatn(equation_id, eqs, comment='deqatn') nid = 100 dvid = 10000 dxyz = [1., 2., 3.] dvgrid1 = model.add_dvgrid(dvid, nid, dxyz, cid=0, coeff=1.0, comment='dvgrid') nid = 101 dvid = 10001 dxyz = np.array([1., 2., 3.]) unused_dvgrid2 = model.add_dvgrid(dvid, nid, dxyz, cid=0, coeff=1.0, comment='dvgrid') model.pop_parse_errors() dvcrel1.raw_fields() dvcrel1.write_card(size=16) dvcrel2.raw_fields() dvcrel2.write_card(size=16) dvgrid1.raw_fields() dvgrid1.write_card(size=16) dvcrel1.comment = '' dvcrel2.comment = '' desvar.comment = '' dvgrid1.comment = '' dvcrel1_msg = dvcrel1.write_card(size=8) dvcrel2_msg = dvcrel2.write_card(size=8) desvar_msg = desvar.write_card(size=8) dvgrid_msg = dvgrid1.write_card(size=8) model.validate() model.cross_reference() model.pop_xref_errors() dvcrel1.raw_fields() dvcrel1.write_card(size=16) dvcrel1.write_card(size=8) dvcrel2.raw_fields() dvcrel2.write_card(size=16) dvcrel2.write_card(size=8) dvgrid1.raw_fields() dvgrid1.write_card(size=16) dvgrid1.write_card(size=8) deqatn.write_card() assert cbar.Mass() > 0, cbar.Mass() model.uncross_reference() #------------------------------------------- dvcrel1_lines = dvcrel1_msg.split('\n') dvcrel2_lines = dvcrel2_msg.split('\n') desvar_lines = desvar_msg.split('\n') dvgrid_lines = dvgrid_msg.split('\n') model2 = BDF(debug=True) model2.add_card(dvcrel1_lines, 'DVCREL1', is_list=False) model2.add_card(dvcrel2_lines, 'DVCREL2', is_list=False) model2.add_card(desvar_lines, 'DESVAR', is_list=False) model2.add_card(dvgrid_lines, 'DVGRID', is_list=False)
def test_trax(self): """tests a CTRAX3/CTRAX6/???""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) model.add_grid(5, [.5, 0., 0.]) model.add_grid(6, [1., 0.5, 0.]) model.add_grid(7, [.5, 1., 0.]) model.add_grid(8, [0., .5, 0.]) model.add_grid(9, [.5, .5, 0.]) mid1 = 1 E = 30.e7 G = None nu = 0.3 model.add_mat1(mid1, E, G, nu, rho=0.1) #model.add_mat1(2, E, G, nu, rho=0.1) #model.add_mat1(3, E, G, nu, rho=0.1) pid = 1 nids = [1, 2, 3] ctrax3 = model.add_ctrax3(1, pid, nids, theta=0., comment='ctrax3') #model.add_pshell(pid, mid1=2, t=0.1) psolid = model.add_psolid(pid, mid1, cordm=0, integ=None, stress=None, isop=None, fctn='SMECH', comment='psolid') pid = 2 nids = [1, 2, 3, 5, 6, 9] ctrax6 = model.add_ctrax6(2, pid, nids, theta=0., comment='ctrax6') plsolid = model.add_plsolid(pid, mid1, stress_strain='GRID', ge=0., comment='plsolid') mathp = model.add_mathp(mid1) #assert pcomp.Thickness() == sum(thicknesses), thicknesses #pcomp.lam = 'SYM' #assert pcomp.Thickness() == sum(thicknesses)*2, thicknesses model.validate() ctrax6.raw_fields() ctrax6.write_card(size=8) psolid.raw_fields() psolid.write_card(size=8) #psolid.write_card(size=16) #psolid.write_card(size=16, is_double=True) plsolid.raw_fields() plsolid.write_card(size=8) #plsolid.write_card(size=16) #plsolid.write_card(size=16, is_double=True) model._verify_bdf(xref=False) #-------------------------------- model.cross_reference() model._verify_bdf(xref=True) ctrax3.raw_fields() ctrax3.write_card(size=8) ctrax6.raw_fields() ctrax6.write_card(size=8) #pcomp.raw_fields() #pcomp.write_card(size=8) #pcomp.write_card(size=16) #pcomp.write_card(size=16, is_double=True) save_load_deck(model, run_convert=False)
def test_cbar_dvprel(self): """tests CBAR and DVPREL1""" log = get_logger(level='warning') model = BDF(log=log) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [0., 0., 1.]) mid = 10 E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) #--------------------------------------------- eid = 2 pid = 2 nids = [1, 2] x = None g0 = 3 wa = [0., 0., 0.1] wb = [0., 0., 0.1] model.add_cbar(eid, pid, nids, x, g0, offt='GGG', pa=0, pb=0, wa=wa, wb=wb, comment='') model.add_cbar(eid+1, pid+1, nids, x, g0, offt='GGG', pa=0, pb=0, wa=wa, wb=wb, comment='') model.add_cbeam(eid+2, pid+2, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=wa, wb=wb, sa=0, sb=0, comment='') model.add_cbeam(eid+3, pid+3, nids, x, g0, offt='GGG', bit=None, pa=0, pb=0, wa=wa, wb=wb, sa=0, sb=0, comment='') model.add_pbar(pid, mid, A=0., i1=0., i2=0., i12=0., j=0., nsm=0., c1=0., c2=0., d1=0., d2=0., e1=0., e2=0., f1=0., f2=0., k1=1.e8, k2=1.e8, comment='') Type = 'BAR' dim = [0.1, 0.2] model.add_pbarl(pid+1, mid, Type, dim, group='MSCBML0', nsm=0., comment='') #--------------------- xxb = [0.] so = ['YES'] area = [1.0] i1 = [1.] i2 = [2.] i12 = [0.4] j = [0.3] nsm = [0.] model.add_pbeam(pid+2, mid, xxb, so, area, i1, i2, i12, j, nsm, c1=None, c2=None, d1=None, d2=None, e1=None, e2=None, f1=None, f2=None, k1=1., k2=1., s1=0., s2=0., nsia=0., nsib=None, cwa=0., cwb=None, m1a=0., m2a=0., m1b=None, m2b=None, n1a=0., n2a=0., n1b=None, n2b=None, comment='') beam_type = 'BAR' dims = [dim] model.add_pbeaml(pid+3, mid, beam_type, xxb, dims, so=None, nsm=None, group='MSCBML0', comment='') dvprels = [ #oid, pid, prop_type, pname_fid (1, pid, 'PBAR', 'A'), (2, pid, 'PBAR', 'J'), (3, pid, 'PBAR', 'I1'), (4, pid, 'PBAR', 'I2'), (5, pid, 'PBAR', 'I12'), (6, pid+1, 'PBARL', 'DIM1'), (7, pid+1, 'PBARL', 'DIM2'), #----------- (8, pid+2, 'PBEAM', 'A'), (9, pid+2, 'PBEAM', 'J'), (10, pid+2, 'PBEAM', 'I1'), (11, pid+2, 'PBEAM', 'I2'), (12, pid+2, 'PBEAM', 'I12'), (13, pid+2, 'PBEAM', 'J'), (14, pid+3, 'PBEAML', 'DIM1'), (15, pid+3, 'PBEAML', 'DIM2'), ] coeffs = [1.0] xinit = 1.0 for dvprel_data in dvprels: oid, pid, prop_type, pname_fid = dvprel_data dvids = [oid] desvar_id = oid dim_label = pname_fid prop_label = prop_type if pname_fid.startswith('DIM'): dim_label = 'D%s' % pname_fid[-1] if prop_type == 'PBEAML': prop_label = 'PBML' elif prop_type == 'PBEAM': prop_label = 'PBM' label = '%s%s%s' % (prop_label, dim_label, pid) model.add_desvar(desvar_id, label, xinit, xlb=-1e20, xub=1e20, delx=None, ddval=None, comment='') model.add_dvprel1(oid, prop_type, pid, pname_fid, dvids, coeffs, p_min=None, p_max=1e20, c0=0.0, validate=True, comment='') model.cross_reference() save_load_deck(model, xref='standard', punch=True)
def test_pbeam_10(self): """ The number of continuation lines on a PBEAM for a NO/YESA is 0. The number of continuation lines on a PBEAM for a YES is 1. """ model = BDF(debug=False) # correct - standard NO with full list of values lines = [ 'PBEAM 1 1 5.094+7 289940.1.6043+7 271610. 3.73058', ' 0.', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0. 0. .872 .718', ' 0. .33936 0. .31983', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False) # correct - 2nd continuation line lines = [ 'PBEAM 2 1 5.094+7 289940.1.6043+7 271610. 3.73058', '+', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0. 0. .872 .718', ' 0. .33936 0. .31983', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False) # BAD x/xb value of 1.4 (should be 0 to 1.0) lines = [ 'PBEAM 2 1 5.094+7 289940.1.6043+7 271610. 3.73058', '+', ' NO 1.4 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0. 0. .872 .718', ' 0. .33936 0. .31983', ] #lines_expected = lines with self.assertRaises(AssertionError): model.add_card(lines, 'PBEAM', is_list=False) # error - 3 lines after NO lines = [ 'PBEAM 3 1 5.094+7 289940.1.6043+7 271610. 3.73058', ' 0.', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0.', ' 0. 0. .872 .718', ' 0. .33936 0. .31983', ] with self.assertRaises(RuntimeError): model.add_card(lines, 'PBEAM', is_list=False) # correct - skipped 2nd line lines = [ 'PBEAM 4 1 5.094+7 289940.1.6043+7 271610. 3.73058', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0. 0. .872 .718', ' 0. .33936 0. .31983', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False) # correct - skipped 2nd line and last line lines = [ 'PBEAM 5 1 5.094+7 289940.1.6043+7 271610. 3.73058', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ' 0. 0. .872 .718', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False) # correct - skipped 2nd line and last 2 lines lines = [ 'PBEAM 6 1 5.094+7 289940.1.6043+7 271610. 3.73058', ' NO 1.0 .7489+7 238250.1.3182+7 1.-12 223170.3.458069', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False) # correct - single line lines = [ 'PBEAM 7 1 5.094+7 289940.1.6043+7 271610. 3.73058', ] #lines_expected = lines model.add_card(lines, 'PBEAM', is_list=False)
def test_shell_dvprel(self): """tests CBAR and DVPREL1""" log = get_logger(level='warning') model = BDF(log=log) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) mid = 10 E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) #--------------------------------------------- eid = 2 pid = 2 nids = [1, 2, 3, 4] model.add_cquad4(eid, pid, nids, theta_mcid=0.0, zoffset=0., tflag=0, T1=None, T2=None, T3=None, T4=None, comment='') nids = [1, 2, 3] model.add_ctria3(eid+1, pid+1, nids, zoffset=0., theta_mcid=0.0, tflag=0, T1=None, T2=None, T3=None, comment='') model.add_pshell(pid, mid1=mid, t=0.1, mid2=mid, twelveIt3=1.0, mid3=mid, tst=0.833333, nsm=0.0, z1=None, z2=None, mid4=None, comment='') mids = [mid] * 3 thicknesses = [0.1] * 3 model.add_pcomp(pid+1, mids, thicknesses, thetas=None, souts=None, nsm=0., sb=0., ft=None, tref=0., ge=0., lam=None, z0=None, comment='') #--------------------- dvprels = [ #oid, pid, prop_type, pname_fid (1, pid, 'PSHELL', 'T'), (2, pid+1, 'PCOMP', 'T1'), (3, pid+1, 'PCOMP', 'T2'), (4, pid+1, 'PCOMP', 'T3'), (5, pid+1, 'PCOMP', 'THETA1'), (6, pid+1, 'PCOMP', 'THETA2'), (7, pid+1, 'PCOMP', 'THETA3'), (8, pid+1, 'PCOMP', 'SB'), (9, pid+1, 'PCOMP', 'GE'), (10, pid+1, 'PCOMP', 'Z0'), ] coeffs = [1.0] xinit = 1.0 for dvprel_data in dvprels: oid, pid, prop_type, pname_fid = dvprel_data dvids = [oid] desvar_id = oid dim_label = pname_fid prop_label = prop_type if pname_fid.startswith('THETA'): dim_label = 'TH%s' % pname_fid[-1] if prop_type == 'PCOMP': prop_label = 'COMP' #elif prop_type == 'PBEAM': #prop_label = 'PBM' label = '%s%s%s' % (prop_label, dim_label, pid) model.add_desvar(desvar_id, label, xinit, xlb=-1e20, xub=1e20, delx=None, ddval=None, comment='') model.add_dvprel1(oid, prop_type, pid, pname_fid, dvids, coeffs, p_min=None, p_max=1e20, c0=0.0, validate=True, comment='') model.cross_reference() save_load_deck(model, xref='standard', punch=True)
def test_beam_mass_01(self): model = BDF(debug=False) #model.case_control_deck = CaseControlDeck(case_control_lines) spc = ['SPC1', 123456, 123456, 1] grid1 = ['GRID', 1, None, 0., 0., 0.] grid2 = ['GRID', 2, None, 1., 0., 0.] #grid3 = ['GRID', 3, None, 1., 0., 0.] force = ['FORCE', 100, 1, 0, 2., 3., 4.] pid = 11 cbeam = [ 'CBEAM', 10, pid, 1, 2, 0., 1., 0., None, ] mid = 12 nsm_offset_a = [0., 0., 0.] nsm_offset_b = [0., 50., 0.] k1 = k2 = None area1 = 2.0 area2 = 1.0 rho = 3. nsm_a = 0. nsm_b = 0. nu = 0.3 pbeam = ([ 'PBEAM', pid, mid, area1, 2.1, 1.2, 1.3, None, nsm_a, None, None, None, None, None, None, None, None, 'YES', 1.0, area2, 2.1, 1.2, 1.3, None, nsm_b, None, None, None, None, None, None, None, None, # 100s are the NSIa, NSIb (moment of inertia per unit length) k1, k2, None, None, 100., 100., None, None ] + # Nones are neutral axis offset nsm_offset_a + nsm_offset_b + [None, None, None, None]) #print('\n' + print_card_8(pbeam)) mat1 = ['MAT1', 12, 3.0e7, None, nu, rho] model.add_card(grid1, 'GRID') model.add_card(grid2, 'GRID') #model.add_card(grid3, 'GRID') model.add_card(cbeam, 'CBEAM') model.add_card(pbeam, 'PBEAM') model.add_card(mat1, 'MAT1') model.add_card(spc, 'SPC1') model.add_card(force, 'FORCE') model.cross_reference() #print(model.properties[11]) mass, cg, I = model.mass_properties(element_ids=None, mass_ids=None, reference_point=None, sym_axis=None, scale=None) #print('cg* =', cg) L = 1.0 area = (area1 + area2) / 2. nsm = (nsm_a + nsm_b) / 2. mass_per_length = area * rho + nsm mass = L * mass_per_length mass_a = L / 2. * (area1 * rho + nsm_a) mass_b = L / 2. * (area2 * rho + nsm_b) xcg = (0.0 * mass_a + 1.0 * mass_b) / (mass_a + mass_b) #print(mass_a, mass_b, xcg, mass_a + mass_b) #print('mass =', mass) #cbeam = CBEAM() cbeam = model.elements[10] pbeam = model.properties[11] assert pbeam.Nu() == nu, 'pbeam.Nu()=%s nu=%s' % (pbeam.Nu(), nu) assert pbeam.Rho() == rho, 'pbeam.Rho()=%s rho=%s' % (pbeam.Rho(), rho) assert allclose(cbeam.Length(), 1.0), cbeam.Length() #assert allclose(cbeam.Mass(), 10.25), cbeam.Mass() #assert allclose(cbeam.MassPerLength(), 10.25), cbeam.MassPerLength() #assert allclose(mass, 10.25), mass with open('pbeam12.bdf', 'w') as bdf_file: case_control_lines = ('SOL 101\n' 'CEND\n' 'SUBCASE 1\n' ' STRESS(PLOT,SORT1,REAL) = ALL\n' ' SPC = 123456\n' ' LOAD = 100\n' 'BEGIN BULK\n' 'PARAM,GRDPNT,0\n' 'PARAM,POST,-1\n' 'PARAM POSTEXT YES\n') bdf_file.write(case_control_lines) model.write_bdf(bdf_file, enddata=True) model2 = BDF(debug=False) model2.read_bdf('pbeam12.bdf') if not os.path.exists('pbeam12.op2') and 0: # pragma: no cover os.system('nastran scr=yes bat=no old=no pbeam12.bdf') os.remove('pbeam12.bdf') if 0: # pragma: no cover from pyNastran.op2.op2 import OP2 op2 = OP2() op2.read_op2('pbeam12.op2') #os.remove('pbeam12.op2') gpw = op2.grid_point_weight op2_mass = gpw.mass.max() assert op2_mass == mass, 'op2_mass=%s mass=%s' % (op2_mass, mass) print('op2_mass=%s mass=%s' % (op2_mass, mass)) op2_cg = gpw.cg cg = array([0.5, 0., 0.], dtype='float32') print('cg =', op2_cg)
def test_shear(self): """tests a CSHEAR, PSHEAR""" pid = 10 pid_pshell = 11 mid = 100 model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(4, [0., 1., 0.]) nsm = 10.0 t = 1.0 rho = 1.0 cshear = model.add_cshear(10, pid, [1, 2, 3, 4], comment='cshear') cquad4 = model.add_cquad4(14, pid_pshell, [1, 2, 3, 4], comment='cquad4') model.add_pshear(pid, mid, t=t, nsm=nsm, f1=0., f2=0., comment='pshear') model.add_pshell(pid_pshell, mid1=mid, t=t, mid2=None, twelveIt3=1.0, mid3=None, tst=0.833333, nsm=nsm, z1=None, z2=None, mid4=None, comment='') E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu, rho=rho) model.validate() model.cross_reference() model.pop_xref_errors() area = 1.0 mass_expected = area * (rho * t + nsm) mass = model.mass_properties()[0] assert np.allclose( mass, mass_expected * 2), 'mass_properties all: mass=%s mass_expected=%s' % ( mass, mass_expected * 2) mass = model.mass_properties(element_ids=10)[0] assert np.allclose( mass, mass_expected ), 'mass_properties reduced: mass=%s mass_expected=%s' % ( mass, mass_expected) mass = model.mass_properties_nsm()[0] assert np.allclose( mass, mass_expected * 2), 'mass_properties_nsm all: mass=%s mass_expected=%s' % ( mass, mass_expected * 2) mass = model.mass_properties_nsm(element_ids=10)[0] assert np.allclose( mass, mass_expected ), 'mass_properties_nsm reduced: mass=%s mass_expected=%s' % ( mass, mass_expected) bdf_file = StringIO() model.write_bdf(bdf_file) model.uncross_reference() model.cross_reference() model.pop_xref_errors() model.get_area_breakdown(property_ids=None, stop_if_no_area=True) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=False) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=True) model.get_volume_breakdown(property_ids=None, stop_if_no_volume=True) assert np.allclose(cshear.Mass(), mass_expected), cshear.Mass() model.uncross_reference() model.safe_cross_reference() model.uncross_reference() #bdf_file = model.write_bdf(bdf_file) save_load_deck(model)
def test_dvmrel1(self): """tests a DVMREL1""" model = BDF(debug=False) oid = 10 mid1 = 4 mp_min = 1e6 mp_max = 1e7 dvids = 11 coeffs = 1.0 dvmrel_1 = model.add_dvmrel1(oid, 'MAT1', mid1, 'E', dvids, coeffs, mp_min=mp_min, mp_max=mp_max, c0=0., validate=True, comment='dmvrel') oid = 11 mid8 = 8 dvmrel_8 = model.add_dvmrel1(oid, 'MAT8', mid8, 'NU12', dvids, coeffs, mp_min=0.25, mp_max=0.3, c0=0., validate=True, comment='dmvrel') oid = 12 mid10 = 10 dvmrel_10 = model.add_dvmrel1(oid, 'MAT10', mid10, 'RHO', dvids, coeffs, mp_min=0.1, mp_max=0.2, c0=0., validate=True, comment='dmvrel') E = 30.e7 G = None nu = 0.3 #nids = [1, 2, 3] mat1 = model.add_mat1(mid1, E, G, nu, rho=0.1, comment='mat1') e11 = 3e7 e22 = 0.2 * e11 nu12 = 0.3 mat8 = model.add_mat8(mid8, e11, e22, nu12, comment='mat8') #bulk = c ** 2. * rho bulk = None rho = 0.1 c = 4000. mat10 = model.add_mat10(mid10, bulk, rho, c, ge=0.0, comment='mat10') dvmrel_1.raw_fields() dvmrel_1.write_card(size=8) dvmrel_1.write_card(size=16) dvmrel_8.raw_fields() dvmrel_8.write_card(size=8) dvmrel_8.write_card(size=16) dvmrel_10.raw_fields() dvmrel_10.write_card(size=8) dvmrel_10.write_card(size=16) mat8.raw_fields() mat8.write_card(size=8) mat8.write_card(size=16) mat10.raw_fields() mat10.write_card(size=8) mat10.write_card(size=16) model.validate() model.cross_reference() dvmrel_1.raw_fields() dvmrel_8.raw_fields() dvmrel_10.raw_fields() mat8.raw_fields() mat10.raw_fields()
def test_ctria6_cquad8_cquad9(self): """tests a CQUAD8 and CQUAD9""" model = BDF(debug=False) eid = 1 pid = 10 mid = 100 model.add_grid(1, [0., 0., 0.]) model.add_grid(5, [.5, 0., 0.]) model.add_grid(2, [1., 0., 0.]) model.add_grid(6, [1., .5, 0.]) model.add_grid(3, [1., 1., 0.]) model.add_grid(7, [.5, 1., 0.]) model.add_grid(4, [0., 1., 0.]) model.add_grid(8, [0., .5, 0.]) model.add_grid(9, [.5, .5, 0.]) nids = [1, 2, 3, 4, 5, 6, 7, 8] cquad8 = model.add_cquad8(eid, pid, nids, theta_mcid=0., comment='cquad8') cquad8.flip_normal() eid = 2 nids = [1, 2, 3, 4, 5, 6, 7, 8, 9] cquad = model.add_cquad(eid, pid, nids, theta_mcid=0., comment='cquad') model.add_pshell(pid, mid1=mid, t=1.0) eid = 3 nids = [1, 2, 3, 5, 6, 9] ctria6 = model.add_ctria6(eid, pid, nids, theta_mcid=0., comment='ctria6') ctria6.flip_normal() eid = 4 cquad4 = model.add_cquad4(eid, pid, [1, 2, 3, 4]) cquad4.flip_normal() str(cquad4) eid = 5 cquad4 = model.add_cquad4(eid, pid, [1, 2, 3, 4], tflag=1, T1=2., T2=2., T3=2., T4=2.) str(cquad4) eid = 6 ctria3 = model.add_ctria3(eid, pid, [1, 2, 3]) ctria3.flip_normal() str(ctria3) eid = 7 ctria3 = model.add_ctria3(eid, pid, [1, 2, 3], tflag=1, T1=2., T2=2., T3=2.) str(ctria3) str(ctria3) E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu, rho=0.1) model.cross_reference() model.pop_xref_errors() ctria3.flip_normal() cquad4.flip_normal() ctria6.flip_normal() cquad8.flip_normal() assert len(ctria6.Centroid()) == 3, ctria6.Centroid() assert len(ctria6.center_of_mass()) == 3, ctria6.center_of_mass() assert np.allclose(cquad8.Mass(), 0.1), cquad8.Mass() assert np.allclose(cquad.Mass(), 0.1), cquad.Mass() assert np.allclose(ctria6.Mass(), 0.05), ctria6.Mass() model.get_area_breakdown(property_ids=None, stop_if_no_area=True) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=False) model.get_mass_breakdown(property_ids=None, stop_if_no_mass=True, detailed=True) model.get_volume_breakdown(property_ids=None, stop_if_no_volume=True) save_load_deck(model)
def test_loads_sum_04(self): """ tests: - 1=FORCE - 2=LOAD/FORCE - 3=LOAD/PLOAD4 - 4=LOAD/PLOAD4 - 5=LOAD/PLOAD4 - 6=LOAD/PLOAD4 - 10=PLOAD4 - 11=PLOAD4 """ p0 = array([0., 0., 0.]) model = BDF(log=log, debug=False) bdf_filename = os.path.join(model_path, 'plate', 'plate.bdf') #print(bdf_filename) model.read_bdf(bdf_filename) #print("keys4", model.loads.keys()) loadcase_id = 1 F_expected = array([600., 0., 0.]) M_expected = array([0., 0., -3000.]) eids = None nids = None F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) loadcase_id = 2 F_expected = array([600., 0., 0.]) M_expected = array([0., 0., -3000.]) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) #--------- loadcase_id = 3 A = 0. for e, element in model.elements.items(): A += element.Area() A_expected = 100. self.assertTrue( allclose(A, A_expected), 'loadcase_id=%s A_expected=%s A=%s' % (loadcase_id, A_expected, A)) p = 3. Fi = p * A eids = None nids = None F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue(allclose(p * A, F[2]), 'loadcase_id=%s p*A=%s F=%s' % (loadcase_id, p * A, F)) F_expected = array([0., 0., 300.]) M_expected = array([1500., -1500., 0.]) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) #--- loadcase_id = 10 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) #--- loadcase_id = 4 F_expected = array([0., 0., 300.]) M_expected = array([1500., -1500., 0.]) F_expected *= 5. M_expected *= 5. F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) #print('F =', F) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) loadcase_id = 5 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) F_expected = array([0., 0., 300.]) M_expected = array([1500., -1500., 0.]) F_expected *= 7. M_expected *= 7. self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) loadcase_id = 6 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) F_expected = array([0., 0., 300.]) M_expected = array([1500., -1500., 0.]) F_expected *= 7. * 5. M_expected *= 7. * 5. self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M)) #--------- loadcase_id = 11 A_expected = 4. A = 4. p = 3. Fi = p * A element = model.elements[1] normal = element.Normal() normal_expected = array([0., 0., 1.]) self.assertTrue( allclose(normal_expected, normal), 'loadcase_id=%s normal_expected=%s normal=%s' % (loadcase_id, normal_expected, normal)) F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) self.assertTrue(allclose(p * A, F[2]), 'loadcase_id=%s p*A=%s F=%s' % (loadcase_id, p * A, F)) F_expected = array([0., 0., 12.]) M_expected = array([12., -12., 0.]) self.assertTrue( allclose(F_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F_expected, F)) self.assertTrue( allclose(M_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M_expected, M))
def test_shell_mcid(self): """tests that mcids=0 are correctly identified as not 0.0 and thus not dropped""" model = BDF(debug=False) model.add_grid(1, [0., 0., 0.]) model.add_grid(2, [0., 1., 0.]) model.add_grid(3, [0., 1., 1.]) model.add_grid(4, [0., 0., 1.]) eid = 10 pid = 100 mid = 1000 model.add_ctria3(eid, pid, [1, 2, 3], zoffset=0., theta_mcid=0, tflag=0, T1=None, T2=None, T3=None, comment='') eid = 11 model.add_cquad4(eid, pid, [1, 2, 3, 4], theta_mcid=0, zoffset=0., tflag=0, T1=None, T2=None, T3=None, T4=None, comment='') model.add_pshell(pid, mid1=mid, t=0.1, mid2=mid, twelveIt3=1.0, mid3=None, tst=0.833333, nsm=0.0, z1=None, z2=None, mid4=None, comment='') E = 3.0e7 G = None nu = 0.3 model.add_mat1(mid, E, G, nu) #print(model.elements[11]) assert model.elements[10].rstrip( ) == 'CTRIA3 10 100 1 2 3 0' assert model.elements[11].rstrip( ) == 'CQUAD4 11 100 1 2 3 4 0' assert model.elements[10].write_card().rstrip( ) == 'CTRIA3 10 100 1 2 3 0' model.cross_reference() assert model.elements[10].rstrip( ) == 'CTRIA3 10 100 1 2 3 0' assert model.elements[11].rstrip( ) == 'CQUAD4 11 100 1 2 3 4 0' model.uncross_reference() assert model.elements[10].rstrip( ) == 'CTRIA3 10 100 1 2 3 0' assert model.elements[11].rstrip( ) == 'CQUAD4 11 100 1 2 3 4 0' model.safe_cross_reference() model.uncross_reference() assert model.elements[10].rstrip( ) == 'CTRIA3 10 100 1 2 3 0' assert model.elements[11].rstrip( ) == 'CQUAD4 11 100 1 2 3 4 0' model2 = save_load_deck(model) model2.elements[10].comment = '' assert model2.elements[10].rstrip( ) == 'CTRIA3 10 100 1 2 3 0' assert model2.elements[11].rstrip( ) == 'CQUAD4 11 100 1 2 3 4 0'
def test_loads_sum_radial_01(self): model = BDF(debug=False) model.nodes[1] = GRID(1, cp=1, xyz=[0., 0., 0.], cd=0, ps='', seid=0, comment='') cid = 1 origin = [0., 0., 0.] zaxis = [0., 0., 1.] xaxis = [1., 0., 0.] model.add_cord2c(cid, rid=0, origin=origin, zaxis=zaxis, xzplane=xaxis, comment='') sid = 1 node = 1 cid = 1 mag = 1.1 xyz = [1., 0., 0.] radial_force = model.add_force(sid, node, mag, xyz, cid=cid, comment='') sid = 2 xyz = [1., 90., 0.] mag = 2.2 theta_force = model.add_force(sid, node, mag, xyz, cid=cid, comment='') model.cross_reference() p0 = 1 eids = None nids = None loadcase_id = 1 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False, xyz_cid0=None) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False, xyz_cid0=None) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) F1_expected = np.array([1.1, 0., 0.]) M1_expected = np.array([0., 0., 0.]) self.assertTrue( allclose(F1_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F1_expected, F)) self.assertTrue( allclose(M1_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M1_expected, M)) loadcase_id = 2 F, M = sum_forces_moments(model, p0, loadcase_id, include_grav=False, xyz_cid0=None) F2, M2 = sum_forces_moments_elements(model, p0, loadcase_id, eids, nids, include_grav=False, xyz_cid0=None) assert np.allclose(F, F2), 'F=%s F2=%s' % (F, F2) assert np.allclose(M, M2), 'M=%s M2=%s' % (M, M2) F2_expected = np.array([0., 2.2, 0.]) M2_expected = np.array([0., 0., 0.]) self.assertTrue( allclose(F2_expected, F), 'loadcase_id=%s F_expected=%s F=%s' % (loadcase_id, F2_expected, F)) self.assertTrue( allclose(M2_expected, M), 'loadcase_id=%s M_expected=%s M=%s' % (loadcase_id, M2_expected, M))
def test_pbar_2(self): """tests the PBAR BDF add""" pid = 1 mid = 2 A = None I1 = I2 = None J = None nsm = None c1 = c2 = d1 = d2 = e1 = e2 = f1 = f2 = None k1 = k2 = None i12 = 3. fields = [ 'PBAR', pid, mid, A, I1, I2, J, nsm, None, c1, c2, d1, d2, e1, e2, f1, f2, k1, k2, i12 ] card = print_card_8(fields) lines = card.split('\n') model = BDF(debug=False) card = model.process_card(lines) cardi = BDFCard(card) pbar = PBAR.add_card(cardi) self.assertEqual(pbar.pid, 1) self.assertEqual(pbar.mid, 2) self.assertEqual(pbar.A, 0.0) self.assertEqual(pbar.i1, 0.0) self.assertEqual(pbar.i2, 0.0) self.assertEqual(pbar.j, 0.0) self.assertEqual(pbar.nsm, 0.0) self.assertEqual(pbar.i12, 3.0) self.assertEqual(pbar.c1, 0.0) self.assertEqual(pbar.c2, 0.0) self.assertEqual(pbar.d1, 0.0) self.assertEqual(pbar.d2, 0.0) self.assertEqual(pbar.e1, 0.0) self.assertEqual(pbar.e2, 0.0) self.assertEqual(pbar.k1, None) self.assertEqual(pbar.k2, None) #-------------------------------------------------------- A = 6. I1 = 5. I2 = 4. J = 3. nsm = 2. c1 = c2 = d1 = d2 = e1 = e2 = f1 = f2 = None k1 = k2 = 1e2 i12 = 0. fields = [ 'PBAR', pid, mid, A, I1, I2, J, nsm, None, c1, c2, d1, d2, e1, e2, f1, f2, k1, k2, i12] card = print_card_8(fields) lines = card.split('\n') model = BDF(debug=False) card = model.process_card(lines) cardi = BDFCard(card) pbar = PBAR.add_card(cardi) self.assertEqual(pbar.pid, 1) self.assertEqual(pbar.mid, 2) self.assertEqual(pbar.A, 6.0) self.assertEqual(pbar.i1, 5.0) self.assertEqual(pbar.i2, 4.0) self.assertEqual(pbar.j, 3.0) self.assertEqual(pbar.nsm, 2.0) self.assertEqual(pbar.i12, 0.0) self.assertEqual(pbar.c1, 0.0) self.assertEqual(pbar.c2, 0.0) self.assertEqual(pbar.d1, 0.0) self.assertEqual(pbar.d2, 0.0) self.assertEqual(pbar.e1, 0.0) self.assertEqual(pbar.e2, 0.0) self.assertEqual(pbar.k1, 1e2) self.assertEqual(pbar.k2, 1e2)