FEM: solver calculix writer and solver writer base, use small character for import identifier
This commit is contained in:
@@ -27,17 +27,18 @@ __url__ = "http://www.freecadweb.org"
|
||||
## \addtogroup FEM
|
||||
# @{
|
||||
|
||||
import FreeCAD
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import codecs
|
||||
import femmesh.meshtools as FemMeshTools
|
||||
from .. import writerbase as FemInputWriter
|
||||
import six
|
||||
|
||||
import FreeCAD
|
||||
from femmesh import meshtools
|
||||
from .. import writerbase
|
||||
|
||||
class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
|
||||
class FemInputWriterCcx(writerbase.FemInputWriter):
|
||||
def __init__(
|
||||
self,
|
||||
analysis_obj,
|
||||
@@ -62,7 +63,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
fluidsection_obj,
|
||||
dir_name=None
|
||||
):
|
||||
FemInputWriter.FemInputWriter.__init__(
|
||||
writerbase.FemInputWriter.__init__(
|
||||
self,
|
||||
analysis_obj,
|
||||
solver_obj,
|
||||
@@ -91,9 +92,9 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
self.file_name = join(self.dir_name, self.main_file_name)
|
||||
self.FluidInletoutlet_ele = []
|
||||
self.fluid_inout_nodes_file = join(self.dir_name, (self.mesh_object.Name + '_inout_nodes.txt'))
|
||||
FreeCAD.Console.PrintLog('FemInputWriterCcx --> self.dir_name --> ' + self.dir_name + '\n')
|
||||
FreeCAD.Console.PrintLog('FemInputWriterCcx --> self.main_file_name --> ' + self.main_file_name + '\n')
|
||||
FreeCAD.Console.PrintMessage('FemInputWriterCcx --> self.file_name --> ' + self.file_name + '\n')
|
||||
FreeCAD.Console.PrintLog('writerbaseCcx --> self.dir_name --> ' + self.dir_name + '\n')
|
||||
FreeCAD.Console.PrintLog('writerbaseCcx --> self.main_file_name --> ' + self.main_file_name + '\n')
|
||||
FreeCAD.Console.PrintMessage('writerbaseCcx --> self.file_name --> ' + self.file_name + '\n')
|
||||
|
||||
def write_calculix_input_file(self):
|
||||
timestart = time.clock()
|
||||
@@ -101,7 +102,10 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
self.write_calculix_splitted_input_file()
|
||||
else:
|
||||
self.write_calculix_one_input_file()
|
||||
writing_time_string = "Writing time input file: " + str(round((time.clock() - timestart), 2)) + " seconds"
|
||||
writing_time_string = (
|
||||
"Writing time input file: {} seconds"
|
||||
.format(round((time.clock() - timestart), 2))
|
||||
)
|
||||
if self.femelement_count_test is True:
|
||||
FreeCAD.Console.PrintMessage(writing_time_string + ' \n\n')
|
||||
return self.file_name
|
||||
@@ -120,7 +124,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
# Check to see if fluid sections are in analysis and use D network element type
|
||||
if self.fluidsection_objects:
|
||||
inpfile.close()
|
||||
FemMeshTools.write_D_network_element_to_inputfile(self.file_name)
|
||||
meshtools.write_D_network_element_to_inputfile(self.file_name)
|
||||
inpfile = open(self.file_name, 'a')
|
||||
# node and element sets
|
||||
self.write_element_sets_material_and_femelement_type(inpfile)
|
||||
@@ -146,7 +150,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
if self.fluidsection_objects:
|
||||
if is_fluid_section_inlet_outlet(self.ccx_elsets) is True:
|
||||
inpfile.close()
|
||||
FemMeshTools.use_correct_fluidinout_ele_def(self.FluidInletoutlet_ele, self.file_name, self.fluid_inout_nodes_file)
|
||||
meshtools.use_correct_fluidinout_ele_def(self.FluidInletoutlet_ele, self.file_name, self.fluid_inout_nodes_file)
|
||||
inpfile = open(self.file_name, 'a')
|
||||
|
||||
# constraints independent from steps
|
||||
@@ -218,7 +222,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
|
||||
# Check to see if fluid sections are in analysis and use D network element type
|
||||
if self.fluidsection_objects:
|
||||
FemMeshTools.write_D_network_element_to_inputfile(name + "_Node_Elem_sets.inp")
|
||||
meshtools.write_D_network_element_to_inputfile(name + "_Node_Elem_sets.inp")
|
||||
|
||||
inpfileMain.write('\n***********************************************************\n')
|
||||
inpfileMain.write('**Nodes and Elements\n')
|
||||
@@ -294,7 +298,14 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
# Fluid section: Inlet and Outlet requires special element definition
|
||||
if self.fluidsection_objects:
|
||||
if is_fluid_section_inlet_outlet(self.ccx_elsets) is True:
|
||||
<<<<<<< HEAD
|
||||
FemMeshTools.use_correct_fluidinout_ele_def(self.FluidInletoutlet_ele, name + "_Node_Elem_sets.inp", self.fluid_inout_nodes_file)
|
||||
=======
|
||||
meshtools.use_correct_fluidinout_ele_def(
|
||||
self.FluidInletoutlet_ele, name + "_Node_Elem_sets.inp",
|
||||
self.fluid_inout_nodes_file
|
||||
)
|
||||
>>>>>>> 5e4bf5b587... FEM: solver calculix writer and solver writer base, use small character for import identifier
|
||||
|
||||
# constraints independent from steps
|
||||
if self.planerotation_objects:
|
||||
@@ -516,7 +527,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
nodes_coords = []
|
||||
for node in l_nodes:
|
||||
nodes_coords.append((node, self.femnodes_mesh[node].x, self.femnodes_mesh[node].y, self.femnodes_mesh[node].z))
|
||||
node_planerotation = FemMeshTools.get_three_non_colinear_nodes(nodes_coords)
|
||||
node_planerotation = meshtools.get_three_non_colinear_nodes(nodes_coords)
|
||||
for i in range(len(l_nodes)):
|
||||
if l_nodes[i] not in node_planerotation:
|
||||
node_planerotation.append(l_nodes[i])
|
||||
@@ -921,11 +932,11 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
|
||||
f.write('** ' + trans_obj.Label + '\n')
|
||||
if trans_obj.TransformType == "Rectangular":
|
||||
f.write('*TRANSFORM, NSET=Rect' + trans_obj.Name + ', TYPE=R\n')
|
||||
coords = FemMeshTools.get_rectangular_coords(trans_obj)
|
||||
coords = meshtools.get_rectangular_coords(trans_obj)
|
||||
f.write(coords + '\n')
|
||||
elif trans_obj.TransformType == "Cylindrical":
|
||||
f.write('*TRANSFORM, NSET=Cylin' + trans_obj.Name + ', TYPE=C\n')
|
||||
coords = FemMeshTools.get_cylindrical_coords(trans_obj)
|
||||
coords = meshtools.get_cylindrical_coords(trans_obj)
|
||||
f.write(coords + '\n')
|
||||
|
||||
def write_constraints_selfweight(self, f):
|
||||
|
||||
@@ -27,7 +27,7 @@ __url__ = "http://www.freecadweb.org"
|
||||
# @{
|
||||
|
||||
import FreeCAD
|
||||
import femmesh.meshtools as FemMeshTools
|
||||
from femmesh import meshtools
|
||||
import os
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ class FemInputWriter():
|
||||
# get nodes
|
||||
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint fixed:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
# add nodes to constraint_conflict_nodes, needed by constraint plane rotation
|
||||
for node in femobj['Nodes']:
|
||||
self.constraint_conflict_nodes.append(node)
|
||||
@@ -126,7 +126,7 @@ class FemInputWriter():
|
||||
if self.femmesh.Volumes and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0):
|
||||
print('We need to find the solid nodes.')
|
||||
if not self.femelement_volumes_table:
|
||||
self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_table(self.femmesh)
|
||||
self.femelement_volumes_table = meshtools.get_femelement_volumes_table(self.femmesh)
|
||||
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
nds_solid = []
|
||||
nds_faceedge = []
|
||||
@@ -146,7 +146,7 @@ class FemInputWriter():
|
||||
# get nodes
|
||||
for femobj in self.displacement_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint displacement:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
# add nodes to constraint_conflict_nodes, needed by constraint plane rotation
|
||||
for node in femobj['Nodes']:
|
||||
self.constraint_conflict_nodes.append(node)
|
||||
@@ -155,25 +155,25 @@ class FemInputWriter():
|
||||
# get nodes
|
||||
for femobj in self.planerotation_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint plane rotation:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
|
||||
def get_constraints_transform_nodes(self):
|
||||
# get nodes
|
||||
for femobj in self.transform_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint transform nodes:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
|
||||
def get_constraints_temperature_nodes(self):
|
||||
# get nodes
|
||||
for femobj in self.temperature_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint temperature:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
|
||||
def get_constraints_fluidsection_nodes(self):
|
||||
# get nodes
|
||||
for femobj in self.fluidsection_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint fluid section:" + ' ' + femobj['Object'].Name + '\n')
|
||||
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
femobj['Nodes'] = meshtools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
|
||||
|
||||
def get_constraints_force_nodeloads(self):
|
||||
# check shape type of reference shape
|
||||
@@ -183,7 +183,7 @@ class FemInputWriter():
|
||||
if femobj['RefShapeType'] == 'Vertex':
|
||||
# print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
|
||||
pass
|
||||
elif femobj['RefShapeType'] == 'Face' and FemMeshTools.is_solid_femmesh(self.femmesh) and not FemMeshTools.has_no_face_data(self.femmesh):
|
||||
elif femobj['RefShapeType'] == 'Face' and meshtools.is_solid_femmesh(self.femmesh) and not meshtools.has_no_face_data(self.femmesh):
|
||||
# print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation")
|
||||
if not self.femnodes_mesh:
|
||||
self.femnodes_mesh = self.femmesh.Nodes
|
||||
@@ -192,7 +192,7 @@ class FemInputWriter():
|
||||
if not self.femnodes_mesh:
|
||||
self.femnodes_mesh = self.femmesh.Nodes
|
||||
if not self.femelement_table:
|
||||
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
|
||||
self.femelement_table = meshtools.get_femelement_table(self.femmesh)
|
||||
# get node loads
|
||||
FreeCAD.Console.PrintMessage(" Finite element mesh nodes will be retrieved by searching the appropriate nodes in the finite element mesh.\n")
|
||||
FreeCAD.Console.PrintMessage(" The appropriate finite element mesh node load values will be calculated according to the finite element definition.\n")
|
||||
@@ -201,11 +201,11 @@ class FemInputWriter():
|
||||
if frc_obj.Force == 0:
|
||||
FreeCAD.Console.PrintMessage(' Warning --> Force = 0\n')
|
||||
if femobj['RefShapeType'] == 'Vertex': # point load on vertices
|
||||
femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(self.femmesh, frc_obj)
|
||||
femobj['NodeLoadTable'] = meshtools.get_force_obj_vertex_nodeload_table(self.femmesh, frc_obj)
|
||||
elif femobj['RefShapeType'] == 'Edge': # line load on edges
|
||||
femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
|
||||
femobj['NodeLoadTable'] = meshtools.get_force_obj_edge_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
|
||||
elif femobj['RefShapeType'] == 'Face': # area load on faces
|
||||
femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
|
||||
femobj['NodeLoadTable'] = meshtools.get_force_obj_face_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
|
||||
|
||||
def get_constraints_pressure_faces(self):
|
||||
# TODO see comments in get_constraints_force_nodeloads(), it applies here too. Mhh it applies to all constraints ...
|
||||
@@ -214,20 +214,20 @@ class FemInputWriter():
|
||||
# depreciated version
|
||||
# get the faces and face numbers
|
||||
for femobj in self.pressure_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
femobj['PressureFaces'] = FemMeshTools.get_pressure_obj_faces_depreciated(self.femmesh, femobj)
|
||||
femobj['PressureFaces'] = meshtools.get_pressure_obj_faces_depreciated(self.femmesh, femobj)
|
||||
# print(femobj['PressureFaces'])
|
||||
'''
|
||||
|
||||
if not self.femnodes_mesh:
|
||||
self.femnodes_mesh = self.femmesh.Nodes
|
||||
if not self.femelement_table:
|
||||
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
|
||||
self.femelement_table = meshtools.get_femelement_table(self.femmesh)
|
||||
if not self.femnodes_ele_table:
|
||||
self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
|
||||
self.femnodes_ele_table = meshtools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
|
||||
|
||||
for femobj in self.pressure_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
|
||||
FreeCAD.Console.PrintMessage("Constraint pressure: " + femobj['Object'].Name + '\n')
|
||||
pressure_faces = FemMeshTools.get_pressure_obj_faces(self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj)
|
||||
pressure_faces = meshtools.get_pressure_obj_faces(self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj)
|
||||
femobj['PressureFaces'] = [(femobj['Object'].Name + ': face load', pressure_faces)]
|
||||
FreeCAD.Console.PrintLog('{}\n'.format(femobj['PressureFaces']))
|
||||
|
||||
@@ -235,29 +235,29 @@ class FemInputWriter():
|
||||
# get element ids and write them into the objects
|
||||
FreeCAD.Console.PrintMessage('Shell thicknesses\n')
|
||||
if not self.femelement_faces_table:
|
||||
self.femelement_faces_table = FemMeshTools.get_femelement_faces_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.shellthickness_objects)
|
||||
self.femelement_faces_table = meshtools.get_femelement_faces_table(self.femmesh)
|
||||
meshtools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.shellthickness_objects)
|
||||
|
||||
def get_element_geometry1D_elements(self):
|
||||
# get element ids and write them into the objects
|
||||
FreeCAD.Console.PrintMessage('Beam sections\n')
|
||||
if not self.femelement_edges_table:
|
||||
self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.beamsection_objects)
|
||||
self.femelement_edges_table = meshtools.get_femelement_edges_table(self.femmesh)
|
||||
meshtools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.beamsection_objects)
|
||||
|
||||
def get_element_rotation1D_elements(self):
|
||||
# get for each geometry edge direction the element ids and rotation norma
|
||||
FreeCAD.Console.PrintMessage('Beam rotations\n')
|
||||
if not self.femelement_edges_table:
|
||||
self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_direction1D_set(self.femmesh, self.femelement_edges_table, self.beamrotation_objects, self.theshape)
|
||||
self.femelement_edges_table = meshtools.get_femelement_edges_table(self.femmesh)
|
||||
meshtools.get_femelement_direction1D_set(self.femmesh, self.femelement_edges_table, self.beamrotation_objects, self.theshape)
|
||||
|
||||
def get_element_fluid1D_elements(self):
|
||||
# get element ids and write them into the objects
|
||||
FreeCAD.Console.PrintMessage('Fluid sections\n')
|
||||
if not self.femelement_edges_table:
|
||||
self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.fluidsection_objects)
|
||||
self.femelement_edges_table = meshtools.get_femelement_edges_table(self.femmesh)
|
||||
meshtools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.fluidsection_objects)
|
||||
|
||||
def get_material_elements(self):
|
||||
# it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects
|
||||
@@ -270,28 +270,28 @@ class FemInputWriter():
|
||||
# there we have to check of some geometric objects
|
||||
all_found = False
|
||||
if self.femmesh.GroupCount:
|
||||
all_found = FemMeshTools.get_femelement_sets_from_group_data(self.femmesh, self.material_objects)
|
||||
all_found = meshtools.get_femelement_sets_from_group_data(self.femmesh, self.material_objects)
|
||||
FreeCAD.Console.PrintMessage(all_found)
|
||||
FreeCAD.Console.PrintMessage('\n')
|
||||
if all_found is False:
|
||||
if not self.femelement_table:
|
||||
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
|
||||
self.femelement_table = meshtools.get_femelement_table(self.femmesh)
|
||||
# we're going to use the binary search for get_femelements_by_femnodes()
|
||||
# thus we need the parameter values self.femnodes_ele_table
|
||||
if not self.femnodes_mesh:
|
||||
self.femnodes_mesh = self.femmesh.Nodes
|
||||
if not self.femnodes_ele_table:
|
||||
self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
|
||||
control = FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects, self.femnodes_ele_table)
|
||||
self.femnodes_ele_table = meshtools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
|
||||
control = meshtools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects, self.femnodes_ele_table)
|
||||
if (self.femelement_count_test is True) and (control is False): # we only need to set it, if it is still True
|
||||
self.femelement_count_test = False
|
||||
if self.shellthickness_objects:
|
||||
if not self.femelement_faces_table:
|
||||
self.femelement_faces_table = FemMeshTools.get_femelement_faces_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.material_objects)
|
||||
self.femelement_faces_table = meshtools.get_femelement_faces_table(self.femmesh)
|
||||
meshtools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.material_objects)
|
||||
if self.beamsection_objects or self.fluidsection_objects:
|
||||
if not self.femelement_edges_table:
|
||||
self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh)
|
||||
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.material_objects)
|
||||
self.femelement_edges_table = meshtools.get_femelement_edges_table(self.femmesh)
|
||||
meshtools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.material_objects)
|
||||
|
||||
## @}
|
||||
|
||||
Reference in New Issue
Block a user