Fem: Move code from Elmer electrostatic writer to proxy class
This commit is contained in:
@@ -29,6 +29,9 @@ __url__ = "https://www.freecad.org"
|
||||
# \ingroup FEM
|
||||
# \brief constraint electric charge density object
|
||||
|
||||
|
||||
from FreeCAD import Units
|
||||
|
||||
from . import base_fempythonobject
|
||||
|
||||
_PropHelper = base_fempythonobject._PropHelper
|
||||
@@ -85,3 +88,43 @@ class ConstraintElectricChargeDensity(base_fempythonobject.BaseFemPythonObject):
|
||||
)
|
||||
|
||||
return prop
|
||||
|
||||
def get_total_source_density(self, obj):
|
||||
"""
|
||||
Calculate density for `Total Source` mode.
|
||||
"""
|
||||
size = 0
|
||||
items = []
|
||||
for feat, sub_elem in obj.References:
|
||||
for name in sub_elem:
|
||||
sub = feat.getSubObject(name)
|
||||
if sub.ShapeType == "Solid":
|
||||
size += sub.Volume
|
||||
items.append(name)
|
||||
elif sub.ShapeType == "Face":
|
||||
size += sub.Area
|
||||
items.append(name)
|
||||
|
||||
if items:
|
||||
vol = Units.Quantity(f"{size} mm^3")
|
||||
return obj.TotalCharge / vol
|
||||
|
||||
def get_total_interface_density(self, obj):
|
||||
"""
|
||||
Calculate density for `Total Interface` mode.
|
||||
"""
|
||||
size = 0
|
||||
items = []
|
||||
for feat, sub_elem in obj.References:
|
||||
for name in sub_elem:
|
||||
sub = feat.getSubObject(name)
|
||||
if sub.ShapeType == "Face":
|
||||
size += sub.Area
|
||||
items.append(name)
|
||||
elif sub.ShapeType == "Edge":
|
||||
size += sub.Length
|
||||
items.append(name)
|
||||
|
||||
if items:
|
||||
area = Units.Quantity(f"{size} mm^2")
|
||||
return obj.TotalCharge / area
|
||||
|
||||
@@ -152,58 +152,38 @@ class ESwriter:
|
||||
self.write.handled(obj)
|
||||
|
||||
for obj in self.write.getMember("Fem::ConstraintElectricChargeDensity"):
|
||||
if obj.Mode not in ["Interface", "Total Interface"]:
|
||||
continue
|
||||
match obj.Mode:
|
||||
case "Interface":
|
||||
density = obj.InterfaceChargeDensity
|
||||
case "Total Interface":
|
||||
density = obj.Proxy.get_total_interface_density(obj)
|
||||
case _:
|
||||
continue
|
||||
|
||||
size = 0
|
||||
items = []
|
||||
for feat, sub_elem in obj.References:
|
||||
for name in sub_elem:
|
||||
sub = feat.getSubObject(name)
|
||||
if sub.ShapeType == "Face":
|
||||
size += sub.Area
|
||||
items.append(name)
|
||||
elif sub.ShapeType == "Edge":
|
||||
size += sub.Length
|
||||
items.append(name)
|
||||
|
||||
if items:
|
||||
if obj.Mode == "Interface":
|
||||
density = obj.InterfaceChargeDensity.getValueAs("C/m^2").Value
|
||||
elif obj.Mode == "Total Interface":
|
||||
area = Units.Quantity(f"{size} mm^2")
|
||||
density = (obj.TotalCharge / area).getValueAs("C/m^2").Value
|
||||
for name in items:
|
||||
self.write.boundary(name, "! FreeCAD Name", obj.Label)
|
||||
self.write.boundary(name, "Surface Charge Density", round(density, 6))
|
||||
self.write.boundary(
|
||||
name, "Surface Charge Density", round(density.getValueAs("C/m^2").Value, 6)
|
||||
)
|
||||
self.write.handled(obj)
|
||||
|
||||
def handleElectrostaticBodyForces(self):
|
||||
for obj in self.write.getMember("Fem::ConstraintElectricChargeDensity"):
|
||||
if obj.Mode not in ["Source", "Total Source"]:
|
||||
continue
|
||||
match obj.Mode:
|
||||
case "Source":
|
||||
density = obj.SourceChargeDensity
|
||||
case "Total Source":
|
||||
density = obj.Proxy.get_total_source_density(obj)
|
||||
case _:
|
||||
continue
|
||||
|
||||
size = 0
|
||||
items = []
|
||||
for feat, sub_elem in obj.References:
|
||||
for name in sub_elem:
|
||||
sub = feat.getSubObject(name)
|
||||
if sub.ShapeType == "Solid":
|
||||
size += sub.Volume
|
||||
items.append(name)
|
||||
elif sub.ShapeType == "Face":
|
||||
size += sub.Area
|
||||
items.append(name)
|
||||
|
||||
if items:
|
||||
if obj.Mode == "Source":
|
||||
density = obj.SourceChargeDensity.getValueAs("C/m^3").Value
|
||||
elif obj.Mode == "Total Source":
|
||||
vol = Units.Quantity(f"{size} mm^3")
|
||||
density = (obj.TotalCharge / vol).getValueAs("C/m^3").Value
|
||||
for name in items:
|
||||
self.write.bodyForce(name, "! FreeCAD Name", obj.Label)
|
||||
self.write.bodyForce(name, "Charge Density", round(density, 6))
|
||||
self.write.bodyForce(
|
||||
name, "Charge Density", round(density.getValueAs("C/m^3").Value, 6)
|
||||
)
|
||||
self.write.handled(obj)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user