FI_violated = [] disp_max = [] i = 0 i_violated = 0 continue_iterations = True check_tolerance = False mass_excess = 0.0 elm_states_before_last = {} elm_states_last = elm_states oscillations = False while True: # creating the new .inp file for CalculiX file_nameW = os.path.join(path, "file" + str(i).zfill(3)) beso_lib.write_inp(file_name, file_nameW, elm_states, number_of_states, domains, domains_from_config, domain_optimized, domain_thickness, domain_offset, domain_orientation, domain_material, domain_volumes, domain_shells, plane_strain, plane_stress, axisymmetry, save_iteration_results, i, reference_points, shells_as_composite, optimization_base, displacement_graph) # running CalculiX analysis subprocess.call(os.path.normpath(path_calculix) + " " + file_nameW, shell=True, cwd=path) # reading results and computing failure indeces if reference_points == "integration points": # from .dat file [FI_step, energy_density_step, disp_i] = beso_lib.import_FI_int_pt(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states, domains_from_config, steps_superposition, displacement_graph) elif reference_points == "nodes": # from .frd file FI_step = beso_lib.import_FI_node(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states, steps_superposition) disp_i = beso_lib.import_displacement(file_nameW, displacement_graph, steps_superposition) disp_max.append(disp_i)
buckling_factors_all = [] i = 0 i_violated = 0 continue_iterations = True check_tolerance = False mass_excess = 0.0 elm_states_before_last = {} elm_states_last = elm_states oscillations = False while True: # creating the new .inp file for CalculiX file_nameW = os.path.join(path, "file" + str(i).zfill(3)) beso_lib.write_inp(file_name, file_nameW, elm_states, number_of_states, domains, domains_from_config, domain_optimized, domain_thickness, domain_offset, domain_orientation, domain_material, domain_volumes, domain_shells, plane_strain, plane_stress, axisymmetry, save_iteration_results, i, reference_points, shells_as_composite, optimization_base, displacement_graph, domain_FI_filled) # running CalculiX analysis subprocess.call([os.path.normpath(path_calculix), file_nameW], cwd=path) # reading results and computing failure indeces if (reference_points == "integration points") or (optimization_base == "stiffness") or \ (optimization_base == "buckling") or (optimization_base == "heat"): # from .dat file [FI_step, energy_density_step, disp_i, buckling_factors, energy_density_eigen, heat_flux] = \ beso_lib.import_FI_int_pt(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states, domains_from_config, steps_superposition, displacement_graph) if reference_points == "nodes": # from .frd file FI_step = beso_lib.import_FI_node(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states, steps_superposition) disp_i = beso_lib.import_displacement(file_nameW, displacement_graph, steps_superposition)
def FEA(self): global i, FI_step, sensitivity_number, FI_violated, FI_step_max print("FEA") # creating a new .inp file for CalculiX file_nameW = path_export + '/' + str(i).zfill(3) beso_lib.write_inp(file_name, file_nameW, elm_states, number_of_states, domains, domains_from_config, domain_optimized, domain_thickness, domain_offset, domain_material, domain_volumes, domain_shells, plane_strain, plane_stress, axisymmetry, save_iteration_results, i, reference_points, shells_as_composite) # running CalculiX analysis subprocess.call(os.path.normpath(path_calculix) + " " + os.path.join(path, file_nameW), shell=True) # reading results and computing failure indeces if reference_points == "integration points": # from .dat file FI_step = beso_lib.import_FI_int_pt(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states, domains_from_config) elif reference_points == "nodes": # from .frd file FI_step = beso_lib.import_FI_node(reference_value, file_nameW, domains, criteria, domain_FI, file_name, elm_states) os.remove(file_nameW + ".inp") if not save_iteration_results or np.mod(float(i - 1), save_iteration_results) != 0: os.remove(file_nameW + ".dat") os.remove(file_nameW + ".frd") os.remove(file_nameW + ".sta") os.remove(file_nameW + ".cvg") FI_max.append({}) for dn in domains_from_config: FI_max[i][dn] = 0 for en in domains[dn]: for sn in range(len(FI_step)): try: FI_step_en = list( filter(lambda a: a is not None, FI_step[sn][en])) # drop None FI FI_max[i][dn] = max(FI_max[i][dn], max(FI_step_en)) except ValueError: msg = "FI_max computing failed. Check if each domain contains at least one failure criterion." beso_lib.write_to_log(file_name, "ERROR: " + msg + "\n") raise Exception(msg) except KeyError: msg = "Some result values are missing. Check available disk space." beso_lib.write_to_log(file_name, "ERROR: " + msg + "\n") raise Exception(msg) print("domain ordered \nFI_max and number of violated elements") # handling with more steps FI_step_max = { } # maximal FI over all steps for each element in this iteration FI_violated.append([]) dno = 0 for dn in domains_from_config: FI_violated[i].append(0) for en in domains[dn]: FI_step_max[en] = 0 for sn in range(len(FI_step)): FI_step_en = list( filter(lambda a: a is not None, FI_step[sn][en])) # drop None FI FI_step_max[en] = max(FI_step_max[en], max(FI_step_en)) sensitivity_number[en] = FI_step_max[en] / domain_density[dn][ elm_states[en]] if FI_step_max[en] >= 1: FI_violated[i][dno] += 1 print( str(FI_max[i][dn]).rjust(15) + " " + str(FI_violated[i][dno]).rjust(4)) dno += 1