FEM: calculix writer, use mat geo sets instead of ccx elsets

This commit is contained in:
Bernd Hahnebach
2021-07-16 08:23:23 +02:00
parent 10faf786c8
commit 895c817f56
6 changed files with 44 additions and 46 deletions

View File

@@ -89,6 +89,7 @@ class MeshSetsGetter():
self.femelement_faces_table = {}
self.femelement_edges_table = {}
self.femelement_count_test = True
self.mat_geo_sets = []
# ********************************************************************************************
# ********************************************************************************************
@@ -652,7 +653,7 @@ class MeshSetsGetter():
if len(self.member.mats_linear) > 1:
self.get_material_elements()
# create the ccx_elsets
# create the mat_geo_sets
if len(self.member.mats_linear) == 1:
if self.femmesh.Volumes:
# we only could do this for volumes, if a mesh contains volumes
@@ -660,19 +661,19 @@ class MeshSetsGetter():
# but a mesh could contain the element faces of the volumes as faces
# and the edges of the faces as edges
# there we have to check for some geometric objects
self.get_ccx_elsets_single_mat_solid()
self.get_mat_geo_sets_single_mat_solid()
if len(self.member.geos_shellthickness) == 1:
self.get_ccx_elsets_single_mat_single_shell()
self.get_mat_geo_sets_single_mat_single_shell()
elif len(self.member.geos_shellthickness) > 1:
self.get_ccx_elsets_single_mat_multiple_shell()
self.get_mat_geo_sets_single_mat_multiple_shell()
if len(self.member.geos_beamsection) == 1:
self.get_ccx_elsets_single_mat_single_beam()
self.get_mat_geo_sets_single_mat_single_beam()
elif len(self.member.geos_beamsection) > 1:
self.get_ccx_elsets_single_mat_multiple_beam()
self.get_mat_geo_sets_single_mat_multiple_beam()
if len(self.member.geos_fluidsection) == 1:
self.get_ccx_elsets_single_mat_single_fluid()
self.get_mat_geo_sets_single_mat_single_fluid()
elif len(self.member.geos_fluidsection) > 1:
self.get_ccx_elsets_single_mat_multiple_fluid()
self.get_mat_geo_sets_single_mat_multiple_fluid()
elif len(self.member.mats_linear) > 1:
if self.femmesh.Volumes:
# we only could do this for volumes, if a mseh contains volumes
@@ -682,19 +683,19 @@ class MeshSetsGetter():
# there we have to check for some geometric objects
# volume is a bit special
# because retrieving ids from group mesh data is implemented
self.get_ccx_elsets_multiple_mat_solid()
self.get_mat_geo_sets_multiple_mat_solid()
if len(self.member.geos_shellthickness) == 1:
self.get_ccx_elsets_multiple_mat_single_shell()
self.get_mat_geo_sets_multiple_mat_single_shell()
elif len(self.member.geos_shellthickness) > 1:
self.get_ccx_elsets_multiple_mat_multiple_shell()
self.get_mat_geo_sets_multiple_mat_multiple_shell()
if len(self.member.geos_beamsection) == 1:
self.get_ccx_elsets_multiple_mat_single_beam()
self.get_mat_geo_sets_multiple_mat_single_beam()
elif len(self.member.geos_beamsection) > 1:
self.get_ccx_elsets_multiple_mat_multiple_beam()
self.get_mat_geo_sets_multiple_mat_multiple_beam()
if len(self.member.geos_fluidsection) == 1:
self.get_ccx_elsets_multiple_mat_single_fluid()
self.get_mat_geo_sets_multiple_mat_single_fluid()
elif len(self.member.geos_fluidsection) > 1:
self.get_ccx_elsets_multiple_mat_multiple_fluid()
self.get_mat_geo_sets_multiple_mat_multiple_fluid()
# self.mat_geo_sets = [ {
# "ccx_elset" : [e1, e2, e3, ... , en] or elements set name strings
@@ -712,7 +713,7 @@ class MeshSetsGetter():
# TODO support multiple beamrotations
# we do not need any more any data from the rotation document object,
# thus we do not need to save the rotation document object name in the else
def get_ccx_elsets_single_mat_single_beam(self):
def get_mat_geo_sets_single_mat_single_beam(self):
mat_obj = self.member.mats_linear[0]["Object"]
beamsec_obj = self.member.geos_beamsection[0]["Object"]
beamrot_data = self.member.geos_beamrotation[0]
@@ -735,7 +736,7 @@ class MeshSetsGetter():
ccx_elset["beam_normal"] = beamdirection["normal"]
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_single_mat_multiple_beam(self):
def get_mat_geo_sets_single_mat_multiple_beam(self):
mat_obj = self.member.mats_linear[0]["Object"]
beamrot_data = self.member.geos_beamrotation[0]
for beamsec_data in self.member.geos_beamsection:
@@ -762,7 +763,7 @@ class MeshSetsGetter():
ccx_elset["beam_normal"] = beamdirection["normal"]
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_single_beam(self):
def get_mat_geo_sets_multiple_mat_single_beam(self):
beamsec_obj = self.member.geos_beamsection[0]["Object"]
beamrot_data = self.member.geos_beamrotation[0]
for mat_data in self.member.mats_linear:
@@ -788,7 +789,7 @@ class MeshSetsGetter():
ccx_elset["beam_normal"] = beamdirection["normal"]
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_multiple_beam(self):
def get_mat_geo_sets_multiple_mat_multiple_beam(self):
beamrot_data = self.member.geos_beamrotation[0]
for beamsec_data in self.member.geos_beamsection:
beamsec_obj = beamsec_data["Object"]
@@ -820,7 +821,7 @@ class MeshSetsGetter():
self.mat_geo_sets.append(ccx_elset)
# fluid
def get_ccx_elsets_single_mat_single_fluid(self):
def get_mat_geo_sets_single_mat_single_fluid(self):
mat_obj = self.member.mats_linear[0]["Object"]
fluidsec_obj = self.member.geos_fluidsection[0]["Object"]
elset_data = self.ccx_eedges
@@ -833,7 +834,7 @@ class MeshSetsGetter():
ccx_elset["fluidsection_obj"] = fluidsec_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_single_mat_multiple_fluid(self):
def get_mat_geo_sets_single_mat_multiple_fluid(self):
mat_obj = self.member.mats_linear[0]["Object"]
for fluidsec_data in self.member.geos_fluidsection:
fluidsec_obj = fluidsec_data["Object"]
@@ -847,7 +848,7 @@ class MeshSetsGetter():
ccx_elset["fluidsection_obj"] = fluidsec_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_single_fluid(self):
def get_mat_geo_sets_multiple_mat_single_fluid(self):
fluidsec_obj = self.member.geos_fluidsection[0]["Object"]
for mat_data in self.member.mats_linear:
mat_obj = mat_data["Object"]
@@ -861,7 +862,7 @@ class MeshSetsGetter():
ccx_elset["fluidsection_obj"] = fluidsec_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_multiple_fluid(self):
def get_mat_geo_sets_multiple_mat_multiple_fluid(self):
for fluidsec_data in self.member.geos_fluidsection:
fluidsec_obj = fluidsec_data["Object"]
for mat_data in self.member.mats_linear:
@@ -884,7 +885,7 @@ class MeshSetsGetter():
self.mat_geo_sets.append(ccx_elset)
# shell
def get_ccx_elsets_single_mat_single_shell(self):
def get_mat_geo_sets_single_mat_single_shell(self):
mat_obj = self.member.mats_linear[0]["Object"]
shellth_obj = self.member.geos_shellthickness[0]["Object"]
elset_data = self.ccx_efaces
@@ -900,7 +901,7 @@ class MeshSetsGetter():
ccx_elset["shellthickness_obj"] = shellth_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_single_mat_multiple_shell(self):
def get_mat_geo_sets_single_mat_multiple_shell(self):
mat_obj = self.member.mats_linear[0]["Object"]
for shellth_data in self.member.geos_shellthickness:
shellth_obj = shellth_data["Object"]
@@ -917,7 +918,7 @@ class MeshSetsGetter():
ccx_elset["shellthickness_obj"] = shellth_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_single_shell(self):
def get_mat_geo_sets_multiple_mat_single_shell(self):
shellth_obj = self.member.geos_shellthickness[0]["Object"]
for mat_data in self.member.mats_linear:
mat_obj = mat_data["Object"]
@@ -934,7 +935,7 @@ class MeshSetsGetter():
ccx_elset["shellthickness_obj"] = shellth_obj
self.mat_geo_sets.append(ccx_elset)
def get_ccx_elsets_multiple_mat_multiple_shell(self):
def get_mat_geo_sets_multiple_mat_multiple_shell(self):
for shellth_data in self.member.geos_shellthickness:
shellth_obj = shellth_data["Object"]
for mat_data in self.member.mats_linear:
@@ -957,7 +958,7 @@ class MeshSetsGetter():
self.mat_geo_sets.append(ccx_elset)
# solid
def get_ccx_elsets_single_mat_solid(self):
def get_mat_geo_sets_single_mat_solid(self):
mat_obj = self.member.mats_linear[0]["Object"]
elset_data = self.ccx_evolumes
names = [
@@ -972,7 +973,7 @@ class MeshSetsGetter():
self.mat_geo_sets.append(ccx_elset)
print(self.mat_geo_sets)
def get_ccx_elsets_multiple_mat_solid(self):
def get_mat_geo_sets_multiple_mat_solid(self):
for mat_data in self.member.mats_linear:
mat_obj = mat_data["Object"]
elset_data = mat_data["FEMElements"]

View File

@@ -49,8 +49,8 @@ def handle_fluidsection_liquid_inlet_outlet(inpfile, ccxwriter):
# Fluid sections:
# fluidsection Liquid inlet outlet objs requires special element definition
# to fill ccxwriter.FluidInletoutlet_ele list the ccx_elset are needed
# thus this has to be after the creation of ccx_elsets
# different pipe cross sections will generate ccx_elsets
# thus this has to be after the creation of mat_geo_sets
# different pipe cross sections will generate mat_geo_sets
ccxwriter.FluidInletoutlet_ele = []
ccxwriter.fluid_inout_nodes_file = join(
@@ -76,8 +76,8 @@ def handle_fluidsection_liquid_inlet_outlet(inpfile, ccxwriter):
return fluidsec_obj
return None
def is_fluidsection_inoutlet_setnames_possible(ccx_elsets):
for ccx_elset in ccx_elsets:
def is_fluidsection_inoutlet_setnames_possible(mat_geo_sets):
for ccx_elset in mat_geo_sets:
if (
ccx_elset["ccx_elset"]
and "fluidsection_obj" in ccx_elset # fluid mesh
@@ -95,7 +95,7 @@ def handle_fluidsection_liquid_inlet_outlet(inpfile, ccxwriter):
# collect elementIDs for fluidsection Liquid inlet outlet objs
# if they have element data (happens if not "eall")
for ccx_elset in ccxwriter.ccx_elsets:
for ccx_elset in ccxwriter.mat_geo_sets:
fluidsec_obj = get_fluidsection_inoutlet_obj_if_setdata(ccx_elset)
if fluidsec_obj is None:
continue
@@ -118,9 +118,9 @@ def handle_fluidsection_liquid_inlet_outlet(inpfile, ccxwriter):
)
# create the correct element definition for fluidsection Liquid inlet outlet objs
# at least one "fluidsection_obj" needs to be in ccx_elsets and has the attributes
# at least one "fluidsection_obj" needs to be in mat_geo_sets and has the attributes
# TODO: what if there are other objs in elsets?
if is_fluidsection_inoutlet_setnames_possible(ccxwriter.ccx_elsets) is not None:
if is_fluidsection_inoutlet_setnames_possible(ccxwriter.mat_geo_sets) is not None:
# it is not distinguished if split input file
# for split input file the main file is just closed and reopend even if not needed
inpfile.close()

View File

@@ -32,7 +32,7 @@ def write_femelement_geometry(f, ccxwriter):
f.write("\n{}\n".format(59 * "*"))
f.write("** Sections\n")
for ccx_elset in ccxwriter.ccx_elsets:
for ccx_elset in ccxwriter.mat_geo_sets:
if ccx_elset["ccx_elset"]:
elsetdef = "ELSET={}, ".format(ccx_elset["ccx_elset_name"])
material = "MATERIAL={}".format(ccx_elset["mat_obj_name"])

View File

@@ -31,11 +31,11 @@ import six
def write_femelement_matgeosets(f, ccxwriter):
# write ccx_elsets to file
# write mat_geo_sets to file
f.write("\n{}\n".format(59 * "*"))
f.write("** Element sets for materials and FEM element type (solid, shell, beam, fluid)\n")
for ccx_elset in ccxwriter.ccx_elsets:
for ccx_elset in ccxwriter.mat_geo_sets:
f.write("*ELSET,ELSET={}\n".format(ccx_elset["ccx_elset_name"]))

View File

@@ -134,7 +134,7 @@ class FemInputWriterCcx(writerbase.FemInputWriter):
FreeCAD.Console.PrintMessage("Get mesh sets.\n")
time_start = time.process_time()
if not self.ccx_elsets:
if not self.mat_geo_sets:
self.get_mesh_sets()
time_getsets = time.process_time()
@@ -155,7 +155,7 @@ class FemInputWriterCcx(writerbase.FemInputWriter):
# element sets for materials and element geometry
write_femelement_matgeosets.write_femelement_matgeosets(inpfile, self)
# some fluidsection objs need special treatment, ccx_elsets are needed for this
# some fluidsection objs need special treatment, mat_geo_sets are needed for this
inpfile = con_fluidsection.handle_fluidsection_liquid_inlet_outlet(inpfile, self)
# element sets constraints

View File

@@ -76,10 +76,7 @@ class FemInputWriter():
self.ccx_evolumes = "Evolumes"
self.ccx_efaces = "Efaces"
self.ccx_eedges = "Eedges"
if mat_geo_sets is not None:
self.ccx_elsets = mat_geo_sets
else:
self.ccx_elsets = []
self.mat_geo_sets = mat_geo_sets
if self.mesh_object:
if hasattr(self.mesh_object, "Shape"):
self.theshape = self.mesh_object.Shape
@@ -304,7 +301,7 @@ class FemInputWriter():
def get_element_sets_material_and_femelement_geometry(self):
self.meshdatagetter.get_element_sets_material_and_femelement_geometry()
self.ccx_elsets = self.meshdatagetter.mat_geo_sets
self.mat_geo_sets = self.meshdatagetter.mat_geo_sets
## @}