Add FEM Equation Tutorial/fr: Difference between revisions

From FreeCAD Documentation
No edit summary
(Updating to match new version of source page)
Line 1: Line 1:
<languages/>
<languages/>

<div class="mw-translate-fuzzy">
{{TutorialInfo/fr
{{TutorialInfo/fr
|Topic= Ajouter des équations FEM
|Topic= Ajouter des équations FEM
Line 8: Line 10:
|Files=
|Files=
}}
}}
</div>

== Introduction ==


<div class="mw-translate-fuzzy">
Dans ce tutoriel, nous allons ajouter l'équation de flux à FreeCAD et implémenter le support pour le solveur Elmer. Assurez-vous d'avoir lu et compris [[Extend_FEM_Module/fr|Module d'extension FEM]] avant de lire ce tutoriel.
Dans ce tutoriel, nous allons ajouter l'équation de flux à FreeCAD et implémenter le support pour le solveur Elmer. Assurez-vous d'avoir lu et compris [[Extend_FEM_Module/fr|Module d'extension FEM]] avant de lire ce tutoriel.
</div>


<div class="mw-translate-fuzzy">
La tâche peut être divisée en quatre parties:
La tâche peut être divisée en quatre parties:
* La première étape consiste à informer l'atelier de travail FEM d'un nouveau type d'équation. Cette étape ne doit être effectuée que si l'équation n'existe pas encore dans FreeCAD (par opposition à une équation qui est déjà dans FreeCAD mais qui n'est pas prise en charge par le solveur cible).
* La première étape consiste à informer l'atelier de travail FEM d'un nouveau type d'équation. Cette étape ne doit être effectuée que si l'équation n'existe pas encore dans FreeCAD (par opposition à une équation qui est déjà dans FreeCAD mais qui n'est pas prise en charge par le solveur cible).
Line 16: Line 24:
* La troisième étape consiste à ajouter la prise en compte de la nouvelle équation dans le solveur d'Elmer.
* La troisième étape consiste à ajouter la prise en compte de la nouvelle équation dans le solveur d'Elmer.
* Après cela, l'exportation d'analyse sous Elmer doit être étendue pour prendre en charge le nouveau type d'équation.
* Après cela, l'exportation d'analyse sous Elmer doit être étendue pour prendre en charge le nouveau type d'équation.
</div>


<div class="mw-translate-fuzzy">
== Ajout d'un nouveau type d'équation ==
== Ajout d'un nouveau type d'équation ==
</div>


In this step we are going to modify the following file:
Dans cette étape, nous allons modifier les fichiers suivants:
* 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
Le type d'équation est partagé par tous les objets d'équation des différents solveurs. Chaque type a un spécificateur de chaîne (par exemple &quot;Heat&quot;) et une commande dédiée qui ajoute l'équation au solveur sélectionné. Cela permet une interface graphique plus simple dans laquelle nous n’avons qu’un bouton pour l’équation de la chaleur utilisée par tous les solveurs supportés.


* {{FileName|src/Mod/Fem/femsolver/equationbase.py}}
Ajoutez d’abord la nouvelle équation au module {{incode|equationbase.py}}. Chaque équation nécessite deux classes. Un proxy document et un proxy vue. Copiez-les simplement à partir d'un type d'équation existant et ajustez le chemin de l'icône à l'intérieur de getIcon(self) du proxy vue.

<pre>class FlowProxy(BaseProxy):
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. Those two classes will later be used as base classes for the Elmer specific equation classes. Just copy-paste them from an existing equation type and adjust the icon path inside {{Incode|getIcon(self)}} of the view proxy.

{{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"
}}


<div class="mw-translate-fuzzy">
Ces deux classes seront ensuite utilisées comme classes de base pour les classes d'équations spécifiques d'Elmer. En plus de ces classes de base, nous devons créer une nouvelle classe de commandes qui ajoute une équation de flux à l'objet solveur sélectionné. De plus, la nouvelle image .svg doit être enregistrée pour le bouton GUI avec {{incode|<file>icons/FEM_EquationFlow.svg</file>}} dans {{incode|Fem.qrc}} (dans {{incode|/Gui/Resources/}}). Le fichier .svg associé doit être placé dans {{incode|/Gui/Resources/icons/}}.
== L'objet équation d'Elmer ==
</div>


<div class="mw-translate-fuzzy">
Ensuite, la commande/l'équation doit être ajoutée au module {{incode|femcommands/commands.py}}. Copiez simplement une commande existante et ajustez l'icône, le texte du menu et l'info-bulle dans __init __ (auto). '''N'oubliez pas''' d'enregistrer la commande au bas du fichier de module en utilisant la méthode addCommand(...). Veuillez consulter la discussion sur le forum à https://forum.freecadweb.org/viewtopic.php?f=18&t=46693&start=10#p402004 si des icônes sont impliquées.
Dans cette étape, nous allons modifier le fichier suivant:
<pre>
</div>
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>


<div class="mw-translate-fuzzy">
et ajoutez le nouveau fichier suivant:
Notre commande nouvellement créée doit toujours être accessible via l'interface graphique de l'atelier de travail FEM. Pour l'ajouter à la barre d'outils, recherchez le bout de code suivant dans {{incode|/Gui/Workbench.cpp}} et ajoutez la nouvelle commande au reste des commandes d'équation.
<pre>
</div>
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>
Nous allons également ajouter la commande d’équation de flux au menu de résolution de l'atelier FEM. Pour ce faire, insérez notre équation dans l'extrait de code suivant dans {{incode|Workbench.cpp}}.
<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}}


<div class="mw-translate-fuzzy">
== L'objet équation d'Elmer ==

Dans cette étape, nous allons modifier le fichier suivant:
* src/Mod/Fem/CMakeLists.txt
et ajoutez le nouveau fichier suivant:
* src/Mod/Fem/femsolver/elmer/equations/flow.py
Commençons par le module qui implémente l'objet document. Il peut être copié à partir d'une équation existante.
Commençons par le module qui implémente l'objet document. Il peut être copié à partir d'une équation existante.
* Si la nouvelle équation ne prend en charge que les mots-clés des systèmes '''linéaires''', copiez le module {{incode|femsolver/elmer/equations/elasticity.py}}.
* Si la nouvelle équation ne prend en charge que les mots-clés des systèmes '''linéaires''', copiez le module {{incode|femsolver/elmer/equations/elasticity.py}}.
* S'il prend également en charge les mots-clés '''non linéaires''', copiez {{incode|femsolver/elmer/equations/heat.py}}.
* S'il prend également en charge les mots-clés '''non linéaires''', copiez {{incode|femsolver/elmer/equations/heat.py}}.
L'équation de l'écoulement dans Elmer est une équation potentiellement non linéaire. Cela signifie que nous allons focaliser notre travail sur {{incode|heat.py}}.
L'équation de l'écoulement dans Elmer est une équation potentiellement non linéaire. Cela signifie que nous allons focaliser notre travail sur {{incode|heat.py}}.
</div>

=== Keywords ===

* If the new equation only supports keywords for '''linear''' systems copy the {{Incode|femsolver/elmer/equations/elasticity.py}} module.
* If the new equation supports keywords for both '''linear''' and '''non-linear''' systems, 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}}.

=== Editing files ===


<div class="mw-translate-fuzzy">
Après avoir copié {{incode|heat.py}} dans {{incode|flow.py}}, ajustez
Après avoir copié {{incode|heat.py}} dans {{incode|flow.py}}, ajustez
* l’argument name de la fonction create module,
* l’argument name de la fonction create module,
Line 111: Line 86:
* les classes de base des classes {{incode|Proxy}} et {{incode|ViewProxy}}
* les classes de base des classes {{incode|Proxy}} et {{incode|ViewProxy}}
* ainsi que les propriétés ajoutées via la fonction {{incode|obj.addProperty(..)}} à ceux requis par l'équation.
* ainsi que les propriétés ajoutées via la fonction {{incode|obj.addProperty(..)}} à ceux requis par l'équation.
<pre>
</div>

def create(doc, name=&quot;Flow&quot;):
{{Code|code=
def create(doc, name="'''Flow'''"):
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 125: Line 101:
obj.Priority = 10
obj.Priority = 10


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

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

Then you need to change the properties added via the {{Incode|obj.addProperty(..)}} function to those needed by the equation.


Au moment de la rédaction de ce tutoriel, l'équation de flux Elmer n'a aucunes propriétés particulières. Voir l'équation d'élasticité d'Elmer pour un exemple avec des propriétés.
Au moment de la rédaction de ce tutoriel, l'équation de flux Elmer n'a aucunes propriétés particulières. Voir l'équation d'élasticité d'Elmer pour un exemple avec des propriétés.


<div class="mw-translate-fuzzy">
Enfin et surtout, enregistrez le nouveau fichier de module ({{incode|flow.py}}) dans les deux fichiers {{incode|src/Mod/Fem/CMakeLists.txt}} comme décrit dans [https://www.freecadweb.org/wiki/Extend_FEM_Module/fr Module d'extension FEM]. Les listes appropriées peuvent être facilement trouvées en recherchant les fichiers de modules d’équations existants d’Elmer.

Enfin, il faut enregistrer une définition de '''makeEquationStatcurrent''' dans {{incode|ObjectsFem.py}} en dupliquant une entrée disponible.
Enfin, il faut enregistrer une définition de '''makeEquationStatcurrent''' dans {{incode|ObjectsFem.py}} en dupliquant une entrée disponible.
</div>


<div class="mw-translate-fuzzy">
Enfin et surtout, enregistrez le nouveau fichier de module ({{incode|flow.py}}) dans les deux fichiers {{incode|src/Mod/Fem/CMakeLists.txt}} comme décrit dans [https://www.freecadweb.org/wiki/Extend_FEM_Module/fr Module d'extension FEM]. Les listes appropriées peuvent être facilement trouvées en recherchant les fichiers de modules d’équations existants d’Elmer.
</div>


== Extension de l'objet du solveur ==
== Extension de l'objet du solveur ==


Dans cette étape, nous allons modifier le fichier suivant:
Dans cette étape, nous allons modifier le fichier suivant:

* src/Mod/Fem/femsolver/elmer/solver.py
* {{FileName|src/Mod/Fem/femsolver/elmer/solver.py}}

<div class="mw-translate-fuzzy">
À l'heure actuelle, nous avons informé FreeCAD qu'il existe un nouveau type d'équation et nous avons même ajouté une commande qui ajoute cette équation à l'objet solveur sélectionné. Nous avons également implémenté un objet d'équation concret pour Elmer. Que reste-t-il à faire maintenant pour faire le lien entre Elmer et l'équation de débit. Cela doit être fait directement dans l'objet solveur Elmer.
À l'heure actuelle, nous avons informé FreeCAD qu'il existe un nouveau type d'équation et nous avons même ajouté une commande qui ajoute cette équation à l'objet solveur sélectionné. Nous avons également implémenté un objet d'équation concret pour Elmer. Que reste-t-il à faire maintenant pour faire le lien entre Elmer et l'équation de débit. Cela doit être fait directement dans l'objet solveur Elmer.
</div>


<div class="mw-translate-fuzzy">
Enregistrez le module dans lequel nous venons d'implémenter notre nouvel objet équation ({{incode|flow.py}}) avec le spécificateur d'équation de l'étape 1 (&quot;Flow&quot;) dans la liste {{incode|_EQUATIONS}} dans {{incode|elmer/solver.py}}.
Enregistrez le module dans lequel nous venons d'implémenter notre nouvel objet équation ({{incode|flow.py}}) avec le spécificateur d'équation de l'étape 1 (&quot;Flow&quot;) dans la liste {{incode|_EQUATIONS}} dans {{incode|elmer/solver.py}}.
<pre>
</div>

{{Code|code=
from .equations import electrostatic
from .equations import electrostatic
+from .equations import flow
+from .equations import flow
Line 151: Line 138:


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


<div class="mw-translate-fuzzy">
== Extension de l'analyse à l'export ==
== Extension de l'analyse à l'export ==
</div>


Dans cette étape, nous allons modifier le fichier suivant:
Dans cette étape, nous allons modifier le fichier suivant:

* src/Mod/Fem/femsolver/elmer/writer.py
* {{FileName|src/Mod/Fem/femsolver/elmer/writer.py}}

<div class="mw-translate-fuzzy">
C'est la partie la plus exigeante de la mise en œuvre d'une nouvelle équation. Ce fichier contient la classe {{incode|Writer}} qui exporte l'analyse au format sif d'Elmer.
C'est la partie la plus exigeante de la mise en œuvre d'une nouvelle équation. Ce fichier contient la classe {{incode|Writer}} qui exporte l'analyse au format sif d'Elmer.
</div>


<div class="mw-translate-fuzzy">
Pour chaque équation prise en charge, il existe une série de méthodes gérant l'exportation de l'équation respective. Copiez-les simplement à partir d'une équation existante et ajustez-les à vos besoins. Notre équation de flux utilise les méthodes suivantes:
Pour chaque équation prise en charge, il existe une série de méthodes gérant l'exportation de l'équation respective. Copiez-les simplement à partir d'une équation existante et ajustez-les à vos besoins. Notre équation de flux utilise les méthodes suivantes:
</div>
* _handleFlow

* _getFlowSolver
* {{Incode|_getFlowSolver}}
* _handleFlowConstants
* {{Incode|_handleFlow}}
* _handleFlowMaterial

* _handleFlowInitialVelocity
You need to register the {{Incode|_handleFlow}} method inside the {{Incode|Writer}} class:
* _handleFlowBndConditions

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

...

}}

{{Incode|_handleFlow}} can control a series of other detailed methods. Our flow equation uses the following detailed methods:

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

We now finished the function part of the new equation. Next we'll connect the new equation through the GUI.

== Gui tool to create an equation ==

We have just created a new equation class. To access it from the FEM GUI, we need to create a button and link it to the new equation class. Here is a tutorial: [[Add_button_to_FEM_toolbar_tutorial|Add button to FEM toolbar tutorial]].

[[Category:FEM{{#translation:}}]]
[[Category:FEM{{#translation:}}]]
[[Category:Developer Documentation{{#translation:}}]]

Revision as of 19:01, 20 August 2021

Tutoriel
Thème
Ajouter des équations FEM
Niveau
Temps d'exécution estimé
Auteurs
M42kus
Version de FreeCAD
Fichiers exemples
Voir aussi
None

Introduction

Dans ce tutoriel, nous allons ajouter l'équation de flux à FreeCAD et implémenter le support pour le solveur Elmer. Assurez-vous d'avoir lu et compris Module d'extension FEM avant de lire ce tutoriel.

La tâche peut être divisée en quatre parties:

  • La première étape consiste à informer l'atelier de travail FEM d'un nouveau type d'équation. Cette étape ne doit être effectuée que si l'équation n'existe pas encore dans FreeCAD (par opposition à une équation qui est déjà dans FreeCAD mais qui n'est pas prise en charge par le solveur cible).
  • La deuxième étape consiste à ajouter un objet document représentant l’équation spécifique d’Elmer.
  • La troisième étape consiste à ajouter la prise en compte de la nouvelle équation dans le solveur d'Elmer.
  • Après cela, l'exportation d'analyse sous Elmer doit être étendue pour prendre en charge le nouveau type d'équation.

Ajout d'un nouveau type d'équation

In this step we are going to modify the following file:

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

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 equationbase.py module. Each equation requires two classes. A document proxy and a view proxy. Those two classes will later be used as base classes for the Elmer specific equation classes. Just copy-paste them from an existing equation type and adjust the icon path inside getIcon(self) of the view proxy.

class FlowProxy(BaseProxy):
    pass

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

L'objet équation d'Elmer

Dans cette étape, nous allons modifier le fichier suivant:

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

et ajoutez le nouveau fichier suivant:

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

Commençons par le module qui implémente l'objet document. Il peut être copié à partir d'une équation existante.

  • Si la nouvelle équation ne prend en charge que les mots-clés des systèmes linéaires, copiez le module femsolver/elmer/equations/elasticity.py.
  • S'il prend également en charge les mots-clés non linéaires, copiez femsolver/elmer/equations/heat.py.

L'équation de l'écoulement dans Elmer est une équation potentiellement non linéaire. Cela signifie que nous allons focaliser notre travail sur heat.py.

Keywords

  • If the new equation only supports keywords for linear systems copy the femsolver/elmer/equations/elasticity.py module.
  • If the new equation supports keywords for both linear and non-linear systems, copy 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 heat.py.

Editing files

Après avoir copié heat.py dans flow.py, ajustez

  • l’argument name de la fonction create module,
  • l’attribut Type de la classe Proxy
  • les classes de base des classes Proxy et ViewProxy
  • ainsi que les propriétés ajoutées via la fonction obj.addProperty(..) à ceux requis par l'équation.
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

Then you need to change the properties added via the obj.addProperty(..) function to those needed by the equation.

Au moment de la rédaction de ce tutoriel, l'équation de flux Elmer n'a aucunes propriétés particulières. Voir l'équation d'élasticité d'Elmer pour un exemple avec des propriétés.

Enfin, il faut enregistrer une définition de makeEquationStatcurrent dans ObjectsFem.py en dupliquant une entrée disponible.

Enfin et surtout, enregistrez le nouveau fichier de module (flow.py) dans les deux fichiers src/Mod/Fem/CMakeLists.txt comme décrit dans Module d'extension FEM. Les listes appropriées peuvent être facilement trouvées en recherchant les fichiers de modules d’équations existants d’Elmer.

Extension de l'objet du solveur

Dans cette étape, nous allons modifier le fichier suivant:

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

À l'heure actuelle, nous avons informé FreeCAD qu'il existe un nouveau type d'équation et nous avons même ajouté une commande qui ajoute cette équation à l'objet solveur sélectionné. Nous avons également implémenté un objet d'équation concret pour Elmer. Que reste-t-il à faire maintenant pour faire le lien entre Elmer et l'équation de débit. Cela doit être fait directement dans l'objet solveur Elmer.

Enregistrez le module dans lequel nous venons d'implémenter notre nouvel objet équation (flow.py) avec le spécificateur d'équation de l'étape 1 ("Flow") dans la liste _EQUATIONS dans elmer/solver.py.

from .equations import electrostatic
+from .equations import flow

...

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

Extension de l'analyse à l'export

Dans cette étape, nous allons modifier le fichier suivant:

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

C'est la partie la plus exigeante de la mise en œuvre d'une nouvelle équation. Ce fichier contient la classe Writer qui exporte l'analyse au format sif d'Elmer.

Pour chaque équation prise en charge, il existe une série de méthodes gérant l'exportation de l'équation respective. Copiez-les simplement à partir d'une équation existante et ajustez-les à vos besoins. Notre équation de flux utilise les méthodes suivantes:

  • _getFlowSolver
  • _handleFlow

You need to register the _handleFlow method inside the Writer class:

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

...

_handleFlow can control a series of other detailed methods. Our flow equation uses the following detailed methods:

  • _handleFlowConstants
  • _handleFlowMaterial
  • _handleFlowInitialVelocity
  • _handleFlowBndConditions
  • _handleFlowEquation

We now finished the function part of the new equation. Next we'll connect the new equation through the GUI.

Gui tool to create an equation

We have just created a new equation class. To access it from the FEM GUI, we need to create a button and link it to the new equation class. Here is a tutorial: Add button to FEM toolbar tutorial.