diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 75e87aea1..815766868 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -61,6 +61,14 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): print('FemInputWriterCcx --> self.dir_name --> ' + self.dir_name) print('FemInputWriterCcx --> self.file_name --> ' + self.file_name) + def select_input_writer_mode(self): + if self.solver_obj.SplitInputWriter == True: + self.write_calculix_splitted_input_file() + else: + self.write_calculix_input_file() + + return self.file_name + def write_calculix_input_file(self): timestart = time.clock() self.femmesh.writeABAQUS(self.file_name) @@ -146,6 +154,173 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): print("Writing time input file: " + str(time.clock() - timestart) + ' \n') return self.file_name + def write_calculix_splitted_input_file(self): + timestart = time.clock() + + # reopen file with "append" and add the analysis definition + # first open file with "write" to ensure that each new iteration of writing of inputfile starts in new file + # first open file with "write" to ensure that the .writeABAQUS also writes in inputfile + inpfileMain = open(self.file_name, 'w') + inpfileMain.close + inpfileMain = open(self.file_name, 'a') + inpfileMain.write('\n\n') + + # write nodes and elements + name = "" + for i in range(len(self.file_name)-4): + name = name + self.file_name[i] + + inpfileNodesElem = open(name + "_Node_Elem_sets.inp", 'w') + self.femmesh.writeABAQUS(name + "_Node_Elem_sets.inp") + inpfileNodesElem.close + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('**Nodes and Elements\n') + inpfileMain.write('** written by femmesh.writeABAQUS\n') + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_Elem_sets.inp \n") + + # create seperate inputfiles for each node set or constraint + if self.fixed_objects or self.displacement_objects or self.planerotation_objects: + inpfileNodes = open(name + "_Node_sets.inp", 'w') + if self.analysis_type == "thermomech" and self.temperature_objects: + inpfileNodeTemp = open(name + "_Node_Temp.inp", 'w') + if self.force_objects: + inpfileForce = open(name + "_Node_Force.inp", 'w') + if self.pressure_objects: + inpfilePressure = open(name + "_Pressure.inp", 'w') + if self.analysis_type == "thermomech" and self.heatflux_objects: + inpfileHeatflux = open(name + "_Node_Heatlfux.inp", 'w') + if self.contact_objects: + inpfileContact = open(name + "_Surface_Contact.inp", 'w') + if self.transform_objects: + inpfileTransform = open(name + "_Node_Transform.inp", 'w') + + # node and element sets + self.write_element_sets_material_and_femelement_type(inpfileMain) + if self.fixed_objects: + self.write_node_sets_constraints_fixed(inpfileNodes) + if self.displacement_objects: + self.write_node_sets_constraints_displacement(inpfileNodes) + if self.planerotation_objects: + self.write_node_sets_constraints_planerotation(inpfileNodes) + if self.contact_objects: + self.write_surfaces_contraints_contact(inpfileContact) + if self.transform_objects: + self.write_node_sets_constraints_transform(inpfileTransform) + + # write commentary and include statement for static case node sets + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('**Node sets for constraints\n') + inpfileMain.write('** written by write_node_sets_constraints_fixed\n') + inpfileMain.write('** written by write_node_sets_constraints_displacement\n') + inpfileMain.write('** written by write_node_sets_constraints_planerotation\n') + if self.fixed_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_sets.inp \n") + + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('** Surfaces for contact constraint\n') + inpfileMain.write('** written by write_surfaces_contraints_contact\n') + if self.contact_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Surface_Contact.inp \n") + + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('** Node sets for transform constraint\n') + inpfileMain.write('** written by write_node_sets_constraints_transform\n') + if self.transform_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_Transform.inp \n") + + if self.analysis_type == "thermomech" and self.temperature_objects: + self.write_node_sets_constraints_temperature(inpfileNodeTemp) + + # include seperately written temperature constraint in input file + if self.analysis_type == "thermomech": + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('**Node sets for temperature constraint\n') + inpfileMain.write('** written by write_node_sets_constraints_temperature\n') + if self.temperature_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_Temp.inp \n") + + # materials and fem element types + self.write_materials(inpfileMain) + if self.analysis_type == "thermomech" and self.initialtemperature_objects: + self.write_constraints_initialtemperature(inpfileMain) + self.write_femelementsets(inpfileMain) + + # constraints independent from steps + if self.planerotation_objects: + self.write_constraints_planerotation(inpfileMain) + if self.contact_objects: + self.write_constraints_contact(inpfileMain) + if self.transform_objects: + self.write_constraints_transform(inpfileMain) + + # step begin + if self.analysis_type == "frequency": + self.write_step_begin_static_frequency(inpfileMain) + self.write_analysis_frequency(inpfileMain) + elif self.analysis_type == "static": + self.write_step_begin_static_frequency(inpfileMain) + elif self.analysis_type == "thermomech": + self.write_step_begin_thermomech(inpfileMain) + self.write_analysis_thermomech(inpfileMain) + + # constraints depend on step used in all analysis types + if self.fixed_objects: + self.write_constraints_fixed(inpfileMain) + if self.displacement_objects: + self.write_constraints_displacement(inpfileMain) + + # constraints depend on step and depending on analysis type + if self.analysis_type == "frequency": + pass + elif self.analysis_type == "static": + if self.selfweight_objects: + self.write_constraints_selfweight(inpfileMain) + if self.force_objects: + self.write_constraints_force(inpfileForce) + if self.pressure_objects: + self.write_constraints_pressure(inpfilePressure) + elif self.analysis_type == "thermomech": + if self.selfweight_objects: + self.write_constraints_selfweight(inpfileMain) + if self.force_objects: + self.write_constraints_force(inpfileForce) + if self.pressure_objects: + self.write_constraints_pressure(inpfilePressure) + if self.temperature_objects: + self.write_constraints_temperature(inpfileMain) + if self.heatflux_objects: + self.write_constraints_heatflux(inpfileHeatflux) + + # include seperately written constraints in input file + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('** Node loads\n') + inpfileMain.write('** written by write_constraints_force\n') + if self.force_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_Force.inp \n") + + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('** Element + CalculiX face + load in [MPa]\n') + inpfileMain.write('** written by write_constraints_pressure\n') + if self.pressure_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Pressure.inp \n") + + if self.analysis_type == "thermomech": + inpfileMain.write('\n***********************************************************\n') + inpfileMain.write('** Convective heat transfer (heat flux)\n') + inpfileMain.write('** written by write_constraints_heatflux\n') + if self.heatflux_objects: + inpfileMain.write('*INCLUDE,INPUT=' + name + "_Node_Heatlfux.inp \n") + + # output and step end + self.write_outputs_types(inpfileMain) + self.write_step_end(inpfileMain) + + # footer + self.write_footer(inpfileMain) + inpfileMain.close() + print("Writing time input file: " + str(time.clock() - timestart) + ' \n') +# return self.file_name + def write_element_sets_material_and_femelement_type(self, f): f.write('\n***********************************************************\n') f.write('** Element sets for materials and FEM element type (solid, shell, beam)\n') diff --git a/src/Mod/Fem/FemToolsCcx.py b/src/Mod/Fem/FemToolsCcx.py index d110197d8..936f7feed 100644 --- a/src/Mod/Fem/FemToolsCcx.py +++ b/src/Mod/Fem/FemToolsCcx.py @@ -97,7 +97,7 @@ class FemToolsCcx(FemTools.FemTools): self.temperature_constraints, self.heatflux_constraints, self.initialtemperature_constraints, self.beam_sections, self.shell_thicknesses, self.analysis_type, self.working_dir) - self.inp_file_name = inp_writer.write_calculix_input_file() + self.inp_file_name = inp_writer.select_input_writer_mode() except: print("Unexpected error when writing CalculiX input file:", sys.exc_info()[0]) raise