Fem: Move code from Elmer electrostatic writer to proxy class

This commit is contained in:
marioalexis
2025-03-29 13:19:44 -03:00
parent b3a3b13603
commit 37b988ec00
2 changed files with 63 additions and 40 deletions

View File

@@ -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

View File

@@ -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)