From 0344b7a40a09b3719dd0cb3763da7d3de4e110e9 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 13 Jul 2021 07:59:21 +0200 Subject: [PATCH] FEM: calculix writer, move generic constraint writer into base writer --- src/Mod/Fem/femsolver/calculix/writer.py | 121 +++++------------------ src/Mod/Fem/femsolver/writerbase.py | 78 +++++++++++++++ 2 files changed, 101 insertions(+), 98 deletions(-) diff --git a/src/Mod/Fem/femsolver/calculix/writer.py b/src/Mod/Fem/femsolver/calculix/writer.py index c9dd6c9ae0..41de031999 100644 --- a/src/Mod/Fem/femsolver/calculix/writer.py +++ b/src/Mod/Fem/femsolver/calculix/writer.py @@ -170,44 +170,44 @@ class FemInputWriterCcx(writerbase.FemInputWriter): inpfile = con_fluidsection.handle_fluidsection_liquid_inlet_outlet(inpfile, self) # element sets constraints - self.write_constraints_sets(inpfile, self.centrif_objects, con_centrif) + self.write_constraints_meshsets(inpfile, self.centrif_objects, con_centrif) # node sets - self.write_constraints_sets(inpfile, self.fixed_objects, con_fixed) - self.write_constraints_sets(inpfile, self.displacement_objects, con_displacement) - self.write_constraints_sets(inpfile, self.planerotation_objects, con_planerotation) - self.write_constraints_sets(inpfile, self.transform_objects, con_transform) - self.write_constraints_sets(inpfile, self.temperature_objects, con_temperature) + self.write_constraints_meshsets(inpfile, self.fixed_objects, con_fixed) + self.write_constraints_meshsets(inpfile, self.displacement_objects, con_displacement) + self.write_constraints_meshsets(inpfile, self.planerotation_objects, con_planerotation) + self.write_constraints_meshsets(inpfile, self.transform_objects, con_transform) + self.write_constraints_meshsets(inpfile, self.temperature_objects, con_temperature) # surface sets - self.write_constraints_sets(inpfile, self.contact_objects, con_contact) - self.write_constraints_sets(inpfile, self.tie_objects, con_tie) - self.write_constraints_sets(inpfile, self.sectionprint_objects, con_sectionprint) + self.write_constraints_meshsets(inpfile, self.contact_objects, con_contact) + self.write_constraints_meshsets(inpfile, self.tie_objects, con_tie) + self.write_constraints_meshsets(inpfile, self.sectionprint_objects, con_sectionprint) # materials and fem element types write_femelement_material.write_femelement_material(inpfile, self) - self.write_constraints_data(inpfile, self.initialtemperature_objects, con_initialtemp) + self.write_constraints_propdata(inpfile, self.initialtemperature_objects, con_initialtemp) write_femelement_geometry.write_femelement_geometry(inpfile, self) # constraints independent from steps - self.write_constraints_data(inpfile, self.planerotation_objects, con_planerotation) - self.write_constraints_data(inpfile, self.contact_objects, con_contact) - self.write_constraints_data(inpfile, self.tie_objects, con_tie) - self.write_constraints_data(inpfile, self.transform_objects, con_transform) + self.write_constraints_propdata(inpfile, self.planerotation_objects, con_planerotation) + self.write_constraints_propdata(inpfile, self.contact_objects, con_contact) + self.write_constraints_propdata(inpfile, self.tie_objects, con_tie) + self.write_constraints_propdata(inpfile, self.transform_objects, con_transform) # step equation write_step_equation.write_step_equation(inpfile, self) # constraints dependent from steps - self.write_constraints_data(inpfile, self.fixed_objects, con_fixed) - self.write_constraints_data(inpfile, self.displacement_objects, con_displacement) - self.write_constraints_data(inpfile, self.sectionprint_objects, con_sectionprint) - self.write_constraints_data(inpfile, self.selfweight_objects, con_selfweight) - self.write_constraints_data(inpfile, self.centrif_objects, con_centrif) - self.write_constraints_sets(inpfile, self.force_objects, con_force) - self.write_constraints_sets(inpfile, self.pressure_objects, con_pressure) - self.write_constraints_data(inpfile, self.temperature_objects, con_temperature) - self.write_constraints_sets(inpfile, self.heatflux_objects, con_heatflux) + self.write_constraints_propdata(inpfile, self.fixed_objects, con_fixed) + self.write_constraints_propdata(inpfile, self.displacement_objects, con_displacement) + self.write_constraints_propdata(inpfile, self.sectionprint_objects, con_sectionprint) + self.write_constraints_propdata(inpfile, self.selfweight_objects, con_selfweight) + self.write_constraints_propdata(inpfile, self.centrif_objects, con_centrif) + self.write_constraints_meshsets(inpfile, self.force_objects, con_force) + self.write_constraints_meshsets(inpfile, self.pressure_objects, con_pressure) + self.write_constraints_propdata(inpfile, self.temperature_objects, con_temperature) + self.write_constraints_meshsets(inpfile, self.heatflux_objects, con_heatflux) con_fluidsection.write_constraints_fluidsection(inpfile, self) # output and step end @@ -218,80 +218,5 @@ class FemInputWriterCcx(writerbase.FemInputWriter): write_footer.write_footer(inpfile, self) inpfile.close() - # ******************************************************************************************** - # write constraint node sets, constraint face sets, constraint element sets - def write_constraints_sets( - self, - f, - femobjs, - con_module - ): - if not femobjs: - return - - analysis_types = con_module.get_analysis_types() - if analysis_types != "all" and self.analysis_type not in analysis_types: - return - - def constraint_sets_loop_writing(the_file, femobjs, write_before, write_after): - if write_before != "": - f.write(write_before) - for femobj in femobjs: - # femobj --> dict, FreeCAD document object is femobj["Object"] - the_obj = femobj["Object"] - f.write("** {}\n".format(the_obj.Label)) - con_module.write_meshdata_constraint(the_file, femobj, the_obj, self) - if write_after != "": - f.write(write_after) - - write_before = con_module.get_before_write_meshdata_constraint() - write_after = con_module.get_after_write_meshdata_constraint() - - # write sets to file - write_name = con_module.get_sets_name() - f.write("\n{}\n".format(59 * "*")) - f.write("** {}\n".format(write_name.replace("_", " "))) - - if self.split_inpfile is True: - file_name_split = "{}_{}.inp".format(self.mesh_name, write_name) - f.write("** {}\n".format(write_name.replace("_", " "))) - f.write("*INCLUDE,INPUT={}\n".format(file_name_split)) - inpfile_split = open(join(self.dir_name, file_name_split), "w") - constraint_sets_loop_writing(inpfile_split, femobjs, write_before, write_after) - inpfile_split.close() - else: - constraint_sets_loop_writing(f, femobjs, write_before, write_after) - - # ******************************************************************************************** - # write constraint data - def write_constraints_data( - self, - f, - femobjs, - con_module - ): - - if not femobjs: - return - - analysis_types = con_module.get_analysis_types() - if analysis_types != "all" and self.analysis_type not in analysis_types: - return - - write_before = con_module.get_before_write_constraint() - write_after = con_module.get_after_write_constraint() - - # write constraint to file - f.write("\n{}\n".format(59 * "*")) - f.write("** {}\n".format(con_module.get_constraint_title())) - if write_before != "": - f.write(write_before) - for femobj in femobjs: - # femobj --> dict, FreeCAD document object is femobj["Object"] - the_obj = femobj["Object"] - f.write("** {}\n".format(the_obj.Label)) - con_module.write_constraint(f, femobj, the_obj, self) - if write_after != "": - f.write(write_after) ## @} diff --git a/src/Mod/Fem/femsolver/writerbase.py b/src/Mod/Fem/femsolver/writerbase.py index 2e2140c67c..104507f2d0 100644 --- a/src/Mod/Fem/femsolver/writerbase.py +++ b/src/Mod/Fem/femsolver/writerbase.py @@ -29,6 +29,7 @@ __url__ = "https://www.freecadweb.org" # @{ import os +from os.path import join import FreeCAD @@ -127,6 +128,83 @@ class FemInputWriter(): self.femelement_edges_table = {} self.femelement_count_test = True + # ******************************************************************************************** + # ******************************************************************************************** + # generic writer for constraints mesh sets and constraints property data + # write constraint node sets, constraint face sets, constraint element sets + def write_constraints_meshsets( + self, + f, + femobjs, + con_module + ): + if not femobjs: + return + + analysis_types = con_module.get_analysis_types() + if analysis_types != "all" and self.analysis_type not in analysis_types: + return + + def constraint_sets_loop_writing(the_file, femobjs, write_before, write_after): + if write_before != "": + f.write(write_before) + for femobj in femobjs: + # femobj --> dict, FreeCAD document object is femobj["Object"] + the_obj = femobj["Object"] + f.write("** {}\n".format(the_obj.Label)) + con_module.write_meshdata_constraint(the_file, femobj, the_obj, self) + if write_after != "": + f.write(write_after) + + write_before = con_module.get_before_write_meshdata_constraint() + write_after = con_module.get_after_write_meshdata_constraint() + + # write sets to file + write_name = con_module.get_sets_name() + f.write("\n{}\n".format(59 * "*")) + f.write("** {}\n".format(write_name.replace("_", " "))) + + if self.split_inpfile is True: + file_name_split = "{}_{}.inp".format(self.mesh_name, write_name) + f.write("** {}\n".format(write_name.replace("_", " "))) + f.write("*INCLUDE,INPUT={}\n".format(file_name_split)) + inpfile_split = open(join(self.dir_name, file_name_split), "w") + constraint_sets_loop_writing(inpfile_split, femobjs, write_before, write_after) + inpfile_split.close() + else: + constraint_sets_loop_writing(f, femobjs, write_before, write_after) + + # write constraint property data + def write_constraints_propdata( + self, + f, + femobjs, + con_module + ): + + if not femobjs: + return + + analysis_types = con_module.get_analysis_types() + if analysis_types != "all" and self.analysis_type not in analysis_types: + return + + write_before = con_module.get_before_write_constraint() + write_after = con_module.get_after_write_constraint() + + # write constraint to file + f.write("\n{}\n".format(59 * "*")) + f.write("** {}\n".format(con_module.get_constraint_title())) + if write_before != "": + f.write(write_before) + for femobj in femobjs: + # femobj --> dict, FreeCAD document object is femobj["Object"] + the_obj = femobj["Object"] + f.write("** {}\n".format(the_obj.Label)) + con_module.write_constraint(f, femobj, the_obj, self) + if write_after != "": + f.write(write_after) + # ******************************************************************************************** # ******************************************************************************************** # use set for node sets to be sure all nodes are unique