FEM: calculix writer, use mat geo sets instead of ccx elsets
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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"]))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
## @}
|
||||
|
||||
Reference in New Issue
Block a user