Add FEM Equation Tutorial/it: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Created page with "É appena stata creata una nuova classe di equazioni. Per accedervi dalla GUI FEM, si deve creare un pulsante e collegarlo alla nuova classe di equazioni. Si veda questo tutorial: Aggiungere un pulsante alla barra strumenti di FEM.")
 
(40 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{TutorialInfo/it
{{TutorialInfo/it
|Topic=
|Topic=Aggiungere equazioni FEM
|Level=
|Level=
|Time=
|Time=
Line 8: Line 9:
|Files=
|Files=
}}
}}

<span id="Introduction"></span>
== Introduzione ==


In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial [[Extend_FEM_Module/it| Estendere il modulo FEM]].
In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial [[Extend_FEM_Module/it| Estendere il modulo FEM]].


L'operazione può essere suddivisa in cinque parti:
The task can be split into four parts. The first step is to make the FEM workbench aware of a new type of equation. This step must only be done if the equation doesn't exist in FreeCAD jet (as opposed to a equation that is already in FreeCAD but not supported by the target solver). The secound step is to add a concrete document object representing the elmer specific equation. The third step is to add support for the new equation to the solver object of elmer. After that the analysis export of elmer must be extended to support the new equation type.
* '''Nuovo tipo di equazione'''. Questo passaggio deve essere eseguito solo se l'equazione non esiste ancora in FreeCAD (al contrario di un'equazione già presente in FreeCAD ma non supportata dal risolutore di destinazione).
* '''Nuovo oggetto equazione'''. Aggiunta di un oggetto documento concreto che rappresenta l'equazione specifica di Elmer.
* '''Estendere l'oggetto risolutore'''. Aggiungere il supporto per la nuova equazione all'oggetto risolutore di Elmer.
* '''Estendere l'oggetto scrittore'''. Estensione dell'esportazione dell'analisi di Elmer per supportare il nuovo tipo di equazione.
* '''Strumento GUI per creare un'equazione'''. Accedere alla nuova funzione dell'equazione tramite la GUI dell'ambiente.


<span id="New_equation_type"></span>
== New Equation Type ==
== Nuovo tipo di equazione ==


In questo passaggio modificheremo il seguente file:
In this step we are going to modify the following files:
* 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
The equation type is shared among all equation objects of the different solver. Each type has a string specifier (e.g. &quot;Heat&quot;) 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.


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

<pre>class FlowProxy(BaseProxy):
Il tipo di equazione è condiviso tra tutti gli oggetti dell'equazione dei diversi solutori. Ogni tipo ha uno specificatore di stringa (ad esempio "Heat") e un comando dedicato che aggiunge l'equazione al risolutore selezionato. Ciò consente una GUI più semplice in cui si ha un solo pulsante per l'equazione del calore che viene utilizzata per tutti i solutori supportati.

Innanzitutto, aggiungere la nuova equazione al modulo {{Incode|equationbase.py}}. Ogni equazione richiede due classi. Un proxy di documento e un proxy di visualizzazione. Queste due classi verranno successivamente utilizzate come classi base per le classi di equazioni specifiche di Elmer. Basta copiarle ed incollarle da un tipo di equazione esistente e regolare il percorso dell'icona all'interno di {{Incode|getIcon(self)}} del proxy di visualizzazione.

{{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>
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/}}.
== Nuovo oggetto equazione di Elmer ==


In questo passaggio implementeremo l'oggetto documento. Dobbiamo aggiungere un nuovo file {{Incode|flow.py}} in:
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.
<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>


e modificare i seguenti file:
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.
<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>
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}}.
<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}}


Si inizi aggiungendo il nuovo file {{Incode|flow.py}}. Questo file può essere copiato da un'equazione esistente.
== Elmer's Equation Object ==


=== Keywords ===
In this step we are going to modify the following file:
* src/Mod/Fem/CMakeLists.txt
and add the following new file:
* 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}}.


* Se la nuova equazione supporta solo parole chiave per sistemi '''lineari''' copiare il modulo {{Incode|femsolver/elmer/equations/elasticity.py}}.
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.
* Se la nuova equazione supporta parole chiave sia per i sistemi '''lineari''' che '''non lineari''', copiare {{Incode|femsolver/elmer/equations/heat.py}}.
<pre>

def create(doc, name=&quot;Flow&quot;):
L'equazione del flusso in Elmer è un'equazione potenzialmente non lineare. Ciò significa che si baserà il lavoro su {{Incode|heat.py}}.

<span id="Editing_files"></span>
=== Modifica dei file ===

Dopo aver copiato {{Incode|heat.py}} in {{Incode|flow.py}}, modificare {{Incode|flow.py}} in queste posizioni:
* l'argomento del nome della funzione del modulo {{Incode|create}},
* le classi base della classe {{Incode|Proxy}},
* l'attributo {{Incode|Type}} della classe {{Incode|Proxy}},
* le classi {{Incode|ViewProxy}}.

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


Quindi è necessario modificare le proprietà aggiunte tramite la funzione {{Incode|obj.addProperty(..)}} con quelle richieste dall'equazione.
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.


Al momento della stesura di questo tutorial l'equazione del flusso di Elmer non ha proprietà speciali. Vedere l'equazione dell'elasticità di Elmer per un esempio con le proprietà.
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.


Finally one hast to register a '''makeEquationStatcurrent''' definition in {{incode|ObjectsFem.py}} by duplicating an availabel entry.
Infine bisogna registrare una definizione '''makeEquationFlow''' in {{Incode|src/Mod/Fem/ObjectsFem.py}} duplicando una voce disponibile.


FreeCAD utilizza '''make''' per costruire il programma. Quindi si deve registrare il nuovo file del modulo ({{Incode|flow.py}}) in {{Incode|src/Mod/Fem/CMakeLists.txt}} nel modo descritto in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. Gli elenchi adatti possono essere facilmente trovati cercando i file dei moduli di equazioni esistenti di Elmer.


<span id="Extend_Solver_Object"></span>
== Extend Solver Object ==
== Estendere l'oggetto risolutore ==


In questo passaggio modificheremo il seguente file:
In this step we are going to modify the following file:
* 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>
In questo momento è stato informato FreeCAD dell'esistenza di un nuovo tipo di equazione e si è anche aggiunto un comando che aggiunge questa equazione all'oggetto del risolutore selezionato. Si è anche implementato un oggetto equazione concreta per Elmer. Ciò che resta da fare ora è stabilire la connessione tra Elmer e l'equazione del flusso. Questo deve essere fatto direttamente nell'oggetto risolutore Elmer.

Registrare il modulo in cui abbiamo appena implementato il nostro nuovo oggetto equazione ({{Incode|flow.py}}) con l'identificatore dell'equazione del passaggio 1 ("Flow") nell'elenco {{Incode|_EQUATIONS}} 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>
== Estendere l'oggetto writer ==

In questo passaggio modificheremo il seguente file:

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

Questo file contiene la classe {{Incode|Writer}} che esporta l'analisi nel formato Elmer SIF.

Per ogni equazione supportata, esistono due metodi principali che gestiscono l'esportazione della rispettiva equazione. Basta copiarli tutti da un'equazione esistente e adattarli alle tue esigenze.

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

Si deve registrare il metodo {{Incode|_handleFlow}} all'interno della classe {{Incode|Writer}}:

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

...

}}

{{Incode|_handleFlow}} può controllare una serie di altri metodi dettagliati. L'equazione di flusso utilizza i seguenti metodi dettagliati:

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

Ora è terminata la parte funzione della nuova equazione. Successivamente, si collegherà la nuova equazione tramite la GUI.


<span id="Gui_tool_to_create_an_equation"></span>
== Extend Analysis Export ==
== Strumento Gui per creare un'equazione ==


É appena stata creata una nuova classe di equazioni. Per accedervi dalla GUI FEM, si deve creare un pulsante e collegarlo alla nuova classe di equazioni. Si veda questo tutorial: [[Add_Button_to_FEM_Toolbar_Tutorial/it|Aggiungere un pulsante alla barra strumenti di FEM]].
In this step we are going to modify the following file:
* 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.


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
* _getFlowSolver
* _handleFlowConstants
* _handleFlowMaterial
* _handleFlowInitialVelocity
* _handleFlowBndConditions
* _handleFlowEquation
{{clear}}
[[Category:FEM{{#translation:}}]]
[[Category:FEM{{#translation:}}]]
[[Category:Developer Documentation{{#translation:}}]]

Latest revision as of 14:50, 12 May 2024

Tutorial
Argomento
Aggiungere equazioni FEM
Livello di difficoltà
Tempo di esecuzione
Autori
M42kus
Versione di FreeCAD
Files di esempio
Vedere anche
Nessuno

Introduzione

In questo tutorial aggiungeremo a FreeCAD l'equazione di flusso e implementeremo il supporto per il risolutore elmer. Prima di leggere questo tutorial è necessario aver letto e compreso il tutorial Estendere il modulo FEM.

L'operazione può essere suddivisa in cinque parti:

  • Nuovo tipo di equazione. Questo passaggio deve essere eseguito solo se l'equazione non esiste ancora in FreeCAD (al contrario di un'equazione già presente in FreeCAD ma non supportata dal risolutore di destinazione).
  • Nuovo oggetto equazione. Aggiunta di un oggetto documento concreto che rappresenta l'equazione specifica di Elmer.
  • Estendere l'oggetto risolutore. Aggiungere il supporto per la nuova equazione all'oggetto risolutore di Elmer.
  • Estendere l'oggetto scrittore. Estensione dell'esportazione dell'analisi di Elmer per supportare il nuovo tipo di equazione.
  • Strumento GUI per creare un'equazione. Accedere alla nuova funzione dell'equazione tramite la GUI dell'ambiente.

Nuovo tipo di equazione

In questo passaggio modificheremo il seguente file:

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

Il tipo di equazione è condiviso tra tutti gli oggetti dell'equazione dei diversi solutori. Ogni tipo ha uno specificatore di stringa (ad esempio "Heat") e un comando dedicato che aggiunge l'equazione al risolutore selezionato. Ciò consente una GUI più semplice in cui si ha un solo pulsante per l'equazione del calore che viene utilizzata per tutti i solutori supportati.

Innanzitutto, aggiungere la nuova equazione al modulo equationbase.py. Ogni equazione richiede due classi. Un proxy di documento e un proxy di visualizzazione. Queste due classi verranno successivamente utilizzate come classi base per le classi di equazioni specifiche di Elmer. Basta copiarle ed incollarle da un tipo di equazione esistente e regolare il percorso dell'icona all'interno di getIcon(self) del proxy di visualizzazione.

class FlowProxy(BaseProxy):
    pass

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

Nuovo oggetto equazione di Elmer

In questo passaggio implementeremo l'oggetto documento. Dobbiamo aggiungere un nuovo file flow.py in:

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

e modificare i seguenti file:

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

Si inizi aggiungendo il nuovo file flow.py. Questo file può essere copiato da un'equazione esistente.

Keywords

  • Se la nuova equazione supporta solo parole chiave per sistemi lineari copiare il modulo femsolver/elmer/equations/elasticity.py.
  • Se la nuova equazione supporta parole chiave sia per i sistemi lineari che non lineari, copiare femsolver/elmer/equations/heat.py.

L'equazione del flusso in Elmer è un'equazione potenzialmente non lineare. Ciò significa che si baserà il lavoro su heat.py.

Modifica dei file

Dopo aver copiato heat.py in flow.py, modificare flow.py in queste posizioni:

  • l'argomento del nome della funzione del modulo create,
  • le classi base della classe Proxy,
  • l'attributo Type della classe Proxy,
  • le classi ViewProxy.
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

Quindi è necessario modificare le proprietà aggiunte tramite la funzione obj.addProperty(..) con quelle richieste dall'equazione.

Al momento della stesura di questo tutorial l'equazione del flusso di Elmer non ha proprietà speciali. Vedere l'equazione dell'elasticità di Elmer per un esempio con le proprietà.

Infine bisogna registrare una definizione makeEquationFlow in src/Mod/Fem/ObjectsFem.py duplicando una voce disponibile.

FreeCAD utilizza make per costruire il programma. Quindi si deve registrare il nuovo file del modulo (flow.py) in src/Mod/Fem/CMakeLists.txt nel modo descritto in Extend FEM Module. Gli elenchi adatti possono essere facilmente trovati cercando i file dei moduli di equazioni esistenti di Elmer.

Estendere l'oggetto risolutore

In questo passaggio modificheremo il seguente file:

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

In questo momento è stato informato FreeCAD dell'esistenza di un nuovo tipo di equazione e si è anche aggiunto un comando che aggiunge questa equazione all'oggetto del risolutore selezionato. Si è anche implementato un oggetto equazione concreta per Elmer. Ciò che resta da fare ora è stabilire la connessione tra Elmer e l'equazione del flusso. Questo deve essere fatto direttamente nell'oggetto risolutore Elmer.

Registrare il modulo in cui abbiamo appena implementato il nostro nuovo oggetto equazione (flow.py) con l'identificatore dell'equazione del passaggio 1 ("Flow") nell'elenco _EQUATIONS in elmer/solver.py.

from .equations import electrostatic
+from .equations import flow

...

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

Estendere l'oggetto writer

In questo passaggio modificheremo il seguente file:

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

Questo file contiene la classe Writer che esporta l'analisi nel formato Elmer SIF.

Per ogni equazione supportata, esistono due metodi principali che gestiscono l'esportazione della rispettiva equazione. Basta copiarli tutti da un'equazione esistente e adattarli alle tue esigenze.

  • _getFlowSolver
  • _handleFlow

Si deve registrare il metodo _handleFlow all'interno della classe Writer:

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

...

_handleFlow può controllare una serie di altri metodi dettagliati. L'equazione di flusso utilizza i seguenti metodi dettagliati:

  • _handleFlowConstants
  • _handleFlowMaterial
  • _handleFlowInitialVelocity
  • _handleFlowBndConditions
  • _handleFlowEquation

Ora è terminata la parte funzione della nuova equazione. Successivamente, si collegherà la nuova equazione tramite la GUI.

Strumento Gui per creare un'equazione

É appena stata creata una nuova classe di equazioni. Per accedervi dalla GUI FEM, si deve creare un pulsante e collegarlo alla nuova classe di equazioni. Si veda questo tutorial: Aggiungere un pulsante alla barra strumenti di FEM.