Add FEM Equation Tutorial/de

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: Der Gleichungstyp wird von allen Gleichungsobjekten der verschiedenen Löser gemeinsam verwendet. Jeder Typ hat einen Zeichenfolgenspezifizierer (z.B. &quot;Heat&quot;) 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.
 * 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

Füge zunächst die neue Gleichung zum Modul 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 &quot;:/icons/FEM_EquationFlow.svg&quot;

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  in  (in ) registriert werden. Die zugehörige .svg muss in abgelegt werden.

Als nächstes muss der Befehl bzw. die Gleichung zum Modul 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 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 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: und die folgende neue Datei hinzufügen: 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 module. If it supports non-linear keywords too copy. The flow equation in Elmer is a potentially non-linear equation. This means that we are going to base our work on.
 * src/Mod/Fem/CMakeLists.txt
 * src/Mod/Fem/femsolver/elmer/equations/flow.py

After copying to  adjust - the name argument of the create module function, - the Type attribute of the Proxy class, - the base classes of the  and the  classes, - and the properties added via the  function to those needed by the equation. def create(doc, name=&quot;Flow&quot;): return femutils.createObject(       doc, name, Proxy, ViewProxy)

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

Type = &quot;Fem::EquationElmerFlow&quot;

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

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

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 in  the way described in Extend FEM Module. The suitable lists can be easily found by searching for existing equation modules files of Elmer.

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

Löser Objekt erweitern
In diesem Schritt werden wir die folgenden Dateien modifizieren: 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.
 * src/Mod/Fem/femsolver/elmer/solver.py

Register the module in which we just implemented our new equation object with the equation specifier from step 1 (&quot;Flow&quot;) in the  list in. from .equations import electrostatic +from .equations import flow

...

_EQUATIONS = { &quot;Heat&quot;: heat, &quot;Elasticity&quot;: elasticity, +   &quot;Flow&quot;: flow, }

Analyse Export erweitern
In diesem Schritt werden wir die folgenden Dateien modifizieren: Dies ist der anspruchsvollste Teil der Umsetzung einer neuen Gleichung. Diese Datei enthält die Klasse, die die Analyse in das Elmer sif Format exportiert.
 * src/Mod/Fem/femsolver/elmer/writer.py

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