From 84db9d4baa6023d4df85c9d8e8426e855edfe41e Mon Sep 17 00:00:00 2001 From: Uwe Date: Sun, 7 Aug 2022 01:11:07 +0200 Subject: [PATCH] [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 --- src/Mod/Fem/Gui/TaskPostBoxes.cpp | 3 + .../elmer/equations/electrostatic.py | 51 +++++++++++++---- src/Mod/Fem/femsolver/elmer/writer.py | 57 +++++++++++++++++-- 3 files changed, 93 insertions(+), 18 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index 43ca69157a..db90f011fc 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -1136,6 +1136,9 @@ void TaskPostDataAtPoint::on_Field_activated(int i) { else if (FieldName == "electric energy density") { static_cast(getObject())->Unit.setValue("J/m^3"); } + else if (FieldName == "electric flux") { + static_cast(getObject())->Unit.setValue("A*s/m^2"); + } // ToDo: set a proper unit once it is known else if (FieldName == "potential loads") { static_cast(getObject())->Unit.setValue(""); diff --git a/src/Mod/Fem/femsolver/elmer/equations/electrostatic.py b/src/Mod/Fem/femsolver/elmer/equations/electrostatic.py index 35e7efc342..c6ee2d5782 100644 --- a/src/Mod/Fem/femsolver/elmer/equations/electrostatic.py +++ b/src/Mod/Fem/femsolver/elmer/equations/electrostatic.py @@ -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 diff --git a/src/Mod/Fem/femsolver/elmer/writer.py b/src/Mod/Fem/femsolver/elmer/writer.py index 5d0a975ddb..437510077e 100644 --- a/src/Mod/Fem/femsolver/elmer/writer.py +++ b/src/Mod/Fem/femsolver/elmer/writer.py @@ -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",