[FEM] update Elmer examples

- active already the analysis
- generate the mesh preferably directly, also if this fails, load the rough meshes
- use value for Air is they are in our Air material card
- apply material to the body (not necessary but good practice, the examples are there to teach people and for more complex models setting the material to a body is important)
This commit is contained in:
Uwe
2023-02-18 20:04:24 +01:00
parent 585de7c8a0
commit 65195d99b0
2 changed files with 82 additions and 43 deletions

View File

@@ -22,6 +22,7 @@
# * *
# ***************************************************************************
import sys
import FreeCAD
from FreeCAD import Rotation
from FreeCAD import Vector
@@ -33,7 +34,6 @@ from . import manager
from .manager import get_meshname
from .manager import init_doc
def get_information():
return {
"name": "Electrostatics Capacitance Two Balls",
@@ -45,7 +45,6 @@ def get_information():
"equation": "electrostatic"
}
def get_explanation(header=""):
return header + """
@@ -61,7 +60,6 @@ Electrostatics equation in FreeCAD FEM-Elmer
"""
def setup(doc=None, solvertype="elmer"):
# init FreeCAD document
@@ -99,6 +97,9 @@ def setup(doc=None, solvertype="elmer"):
# analysis
analysis = ObjectsFem.makeAnalysis(doc, "Analysis")
if FreeCAD.GuiUp:
import FemGui
FemGui.setActiveAnalysis(analysis)
# solver
if solvertype == "elmer":
@@ -115,17 +116,18 @@ def setup(doc=None, solvertype="elmer"):
analysis.addObject(solver_obj)
# material
material_obj = ObjectsFem.makeMaterialFluid(doc, "FemMaterial")
material_obj = ObjectsFem.makeMaterialFluid(doc, "Air")
mat = material_obj.Material
mat["Name"] = "Air-Generic"
mat["Density"] = "1.20 kg/m^3"
mat["Name"] = "Air"
mat["Density"] = "1.204 kg/m^3"
mat["KinematicViscosity"] = "15.11 mm^2/s"
mat["VolumetricThermalExpansionCoefficient"] = "0.00 mm/m/K"
mat["ThermalConductivity"] = "0.03 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.0034/K"
mat["SpecificHeat"] = "1.00 J/kg/K"
mat["RelativePermittivity"] = "1.00"
mat["ThermalConductivity"] = "0.02587 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.00343/K"
mat["SpecificHeat"] = "1010.00 J/kg/K"
mat["RelativePermittivity"] = "1.00059"
material_obj.Material = mat
material_obj.References = [(geom_obj, "Solid1")]
analysis.addObject(material_obj)
# constraint potential 1st
@@ -152,23 +154,40 @@ def setup(doc=None, solvertype="elmer"):
analysis.addObject(con_elect_pot3)
# mesh
from .meshes.mesh_capacitance_two_balls_tetra10 import create_nodes, create_elements
fem_mesh = Fem.FemMesh()
control = create_nodes(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
femmesh_obj.FemMesh = fem_mesh
femmesh_obj.Part = geom_obj
femmesh_obj.SecondOrderLinear = False
femmesh_obj.CharacteristicLengthMax = "600 mm"
femmesh_obj.ViewObject.Visibility = False
# mesh_region
mesh_region = ObjectsFem.makeMeshRegion(doc, femmesh_obj, name="MeshRegion")
mesh_region.CharacteristicLength = "300 mm"
mesh_region.CharacteristicLength = "250 mm"
mesh_region.References = [(geom_obj, "Face2"), (geom_obj, "Face3")]
mesh_region.ViewObject.Visibility = False
# generate the mesh
from femmesh import gmshtools
gmsh_mesh = gmshtools.GmshTools(femmesh_obj, analysis)
try:
error = gmsh_mesh.create_mesh()
except Exception:
error = sys.exc_info()[1]
FreeCAD.Console.PrintError(
"Unexpected error when creating mesh: {}\n"
.format(error)
)
if error:
# try to create from existing rough mesh
from .meshes.mesh_capacitance_two_balls_tetra10 import create_nodes, create_elements
fem_mesh = Fem.FemMesh()
control = create_nodes(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
femmesh_obj.FemMesh = fem_mesh
doc.recompute()
return doc

View File

@@ -22,22 +22,21 @@
# * *
# ***************************************************************************
import sys
import FreeCAD
from FreeCAD import Rotation
from FreeCAD import Vector
from FreeCAD import Units
import Part
import Sketcher
import Fem
import ObjectsFem
import Part
import Sketcher
from . import manager
from .manager import get_meshname
from .manager import init_doc
def get_information():
return {
"name": "Electrostatics Electricforce - Elmer NonGUI6",
@@ -49,7 +48,6 @@ def get_information():
"equation": "electrostatic"
}
def get_explanation(header=""):
return header + """
@@ -65,7 +63,6 @@ Electrostatics equation in FreeCAD FEM-Elmer
"""
def setup(doc=None, solvertype="elmer"):
# init FreeCAD document
@@ -103,6 +100,7 @@ def setup(doc=None, solvertype="elmer"):
base_sketch.addConstraint(base_conList)
base_sketch.setDatum(9, Units.Quantity("5000.000000 mm"))
base_sketch.setDatum(10, Units.Quantity("5000.000000 mm"))
base_sketch.ViewObject.Visibility = False
pad = geom_obj.newObject("PartDesign::Pad", "Pad")
pad.Profile = base_sketch
@@ -145,6 +143,7 @@ def setup(doc=None, solvertype="elmer"):
upper_sketch.setDatum(15, Units.Quantity("5000.000000 mm"))
upper_sketch.setDatum(16, Units.Quantity("1500.000000 mm"))
upper_sketch.setDatum(17, Units.Quantity("1500.000000 mm"))
upper_sketch.ViewObject.Visibility = False
pocket = geom_obj.newObject("PartDesign::Pocket", "Pocket")
pocket.Profile = upper_sketch
@@ -159,6 +158,9 @@ def setup(doc=None, solvertype="elmer"):
# analysis
analysis = ObjectsFem.makeAnalysis(doc, "Analysis")
if FreeCAD.GuiUp:
import FemGui
FemGui.setActiveAnalysis(analysis)
# solver
if solvertype == "elmer":
@@ -173,17 +175,18 @@ def setup(doc=None, solvertype="elmer"):
analysis.addObject(solver_obj)
# material
material_obj = ObjectsFem.makeMaterialFluid(doc, "FemMaterial")
material_obj = ObjectsFem.makeMaterialFluid(doc, "Air")
mat = material_obj.Material
mat["Name"] = "Air-Generic"
mat["Density"] = "1.20 kg/m^3"
mat["Name"] = "Air"
mat["Density"] = "1.204 kg/m^3"
mat["KinematicViscosity"] = "15.11 mm^2/s"
mat["VolumetricThermalExpansionCoefficient"] = "0.00 mm/m/K"
mat["ThermalConductivity"] = "0.03 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.0034/K"
mat["SpecificHeat"] = "1.00 J/kg/K"
mat["RelativePermittivity"] = "1.00"
mat["ThermalConductivity"] = "0.02587 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.00343/K"
mat["SpecificHeat"] = "1010.00 J/kg/K"
mat["RelativePermittivity"] = "1.00059"
material_obj.Material = mat
material_obj.References = [(geom_obj, "Solid1")]
analysis.addObject(material_obj)
# constraint potential 0V
@@ -212,27 +215,44 @@ def setup(doc=None, solvertype="elmer"):
analysis.addObject(con_elect_pot2)
# mesh
from .meshes.mesh_electricforce_elmer_nongui6_tetra10 import create_nodes, create_elements
fem_mesh = Fem.FemMesh()
control = create_nodes(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
femmesh_obj.FemMesh = fem_mesh
femmesh_obj.Part = geom_obj
femmesh_obj.SecondOrderLinear = False
femmesh_obj.CharacteristicLengthMax = "500 mm"
femmesh_obj.ViewObject.Visibility = False
# mesh_region
mesh_region = ObjectsFem.makeMeshRegion(doc, femmesh_obj, name="MeshRegion")
mesh_region.CharacteristicLength = "300 mm"
mesh_region.CharacteristicLength = "250 mm"
mesh_region.References = [
(geom_obj, "Face4"),
(geom_obj, "Face5"),
(geom_obj, "Face6"),
(geom_obj, "Face11")]
mesh_region.ViewObject.Visibility = False
# generate the mesh
from femmesh import gmshtools
gmsh_mesh = gmshtools.GmshTools(femmesh_obj, analysis)
try:
error = gmsh_mesh.create_mesh()
except Exception:
error = sys.exc_info()[1]
FreeCAD.Console.PrintError(
"Unexpected error when creating mesh: {}\n"
.format(error)
)
if error:
# try to create from existing rough mesh
from .meshes.mesh_electricforce_elmer_nongui6_tetra10 import create_nodes, create_elements
fem_mesh = Fem.FemMesh()
control = create_nodes(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
femmesh_obj.FemMesh = fem_mesh
doc.recompute()
return doc