Skip to content

Commit

Permalink
FEM: make use of mesh data getter class for calculix solver and ccxtools
Browse files Browse the repository at this point in the history
  • Loading branch information
berndhahnebach committed Jul 17, 2021
1 parent afeb9b2 commit d0dbdf8
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 59 deletions.
23 changes: 20 additions & 3 deletions src/Mod/Fem/femsolver/calculix/tasks.py
Expand Up @@ -40,6 +40,7 @@
from .. import settings
from feminout import importCcxDatResults
from feminout import importCcxFrdResults
from femmesh import meshsetsgetter
from femtools import femutils
from femtools import membertools

Expand All @@ -60,12 +61,28 @@ class Prepare(run.Prepare):
def run(self):
global _inputFileName
self.pushStatus("Preparing input files...\n")
w = writer.FemInputWriterCcx(

mesh_obj = membertools.get_mesh_to_solve(self.analysis)[0] # pre check done already

# get mesh set data
# TODO evaluate if it makes sense to add new task
# between check and prepare to the solver frame work
meshdatagetter = meshsetsgetter.MeshSetsGetter(
self.analysis,
self.solver,
membertools.get_mesh_to_solve(self.analysis)[0], # pre check has been done already
mesh_obj,
membertools.AnalysisMember(self.analysis),
self.directory
)
meshdatagetter.get_mesh_sets()

# write input file
w = writer.FemInputWriterCcx(
self.analysis,
self.solver,
mesh_obj,
meshdatagetter.member,
self.directory,
meshdatagetter.mat_geo_sets
)
path = w.write_calculix_input_file()
# report to user if task succeeded
Expand Down
2 changes: 0 additions & 2 deletions src/Mod/Fem/femsolver/calculix/writer.py
Expand Up @@ -132,10 +132,8 @@ def __init__(
# write calculix input
def write_calculix_input_file(self):

FreeCAD.Console.PrintMessage("Get mesh sets.\n")
time_start = time.process_time()
if not self.mat_geo_sets:
self.get_mesh_sets()
time_getsets = time.process_time()

FreeCAD.Console.PrintMessage(
Expand Down
58 changes: 6 additions & 52 deletions src/Mod/Fem/femsolver/writerbase.py
Expand Up @@ -97,6 +97,7 @@ def __init__(
"In rare cases this might not be an error. "
)

# *************************************************
# deprecated, leave for compatibility reasons
# if these are calculated here they are calculated twice :-(
self.femnodes_mesh = {}
Expand All @@ -110,6 +111,9 @@ def __init__(
self.femelement_edges_table = {}
self.femelement_count_test = True

# deprecated, leave for compatibility reasons
# do not add new objects
# only the ones which exists on 0.19 release are kept
# materials
self.material_objects = member.mats_linear
self.material_nonlinear_objects = member.mats_nonlinear
Expand All @@ -119,7 +123,6 @@ def __init__(
self.fluidsection_objects = member.geos_fluidsection
self.shellthickness_objects = member.geos_shellthickness
# constraints
self.centrif_objects = member.cons_centrif
self.contact_objects = member.cons_contact
self.displacement_objects = member.cons_displacement
self.fixed_objects = member.cons_fixed
Expand All @@ -128,7 +131,6 @@ def __init__(
self.initialtemperature_objects = member.cons_initialtemperature
self.planerotation_objects = member.cons_planerotation
self.pressure_objects = member.cons_pressure
self.sectionprint_objects = member.cons_sectionprint
self.selfweight_objects = member.cons_selfweight
self.temperature_objects = member.cons_temperature
self.tie_objects = member.cons_tie
Expand Down Expand Up @@ -220,46 +222,8 @@ def write_constraints_propdata(
f.write(write_after)

# ********************************************************************************************
# ********************************************************************************************
# use set for node sets to be sure all nodes are unique
# use sorted to be sure the order is the same on different runs
# be aware a sorted set returns a list, because set are not sorted by default
# - done in return value of meshtools.get_femnodes_by_femobj_with_references
# TODO FIXME might be appropriate for element sets and surfaceface sets too

# ********************************************************************************************
# get all known sets
def get_mesh_sets(self):
FreeCAD.Console.PrintMessage(
"Get mesh data for "
"node sets (groups), surface sets (groups) and element sets (groups)\n"
)

# materials and element geometry element sets getter
self.get_element_sets_material_and_femelement_geometry()

# constraints element sets getter
self.get_constraints_centrif_elements()

# constraints node sets getter
self.get_constraints_fixed_nodes()
self.get_constraints_displacement_nodes()
self.get_constraints_planerotation_nodes()

# constraints surface sets getter
self.get_constraints_contact_faces()
self.get_constraints_tie_faces()
self.get_constraints_sectionprint_faces()
self.get_constraints_transform_nodes()
self.get_constraints_temperature_nodes()

# constraints sets with constraint data
self.get_constraints_force_nodeloads()
self.get_constraints_pressure_faces()
self.get_constraints_heatflux_faces()

# ********************************************************************************************
# sets
# deprecated, do not add new constraints
# only the ones which exists on 0.19 release are kept
def get_constraints_fixed_nodes(self):
self.meshdatagetter.get_constraints_fixed_nodes()

Expand Down Expand Up @@ -290,18 +254,8 @@ def get_constraints_contact_faces(self):
def get_constraints_tie_faces(self):
self.meshdatagetter.get_constraints_tie_faces()

def get_constraints_sectionprint_faces(self):
self.meshdatagetter.get_constraints_sectionprint_faces()

def get_constraints_heatflux_faces(self):
self.meshdatagetter.get_constraints_heatflux_faces()

def get_constraints_centrif_elements(self):
self.meshdatagetter.get_constraints_centrif_elements()

def get_element_sets_material_and_femelement_geometry(self):
self.meshdatagetter.get_element_sets_material_and_femelement_geometry()
self.mat_geo_sets = self.meshdatagetter.mat_geo_sets


## @}
19 changes: 17 additions & 2 deletions src/Mod/Fem/femtools/ccxtools.py
Expand Up @@ -366,15 +366,30 @@ def setup_working_dir(self, param_working_dir=None, create=False):
self.set_inp_file_name()

def write_inp_file(self):

# get mesh set data
# TODO use separate method for getting the mesh set data
from femmesh import meshsetsgetter
meshdatagetter = meshsetsgetter.MeshSetsGetter(
self.analysis,
self.solver,
self.mesh,
membertools.AnalysisMember(self.analysis),
)
# save the sets into the member objects of the instanz meshdatagetter
meshdatagetter.get_mesh_sets()

# write input file
import femsolver.calculix.writer as iw
self.inp_file_name = ""
try:
inp_writer = iw.FemInputWriterCcx(
self.analysis,
self.solver,
self.mesh,
self.member,
self.working_dir
meshdatagetter.member,
self.working_dir,
meshdatagetter.mat_geo_sets
)
self.inp_file_name = inp_writer.write_calculix_input_file()
except Exception:
Expand Down

0 comments on commit d0dbdf8

Please sign in to comment.