Add FEM Equation Tutorial/de: Difference between revisions

From FreeCAD Documentation
(Created page with "== Elmers Gleichungs Objekt ==")
(Created page with "Zu guter Letzt registriere die neue Moduldatei ({{incode|flow.py}}) in {{incode|src/Mod/Fem/CMakeLists.txt}} auf die in [https://www.freecadweb.org/wiki/Extend_FEM_Module FEM...")
(15 intermediate revisions by the same user not shown)
Line 20: Line 20:
* src/Mod/Fem/Gui/Workbench.cpp
* src/Mod/Fem/Gui/Workbench.cpp
* src/Mod/Fem/Gui/Resources/Fem.qrc
* src/Mod/Fem/Gui/Resources/Fem.qrc
Der Gleichungstyp wird von allen Gleichungsobjekten der verschiedenen Löser gemeinsam verwendet. Jeder Typ hat einen Zeichenfolgenspezifizierer (z.B. "Heat") und einen zugeordneten Befehl, der die Gleichung dem ausgewählten Gleichungslöser hinzufügt. Dies ermöglicht eine einfachere GUI, bei der wir nur eine Schaltfläche für die Wärmegleichung haben, die für alle unterstützten Löser verwendet wird.
The equation type is shared among all equation objects of the different solver. Each type has a string specifier (e.g. "Heat") and a dedicated command that adds the equation to the selected solver. This allows for a simpler GUI where we have only one button for the heat equation which is used for all supported solver.


First add the new equation to the {{incode|equationbase.py}} module. Each equation requires two classes. A document proxy and a view proxy. Just copy-paste them from an existing equation type and adjust the icon path inside getIcon(self) of the view proxy.
Füge zunächst die neue Gleichung zum Modul {{incode|equationbase.py}} hinzu. Jede Gleichung erfordert zwei Klassen. Einen Dokumentproxy und einen Ansichtproxy. Kopiere und füge sie einfach aus einem vorhandenen Gleichungstyp ein und passe den Symbolpfad innerhalb von getIcon(self) des Ansichtproxys an.
<pre>class FlowProxy(BaseProxy):
<pre>class FlowProxy(BaseProxy):
pass
pass
Line 30: Line 30:
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>


Those two classes will later be used as base classes for the Elmer specific equation classes. In addition to those base classes we have to create a new command class that adds a flow equation to the selected solver object. Additionally, the new .svg image has to be registered for the GUI-button with {{incode|<file>icons/FEM_EquationFlow.svg</file>}} in {{incode|Fem.qrc}} (in {{incode|/Gui/Resources/}}). The related .svg has to be put into {{incode|/Gui/Resources/icons/}}.
Diese beiden Klassen werden später als Basisklassen für die Elmer spezifischen Gleichungsklassen verwendet. Zusätzlich zu diesen Basisklassen müssen wir eine neue Befehlsklasse erstellen, die dem ausgewählten Löserobjekt eine Strömungsgleichung hinzufügt. Zusätzlich muss das neue .svg Bild für die GUI Schaltfläche mit {{incode|<file>icons/FEM_EquationFlow.svg</file>}} in {{incode|Fem.qrc}} (in {{incode|/Gui/Resources/}}) registriert werden. Die zugehörige .svg muss in {{incode|/Gui/Resources/icons/}} abgelegt werden.


Next, the command/equation has to be added to the {{incode|femcommands/commands.py}} module. Just copy an existing command and adjust the icon, menu text and tool-tip in __init__(self). '''Don't forget''' to register the command at the bottom of the module file by using the addCommand(...) method. Please see the discussion in the forum at https://forum.freecadweb.org/viewtopic.php?f=18&t=46693&start=10#p402004 if icons are involed.
Als nächstes muss der Befehl bzw. die Gleichung zum Modul {{incode|femcommands/commands.py}} hinzugefügt werden. Kopiere einfach einen vorhandenen Befehl und passe das Symbol, den Menütext und den Werkzeug-Tipp in __init__(self) an. '''Vergiss nicht''' den Befehl unten in der Moduldatei zu registrieren, indem durch verwenden der addCommand(...) Methode. Bitte beachte die Diskussion im Forum unter https://forum.freecadweb.org/viewtopic.php?f=18&t=46693&start=10#p402004, wenn Symbole betroffen sind,
<pre>
<pre>
class _EquationFlow(CommandManager):
class _EquationFlow(CommandManager):
Line 51: Line 51:


Our newly created command still needs to be made accessible via the GUI of the FEM workbench. To add it to the toolbar search for the following code snippet in {{incode|/Gui/Workbench.cpp}} and add the new command to the rest of the equation commands.
Unser neu geschaffener Befehl muss noch über die GUI des FEM Arbeitsbereiches zugänglich gemacht werden. Um ihn zur Symbolleiste hinzuzufügen, suche den folgenden Codeschnipsel in {{incode|/Gui/Workbench.cpp}} und füge den neuen Befehl zu den restlichen Gleichungsbefehlen hinzu.
<pre>
<pre>
Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
Line 69: Line 69:
<< "FEM_SolverRun";
<< "FEM_SolverRun";
</pre>
</pre>
We are also going to add the flow equation command to the solve menu of the FEM workbench. To do this insert our equation into the following code snippet in {{incode|Workbench.cpp}}.
Wir werden auch den Befehl Strömungsgleichung zum Lösungsmenü dem FEM Arbeitsbereich hinzufügen. Dazu fügen wir unsere Gleichung in das folgende Codeschnipsel in {{incode|Workbench.cpp}} ein.
<pre>
<pre>
Gui::MenuItem* solve = new Gui::MenuItem;
Gui::MenuItem* solve = new Gui::MenuItem;
Line 93: Line 93:
== Elmers Gleichungs Objekt ==
== Elmers Gleichungs Objekt ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
In this step we are going to modify the following file:
* src/Mod/Fem/CMakeLists.txt
* src/Mod/Fem/CMakeLists.txt
und die folgende neue Datei hinzufügen:
and add the following new file:
* src/Mod/Fem/femsolver/elmer/equations/flow.py
* src/Mod/Fem/femsolver/elmer/equations/flow.py
Lets start with the module that implements the document object. In can be copied from an existing equation. If the new equation only supports keywords for '''linear''' systems copy the {{incode|femsolver/elmer/equations/elasticity.py}} module. If it supports '''non-linear''' keywords too copy {{incode|femsolver/elmer/equations/heat.py}}. The flow equation in Elmer is a potentially non-linear equation. This means that we are going to base our work on {{incode|heat.py}}.
Beginnen wir mit dem Modul, das das Dokumentobjekt implementiert. In kann aus einer bestehenden Gleichung kopiert werden. Wenn die neue Gleichung nur Schlüsselwörter für '''lineare''' Systeme unterstützt, kopiere das Modul {{incode|femsolver/elmer/equations/elasticity.py}}. Wenn es '''nicht-lineare''' Schlüsselwörter unterstützt, kopiere auch {{incode|femsolver/elmer/equations/heat.py}}. Die Strömungsgleichung in Elmer ist eine potenziell nichtlineare Gleichung. Das bedeutet, dass wir unsere Arbeit auf {{incode|heat.py}} stützen werden.


After copying {{incode|heat.py}} to {{incode|flow.py}} adjust - the name argument of the create module function, - the Type attribute of the Proxy class, - the base classes of the {{incode|Proxy}} and the {{incode|ViewProxy}} classes, - and the properties added via the {{incode|obj.addProperty(..)}} function to those needed by the equation.
Nach dem Kopieren von {{incode|heat.py}} nach {{incode|flow.py}} passe - das Namensargument der Funktion create module an, - das Typattribut der Klasse Proxy, - die Basisklassen der Klassen {{incode|Proxy}} und {{incode|ViewProxy}}, - und die über die Funktion {{incode|obj.addProperty(..)}} hinzugefügten Eigenschaften an die von der Gleichung benötigten an.
<pre>
<pre>
def create(doc, name=&quot;Flow&quot;):
def create(doc, name=&quot;Flow&quot;):
Line 119: Line 119:
</pre>
</pre>


Zum Zeitpunkt des Schreibens dieses Tutoriums hat die Elmer Fliessgleichung keine besonderen Eigenschaften. Siehe Elmer Elastizitätsgleichung für ein Beispiel mit Eigenschaften.
At the moment of writing this tutorial Elmer flow equation doesn't have any special properties. See Elmer elasticity equation for an example with properties.


Last but not least register the new module file ({{incode|flow.py}}) in {{incode|src/Mod/Fem/CMakeLists.txt}} the way described in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. The suitable lists can be easily found by searching for existing equation modules files of Elmer.
Zu guter Letzt registriere die neue Moduldatei ({{incode|flow.py}}) in {{incode|src/Mod/Fem/CMakeLists.txt}} auf die in [https://www.freecadweb.org/wiki/Extend_FEM_Module FEM Modul erweitern] beschriebene Weise. Die passenden Listen lassen sich leicht finden, indem man nach vorhandenen Gleichungsmoduldateien von Elmer sucht.


Finally one hast to register a '''makeEquationStatcurrent''' definition in {{incode|ObjectsFem.py}} by duplicating an available entry.
Finally one hast to register a '''makeEquationStatcurrent''' definition in {{incode|ObjectsFem.py}} by duplicating an available entry.
Line 128: Line 128:
== Löser Objekt erweitern ==
== Löser Objekt erweitern ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
In this step we are going to modify the following file:
* src/Mod/Fem/femsolver/elmer/solver.py
* src/Mod/Fem/femsolver/elmer/solver.py
Right now we made FreeCAD aware that there is a new type of equation and even added a command that adds this equation to the selected solver object. We also implemented a concrete equation object for Elmer. Whats left to do now it to make the connection between Elmer and the flow equation. This must be done directly in Elmer solver object.
Right now we made FreeCAD aware that there is a new type of equation and even added a command that adds this equation to the selected solver object. We also implemented a concrete equation object for Elmer. Whats left to do now it to make the connection between Elmer and the flow equation. This must be done directly in Elmer solver object.
Line 148: Line 148:
== Analyse Export erweitern ==
== Analyse Export erweitern ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
In this step we are going to modify the following file:
* src/Mod/Fem/femsolver/elmer/writer.py
* src/Mod/Fem/femsolver/elmer/writer.py
This is the most demanding part of implementing a new equation. This file contains the {{incode|Writer}} class which exports the analysis into Elmer sif format.
Dies ist der anspruchsvollste Teil der Umsetzung einer neuen Gleichung. Diese Datei enthält die Klasse {{incode|Writer}}, die die Analyse in das Elmer sif Format exportiert.


Für jede unterstützte Gleichung gibt es eine Reihe von Methoden für den Export der jeweiligen Gleichung. Kopiere einfach alle von einer bestehenden Gleichung und passe sie an deine Bedürfnisse an. Unsere Fließgleichung verwendet die folgenden Methoden:
For every supported equation there are a series of methods handling the export of the respective equation. Just copy all of them from an existing equation and adjust them to your needs. Our flow equation uses the following methods:
* _handleFlow
* _handleFlow
* _getFlowSolver
* _getFlowSolver

Revision as of 07:01, 22 October 2020

Tutorium
Thema
FEM Gleichung hinzufügen
Niveau
Zeit zum Abschluss
Autoren
M42kus
FreeCAD-Version
Beispieldateien
Siehe auch
None

In diesem Tutorium werden wir die Fließgeschwindigkeit zu FreeCAD hinzufügen und die Unterstützung für den Elmer Löser einführen. Bitte stelle sicher, dass du Extend FEM Module gelesen und verstanden hast, bevor du dieses Tutorium liest.

Die Aufgabe kann in vier Teile aufgeteilt werden. Der erste Schritt besteht darin, den FEM Arbeitsbereich auf einen neuen Gleichungstyp aufmerksam zu machen. Dieser Schritt muss nur durchgeführt werden, wenn die Gleichung in FreeCAD jetzt nicht existiert (im Gegensatz zu einer Gleichung, die bereits in FreeCAD existiert, aber vom Ziellöser nicht unterstützt wird). Der zweite Schritt besteht darin, ein konkretes Dokumentobjekt hinzuzufügen, das die Elmer spezifische Gleichung repräsentiert. Der dritte Schritt besteht darin, dem Löserobjekt von elmer Unterstützung für die neue Gleichung hinzuzufügen. Danach muss der Analyseexport von elmer erweitert werden, um den neuen Gleichungstyp zu unterstützen.

Neuer Gleichungstyp

In diesem Schritt werden wir die folgenden Dateien modifizieren:

  • src/Mod/Fem/femsolver/equationbase.py
  • src/Mod/Fem/femcommands/commands.py
  • src/Mod/Fem/Gui/Workbench.cpp
  • src/Mod/Fem/Gui/Resources/Fem.qrc

Der Gleichungstyp wird von allen Gleichungsobjekten der verschiedenen Löser gemeinsam verwendet. Jeder Typ hat einen Zeichenfolgenspezifizierer (z.B. "Heat") und einen zugeordneten Befehl, der die Gleichung dem ausgewählten Gleichungslöser hinzufügt. Dies ermöglicht eine einfachere GUI, bei der wir nur eine Schaltfläche für die Wärmegleichung haben, die für alle unterstützten Löser verwendet wird.

Füge zunächst die neue Gleichung zum Modul equationbase.py hinzu. Jede Gleichung erfordert zwei Klassen. Einen Dokumentproxy und einen Ansichtproxy. Kopiere und füge sie einfach aus einem vorhandenen Gleichungstyp ein und passe den Symbolpfad innerhalb von getIcon(self) des Ansichtproxys an.

class FlowProxy(BaseProxy):
    pass

class FlowViewProxy(BaseViewProxy):
    def getIcon(self):
        return ":/icons/FEM_EquationFlow.svg"

Diese beiden Klassen werden später als Basisklassen für die Elmer spezifischen Gleichungsklassen verwendet. Zusätzlich zu diesen Basisklassen müssen wir eine neue Befehlsklasse erstellen, die dem ausgewählten Löserobjekt eine Strömungsgleichung hinzufügt. Zusätzlich muss das neue .svg Bild für die GUI Schaltfläche mit <file>icons/FEM_EquationFlow.svg</file> in Fem.qrc (in /Gui/Resources/) registriert werden. Die zugehörige .svg muss in /Gui/Resources/icons/ abgelegt werden.

Als nächstes muss der Befehl bzw. die Gleichung zum Modul femcommands/commands.py hinzugefügt werden. Kopiere einfach einen vorhandenen Befehl und passe das Symbol, den Menütext und den Werkzeug-Tipp in __init__(self) an. Vergiss nicht den Befehl unten in der Moduldatei zu registrieren, indem durch verwenden der addCommand(...) Methode. Bitte beachte die Diskussion im Forum unter https://forum.freecadweb.org/viewtopic.php?f=18&t=46693&start=10#p402004, wenn Symbole betroffen sind,

class _EquationFlow(CommandManager):
    "The FEM_EquationFlow command definition"

    def __init__(self):
        super(_EquationFlow, self).__init__()
        self.menuetext = "Flow equation"
        self.tooltip = "Creates a FEM equation for flow"
        self.is_active = "with_solver_elmer"
        self.do_activated = "add_obj_on_gui_selobj_noset_edit"
...
FreeCADGui.addCommand(
    "FEM_EquationFlow",
    _EquationFlow()
)


Unser neu geschaffener Befehl muss noch über die GUI des FEM Arbeitsbereiches zugänglich gemacht werden. Um ihn zur Symbolleiste hinzuzufügen, suche den folgenden Codeschnipsel in /Gui/Workbench.cpp und füge den neuen Befehl zu den restlichen Gleichungsbefehlen hinzu.

 
     Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
     solve->setCommand("Solve");
     *solve << "FEM_SolverCalculixCxxtools"
           << "FEM_SolverCalculiX"
           << "FEM_SolverElmer"
           << "Separator"
           << "FEM_EquationElasticity"
           << "FEM_EquationElectrostatic"
+          << "FEM_EquationFlow"
           << "FEM_EquationFluxsolver"
           << "FEM_EquationElectricforce"
           << "FEM_EquationHeat"
           << "Separator"
           << "FEM_SolverControl"
           << "FEM_SolverRun";

Wir werden auch den Befehl Strömungsgleichung zum Lösungsmenü dem FEM Arbeitsbereich hinzufügen. Dazu fügen wir unsere Gleichung in das folgende Codeschnipsel in Workbench.cpp ein.

 
    Gui::MenuItem* solve = new Gui::MenuItem;
    root->insertItem(item, solve);
    solve->setCommand("&Solve");
    *solve << "FEM_SolverCalculixCxxtools"
           << "FEM_SolverCalculiX"
           << "FEM_SolverElmer"
           << "FEM_SolverZ88"
           << "Separator"
           << "FEM_EquationElasticity"
           << "FEM_EquationElectrostatic"
+          << "FEM_EquationFlow"
           << "FEM_EquationFluxsolver"
           << "FEM_EquationElectricforce"
           << "FEM_EquationHeat"
           << "Separator"
           << "FEM_SolverControl"
           << "FEM_SolverRun";


Elmers Gleichungs Objekt

In diesem Schritt werden wir die folgenden Dateien modifizieren:

  • src/Mod/Fem/CMakeLists.txt

und die folgende neue Datei hinzufügen:

  • src/Mod/Fem/femsolver/elmer/equations/flow.py

Beginnen wir mit dem Modul, das das Dokumentobjekt implementiert. In kann aus einer bestehenden Gleichung kopiert werden. Wenn die neue Gleichung nur Schlüsselwörter für lineare Systeme unterstützt, kopiere das Modul femsolver/elmer/equations/elasticity.py. Wenn es nicht-lineare Schlüsselwörter unterstützt, kopiere auch femsolver/elmer/equations/heat.py. Die Strömungsgleichung in Elmer ist eine potenziell nichtlineare Gleichung. Das bedeutet, dass wir unsere Arbeit auf heat.py stützen werden.

Nach dem Kopieren von heat.py nach flow.py passe - das Namensargument der Funktion create module an, - das Typattribut der Klasse Proxy, - die Basisklassen der Klassen Proxy und ViewProxy, - und die über die Funktion obj.addProperty(..) hinzugefügten Eigenschaften an die von der Gleichung benötigten an.

def create(doc, name="Flow"):
    return femutils.createObject(
        doc, name, Proxy, ViewProxy)


class Proxy(nonlinear.Proxy, equationbase.FlowProxy):

    Type = "Fem::EquationElmerFlow"

    def __init__(self, obj):
        super(Proxy, self).__init__(obj)
        obj.Priority = 10


class ViewProxy(nonlinear.ViewProxy, equationbase.FlowViewProxy):
    pass

Zum Zeitpunkt des Schreibens dieses Tutoriums hat die Elmer Fliessgleichung keine besonderen Eigenschaften. Siehe Elmer Elastizitätsgleichung für ein Beispiel mit Eigenschaften.

Zu guter Letzt registriere die neue Moduldatei (flow.py) in src/Mod/Fem/CMakeLists.txt auf die in FEM Modul erweitern beschriebene Weise. Die passenden Listen lassen sich leicht finden, indem man nach vorhandenen Gleichungsmoduldateien von Elmer sucht.

Finally one hast to register a makeEquationStatcurrent definition in ObjectsFem.py by duplicating an available entry.


Löser Objekt erweitern

In diesem Schritt werden wir die folgenden Dateien modifizieren:

  • src/Mod/Fem/femsolver/elmer/solver.py

Right now we made FreeCAD aware that there is a new type of equation and even added a command that adds this equation to the selected solver object. We also implemented a concrete equation object for Elmer. Whats left to do now it to make the connection between Elmer and the flow equation. This must be done directly in Elmer solver object.

Register the module in which we just implemented our new equation object (flow.py) with the equation specifier from step 1 ("Flow") in the _EQUATIONS list in elmer/solver.py.

from .equations import electrostatic
+from .equations import flow

...

_EQUATIONS = {
    "Heat": heat,
    "Elasticity": elasticity,
+    "Flow": flow,
}

Analyse Export erweitern

In diesem Schritt werden wir die folgenden Dateien modifizieren:

  • src/Mod/Fem/femsolver/elmer/writer.py

Dies ist der anspruchsvollste Teil der Umsetzung einer neuen Gleichung. Diese Datei enthält die Klasse Writer, die die Analyse in das Elmer sif Format exportiert.

Für jede unterstützte Gleichung gibt es eine Reihe von Methoden für den Export der jeweiligen Gleichung. Kopiere einfach alle von einer bestehenden Gleichung und passe sie an deine Bedürfnisse an. Unsere Fließgleichung verwendet die folgenden Methoden:

  • _handleFlow
  • _getFlowSolver
  • _handleFlowConstants
  • _handleFlowMaterial
  • _handleFlowInitialVelocity
  • _handleFlowBndConditions
  • _handleFlowEquation