Fem: Update electrostatic element getter for CalculiX
This commit is contained in:
@@ -393,15 +393,15 @@ class MeshSetsGetter:
|
||||
)
|
||||
|
||||
for femobj in self.member.cons_electrostatic:
|
||||
if femobj["Object"].BoundaryCondition == "Neumann":
|
||||
print_obj_info(femobj["Object"])
|
||||
obj = femobj["Object"]
|
||||
if obj.BoundaryCondition == "Neumann":
|
||||
print_obj_info(obj)
|
||||
result = []
|
||||
ref_data = meshtools.pair_obj_reference(obj.References)
|
||||
for ref_pair in ref_data:
|
||||
result.append(meshtools.get_ccx_elements(self, ref_pair))
|
||||
|
||||
charged_faces = meshtools.get_charge_density_obj_faces(
|
||||
self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj
|
||||
)
|
||||
some_string = "{}: face electric flux".format(femobj["Object"].Name)
|
||||
femobj["ElectricFluxFaces"] = [(some_string, charged_faces)]
|
||||
FreeCAD.Console.PrintLog("{}\n".format(femobj["ElectricFluxFaces"]))
|
||||
femobj["ElectricFluxFaces"] = result
|
||||
|
||||
def get_constraints_electricchargedensity_faces(self):
|
||||
if not self.member.cons_electricchargedensity:
|
||||
@@ -416,27 +416,17 @@ class MeshSetsGetter:
|
||||
)
|
||||
|
||||
for femobj in self.member.cons_electricchargedensity:
|
||||
if femobj["Object"].Mode in ["Interface", "Total Interface"]:
|
||||
print_obj_info(femobj["Object"])
|
||||
obj = femobj["Object"]
|
||||
print_obj_info(obj)
|
||||
result = []
|
||||
ref_data = meshtools.pair_obj_reference(obj.References)
|
||||
for ref_pair in ref_data:
|
||||
result.append(meshtools.get_ccx_elements(self, ref_pair))
|
||||
|
||||
charged_faces = meshtools.get_charge_density_obj_faces(
|
||||
self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj
|
||||
)
|
||||
some_string = "{}: face electric charge density".format(femobj["Object"].Name)
|
||||
femobj["ChargeDensityFaces"] = [(some_string, charged_faces)]
|
||||
FreeCAD.Console.PrintLog("{}\n".format(femobj["ChargeDensityFaces"]))
|
||||
|
||||
elif femobj["Object"].Mode in ["Source", "Total Source"]:
|
||||
print_obj_info(femobj["Object"])
|
||||
|
||||
charged_volumes = meshtools.get_charge_density_obj_elements(
|
||||
self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj
|
||||
)
|
||||
some_string = "{}: Elements with electric charge density".format(
|
||||
femobj["Object"].Name
|
||||
)
|
||||
femobj["ChargeDensityElements"] = (some_string, charged_volumes)
|
||||
FreeCAD.Console.PrintLog("{}\n".format(femobj["ChargeDensityElements"]))
|
||||
if obj.Mode in ["Interface", "Total Interface"]:
|
||||
femobj["ChargeDensityFaces"] = result
|
||||
elif obj.Mode in ["Source", "Total Source"]:
|
||||
femobj["ChargeDensityElements"] = result
|
||||
|
||||
def get_constraints_contact_faces(self):
|
||||
if not self.member.cons_contact:
|
||||
|
||||
@@ -31,7 +31,7 @@ def get_analysis_types():
|
||||
|
||||
|
||||
def get_sets_name():
|
||||
return "constraints_electricchargedensity_node_sets"
|
||||
return "constraints_electricchargedensity_element_sets"
|
||||
|
||||
|
||||
def get_constraint_title():
|
||||
@@ -40,30 +40,15 @@ def get_constraint_title():
|
||||
|
||||
def write_meshdata_constraint(f, femobj, den_obj, ccxwriter):
|
||||
|
||||
# print("MESHDATA: ", femobj)
|
||||
if ccxwriter.solver_obj.ElectromagneticMode != "electrostatic":
|
||||
return
|
||||
|
||||
if den_obj.Mode in ["Source", "Total Source"]:
|
||||
msg, data = femobj["ChargeDensityElements"]
|
||||
f.write(f"** {msg}\n")
|
||||
f.write(f"*ELSET,ELSET={den_obj.Name}\n")
|
||||
for ref, elem in data:
|
||||
for e in elem:
|
||||
f.write(f"{e},\n")
|
||||
|
||||
|
||||
# if isinstance(femobj["FEMElements"], str):
|
||||
# f.write("{}\n".format(femobj["FEMElements"]))
|
||||
# else:
|
||||
# for e in femobj["FEMElements"]:
|
||||
# f.write(f"{e},\n")
|
||||
|
||||
|
||||
# if femobj["Object"].BoundaryCondition == "Dirichlet":
|
||||
# f.write(f"*NSET,NSET={den_obj.Name}\n")
|
||||
# for n in femobj["Nodes"]:
|
||||
# f.write(f"{n},\n")
|
||||
for refs, surf, is_sub_el in femobj["ChargeDensityElements"]:
|
||||
if not is_sub_el:
|
||||
for elem in surf:
|
||||
f.write(f"{elem},\n")
|
||||
|
||||
|
||||
def get_before_write_meshdata_constraint():
|
||||
@@ -85,10 +70,6 @@ def get_after_write_constraint():
|
||||
def write_constraint(f, femobj, den_obj, ccxwriter):
|
||||
|
||||
# floats read from ccx should use {:.13G}, see comment in writer module
|
||||
# if den_obj.BoundaryCondition == "Dirichlet":
|
||||
# f.write("*BOUNDARY\n")
|
||||
# f.write("{},11,11,{:.13G}\n".format(den_obj.Name, den_obj.Potential.getValueAs("mV").Value))
|
||||
# f.write("\n")
|
||||
if ccxwriter.solver_obj.ElectromagneticMode != "electrostatic":
|
||||
return
|
||||
|
||||
@@ -108,18 +89,17 @@ def write_constraint(f, femobj, den_obj, ccxwriter):
|
||||
f.write("\n")
|
||||
|
||||
elif den_obj.Mode in ["Interface", "Total Interface"]:
|
||||
# check internal interface
|
||||
density = density.getValueAs("C/mm^2").Value
|
||||
# check internal interface
|
||||
internal = _check_shared_interface(den_obj)
|
||||
for feat, refs in femobj["ChargeDensityFaces"]:
|
||||
f.write("** " + feat + "\n")
|
||||
for feat, surf, is_sub_el in femobj["ChargeDensityFaces"]:
|
||||
f.write("** {0.Name}.{1[0]}\n".format(*feat))
|
||||
f.write("*DFLUX\n")
|
||||
for ref in refs:
|
||||
d = density
|
||||
if ref[0] in internal:
|
||||
d = density / 2
|
||||
for face, fno in ref[1]:
|
||||
f.write("{},S{},{:.13G}\n".format(face, fno, d))
|
||||
d = density
|
||||
if feat in internal:
|
||||
d = density / 2
|
||||
for face, fno in surf:
|
||||
f.write("{},S{},{:.13G}\n".format(face, fno, d))
|
||||
|
||||
f.write("\n")
|
||||
|
||||
|
||||
@@ -80,15 +80,14 @@ def write_constraint(f, femobj, pot_obj, ccxwriter):
|
||||
density = pot_obj.ElectricFluxDensity.getValueAs("C/mm^2").Value
|
||||
# check internal interface
|
||||
internal = _check_shared_interface(pot_obj)
|
||||
for feat, refs in femobj["ElectricFluxFaces"]:
|
||||
f.write("** " + feat + "\n")
|
||||
for feat, surf, is_sub_el in femobj["ElectricFluxFaces"]:
|
||||
f.write("** {0.Name}.{1[0]}\n".format(*feat))
|
||||
f.write("*DFLUX\n")
|
||||
for ref in refs:
|
||||
d = density
|
||||
if ref[0] in internal:
|
||||
d = density / 2
|
||||
for face, fno in ref[1]:
|
||||
f.write("{},S{},{:.13G}\n".format(face, fno, d))
|
||||
d = density
|
||||
if feat in internal:
|
||||
d = density / 2
|
||||
for face, fno in surf:
|
||||
f.write("{},S{},{:.13G}\n".format(face, fno, d))
|
||||
|
||||
f.write("\n")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user