def _run_mass_properties(model2, nnodes, nelements, run_mass_properties=True): """helper method""" if not (run_mass_properties and nelements): return if nelements > 1 and nnodes == 0: # pragma: no cover raise RuntimeError('no nodes exist') mass1, cg1, inertia1 = mass_properties(model2, reference_point=None, sym_axis=None) mass2, cg2, inertia2 = mass_properties_nsm(model2, reference_point=None, sym_axis=None) #if not quiet: #if model2.wtmass != 1.0: #print('weight = %s' % (mass1 / model2.wtmass)) #print('mass = %s' % mass1) #print('cg = %s' % cg1) #print('Ixx=%s, Iyy=%s, Izz=%s \nIxy=%s, Ixz=%s, Iyz=%s' % tuple(inertia1)) assert np.allclose(mass1, mass2), 'mass1=%s mass2=%s' % (mass1, mass2) assert np.allclose(cg1, cg2), 'mass=%s\ncg1=%s cg2=%s' % (mass1, cg1, cg2) if not np.allclose(inertia1, inertia2, atol=1e-5): # pragma: no cover raise ValueError( 'mass=%s cg=%s\ninertia1=%s\ninertia2=%s\ndinertia=%s' % (mass1, cg1, inertia1, inertia2, inertia1 - inertia2)) unused_mass3, unused_cg3, unused_inertia3 = mass_properties_breakdown( model2)[:3]
def save_load_deck(model, xref='standard', punch=True, run_remove_unused=True, run_convert=True, run_renumber=True, run_mirror=True, run_save_load=True, run_quality=True, write_saves=True, run_save_load_hdf5=True, run_mass_properties=True): """writes, re-reads, saves an obj, loads an obj, and returns the deck""" model.validate() model.pop_parse_errors() model.pop_xref_errors() bdf_file = StringIO() model.write_bdf(bdf_file, size=8, close=False) bdf_file.seek(0) model.write_bdf(bdf_file, size=16, close=False) bdf_file.seek(0) model.write_bdf(bdf_file, size=16, is_double=True, close=False) bdf_file.seek(0) if write_saves and model.save_file_structure: bdf_filenames = { 0: 'junk.bdf', } model.write_bdfs(bdf_filenames) os.remove('junk.bdf') if run_remove_unused: remove_unused(model) if run_convert: units_to = ['m', 'kg', 's'] units = ['ft', 'lbm', 's'] convert(model, units_to, units) model2 = BDF(log=model.log) #print(bdf_file.getvalue()) model2.read_bdf(bdf_file, punch=punch, xref=False) _cross_reference(model2, xref) model2.pop_parse_errors() model2.get_bdf_stats() model2.write_bdf('model2.bdf') nelements = len(model2.elements) + len(model2.masses) if run_mass_properties and len(model2.nodes) == 0 and nelements > 0: mass1, cg1, inertia1 = model2.mass_properties(reference_point=None, sym_axis=None) mass2, cg2, inertia2 = model2.mass_properties_nsm(reference_point=None, sym_axis=None) #if not quiet: #if model2.wtmass != 1.0: #print('weight = %s' % (mass1 / model2.wtmass)) #print('mass = %s' % mass1) #print('cg = %s' % cg1) #print('Ixx=%s, Iyy=%s, Izz=%s \nIxy=%s, Ixz=%s, Iyz=%s' % tuple(inertia1)) assert np.allclose(mass1, mass2), 'mass1=%s mass2=%s' % (mass1, mass2) assert np.allclose(cg1, cg2), 'mass=%s\ncg1=%s cg2=%s' % (mass1, cg1, cg2) assert np.allclose( inertia1, inertia2, atol=1e-5 ), 'mass=%s cg=%s\ninertia1=%s\ninertia2=%s\ndinertia=%s' % ( mass1, cg1, inertia1, inertia2, inertia1 - inertia2) mass3, cg3, inertia3 = mass_properties_breakdown(model2)[:3] assert np.allclose(mass1, mass3), 'mass1=%s mass3=%s' % (mass1, mass3) #assert np.allclose(cg1, cg3), 'mass=%s\ncg1=%s cg3=%s' % (mass1, cg1, cg3) if run_save_load: model2.save(obj_filename='model.obj', unxref=True) model3 = BDF(debug=False, log=model.log, mode='msc') model3.load(obj_filename='model.obj') os.remove('model.obj') else: model2.uncross_reference() model3 = model2 if run_save_load_hdf5 and IS_H5PY: model2.export_hdf5_filename('test.h5') model4 = BDF(log=model2.log) model4.load_hdf5_filename('test.h5') model4.validate() bdf_stream = StringIO() model4.write_bdf(bdf_stream, encoding=None, size=8, is_double=False, interspersed=False, enddata=None, write_header=True, close=True) for key, value in model2.card_count.items(): if key == 'ENDDATA': continue if key not in model4.card_count: msg = 'key=%r was not loaded to hdf5\nexpected=%s\nactual=%s' % ( key, model2.card_count, model4.card_count) #raise RuntimeError(msg) model.log.error(msg) cross_reference(model3, xref) if run_renumber: renumber('model2.bdf', model.log) if run_mirror: # we put embed this under renumber to prevent modifying an # existing model to prevent breaking tests # # shouldn't have any effect model2.bdf bdf_mirror('model2.bdf', plane='xz', log=model.log) os.remove('model2.bdf') if model.elements and run_quality: element_quality(model) return model3