def get_water_pressures(self) -> Dict[int, Dict[str, dict]]: """ Function to get the pore water pressure for each stage and node. Returns ------- water_pressures : Dict[int, Dict[str, dict]] The pore water pressures along the wall. """ check_results_present(self.json_data) num_nodes: int = get_num_nodes(self.json_data) num_stages: int = get_num_stages(self.json_data) design_cases: List[str] = get_design_case_names(self.json_data) water_pressures: Dict[int, Dict[str, dict]] = {} for stage in range(num_stages): water_pressures[stage] = { design_case: {"left": [], "right": [],} for design_case in design_cases } for index, design_case in enumerate(design_cases): for stage in range(num_stages): node_results = self.json_data["Frew Results"][index][ "Stageresults" ][stage]["Noderesults"] for node in range(num_nodes): water_pressures[stage][design_case]["left"].append( node_results[node]["ULeft"] / 1000 ) water_pressures[stage][design_case]["right"].append( node_results[node]["URight"] / 1000 ) return water_pressures
def analyse(self) -> None: """ Analyse the model using the COM interface to open Frew. This method requires greater than Frew 19.4 Build 24. """ num_stages: int = get_num_stages(self.json_data) folder_path: str = os.path.dirname(self.file_path) temp_file_path: str = os.path.join(folder_path, f"{uuid4()}.json") self.save(temp_file_path) try: model = CreateObject("frewLib.FrewComAuto") except OSError: os.remove(temp_file_path) raise FrewError("Failed to create a COM object.") try: model.Open(temp_file_path) except COMError: os.remove(temp_file_path) raise FrewError("Failed to open the Frew model.") model.DeleteResults() model.Analyse(num_stages) model.SaveAs(temp_file_path) model.Close() new_data: Dict[str, list] = load_data(temp_file_path) os.remove(temp_file_path) self._clear_json_data() self._refill_json_data(new_data)
def _get_plot_data(self) -> Dict[str, Union[dict, int, list]]: return { "titles": get_titles(self.json_data), "num_stages": get_num_stages(self.json_data), "stage_names": get_stage_names(self.json_data), "node_levels": self.get_node_levels(), "wall_results": self.get_results(), "envelopes": self.get_envelopes(), }
def get_envelopes(self) -> Dict[str, dict]: """ Method to return the envelopes of max and min shear, bending and displacements for each design case. Returns ------- envelopes : Dict[str, dict] The maximum and minimum shear, bending and displacement for each design case for all stages. """ check_results_present(self.json_data) num_stages = get_num_stages(self.json_data) num_nodes = get_num_nodes(self.json_data) design_cases = get_design_case_names(self.json_data) wall_results = self.get_results() envelopes: Dict[str, dict] = { design_case: { "maximum": {"shear": [], "bending": [], "disp": []}, "minimum": {"shear": [], "bending": [], "disp": []}, } for design_case in design_cases } for design_case in design_cases: for node in range(num_nodes): shear = [] bending = [] disp = [] for stage in range(num_stages): shear.append( wall_results[stage][design_case]["shear"][node] ) bending.append( wall_results[stage][design_case]["bending"][node] ) disp.append( wall_results[stage][design_case]["displacement"][node] ) envelopes[design_case]["maximum"]["shear"].append(max(shear)) envelopes[design_case]["maximum"]["bending"].append( max(bending) ) envelopes[design_case]["maximum"]["disp"].append(max(disp)) envelopes[design_case]["minimum"]["shear"].append(min(shear)) envelopes[design_case]["minimum"]["bending"].append( min(bending) ) envelopes[design_case]["minimum"]["disp"].append(min(disp)) return envelopes
def get_wall_stiffness(self) -> Dict[int, List[float]]: """ Function to get the stiffness of the wall for each stage and node. Returns ------- wall_stiffness : Dict[int, List[float]] The stiffness of the wall in kNm2/m for each stage. """ num_stages = get_num_stages(self.json_data) wall_stiffness: Dict[int, List[float]] = {} for stage in range(num_stages): wall_stiffness[stage] = [ item["Eival"] / 1000 for item in self.json_data["Stages"][stage]["GeoFrewNodes"] ] return wall_stiffness
def get_results(self) -> Dict[int, dict]: """ Method to get the shear, bending moment and displacement of the wall for each stage, node, and design case. Returns ------- wall_results : Dict[int, dict] The shear, bending and displacement of the wall. """ num_nodes = get_num_nodes(self.json_data) num_stages = get_num_stages(self.json_data) check_results_present(self.json_data) wall_results: Dict[int, dict] = {} for stage in range(num_stages): wall_results[stage] = {} for result_set in self.json_data["Frew Results"]: result_set_name = result_set["GeoPartialFactorSet"]["Name"] wall_results[stage][result_set_name] = { "shear": [], "bending": [], "displacement": [], } for node in range(num_nodes): stage_results = result_set["Stageresults"][stage][ "Noderesults" ] wall_results[stage][result_set_name]["shear"].append( stage_results[node]["Shear"] / 1000 ) wall_results[stage][result_set_name]["bending"].append( stage_results[node]["Bending"] / 1000 ) wall_results[stage][result_set_name][ "displacement" ].append(stage_results[node]["Displacement"] * 1000) return wall_results
def get(self, request: str) -> Union[dict, str, int, list]: """ Method to get information about the model. Parameters ---------- request : str Options for request are: 'titles', 'file history', 'file version', 'frew version', 'num stages', 'stage names', 'num nodes'. Returns ------- return_value : Union[dict, str, int, list] The information requested about the model. Raises ------ FrewError If `request` input is not a string or is not one of the options. """ if not isinstance(request, str): raise FrewError("Request must be a string.") while request == "titles": return get_titles(self.json_data) while request == "file history": return get_file_history(self.json_data) while request == "file version": return get_file_version(self.json_data) while request == "frew version": return get_frew_version(self.json_data) while request == "num stages": return get_num_stages(self.json_data) while request == "stage names": return get_stage_names(self.json_data) while request == "num nodes": return get_num_nodes(self.json_data) raise FrewError("Please input a valid option.")
def test_get_num_stages_key_error(): with pytest.raises(FrewError): get_num_stages({"None": 1})
def test_get_num_stages(json_data): assert get_num_stages(json_data) == 11
def results_to_excel(self, out_folder: str) -> None: """ Method to exports the wall results to an excel file where each sheet in the spreadsheet is a design case. The spreadsheet also a title sheet and the envelopes. Parameters ---------- out_folder : str The folder path to save the results at. Returns ------- None """ if not os.path.exists(out_folder): raise FrewError(f"Path {out_folder} does not exist.") num_nodes: int = get_num_nodes(self.json_data) num_stages: int = get_num_stages(self.json_data) node_levels: List[float] = self.get_node_levels() wall_results: Dict[int, dict] = self.get_results() design_cases: List[str] = get_design_case_names(self.json_data) envelopes: Dict[str, dict] = self.get_envelopes() export_envelopes = pd.DataFrame( self._format_envelope_data( num_nodes, node_levels, envelopes, design_cases ) ) titles: Dict[str, str] = get_titles(self.json_data) export_titles = pd.DataFrame(self._format_titles_data(titles)) job_title: str = titles["JobTitle"] uuid_str: str = str(uuid4()).split("-")[0] file_name: str = f"{job_title}_{uuid_str}_results.xlsx" export_data: Dict[str, dict] = {} for design_case in design_cases: export_data[design_case] = { "Node #": [], "Node levels (m)": [], "Stage": [], "Bending (kNm/m)": [], "Shear (kN/m)": [], "Displacement (mm)": [], } for stage in range(num_stages): node_array = list(range(1, num_nodes + 1)) stage_array = [stage] * num_nodes bending_results = wall_results[stage][design_case]["bending"] shear_results = wall_results[stage][design_case]["shear"] displacement_results = wall_results[stage][design_case][ "displacement" ] export_data[design_case]["Node #"].extend(node_array) export_data[design_case]["Node levels (m)"].extend(node_levels) export_data[design_case]["Stage"].extend(stage_array) export_data[design_case]["Bending (kNm/m)"].extend( bending_results ) export_data[design_case]["Shear (kN/m)"].extend(shear_results) export_data[design_case]["Displacement (mm)"].extend( displacement_results ) try: with pd.ExcelWriter(os.path.join(out_folder, file_name)) as writer: export_titles.to_excel( writer, sheet_name="Titles", index=False, header=False ) export_envelopes.to_excel( writer, sheet_name="Envelopes", index=False, ) for design_case in design_cases: export_data_df = pd.DataFrame(export_data[design_case]) export_data_df.to_excel( writer, sheet_name=design_case, index=False, ) except PermissionError: raise FrewError( """ Please make sure you have closed the results spreadsheet. """ )