def test_load_and_save_structure(): structure = models.SDOFBuilding() structure.id = 1 structure.name = "sample building" structure.h_eff = 10.0 structure.t_fixed = 1.0 structure.mass_eff = 80000. structure.mass_ratio = 1.0 # vertical and horizontal masses are equal ecp_output = files.Output() ecp_output.add_to_dict(structure) ecp_output.name = "test data" ecp_output.units = "N, kg, m, s" ecp_output.comments = "" p_str = json.dumps(ecp_output.to_dict(), skipkeys=["__repr__"], indent=4) objs = files.loads_json(p_str) assert np.isclose(structure.mass_eff, objs['building'][1].mass_eff)
def test_load_old_file_w_frame_w_hinges(): # Define special class for section class CustomBeamSection(sfsimodels.models.sections.Section): diametertop = None fylong = None filongtop = None def __init__(self): super(CustomBeamSection, self).__init__() self._extra_class_variables = [ "diametertop", "fylong", "filongtop", "myplus_section" ] self.inputs += self._extra_class_variables # Attach the section class as the default for the building class CustomBuildingFrame2D(sm.FrameBuilding2D): _custom_beam_section = CustomBeamSection _custom_column_section = None fp = test_dir + "/unit_test_data/building_1011_ecp_old.json" # Override the base_type-type for building-building_frame2D with the custom model objs = files.load_json( fp, verbose=0, custom={"building-building_frame2D": CustomBuildingFrame2D}) bd = objs["building"][1] assert np.isclose(bd.floor_length, 13.05) assert np.isclose(bd.beams[0][0].s[0].myplus_section, 97.03) assert np.isclose(bd.beams[1][1].s[0].myplus_section, 127.85), bd.beams[1][1].s[0].myplus_section assert bd.beams[1][0].s[0].diametertop is None assert np.isclose(bd.columns[1][0].s[0].nbar_hplusx, 2) assert "diametertop" in bd.beams[0][0].s[0].inputs ecp_output = files.Output() ecp_output.add_to_dict(bd) p_str = json.dumps(ecp_output.to_dict(), skipkeys=["__repr__"], indent=4) assert '"filongtop"' in p_str objs = files.loads_json(p_str) bd = objs["building"][1] assert np.isclose(bd.beams[0][0].s[0].myplus_section, 97.03) assert np.isclose(bd.beams[1][1].s[0].myplus_section, 127.85), bd.beams[1][1].s[0].myplus_section
def test_can_load_then_save_and_load_custom_ecp_w_custom_obj(): class Cantilever(sm.CustomObject): _id = None base_type = "cantilever" type = "cantilever" inputs = ["id", "length", "depth", "e_mod"] def to_dict(self, **kwargs): outputs = OrderedDict() for item in self.inputs: outputs[item] = getattr(self, item) return outputs fp = test_dir + "/unit_test_data/ecp_models_w_custom_obj.json" objs, meta_data = files.load_json_and_meta( fp, custom={"cantilever-cantilever": Cantilever}, verbose=0) assert np.isclose(objs["foundation"][1].length, 1.0) assert np.isclose(objs["cantilever"][1].length, 6.0) ecp_output = files.Output() for m_type in objs: for instance in objs[m_type]: ecp_output.add_to_dict(objs[m_type][instance]) ecp_output.name = meta_data["name"] ecp_output.units = meta_data["units"] ecp_output.comments = meta_data["comments"] p_str = json.dumps(ecp_output.to_dict(), skipkeys=["__repr__"], indent=4) a = open("temp.json", "w") a.write(p_str) a.close() objs2, md2 = files.loads_json(p_str, custom={"cantilever-cantilever": Cantilever}, meta=True, verbose=0) for m_type in objs: for instance in objs[m_type]: for parameter in objs[m_type][instance].inputs: p_org = getattr(objs[m_type][int(instance)], parameter) p_2nd = getattr(objs2[m_type][int(instance)], parameter) assert p_org == p_2nd, (m_type, parameter, p_org, p_2nd) for item in meta_data: if item == 'sfsimodels_version': continue assert meta_data[item] == md2[item], (item, meta_data[item], md2[item])
def test_full_save_and_load(): system = models.SoilStructureSystem() ltd.load_test_data(system) assert system.fd.length == 18.0 ecp_output = files.Output() ecp_output.add_to_dict(system.sp) ecp_output.add_to_dict(system.fd) ecp_output.add_to_dict(system.bd) ecp_output.add_to_dict(system) ecp_output.name = "all test data" ecp_output.units = "N, kg, m, s" ecp_output.comments = "" p_str = json.dumps(ecp_output.to_dict(), skipkeys=["__repr__"], indent=4) a = open("temp.json", "w") a.write(p_str) a.close() objs = files.loads_json(p_str, verbose=0) assert np.isclose(system.bd.mass_eff, objs['buildings'][1].mass_eff) soil = system.sp.layer(1) for item in soil.inputs: if getattr(soil, item) is not None: if not isinstance(getattr(soil, item), str): assert np.isclose(getattr(soil, item), getattr(objs['soils'][1], item)), item for item in system.fd.inputs: if getattr(system.fd, item) is not None: if isinstance(getattr(system.fd, item), str): assert getattr(system.fd, item) == getattr(objs['foundations'][1], item), item else: assert np.isclose(getattr(system.fd, item), getattr(objs['foundations'][1], item)), item for item in system.bd.inputs: if getattr(system.bd, item) is not None: if isinstance(getattr(system.bd, item), str): assert getattr(system.bd, item) == getattr(objs['buildings'][1], item), item else: assert np.isclose(getattr(system.bd, item), getattr(objs['buildings'][1], item)), item
def test_load_and_save_foundation_w_pads(): fd = models.PadFoundation() fd.width = 12 # m fd.length = 14 # m fd.depth = 0.6 # m fd.height = 1.0 # m fd.mass = 0.0 # kg fd.pad.length = 1.1 fd.pad.width = 1.1 fd.n_pads_l = 3 fd.n_pads_w = 3 fd.set_pad_pos_in_length_dir_as_equally_spaced() fd.set_pad_pos_in_width_dir_as_equally_spaced() tie_beams_sect = sm.sections.RCBeamSection() tie_beams_sect.depth = fd.height tie_beams_sect.width = fd.height tie_beams_sect.rc_mat = sm.materials.ReinforcedConcreteMaterial() tie_beams_sect.cracked_ratio = 0.6 fd.tie_beam_sect_in_width_dir = tie_beams_sect fd.tie_beam_sect_in_length_dir = tie_beams_sect ecp_output = files.Output() ecp_output.add_to_dict(fd) ecp_output.name = "test data" ecp_output.units = "N, kg, m, s" ecp_output.comments = "" p_str = json.dumps(ecp_output.to_dict(), skipkeys=["__repr__"], indent=4) objs = files.loads_json(p_str) fd_new = objs['foundation'][1] fd_pms = ['width', 'length', 'depth', 'height', 'n_pads_l', 'n_pads_w'] for item in fd_pms: np.isclose(getattr(fd, item), getattr(fd_new, item)) assert np.sum( abs(fd.pad_pos_in_length_dir - fd_new.pad_pos_in_length_dir)) < 1.0e-6 assert np.sum( abs(fd.pad_pos_in_width_dir - fd_new.pad_pos_in_width_dir)) < 1.0e-6 pad_pms = ['width', 'length', 'depth', 'height'] for item in pad_pms: np.isclose(getattr(fd.pad, item), getattr(fd_new.pad, item))