[FEM] Elmer: fixes for electrostatics

- one needs to specify a file when calculating the capacitance matrix
- add electric flux to point filter results
- add missing parameters
- also some sorting
This commit is contained in:
Uwe
2022-08-07 01:11:07 +02:00
parent ef4366a20d
commit 84db9d4baa
3 changed files with 93 additions and 18 deletions

View File

@@ -1136,6 +1136,9 @@ void TaskPostDataAtPoint::on_Field_activated(int i) {
else if (FieldName == "electric energy density") {
static_cast<Fem::FemPostDataAtPointFilter*>(getObject())->Unit.setValue("J/m^3");
}
else if (FieldName == "electric flux") {
static_cast<Fem::FemPostDataAtPointFilter *>(getObject())->Unit.setValue("A*s/m^2");
}
// ToDo: set a proper unit once it is known
else if (FieldName == "potential loads") {
static_cast<Fem::FemPostDataAtPointFilter*>(getObject())->Unit.setValue("");

View File

@@ -44,6 +44,19 @@ class Proxy(linear.Proxy, equationbase.ElectrostaticProxy):
def __init__(self, obj):
super(Proxy, self).__init__(obj)
obj.addProperty(
"App::PropertyBool",
"CalculateCapacitanceMatrix",
"Electrostatic",
""
)
obj.addProperty(
"App::PropertyBool",
"CalculateElectricEnergy",
"Electrostatic",
""
)
obj.addProperty(
"App::PropertyBool",
"CalculateElectricField",
@@ -56,24 +69,12 @@ class Proxy(linear.Proxy, equationbase.ElectrostaticProxy):
"Electrostatic",
""
)
obj.addProperty(
"App::PropertyBool",
"CalculateElectricEnergy",
"Electrostatic",
""
)
obj.addProperty(
"App::PropertyBool",
"CalculateSurfaceCharge",
"Electrostatic",
""
)
obj.addProperty(
"App::PropertyBool",
"CalculateCapacitanceMatrix",
"Electrostatic",
""
)
"""
obj.addProperty(
"App::PropertyInteger",
@@ -82,7 +83,33 @@ class Proxy(linear.Proxy, equationbase.ElectrostaticProxy):
""
)
"""
obj.addProperty(
"App::PropertyFile",
"CapacitanceMatrixFilename",
"Electrostatic",
(
"File where capacitance matrix is being saved\n"
"Only used if 'CalculateCapacitanceMatrix' is true"
)
)
obj.addProperty(
"App::PropertyBool",
"ConstantWeights",
"Electrostatic",
"Use constant weighting for results"
)
obj.addProperty(
"App::PropertyFloat",
"PotentialDifference",
"Electrostatic",
(
"Potential difference in Volt for which capacitance is\n"
"calculated if 'CalculateCapacitanceMatrix' is false"
)
)
obj.CapacitanceMatrixFilename = "cmatrix.dat"
obj.PotentialDifference = 0.0
obj.Priority = 10

View File

@@ -557,22 +557,67 @@ class Writer(object):
self._handleElectrostaticMaterial(activeIn)
def _getElectrostaticSolver(self, equation):
# check if we need to update the equation
self._updateElectrostaticSolver(equation)
# output the equation parameters
s = self._createLinearSolver(equation)
s["Equation"] = "Stat Elec Solver" # equation.Name
s["Procedure"] = sifio.FileAttr("StatElecSolve/StatElecSolver")
s["Variable"] = self._getUniqueVarName("Potential")
s["Variable DOFs"] = 1
s["Calculate Electric Field"] = equation.CalculateElectricField
# s["Calculate Electric Flux"] = equation.CalculateElectricFlux
s["Calculate Electric Energy"] = equation.CalculateElectricEnergy
s["Calculate Surface Charge"] = equation.CalculateSurfaceCharge
s["Calculate Capacitance Matrix"] = equation.CalculateCapacitanceMatrix
s["Displace mesh"] = False
if equation.CalculateCapacitanceMatrix is True:
s["Calculate Capacitance Matrix"] = equation.CalculateCapacitanceMatrix
s["Capacitance Matrix Filename"] = equation.CapacitanceMatrixFilename
if equation.CalculateElectricEnergy is True:
s["Calculate Electric Energy"] = equation.CalculateElectricEnergy
if equation.CalculateElectricField is True:
s["Calculate Electric Field"] = equation.CalculateElectricField
if equation.CalculateElectricFlux is True:
s["Calculate Electric Flux"] = equation.CalculateElectricFlux
if equation.CalculateSurfaceCharge is True:
s["Calculate Surface Charge"] = equation.CalculateSurfaceCharge
if equation.ConstantWeights is True:
s["Constant Weights"] = equation.ConstantWeights
s["Exec Solver"] = "Always"
s["Optimize Bandwidth"] = True
if equation.CalculateCapacitanceMatrix is False\
and (equation.PotentialDifference != 0.0):
s["Potential Difference"] = equation.PotentialDifference
s["Stabilize"] = equation.Stabilize
return s
def _updateElectrostaticSolver(self, equation):
# updates older Electrostatic equations
if not hasattr(equation, "CapacitanceMatrixFilename"):
equation.addProperty(
"App::PropertyFile",
"CapacitanceMatrixFilename",
"Electrostatic",
(
"File where capacitance matrix is being saved\n"
"Only used if 'CalculateCapacitanceMatrix' is true"
)
)
equation.CapacitanceMatrixFilename = "cmatrix.dat"
if not hasattr(equation, "ConstantWeights"):
equation.addProperty(
"App::PropertyBool",
"ConstantWeights",
"Electrostatic",
"Use constant weighting for results"
)
if not hasattr(equation, "PotentialDifference"):
equation.addProperty(
"App::PropertyFloat",
"PotentialDifference",
"Electrostatic",
(
"Potential difference in Volt for which capacitance is\n"
"calculated if 'CalculateCapacitanceMatrix' is false"
)
)
equation.PotentialDifference = 0.0
def _handleElectrostaticConstants(self):
self._constant(
"Permittivity Of Vacuum",