Add FEM Equation Tutorial/de: Difference between revisions

From FreeCAD Documentation
(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...")
No edit summary
 
(55 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{TutorialInfo/de
{{TutorialInfo/de
|Topic= FEM Gleichung hinzufügen
|Topic=FEM Gleichung hinzufügen
|Level=
|Level=Fortgeschritten
|Time=
|Time=1 Tag
|Author=[[User:M42kus|M42kus]]
|Author=[[User:JohnWang|JohnWang]]
|FCVersion=
|FCVersion=0.19
|Files=
}}
}}


<span id="Introduction"></span>
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/de|Extend FEM Module]] gelesen und verstanden hast, bevor du dieses Tutorium liest.
==Einleitung==

In dieser Anleitung werden wir FreeCAD die Gleichung '''Strömung''' (Flow) hinzufügen und die Unterstützung für den Löser Elmer implementieren. Bitte stelle sicher, dass du [[Extend_FEM_Module/de|FEM-Modul erweitern]] gelesen und verstanden hast, bevor du diese Anleitung liest.


Die Aufgabe kann in fünf Teile aufgeteilt werden.
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'''. Dieser Schritt muss nur durchgeführt werden, wenn die Gleichung in FreeCAD bisher nicht existiert (im Gegensatz zu einer Gleichung, die bereits in FreeCAD existiert, aber vom Ziellöser nicht unterstützt wird).
* '''Neues Gleichungsobjekt'''. Hinzufügen eines konkreten Dokumentobjekts, das die Elmer-spezifische Gleichung repräsentiert.
* '''Löserobjekt erweitern'''. Dem Elmer-Löserobjekt Unterstützung für die neue Gleichung hinzufügen.
* '''Writer-Objekt erweitern'''. Erweitern des Elmer-Analyseexports zur Unterstützung des neuen Gleichungstyps.
* '''GUI-Werkzeug zum Erstellen einer Gleichung'''. Zugriff auf die neue Gleichungsfunktion über den GUI-Arbeitsbereich.


<span id="New_equation_type"></span>
== Neuer Gleichungstyp ==
== Neuer Gleichungstyp ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
In diesem Schritt werden wir die folgende Datei 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. &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.


* {{FileName|src/Mod/Fem/femsolver/equationbase.py}}
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):
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 zuerst die neue Gleichung zum {{incode|equationbase.py}}-Modul hinzu. Jede Gleichung erfordert zwei Klassen, ein Dokument-Proxy und ein Ansicht-Proxy. Diese zwei Klassen werden später als Basisklassen für die Elmer-spezifischen Gleichungsklassen benutzt. Kopiere sie einfach von einem existierenden Gleichungstyp und passe den Icon-Pfad in {{Incode|getIcon(self)}} des Ansicht-Proxy an.

{{Code|code=
class FlowProxy(BaseProxy):
pass
pass


class FlowViewProxy(BaseViewProxy):
class FlowViewProxy(BaseViewProxy):
def getIcon(self):
def getIcon(self):
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>
return ":/icons/FEM_EquationFlow.svg"
}}


<span id="New_Elmer&#039;s_equation_object"></span>
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.
== Neues Elmers Gleichungs Objekt ==


In diesem Schritt werden wir das Dokumentobjekt implementieren. Wir müssen eine neue Datei {{Incode|flow.py}} hinzufügen unter:
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>
class _EquationFlow(CommandManager):
"The FEM_EquationFlow command definition"


* {{FileName|src/Mod/Fem/femsolver/elmer/equations/flow.py}}
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()
)
</pre>


und die folgenden Dateien ändern:
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>
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";
</pre>
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>
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";
</pre>


* {{FileName|src/Mod/Fem/ObjectsFem.py}}
* {{FileName|src/Mod/Fem/CMakeLists.txt}}


Beginnen wir dem Hinzufügen der neuen Datei {{Incode|flow.py}}. Diese Datei kann aus einer bestehenden Gleichung kopiert werden.
== Elmers Gleichungs Objekt ==


<span id="Keywords"></span>
In diesem Schritt werden wir die folgenden Dateien modifizieren:
=== Schlüsselwörter ===
* src/Mod/Fem/CMakeLists.txt

und die folgende neue Datei hinzufügen:
* Falls die neue Gleichung nur Schlüsselworte für '''lineare''' Systeme unterstützt, kopiere das {{Incode|femsolver/elmer/equations/elasticity.py}}-Modul.
* 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 {{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.
* Falls die neue Gleichung Schlüsselworte für '''lineare''' und '''nicht-lineare''' Systeme unterstützt, kopiere das {{Incode|femsolver/elmer/equations/heat.py}}-Modul.

Die Strömungsgleichung ist eine potenziell nicht-lineare Gleichung. Das bedeutet, dass unsere Arbeit auf {{incode|heat.py}} basieren wird.

<span id="Editing_files"></span>
=== Dateien bearbeiten ===

Nach dem Kopieren von {{incode|heat.py}} nach {{incode|flow.py}} passe letztere Datei an folgenden Stellen an:
* das Namensargument der {{Incode|create}}-Modulfunktion,
* die Basisklassen der {{Incode|Proxy}}-Klasse,
* das {{Incode|Type}}-Attribut der {{Incode|Proxy}}-Klasse,
* die {{incode|ViewProxy}}-Klassen.


{{Code|code=
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.
def create(doc, name="'''Flow'''"):
<pre>
def create(doc, name=&quot;Flow&quot;):
return femutils.createObject(
return femutils.createObject(
doc, name, Proxy, ViewProxy)
doc, name, Proxy, ViewProxy)


class Proxy(nonlinear.Proxy, equationbase.'''Flow'''Proxy):


Type = "Fem::EquationElmer'''Flow'''"
class Proxy(nonlinear.Proxy, equationbase.FlowProxy):

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


def __init__(self, obj):
def __init__(self, obj):
Line 114: Line 85:
obj.Priority = 10
obj.Priority = 10


class ViewProxy(nonlinear.ViewProxy, equationbase.'''Flow'''ViewProxy):

class ViewProxy(nonlinear.ViewProxy, equationbase.FlowViewProxy):
pass
pass
}}
</pre>


Dann musst du die über die {{incode|obj.addProperty(..)}}-Funktion hinzugefügten Eigenschaften auf die von der Gleichung benötigten anpassen.
Zum Zeitpunkt des Schreibens dieses Tutoriums hat die Elmer Fliessgleichung keine besonderen Eigenschaften. Siehe Elmer Elastizitätsgleichung für ein Beispiel mit Eigenschaften.


Zum Zeitpunkt des Schreibens dieses Tutoriums hat die Elmer-Strömungsgleichung keine besonderen Eigenschaften. Siehe Elmer-Elastizitätsgleichung für ein Beispiel mit Eigenschaften.
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.
Schließlich muss man eine '''makeEquationFlow'''-Definition in {{Incode|src/Mod/Fem/ObjectsFem.py}} durch Duplizieren eines verfügbaren Eintrags registrieren.


FreeCAD benutzt '''make''' zur Erstellung des Programms. Deshalb müssen wir die neue Moduldatei ({{Incode|flow.py}}) in {{incode|src/Mod/Fem/CMakeLists.txt}} registrieren, wie in [https://www.freecadweb.org/wiki/Extend_FEM_Module FEM Modul erweitern] beschriebenen. Die passenden Listen lassen sich leicht finden, indem man nach vorhandenen Gleichungsmoduldateien von Elmer sucht.


<span id="Extend_Solver_Object"></span>
== Löser Objekt erweitern ==
== Löser Objekt erweitern ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
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.


* {{FileName|src/Mod/Fem/femsolver/elmer/solver.py}}
Register the module in which we just implemented our new equation object ({{incode|flow.py}}) with the equation specifier from step 1 (&quot;Flow&quot;) in the {{incode|_EQUATIONS}} list in {{incode|elmer/solver.py}}.

<pre>
Gerade jetzt haben wir FreeCAD darauf aufmerksam gemacht, dass es einen neuen Gleichungstyp gibt, und sogar einen Befehl hinzugefügt, der diese Gleichung dem ausgewählten Löserobjekt hinzufügt. Wir haben auch ein konkretes Gleichungsobjekt für Elmer implementiert. Was jetzt noch zu tun bleibt, ist die Verbindung zwischen Elmer und der Strömungsgleichung herzustellen. Dies muss direkt im Elmer-Lösungsobjekt erfolgen.

Registriere das Modul, in dem wir gerade unser neues Gleichungsobjekt ({{Incode|flow.py}}) implementiert haben, mit dem Gleichungsspezifizierer aus Schritt 1 ("Flow") in der {{Incode|_EQUATIONS}} Liste in {{Incode|elmer/solver.py}}.

{{Code|code=
from .equations import electrostatic
from .equations import electrostatic
+from .equations import flow
+from .equations import flow
Line 140: Line 115:


_EQUATIONS = {
_EQUATIONS = {
&quot;Heat&quot;: heat,
"Heat": heat,
&quot;Elasticity&quot;: elasticity,
"Elasticity": elasticity,
+ &quot;Flow&quot;: flow,
+ "Flow": flow,
}
}
}}
</pre>


<span id="Extend_writer_object"></span>
== Analyse Export erweitern ==
== Schreiber Objekt erweitern ==


In diesem Schritt werden wir die folgenden Dateien modifizieren:
In diesem Schritt werden wir die folgende Datei modifizieren:

* src/Mod/Fem/femsolver/elmer/writer.py
* {{FileName|src/Mod/Fem/femsolver/elmer/writer.py}}
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.

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 zwei Methoden für den Export der jeweiligen Gleichung. Kopiere einfach alle von einer bestehenden Gleichung und passe sie an deine Bedürfnisse an.

* {{Incode|_getFlowSolver}}
* {{Incode|_handleFlow}}

Du musst die {{incode|_handleFlow}}-Methode in der {{incode|Writer}}-Klasse registrieren:

{{Code|code=
class Writer(object):
...
def write(self):
...
self._handleFlow()

...

}}

{{Incode|_handleFlow}} kann eine Reihe weiterer detaillierter Methoden kontrollieren. Unsere Fließ-Gleichung benutzt die folgenden detaillierten Methoden:

* {{Incode|_handleFlowConstants}}
* {{Incode|_handleFlowMaterial}}
* {{Incode|_handleFlowInitialVelocity}}
* {{Incode|_handleFlowBndConditions}}
* {{Incode|_handleFlowEquation}}

Nun haben wir den Funktionsteil der neuen Gleichung beendet. Nun werden wir die neue Gleichung an die GUI anbinden.

<span id="Gui_tool_to_create_an_equation"></span>
== GUI Werkzeug zum Erstellen einer Gleichung ==

Wir haben gerade eine neue Gleichungsklasse erstellt. Um sie über die FEM-GUI anzusprechen, müssen wir eine Schaltfläche erstellen und sie mit der neuen Gleichungsklasse verbinden. Hier ist ein Tutorium:
[[Add_Button_to_FEM_Toolbar_Tutorial/de|Tutorium Schaltfläche zur FEM Werkzeugleiste hinzufügen]].


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
{{clear}}
[[Category:FEM{{#translation:}}]]
[[Category:FEM{{#translation:}}]]
[[Category:Developer Documentation{{#translation:}}]]

Latest revision as of 14:53, 7 May 2023

Tutorium
Thema
FEM Gleichung hinzufügen
Niveau
Fortgeschritten
Zeit zum Abschluss
1 Tag
Autoren
JohnWang
FreeCAD-Version
0.19
Beispieldateien
None
Siehe auch
None

Einleitung

In dieser Anleitung werden wir FreeCAD die Gleichung Strömung (Flow) hinzufügen und die Unterstützung für den Löser Elmer implementieren. Bitte stelle sicher, dass du FEM-Modul erweitern gelesen und verstanden hast, bevor du diese Anleitung liest.

Die Aufgabe kann in fünf Teile aufgeteilt werden.

  • Neuer Gleichungstyp. Dieser Schritt muss nur durchgeführt werden, wenn die Gleichung in FreeCAD bisher nicht existiert (im Gegensatz zu einer Gleichung, die bereits in FreeCAD existiert, aber vom Ziellöser nicht unterstützt wird).
  • Neues Gleichungsobjekt. Hinzufügen eines konkreten Dokumentobjekts, das die Elmer-spezifische Gleichung repräsentiert.
  • Löserobjekt erweitern. Dem Elmer-Löserobjekt Unterstützung für die neue Gleichung hinzufügen.
  • Writer-Objekt erweitern. Erweitern des Elmer-Analyseexports zur Unterstützung des neuen Gleichungstyps.
  • GUI-Werkzeug zum Erstellen einer Gleichung. Zugriff auf die neue Gleichungsfunktion über den GUI-Arbeitsbereich.

Neuer Gleichungstyp

In diesem Schritt werden wir die folgende Datei modifizieren:

  • src/Mod/Fem/femsolver/equationbase.py

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 zuerst die neue Gleichung zum equationbase.py-Modul hinzu. Jede Gleichung erfordert zwei Klassen, ein Dokument-Proxy und ein Ansicht-Proxy. Diese zwei Klassen werden später als Basisklassen für die Elmer-spezifischen Gleichungsklassen benutzt. Kopiere sie einfach von einem existierenden Gleichungstyp und passe den Icon-Pfad in getIcon(self) des Ansicht-Proxy an.

class FlowProxy(BaseProxy):
    pass

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

Neues Elmers Gleichungs Objekt

In diesem Schritt werden wir das Dokumentobjekt implementieren. Wir müssen eine neue Datei flow.py hinzufügen unter:

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

und die folgenden Dateien ändern:

  • src/Mod/Fem/ObjectsFem.py
  • src/Mod/Fem/CMakeLists.txt

Beginnen wir dem Hinzufügen der neuen Datei flow.py. Diese Datei kann aus einer bestehenden Gleichung kopiert werden.

Schlüsselwörter

  • Falls die neue Gleichung nur Schlüsselworte für lineare Systeme unterstützt, kopiere das femsolver/elmer/equations/elasticity.py-Modul.
  • Falls die neue Gleichung Schlüsselworte für lineare und nicht-lineare Systeme unterstützt, kopiere das femsolver/elmer/equations/heat.py-Modul.

Die Strömungsgleichung ist eine potenziell nicht-lineare Gleichung. Das bedeutet, dass unsere Arbeit auf heat.py basieren wird.

Dateien bearbeiten

Nach dem Kopieren von heat.py nach flow.py passe letztere Datei an folgenden Stellen an:

  • das Namensargument der create-Modulfunktion,
  • die Basisklassen der Proxy-Klasse,
  • das Type-Attribut der Proxy-Klasse,
  • die ViewProxy-Klassen.
def create(doc, name="'''Flow'''"):
    return femutils.createObject(
        doc, name, Proxy, ViewProxy)

class Proxy(nonlinear.Proxy, equationbase.'''Flow'''Proxy):

    Type = "Fem::EquationElmer'''Flow'''"

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

class ViewProxy(nonlinear.ViewProxy, equationbase.'''Flow'''ViewProxy):
    pass

Dann musst du die über die obj.addProperty(..)-Funktion hinzugefügten Eigenschaften auf die von der Gleichung benötigten anpassen.

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

Schließlich muss man eine makeEquationFlow-Definition in src/Mod/Fem/ObjectsFem.py durch Duplizieren eines verfügbaren Eintrags registrieren.

FreeCAD benutzt make zur Erstellung des Programms. Deshalb müssen wir die neue Moduldatei (flow.py) in src/Mod/Fem/CMakeLists.txt registrieren, wie in FEM Modul erweitern beschriebenen. Die passenden Listen lassen sich leicht finden, indem man nach vorhandenen Gleichungsmoduldateien von Elmer sucht.

Löser Objekt erweitern

In diesem Schritt werden wir die folgenden Dateien modifizieren:

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

Gerade jetzt haben wir FreeCAD darauf aufmerksam gemacht, dass es einen neuen Gleichungstyp gibt, und sogar einen Befehl hinzugefügt, der diese Gleichung dem ausgewählten Löserobjekt hinzufügt. Wir haben auch ein konkretes Gleichungsobjekt für Elmer implementiert. Was jetzt noch zu tun bleibt, ist die Verbindung zwischen Elmer und der Strömungsgleichung herzustellen. Dies muss direkt im Elmer-Lösungsobjekt erfolgen.

Registriere das Modul, in dem wir gerade unser neues Gleichungsobjekt (flow.py) implementiert haben, mit dem Gleichungsspezifizierer aus Schritt 1 ("Flow") in der _EQUATIONS Liste in elmer/solver.py.

from .equations import electrostatic
+from .equations import flow

...

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

Schreiber Objekt erweitern

In diesem Schritt werden wir die folgende Datei modifizieren:

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

Diese Datei enthält die Klasse Writer, die die Analyse in das Elmer-SIF Format exportiert.

Für jede unterstützte Gleichung gibt es zwei Methoden für den Export der jeweiligen Gleichung. Kopiere einfach alle von einer bestehenden Gleichung und passe sie an deine Bedürfnisse an.

  • _getFlowSolver
  • _handleFlow

Du musst die _handleFlow-Methode in der Writer-Klasse registrieren:

class Writer(object):
...
    def write(self):
...
        self._handleFlow()

...

_handleFlow kann eine Reihe weiterer detaillierter Methoden kontrollieren. Unsere Fließ-Gleichung benutzt die folgenden detaillierten Methoden:

  • _handleFlowConstants
  • _handleFlowMaterial
  • _handleFlowInitialVelocity
  • _handleFlowBndConditions
  • _handleFlowEquation

Nun haben wir den Funktionsteil der neuen Gleichung beendet. Nun werden wir die neue Gleichung an die GUI anbinden.

GUI Werkzeug zum Erstellen einer Gleichung

Wir haben gerade eine neue Gleichungsklasse erstellt. Um sie über die FEM-GUI anzusprechen, müssen wir eine Schaltfläche erstellen und sie mit der neuen Gleichungsklasse verbinden. Hier ist ein Tutorium: Tutorium Schaltfläche zur FEM Werkzeugleiste hinzufügen.