Fem solve bondary layer meshing issue #3111

This commit is contained in:
qingfengxia
2017-07-31 22:33:06 +01:00
committed by wmayer
parent 1c9278185d
commit d0e15f5173
6 changed files with 49 additions and 22 deletions

View File

@@ -355,11 +355,15 @@ class FemGmshTools():
FreeCAD.Console.PrintError("The element " + elems + " of the mesh boundary layer " + mr_obj.Name + " has been added to another mesh boudary layer.\n")
setting = {}
setting['hwall_n'] = Units.Quantity(mr_obj.MinimumThickness).Value
setting['hwall_t'] = setting['hwall_n'] * 5 # tangetial cell dimension
setting['ratio'] = mr_obj.GrowthRate
setting['thickness'] = sum([setting['hwall_n'] **i for i in range(mr_obj.NumberOfLayers)])
setting['thickness'] = sum([setting['hwall_n'] * setting['ratio']**i for i in range(mr_obj.NumberOfLayers)])
setting['hwall_t'] = setting['thickness'] #setting['hwall_n'] * 5 # tangetial cell dimension
# hfar: cell dimension outside boundary should be set later if some character length is set
setting['hfar'] = setting['thickness'] * 2 # set a value for safety, it may works as background mesh cell size
if self.clmax > setting['thickness'] * 0.8 and self.clmax < setting['thickness'] * 1.6:
setting['hfar'] = self.clmax
else:
setting['hfar'] = setting['thickness'] # set a value for safety, it may works as background mesh cell size
# from face name -> face id is done in geo file write up
#fan angle setup is not implemented yet
if self.dimension == '2':
@@ -450,11 +454,17 @@ class FemGmshTools():
geo.write("// " + e + "\n")
geo.write("Characteristic Length { " + ele_nodes + " } = " + str(self.ele_length_map[e]) + ";\n")
geo.write("\n")
# boundary layer generation may need special setup of Gmsh properties, set them in Gmsh TaskPanel
self.write_boundary_layer(geo)
geo.write("// min, max Characteristic Length\n")
geo.write("Mesh.CharacteristicLengthMax = " + str(self.clmax) + ";\n")
geo.write("Mesh.CharacteristicLengthMin = " + str(self.clmin) + ";\n")
if len(self.bl_setting_list):
# if minLength must smaller than first layer of boundary_layer, it is safer to set it as zero (defualt value) to avoid error
geo.write("Mesh.CharacteristicLengthMin = " + str(0) + ";\n")
else:
geo.write("Mesh.CharacteristicLengthMin = " + str(self.clmin) + ";\n")
geo.write("\n")
if hasattr(self.mesh_obj, 'RecombineAll') and self.mesh_obj.RecombineAll is True:
geo.write("// other mesh options\n")
@@ -480,12 +490,17 @@ class FemGmshTools():
geo.write("// mesh order\n")
geo.write("Mesh.ElementOrder = " + self.order + ";\n")
geo.write("\n")
geo.write("// mesh algorithm\n")
geo.write("// mesh algorithm, only a few algorithms are usable with 3D boundary layer generation\n")
geo.write("// 2D mesh algorithm (1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad)\n")
geo.write("Mesh.Algorithm = " + self.algorithm2D + ";\n")
if len(self.bl_setting_list) and self.dimension == 3:
geo.write("Mesh.Algorithm = " + 'DelQuad' + ";\n") # Frontal/DelQuad are tested
else:
geo.write("Mesh.Algorithm = " + self.algorithm2D + ";\n")
geo.write("// 3D mesh algorithm (1=Delaunay, 2=New Delaunay, 4=Frontal, 5=Frontal Delaunay, 6=Frontal Hex, 7=MMG3D, 9=R-tree)\n")
geo.write("Mesh.Algorithm3D = " + self.algorithm3D + ";\n")
geo.write("\n")
geo.write("// meshing\n")
# remove duplicate vertices, see https://forum.freecadweb.org/viewtopic.php?f=18&t=21571&start=20#p179443
if hasattr(self.mesh_obj, 'CoherenceMesh') and self.mesh_obj.CoherenceMesh is True:

View File

@@ -28,6 +28,7 @@
<file>icons/fem-control-solver.svg</file>
<file>icons/fem-cylinder.svg</file>
<file>icons/fem-data.svg</file>
<file>icons/fem-femmesh-boundary-layer.svg</file>
<file>icons/fem-femmesh-clear-mesh.svg</file>
<file>icons/fem-femmesh-create-node-by-poly.svg</file>
<file>icons/fem-femmesh-from-shape.svg</file>

View File

@@ -319,7 +319,7 @@ def makeSolverZ88(name="Z88"):
if FreeCAD.GuiUp:
import PyGui._ViewProviderFemSolverZ88
PyGui._ViewProviderFemSolverZ88._ViewProviderFemSolverZ88(obj.ViewObject)
return obj
return obj
'''

View File

@@ -46,14 +46,14 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<property name="min_thickness">
<size>
<width>80</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>0.0</string>
<string>1.0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -108,7 +108,7 @@
<double>0.100000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
<double>1.300000000000000</double>
</property>
</widget>
</item>

View File

@@ -47,7 +47,7 @@ class _TaskPanelFemMeshBoundaryLayer:
QtCore.QObject.connect(self.form.bl_number_of_layers, QtCore.SIGNAL("valueChanged(int)"), self.bl_number_of_layers_changed)
QtCore.QObject.connect(self.form.bl_min_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.bl_min_thickness_changed)
QtCore.QObject.connect(self.form.bl_growth_rate, QtCore.SIGNAL("valueChanged(float)"), self.bl_growth_rate_changed)
QtCore.QObject.connect(self.form.bl_growth_rate, QtCore.SIGNAL("valueChanged(double)"), self.bl_growth_rate_changed) # becareful of signal signature for QDoubleSpinbox
QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard)
QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid)
@@ -72,19 +72,17 @@ class _TaskPanelFemMeshBoundaryLayer:
self.obj.MinimumThickness = self.bl_min_thickness
self.obj.NumberOfLayers = self.bl_number_of_layers
self.obj.GrowthRate = self.bl_growth_rate
self.obj.References = self.references
def update(self):
'fills the widgets with '
'fills the widgets with data'
self.form.bl_min_thickness.setText(self.bl_min_thickness.UserString)
self.form.bl_number_of_layers.setValue(self.bl_number_of_layers)
self.form.bl_growth_rate.setValue(self.bl_growth_rate)
self.rebuild_list_References()
def bl_min_thickness_changed(self, base_quantity_value):
self.bl_min_thicknes = base_quantity_value
self.bl_min_thickness = base_quantity_value
def bl_number_of_layers_changed(self, value):
self.bl_number_of_layers = value
@@ -100,13 +98,14 @@ class _TaskPanelFemMeshBoundaryLayer:
FreeCAD.ActiveDocument.recompute()
return True
############### identical to FemMeshRegion ############
def reject(self):
if self.sel_server:
FreeCADGui.Selection.removeObserver(self.sel_server)
FreeCADGui.ActiveDocument.resetEdit()
return True
############### identical to FemMeshRegion ############
def choose_selection_mode_standard(self, state):
self.selection_mode_solid = not state
if self.sel_server and not self.selection_mode_solid:

View File

@@ -31,18 +31,30 @@ __url__ = "http://www.freecadweb.org"
class _FemMeshBoundaryLayer:
"The FemMeshBoundaryLayer object"
def __init__(self, obj):
obj.addProperty("App::PropertyInteger", "NumberOfLayers", "MeshBoundaryLayerProperties",
self.Type = "FemMeshBoundaryLayer"
self.Object = obj # keep a ref to the DocObj for nonGui usage
obj.Proxy = self # link between App::DocumentObject to this object
obj.addProperty("App::PropertyInteger", "NumberOfLayers", "MeshBoundaryLayerProperties",
"set number of inflation layers for this boundary")
obj.NumberOfLayers = 3
obj.addProperty("App::PropertyLength", "MinimumThickness", "MeshBoundaryLayerProperties",
obj.addProperty("App::PropertyLength", "MinimumThickness", "MeshBoundaryLayerProperties",
"set minimum thickness,usually the first inflation layer")
obj.addProperty("App::PropertyFloat", "GrowthRate", "MeshBoundaryLayerProperties",
# default to zero, user must specify a proper value for this property
obj.addProperty("App::PropertyFloat", "GrowthRate", "MeshBoundaryLayerProperties",
"set growth rate of inflation layers for smooth transition")
obj.GrowthRate = 1.0
obj.GrowthRate = 1.5
obj.addProperty("App::PropertyLinkSubList", "References", "MeshBoundaryLayerShapes", "List of FEM mesh region shapes")
obj.Proxy = self
self.Type = "FemMeshBoundaryLayer"
def execute(self, obj):
return
def __getstate__(self):
return self.Type
def __setstate__(self, state):
if state:
self.Type = state