Add FEM Equation Tutorial/ro: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
Line 17: Line 17:
În acest pas vom modifica următoarele fișiere:
În acest pas vom modifica următoarele fișiere:
* src/Mod/Fem/femsolver/equationbase.py
* src/Mod/Fem/femsolver/equationbase.py
* src/Mod/Fem/femguiobjects/_CommandFemEquation.py
* src/Mod/Fem/femcommands/commands.py
* 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
Line 31: Line 31:
def getIcon(self):
def getIcon(self):
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>
return &quot;:/icons/FEM_EquationFlow.svg&quot;</pre>

<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Aceste două clase vor fi folosite pentru clasele de ecuații specifice Elmer FEM Solver. În plus față de aceste clase de bază avem o nouă comandă care adaugă o ecuație de flux la obiectul solver selectat. În plus, noul .svg trebuie să fie înregistrat cu <file>icons/fem-equation-flow.svg</file> in Fem.qrc.
Aceste două clase vor fi folosite pentru clasele de ecuații specifice Elmer FEM Solver. În plus față de aceste clase de bază avem o nouă comandă care adaugă o ecuație de flux la obiectul solver selectat. În plus, noul .svg trebuie să fie înregistrat cu <file>icons/fem-equation-flow.svg</file> in Fem.qrc.
</div>
</div>


<div class="mw-translate-fuzzy">
Comanda trebuie adăugată la the_CommandFemEquation module. Trebuie doar să copiați o comandă existentă și să ajustați iconița, textul meniului și butonul de instrucțiuni din GetResources(self) și specificatorul în getSpecifier(self). Va trebui să specificăm din nou mai târziu în tutorial. Nu uitați să înregistrați în josul fișierului modulului utilizând metoda addCommand (...).
Comanda trebuie adăugată la the_CommandFemEquation module. Trebuie doar să copiați o comandă existentă și să ajustați iconița, textul meniului și butonul de instrucțiuni din GetResources(self) și specificatorul în getSpecifier(self). Va trebui să specificăm din nou mai târziu în tutorial. Nu uitați să înregistrați în josul fișierului modulului utilizând metoda addCommand (...).
</div>
<pre>class Flow(_Base):
<pre>
class _EquationFlow(CommandManager):
"The FEM_EquationFlow command definition"


def getSpecifier(self):
def __init__(self):
super(_EquationFlow, self).__init__()
return &quot;Flow&quot;
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>


def GetResources(self):
<div class="mw-translate-fuzzy">
return {
'Pixmap': 'fem-equation-flow',
'MenuText': &quot;Flow Equation&quot;,
'ToolTip': &quot;Add flow equation to selected solver.&quot;
}

Gui.addCommand('FEM_AddEquationFlow', Flow())</pre>
Our newly created command still needs to be made accessable via the GUI of the FEM workbench. To add it to the toolbar search for the following code snippet in Workbench.cpp and add the new command to the rest of the equation commands.
Our newly created command still needs to be made accessable via the GUI of the FEM workbench. To add it to the toolbar search for the following code snippet in Workbench.cpp and add the new command to the rest of the equation commands.
</div>
<pre> Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
<pre>
solve-&gt;setCommand(&quot;Solve&quot;);
Gui::ToolBarItem* solve = new Gui::ToolBarItem(root);
*solve &lt;&lt; &quot;FEM_SolverCalculix&quot;
solve->setCommand("Solve");
&lt;&lt; &quot;FEM_AddSolverElmer&quot;
*solve << "FEM_SolverCalculixCxxtools"
&lt;&lt; &quot;Separator&quot;
<< "FEM_SolverCalculiX"
&lt;&lt; &quot;FEM_AddEquationHeat&quot;
<< "FEM_SolverElmer"
&lt;&lt; &quot;FEM_AddEquationElasticity&quot;
<< "Separator"
+ &lt;&lt; &quot;FEM_AddEquationFlow&quot;
<< "FEM_EquationElasticity"
&lt;&lt; &quot;Separator&quot;
<< "FEM_EquationElectrostatic"
&lt;&lt; &quot;FEM_SolverControl&quot;
+ << "FEM_EquationFlow"
&lt;&lt; &quot;FEM_SolverRun&quot;;</pre>
<< "FEM_EquationFluxsolver"
<< "FEM_EquationElectricforce"
<< "FEM_EquationHeat"
<< "Separator"
<< "FEM_SolverControl"
<< "FEM_SolverRun";
</pre>
<div class="mw-translate-fuzzy">
De asemenea, vom adăuga comanda pentru ecuația fluxului în meniul de rezolvare a atelierului FEM. Pentru aceasta, introduceți în Workbench.cpp următorul fragment de cod.
De asemenea, vom adăuga comanda pentru ecuația fluxului în meniul de rezolvare a atelierului FEM. Pentru aceasta, introduceți în Workbench.cpp următorul fragment de cod.
</div>
<pre> Gui::MenuItem* solve = new Gui::MenuItem;
<pre>
root-&gt;insertItem(item, solve);
Gui::MenuItem* solve = new Gui::MenuItem;
solve-&gt;setCommand(&quot;&amp;Solve&quot;);
root->insertItem(item, solve);
*solve &lt;&lt; &quot;FEM_SolverCalculix&quot;
solve->setCommand("&Solve");
&lt;&lt; &quot;FEM_SolverZ88&quot;
*solve << "FEM_SolverCalculixCxxtools"
&lt;&lt; &quot;FEM_AddSolverElmer&quot;
&lt;&lt; &quot;Separator&quot;
<< "FEM_SolverCalculiX"
<< "FEM_SolverElmer"
&lt;&lt; &quot;FEM_AddEquationHeat&quot;
<< "FEM_SolverZ88"
&lt;&lt; &quot;FEM_AddEquationElasticity&quot;
<< "Separator"
+ &lt;&lt; &quot;FEM_AddEquationFlow&quot;
<< "FEM_EquationElasticity"
&lt;&lt; &quot;Separator&quot;
<< "FEM_EquationElectrostatic"
&lt;&lt; &quot;FEM_SolverControl&quot;
+ << "FEM_EquationFlow"
&lt;&lt; &quot;FEM_SolverRun&quot;;</pre>
<< "FEM_EquationFluxsolver"
<< "FEM_EquationElectricforce"
<< "FEM_EquationHeat"
<< "Separator"
<< "FEM_SolverControl"
<< "FEM_SolverRun";
</pre>




== Obiectul Elmers FEM Solver Equation ==
== Obiectul Elmers FEM Solver Equation ==


<div class="mw-translate-fuzzy">
În acest pas vom modifica următoarele fișiere:
În acest pas vom modifica următoarele fișiere:
</div>
* src/Mod/Fem/CMakeLists.txt
* src/Mod/Fem/CMakeLists.txt
* src/Mod/Fem/App/CMakeLists.txt
și adăugați următorul fișier nou:
și adăugați următorul fișier nou:
* src/Mod/Fem/FemSolver/Elmer/Equations/Flow.py
* src/Mod/Fem/femsolver/elmer/equations/flow.py
<div class="mw-translate-fuzzy">
Să începem cu modulul care implementează obiectul documentului. In poate fi copiat dintr-o ecuație existentă. Dacă noua ecuație acceptă numai cuvintele cheie pentru sistemele liniare FemSolver/Elmer/Equations/Elasticity.py module. În cazul în care acceptă cuvinte cheie neliniare prea copiate FemSolver/Elmer/Equations/Heat.py. Ecuația de curgere este o posibilă ecuație neliniară. Aceasta înseamnă că ne vom baza munca Heat.py.
Să începem cu modulul care implementează obiectul documentului. In poate fi copiat dintr-o ecuație existentă. Dacă noua ecuație acceptă numai cuvintele cheie pentru sistemele liniare FemSolver/Elmer/Equations/Elasticity.py module. În cazul în care acceptă cuvinte cheie neliniare prea copiate FemSolver/Elmer/Equations/Heat.py. Ecuația de curgere este o posibilă ecuație neliniară. Aceasta înseamnă că ne vom baza munca Heat.py.
</div>


<div class="mw-translate-fuzzy">
După copiere Heat.py to Flow.py adjust - argumentul de nume al funcției de creare a modulului, - atributul Type al clasei Proxy, - - clasele de bază ale proxy - ului și ale ViewProxy classes, - și proprietățile adăugate prin funcția obj.addProperty(..) de cele necesare ecuației.
După copiere Heat.py to Flow.py adjust - argumentul de nume al funcției de creare a modulului, - atributul Type al clasei Proxy, - - clasele de bază ale proxy - ului și ale ViewProxy classes, - și proprietățile adăugate prin funcția obj.addProperty(..) de cele necesare ecuației.
</div>
<pre>def create(doc, name=&quot;Flow&quot;):
<pre>
return FemMisc.createObject(
def create(doc, name=&quot;Flow&quot;):
return femutils.createObject(
doc, name, Proxy, ViewProxy)
doc, name, Proxy, ViewProxy)



class Proxy(Nonlinear.Proxy, FemEquation.FlowProxy):
class Proxy(nonlinear.Proxy, equationbase.FlowProxy):
Type = &quot;Fem::FemEquationElmerFlow&quot;

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

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



class ViewProxy(Nonlinear.ViewProxy, FemEquation.FlowViewProxy):
class ViewProxy(nonlinear.ViewProxy, equationbase.FlowViewProxy):
pass</pre>
pass
</pre>
<div class="mw-translate-fuzzy">
În momentul în care scrieți acest tutorial Consultați ecuația de elasticitate Elmer FEM Solver pentru un exemplu cu proprietăți.
În momentul în care scrieți acest tutorial Consultați ecuația de elasticitate Elmer FEM Solver pentru un exemplu cu proprietăți.
</div>


<div class="mw-translate-fuzzy">
Nu în ultimul rând, înregistrați noul fișier modul (Flow.py) în ambele fișiere CMakeLists.txt modul descris în [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. Listele potrivite pot fi găsite prin căutarea fișierelor de module de ecuație existente ale lui Elmer FEM Solver.
Nu în ultimul rând, înregistrați noul fișier modul (Flow.py) în ambele fișiere CMakeLists.txt modul descris în [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. Listele potrivite pot fi găsite prin căutarea fișierelor de module de ecuație existente ale lui Elmer FEM Solver.
</div>


== Extinderea Obiectului Solver ==
== Extinderea Obiectului Solver ==


În acest pas vom modifica următorul fișier:
În acest pas vom modifica următorul fișier:
* src/Mod/Fem/femsolver/elmer/Object.py
* src/Mod/Fem/femsolver/elmer/solver.py
<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Pentru moment, FreeCAD a realizat că există un nou tip de ecuație și a adăugat o comandă care adaugă această ecuație obiectului solver selectat. Am implementat, de asemenea, un obiect de ecuații concrete pentru Elmer.Ceea ce trebuie să facem acum pentru a face legătura dintre elmer și ecuația de curgere. Acesta trebuie să se facă direct în obeictul Elmer FEM solver.
Pentru moment, FreeCAD a realizat că există un nou tip de ecuație și a adăugat o comandă care adaugă această ecuație obiectului solver selectat. Am implementat, de asemenea, un obiect de ecuații concrete pentru Elmer.Ceea ce trebuie să facem acum pentru a face legătura dintre elmer și ecuația de curgere. Acesta trebuie să se facă direct în obeictul Elmer FEM solver.
Line 114: Line 153:
Înregistrați modulul în care am introdus noul nostru obiect de ecuații (Flow.py) wcu ecuația specificată din pasul 1(&quot;Flow&quot;) în lista Proxy._EQUATIONS în Elmer/Object.py.
Înregistrați modulul în care am introdus noul nostru obiect de ecuații (Flow.py) wcu ecuația specificată din pasul 1(&quot;Flow&quot;) în lista Proxy._EQUATIONS în Elmer/Object.py.
</div>
</div>
<pre>_EQUATIONS = {
<pre>
_EQUATIONS = {
&quot;Heat&quot;: Equations.Heat,
&quot;Elasticity&quot;: Equations.Elasticity,
&quot;Heat&quot;: heat,
+ &quot;Flow&quot;: Equations.Flow,
&quot;Elasticity&quot;: elasticity,
+ &quot;Flow&quot;: flow,
}</pre>
}
</pre>


== Extensia Analizei Export ==
== Extensia Analizei Export ==
Line 128: Line 169:
</div>
</div>


<div class="mw-translate-fuzzy">
Pentru fiecare ecuație suportată există o serie de metode de manipulare a exportului ecuației respective. Trebuie doar să copiați toate ecuațiile existente și să le ajustați la nevoile dvs. Ecuația fluxului nostru folosește următoarele metode:
Pentru fiecare ecuație suportată există o serie de metode de manipulare a exportului ecuației respective. Trebuie doar să copiați toate ecuațiile existente și să le ajustați la nevoile dvs. Ecuația fluxului nostru folosește următoarele metode:
</div>
* _handleFlow
* _handleFlow
* _getFlowSolver
* _getFlowSolver
* _handleFlowConstants
* _handleFlowConstants
* _handleFlowBndConditions
* _handleFlowInitial
* _handleFlowBodyForces
* _handleFlowMaterial
* _handleFlowMaterial
* _handleFlowInitialVelocity
* _handleFlowBndConditions
* _handleFlowEquation
* _handleFlowEquation



Revision as of 06:49, 28 May 2020

Tutorial
Topic
Level
Time to complete
Authors
M42kus
FreeCAD version
Example files
See also
None

În acest tutorial vom adăuga ecuația de flux la FreeCAD și vom implementa suport pentru Elmer FEM Solver. Asigurați-vă că ați citit și ați înțeles Extend FEM Module înainte de a citi acest tutorial.

Sarcina poate fi împărțită în patru părți. Primul pas este de a face bancul de lucru FEM conștient de un nou tip de ecuație. Această etapă ar trebui efectuată numai dacă ecuația nu există în fluxul FreeCAD (spre deosebire de ecuația care există deja în FreeCAD, dar nu este suportată de solverul țintă). Al doilea pas este de a adăuga un obiect tip document concret la ecuația specifică a lui Elmer FEM Solver. Al treilea pas este să adăugăm sprijin pentru noua ecuație obiectului solver al lui Elmer. După ce analiza Elmer trebuie extinsă pentru a susține noul tip de ecuație.

Nou tip de Equation

În acest pas vom modifica următoarele fișiere:

  • 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

Tipul de ecuație este împărțit între toate obiectele de ecuații ale solverului diferit. Fiecare tip are un șir specificat(e.g. "Heat") și o comandă dedicată care adaugă ecuația la solverul selectat. Acest lucru permite o simplă interfață grafică în care avem doar un buton pentru ecuația căldurii, care este folosit pentru toți solverii suportați.

Mai întâi adăugați noua ecuație la modulul EquationBase. Fiecare ecuație necesită două clase. Un document proxy și vizualizare proxy. Doar faceți copy/paste dintr-un tip existent de ecuație și ajustați calea iconiței din interiorul getIcon(self) a proxy-ului de vizualizare.

class FlowProxy(BaseProxy):
    pass

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

Aceste două clase vor fi folosite pentru clasele de ecuații specifice Elmer FEM Solver. În plus față de aceste clase de bază avem o nouă comandă care adaugă o ecuație de flux la obiectul solver selectat. În plus, noul .svg trebuie să fie înregistrat cu <file>icons/fem-equation-flow.svg</file> in Fem.qrc.

Comanda trebuie adăugată la the_CommandFemEquation module. Trebuie doar să copiați o comandă existentă și să ajustați iconița, textul meniului și butonul de instrucțiuni din GetResources(self) și specificatorul în getSpecifier(self). Va trebui să specificăm din nou mai târziu în tutorial. Nu uitați să înregistrați în josul fișierului modulului utilizând metoda addCommand (...).

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()
)


Our newly created command still needs to be made accessable via the GUI of the FEM workbench. To add it to the toolbar search for the following code snippet in Workbench.cpp and add the new command to the rest of the equation commands.

 
     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";

De asemenea, vom adăuga comanda pentru ecuația fluxului în meniul de rezolvare a atelierului FEM. Pentru aceasta, introduceți în Workbench.cpp următorul fragment de cod.

 
    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";


Obiectul Elmers FEM Solver Equation

În acest pas vom modifica următoarele fișiere:

  • src/Mod/Fem/CMakeLists.txt

și adăugați următorul fișier nou:

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

Să începem cu modulul care implementează obiectul documentului. In poate fi copiat dintr-o ecuație existentă. Dacă noua ecuație acceptă numai cuvintele cheie pentru sistemele liniare FemSolver/Elmer/Equations/Elasticity.py module. În cazul în care acceptă cuvinte cheie neliniare prea copiate FemSolver/Elmer/Equations/Heat.py. Ecuația de curgere este o posibilă ecuație neliniară. Aceasta înseamnă că ne vom baza munca Heat.py.

După copiere Heat.py to Flow.py adjust - argumentul de nume al funcției de creare a modulului, - atributul Type al clasei Proxy, - - clasele de bază ale proxy - ului și ale ViewProxy classes, - și proprietățile adăugate prin funcția obj.addProperty(..) de cele necesare ecuației.

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

În momentul în care scrieți acest tutorial Consultați ecuația de elasticitate Elmer FEM Solver pentru un exemplu cu proprietăți.

Nu în ultimul rând, înregistrați noul fișier modul (Flow.py) în ambele fișiere CMakeLists.txt modul descris în Extend FEM Module. Listele potrivite pot fi găsite prin căutarea fișierelor de module de ecuație existente ale lui Elmer FEM Solver.

Extinderea Obiectului Solver

În acest pas vom modifica următorul fișier:

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

Pentru moment, FreeCAD a realizat că există un nou tip de ecuație și a adăugat o comandă care adaugă această ecuație obiectului solver selectat. Am implementat, de asemenea, un obiect de ecuații concrete pentru Elmer.Ceea ce trebuie să facem acum pentru a face legătura dintre elmer și ecuația de curgere. Acesta trebuie să se facă direct în obeictul Elmer FEM solver.

Înregistrați modulul în care am introdus noul nostru obiect de ecuații (Flow.py) wcu ecuația specificată din pasul 1("Flow") în lista Proxy._EQUATIONS în Elmer/Object.py.

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

Extensia Analizei Export

În acest pas vom modifica următorul fișier:

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

Aceasta este cea mai pretențioasă parte a implementării unei noi ecuații. Acest fișier conține o clasă Writer care exportă analiza în format Elmer FEM Solver sif.

Pentru fiecare ecuație suportată există o serie de metode de manipulare a exportului ecuației respective. Trebuie doar să copiați toate ecuațiile existente și să le ajustați la nevoile dvs. Ecuația fluxului nostru folosește următoarele metode:

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