1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% File      : mfront.tex
3% Author    : th202608@pleiades068.intra.cea.fr
4% Date      : 15 oct. 2012
5% Directory : /home/th202608/codes/tfel/tests/Broyden/
6%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7
8% \documentclass[rectoverso,pleiades,pstricks,leqno,anti]{note_technique_2010}
9\documentclass[rectoverso,pleiades,pstricks,leqno,anti,projet]{note_technique_2010}
10
11% \usepackage{draftcopy}
12% \draftcopySetGrey{0.8}
13% \draftcopyName{Version provisoire}{80}
14
15\usepackage[dvips]{graphicx}
16\usepackage[dvips,breaklinks]{hyperref}
17
18\usepackage{mathematiques}
19\usepackage{mecanique}
20\usepackage{couleurs}
21\usepackage{presentation}
22
23\usepackage{pst-plot}
24\usepackage{array}
25\usepackage{subfigure}
26\usepackage{relsize}
27\usepackage{multind}
28
29% one column index
30\makeatletter
31\def\printindex#1#2{\section*{#2}
32\addcontentsline{toc}{section}{#2}
33\@input{#1.ind}}
34\makeatother
35
36\usepackage[frenchb]{babel}
37
38\newcommand{\pleiades}{\texttt{pleiades}}
39\newcommand{\TFEL}{\texttt{tfel}}
40\newcommand{\mfront}{\texttt{mfront}}
41\newcommand{\mtest}{\texttt{mtest}}
42\newcommand{\licos}{\texttt{licos}}
43\newcommand{\cyrano}{\texttt{cyrano}}
44\newcommand{\galileo}{\texttt{galileo}}
45\newcommand{\castem}{\texttt{Cast3M}}
46\newcommand{\gibiane}{\texttt{gibiane}}
47\newcommand{\tmfft}{\texttt{TMFFT}}
48\newcommand{\aster}{\href{http://www.code-aster.org/}{\texttt{Aster}}}
49\newcommand{\pycastem}{\texttt{pyCast3M}}
50\newcommand{\umat}{\texttt{umat}}
51\newcommand{\sirius}{\texttt{sirius}}
52\newcommand{\fortran}{\texttt{fortran}}
53
54\newcommand{\cmake}{\href{http://www.cmake.org/}{\texttt{cmake}}}
55\newcommand{\cppunit}{\texttt{CppUnit}}
56\newcommand{\autotools}{\href{http://fr.wikipedia.org/wiki/Autotools}{\texttt{autotools}}}
57\newcommand{\python}{\href{http://python.org}{\texttt{python}}}
58\newcommand{\gnuplot}{\href{http://www.gnuplot.info}{\texttt{gnuplot}}}
59\newcommand{\latex}{\href{http://www.latex-project.org}{\LaTeX2e{}}}
60\newcommand{\make}{\href{http://www.gnu.org/software/make/}{\texttt{make}}}
61\newcommand{\doxygen}{\href{http://www.stack.nl/~dimitri/doxygen/}{\texttt{doxygen}}}
62\newcommand{\valgrind}{\href{http://www.valgrind.org/}{\texttt{valgrind}}}
63
64\newcommand{\mkey}[1]{\index{mkeys}{#1@\symbol{64}#1}{\texttt{@#1}}}
65\newcommand{\mkeyb}[2]{\index{mkeys}{#1@\symbol{64}#1}{\texttt{@#2}}}
66
67\newcommand{\tclass}[1]{\index{tclass}{#1}{\texttt{#1}}}
68\newcommand{\tclassb}[2]{\index{tclass}{#1}{\texttt{#2}}}
69\newcommand{\tfunc}[1]{\index{tclass}{#1}{\texttt{#1}}}
70\newcommand{\tfuncb}[2]{\index{tclass}{#1}{\texttt{#2}}}
71\newcommand{\tmethod}[2]{\index{tclass}{#1!#2}{\texttt{#2}}}
72\newcommand{\tmethodb}[3]{\index{tclass}{#1!#2}{\texttt{#3}}}
73\newcommand{\toperator}[2]{\index{tclass}{#1!operator::#2}{\texttt{#2}}}
74\newcommand{\toperatorb}[3]{\index{tclass}{#1!operator::#2}{\texttt{#3}}}
75\newcommand{\ttypedef}[2]{\index{tclass}{#1!#2}{\texttt{#2}}}
76\newcommand{\ttypedefb}[3]{\index{tclass}{#1!#2}{\texttt{#3}}}
77
78\newcommand{\env}[1]{\index{env}{#1}{\texttt{#1}}}
79\newcommand{\envb}[2]{\index{env}{#1}{\texttt{#2}}}
80
81\newcommand{\moption}[1]{\texttt{-{}-#1}}
82
83\newcommand{\bigO}[1]{\ensuremath{\mathop{}\mathopen{}O\mathopen{}\left(#1\right)}}
84\def\Hat{\mkern-3mu\text{\textasciicircum}}
85
86%c from texinfo.tex
87\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
88
89%c C plus plus
90\def\cpp{%
91\ifmonospace%
92    C++%
93\else%
94    C\kern.1em\raise.20ex\hbox{\smaller{++}}%
95\fi%
96\spacefactor1000 }
97
98\newcommand{\varcpp}[1]{\texttt{#1}}
99
100\newcommand{\sigmaH}{\ensuremath{\sigma_{H}}}
101
102\newcommand{\nbzrc}{$NbZrC$}
103\newcommand{\upuc}{$\paren{U,Pu}C$}
104\newcommand{\sic}{$SiC$}
105
106\newcommand{\cea}{CEA}
107\newcommand{\windows}{\href{http://www.microsoft.com/france/windows/default.mspx}{\texttt{Windows}}}
108\newcommand{\unix}{\href{http://www.kernel.org/}{\texttt{unix}}}
109\newcommand{\msys}{\href{http://www.mingw.org/wiki/MSYS}{\texttt{msys}}}
110\newcommand{\cygwin}{\href{http://www.cygwin.com/}{\texttt{cygwin}}}
111\newcommand{\linux}{\href{http://www.kernel.org/}{\texttt{linux}}}
112\newcommand{\debian}{\href{http://www.debian.org/}{\texttt{Debian}}}
113\newcommand{\ubuntu}{\href{http://www.ubuntu.com}{\texttt{Ubuntu}}}
114\newcommand{\redhat}{\href{http://www.redhat.com}{\texttt{Red Hat}}}
115\newcommand{\mandriva}{\href{http://www.mandriva.com}{\texttt{Mandriva}}}
116\newcommand{\excel}{\href{http://www.microsoft.com/france/office/2007/programs/excel/overview.mspx}{\texttt{Microsoft Office Excel}}}
117\newcommand{\nsis}{\href{http://nsis.sourceforge.net/Main_Page}{NSIS}}
118
119\newcommand{\debutpas}[1]{\ensuremath{\left.#1\right|_{t}}}
120\newcommand{\milieupas}[1]{\ensuremath{\left.#1\right|_{t+\theta\, \Delta\, t}}}
121\newcommand{\finpas}[1]{\ensuremath{\left.#1\right|_{t+\Delta\, t}}}
122\newcommand{\demipas}[1]{\ensuremath{\left.#1\right|_{t+\frac{\Delta\, t}{2}}}}
123
124\newcommand{\code}[1]{
125  \psframebox[linecolor=ceaorange]{
126    \begin{minipage}[htbp]{1.0\linewidth}
127      \ttfamily #1
128    \end{minipage}
129  }
130}
131
132\newcommand{\bash}[1]{
133  \begin{center}
134    \begin{minipage}{0.8\linewidth}
135      \footnotesize{}
136      \texttt{\$#1}
137    \end{minipage}
138  \end{center}
139}
140
141\include{Champs}
142
143\resumecea{
144  Cette note constitue la notice de référence de la librairie \TFEL{}.
145
146  La librairie \TFEL{} vise à se doter d'outils, notamment
147  mathématiques, basés sur des paradigmes de programmation
148  avancés. Cette librairie a été découpée en modules, dont les
149  principaux sont {\tt Math}, {\tt Material}, {\tt System} et {\tt
150    Utilities}. Les principales fonctionnalités de ces différents
151  modules sont décrits.
152
153  Nous décrivons ensuite certaines techniques de programmation qui
154  sous-tendent la librairie et permettent d'atteindre des performances
155  élevées.
156
157  La liste des plate-formes et des compilateurs supportés permet de
158  juger de la qualité logicielle de la librairie et de sa portabilité.
159
160  La dernière partie décrit les procédures d'installation de \TFEL{}.
161}
162
163\makeindex{tclass}
164
165\begin{document}
166
167\section{Introduction}
168
169Ce note constitue le guide de référence de la bibliothèque \TFEL{}.
170
171La bibliothèque \TFEL{} vise à se doter d'outils, notamment
172mathématiques, basés sur des paradigmes de programmation avancés, dont
173nous présenterons certains en
174section~\ref{sec:tfel::quelq-techn-de}.
175
176Elle est aujourd'hui intégrée à l'architecture \pleiades{} même si il
177est possible de la distribuer indépendamment, en particulier pour des
178utilisations du générateur de code \mfront{} hors du cadre
179\pleiades{}~\cite{helfer_presentation_2011,darrigo_notice_2012,olagnon_analysis_2013,proix_integration_2013}.
180
181Le langage \cpp{} a été choisi pour sa grande disponibilité, son
182caractère libre et pérenne, son interaction avec les langages
183\texttt{C} et \texttt{fortran}, et son support de tels paradigmes.
184
185\newpage
186\clearpage
187\section{Vue d'ensemble}
188
189Nous décrivons dans cette section le contenu de la bibliothèque. Nous
190commençons par décrire les quelques exécutables fournis par \TFEL{},
191puis nous détaillons les différentes librairies produites.
192
193\subsection{Exécutables}
194
195Actuellement, quatre exécutables sont produits~:
196\begin{enumerate}
197  \item \texttt{tfel-config} qui permet de récupérer des
198  informations sur~:
199  \begin{enumerate}
200    \item le répertoire d'installation de \TFEL{}~;
201    \item les options de compilation (et d'optimisation) que nous
202      conseillons d'utiliser avec le compilateur qui a servi à
203      construire \TFEL{}~;
204    \item les drapeaux d'avertissement à utiliser que nous conseillons
205      d'utiliser avec le compilateur qui a servi à construire
206      \TFEL{}~;
207  \end{enumerate}
208\item \texttt{tfel-doc} est un utilitaire de description de cas test
209  et de génération d'un guide en \LaTeX{}. Il a notamment été utilisé
210  pour décrire les cas tests de la bibliothèque \TFEL{} et de
211  l'application \licos{}~\cite{helfer_cas_2012}~;
212\item le générateur de code \texttt{mfront} qui fait l'objet d'une
213  documentation
214  particulière~\cite{helfer_generateur_2013-1,helfer_generateur_2013}~;
215\item un outil de test élémentaire de lois de comportement mécanique
216  nommé \mtest{}~\cite{helfer_mtest_2014}.
217\end{enumerate}
218
219\subsection{Modules disponibles et librairies produites}
220
221\TFEL{} est un projet complexe séparé en différents modules (packages
222en anglais). Nous en dressons ici la liste accompagnée d'une
223description succincte. Les principaux modules seront chacun décrits
224dans une section spécifique.
225
226\begin{enumerate}
227\item le module {\tt TFEL/Math} est de loin le module le plus
228  important de la librairie. Il contient de nombreuses classes
229  représentant les objets mathématiques usuels et différents
230  algorithmes numériques. La plupart de ces classes et de ces
231  algorithmes sont implantés à l'aide de {\tt template}. Ce module
232  fournit plusieurs librairies~:
233  \begin{enumerate}
234  \item {\tt libTFELMath.so} contient quelques classes de base pour
235    les autres librairies du module~;
236  \item {\tt libTFELMathCubicSpline.so} contient la gestion des
237    erreurs des classes d'interpolation de données par des splines
238    cubiques~;
239  \item {\tt libTFELMathKriging.so} contient certaines spécialisations
240    des classes d'interpolation de données multi-dimensionnelles par
241    des méthodes de krigeage et la gestion d'erreur associée~;
242  \item {\tt libTFELMathParser.so} contient des classes dédiées à
243    l'interprétation de formules mathématiques complexes à partir de
244    chaînes de caractères~;
245  \end{enumerate}
246\item TFELMaterial contient certains classes utilitaires pour
247  l'écriture de propriétés matériau ou loi de comportement mécanique.
248\item le module {\tt TFEL/Exception} contient les bases des classes
249  d'exceptions utilisées dans \TFEL{}. Les sources de ce module sont
250  compilées dans la librairie {\tt libTFELException.so}~;
251\item le module {\tt TFEL/Tests} propose un framework de test
252  similaire à \cppunit{}. Les sources de ce module sont compilées dans
253  la librairie {\tt libTFELTests.so}~;
254\item le module {\tt TFEL/Utilities} contient différentes classes
255  utilitaires. Il fournit la librairie {\tt libTFELUtilities.so}~;
256\item le module {\tt TFEL/System} propose :
257  \begin{enumerate}
258  \item un enrobage \cpp{} de diverses fonctionnalités~:
259    \texttt{POSIX}~\cite{blaess_developpement_2011}~:
260    \begin{enumerate}
261    \item créations et interaction avec des processus~;
262    \item gestion des signaux~;
263    \item créations de répertoires, etc..~;
264    \item traduction des erreurs \texttt{POSIX} en exceptions~;
265    \end{enumerate}
266  \item des facilités d'appels de fonctions définies dans des
267    librairies externes~;
268  \end{enumerate}
269\end{enumerate}
270
271\paragraph{Modules internes} D'autres modules existent qui ont
272essentiellement vocation à être utilisés en interne~:
273\begin{enumerate}
274\item le module {\tt TFEL/Metaprogramming} contient des classes
275  utilitaires simplifiant la \og~méta-programmation à base de
276  template~\fg~\cite{alexandrescu_modern_2000,abrahams_c++_2004}.
277\item le module {\tt TFEL/Typetraits} contient un ensemble de classes
278  permettant de donner de manière non intrusive des informations sur
279  des classes d'objets.
280\item le module {\tt TFEL/FSAlgorithm} contient la réécriture de la
281  plupart des algorithmes de la librairie standard pour des objets
282  dont la taille est (raisonnablement) petite et connue à la
283  compilation. L'idée de ce module est tirée des travaux réalisés pour
284  bâtir la librairie {\tt MTL} (Matrix Template
285  Library)~\cite{siek_matrix_1998}. Son rôle est essentiel
286  pour les performances de la librairie.
287\end{enumerate}
288Ces modules sont constitués de fichiers d'entête uniquement.
289
290Les modules {\tt TFEL/Metaprogramming} et {\tt TFEL/Typetraits}
291permettent de faciliter l'emploi de certaines techniques de
292programmation avancées sur la base du standard C++ de 1998. Elles
293contiennent des parties très ardues et potentiellement les plus
294difficiles à maintenir. Leur documentation a été de ce fait été
295l'objet d'une attention particulière. Nous les avons également
296construites en surveillant les travaux du comité de
297standardisation. Ainsi, leur taille devrait largement diminuer avec le
298portage de \TFEL{} sur le standard de 2011 dont le support par la
299compilateur standard est maintenant quasi-complet.
300
301\newpage
302\clearpage
303\section{Description du module {\tt TFEL/Math}}
304
305Nous décrivons dans cette section les principales fonctionnalités
306proposées par le module {\tt TFEL/Math}.
307
308\subsection{Objets mathématiques}
309
310Dans ce paragraphe, nous détaillons les objets mathématiques qui ont
311été implantés dans le module {\tt TFEL/Math}.
312
313\subsubsection{Quantités physiques}
314
315\begin{table}[htbp]
316  \centering
317  \begin{tabular}{|c|c|c|c|c|c|c|c|}
318    \hline
319    Nom & Masse & Longueur & Temps & Ampère & Température & Candela & Mole \\
320    \hline
321    \hline
322    NoUnit      & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
323    \hline
324    Mass        & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
325    \hline
326    Length      & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\
327    \hline
328    Time        & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\
329    \hline
330    Ampere      & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
331    \hline
332    Temperature & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
333    \hline
334    Kelvin      & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
335    \hline
336    Candela     & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
337    \hline
338    Mole        & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\
339    \hline
340    InvLength           & 0 & -1 & 0 & 0 & 0 & 0 & 0 \\
341     \hline
342    InvTemperature      & 0 & 0 & 0 & 0 & -1 & 0 & 0 \\
343     \hline
344    Frequency           & 0 & 0 & -1 & 0 & 0 & 0 & 0 \\
345     \hline
346    Velocity            & 0 & 1 & -1 & 0 & 0 & 0 & 0 \\
347     \hline
348    Acceleration        & 0 & 1 & -2 & 0 & 0 & 0 & 0 \\
349     \hline
350    Momentum            & 1 & 1 & -1 & 0 & 0 & 0 & 0 \\
351     \hline
352    Force               & 1 & 1 & -2 & 0 & 0 & 0 & 0 \\
353     \hline
354    Newton              & 1 & 1 & -2 & 0 & 0 & 0 & 0 \\
355     \hline
356    Stress              & 1 & -1 & -2 & 0 & 0 & 0 & 0 \\
357     \hline
358    StressRate          & 1 & -1 & -3 & 0 & 0 & 0 & 0 \\
359     \hline
360     Pressure            & 1 & -1 & -2 & 0 & 0 & 0 & 0 \\
361     \hline
362    Energy              & 1 & 2 & -2 & 0 & 0 & 0 & 0 \\
363     \hline
364    EnergyDensity       & 1 & -1 & -2 & 0 & 0 & 0 & 0 \\
365     \hline
366    Density             & 1 & -3 & 0 & 0 & 0 & 0 & 0 \\
367     \hline
368    ThermalConductivity & 1 & 1 & -3 & 0 & -1 & 0 & 0 \\
369     \hline
370     HeatFluxDensity     & 1 & 0 & -3 & 0 & 0 & 0 & 0 \\
371     \hline
372   \end{tabular}
373   \caption{Grandeurs prédéfinies et décomposition suivant les grandeurs
374     de base du système international.}
375  \label{tab:tfel:units}
376\end{table}
377
378La classe \tclass{qt} représente des nombres réels représentant des
379quantités physiques. L'idée d'une telle classe a été discutée à
380plusieurs reprises~\cite{abrahams_c++_2004}, mais nous sommes
381particulièrement inspirés du livre de \nom{Barton} et
382\nom{Nackman}~\cite{barton_engineering_1994}.
383
384Il s'agit d'une classe {\tt template} prenant deux arguments~: une
385classe représentant le type de grandeur représentée et le type
386numérique utilisé.
387
388Les grandeurs usuelles ont été prédéfinies et sont regroupées au
389tableau~\ref{tab:tfel:units} qui donne également leurs décompositions
390suivant les grandeurs de base du système international. Il est
391possible de définir d'autres grandeurs par des puissances rationnelles
392des unités de base à l'aide de la méta-fonction \tclass{GenerateUnit}.
393
394Toutes les opérations mathématiques usuelles ont été définies. Le
395compilateur autorisera toutes les opérations conservant le sens
396physique. Ainsi le produit d'une force par une distance à pour
397résultat une énergie. L'addition d'une masse et d'une température
398n'est pas autorisée.
399
400Ces vérifications sont faites à la compilation et l'utilisation des
401{\tt template} et de l'{\tt inlining} fait que les quantités ainsi
402définies n'ont aucun coût à l'exécution.
403
404Des résultats de type {\tt NoUnit} peuvent être convertis
405automatiquement dans le type numérique sous-jacent. Ils peuvent être
406ainsi utilisés dans toutes les fonctions usuelles (logarithmes,
407exponentielle, etc...).
408
409\paragraph{Note} Les quantités ainsi définies sont aujourd'hui de peu
410d'utilité pratique\footnote{En effet, la plupart des corrélations
411  expérimentales font apparaître des coefficients numériques dont il
412  est difficile de donner l'unité. Il s'agit d'une difficulté pratique
413  que nous allons rapidement illustrer et dont nous donnons une
414  solution acceptable. Cette solution présente certains avantages
415  numériques.
416
417  Par exemple, une loi de \nom{Norton} s'écrit~:
418  \[
419  \dot{p} = A\,\sigmaeq^{E}
420  \]
421  où apparaissent la déformation plastique cumulée \(p\) , la contrainte
422  équivalente \(\sigmaeq\), et deux coefficients \(A\) et \(E\). L'unité
423  du coefficient \(A\) est pour le moins exotique.
424
425  En fait, la loi de \nom{Norton} devrait être écrite ainsi~:
426  \[
427  \dot{p} = \dot{\varepsilon}_{0}\,\paren{\Frac{\sigmaeq}{\sigma_{0}}}^{E}
428  \]
429  où apparaît une contrainte de normalisation \(\sigma_{0}\). Cette
430  forme est {\tt a priori} plus complexe, mais en pratique elle peut
431  s'avérer numériquement beaucoup plus précise et efficace. En effet,
432  dans la première version, on évalue une puissance d'un nombre de
433  l'ordre de \(10^{8}\) alors que dans la seconde, on évalue la
434  puissance d'un nombre proche de l'unité~: les risques de divergence
435  sont bien moindre.
436
437  Cette remarque se généralise assez bien~: si l'utilisation de
438  quantité demande un travail supplémentaire aux développeurs de loi,
439  ce travail peut avoir des avantages numériques.
440}, mais nous
441pouvons espérer que leur usage se répande à terme.
442
443L'introduction des quantités a cependant eu un grand rôle sur la
444conception des classes mathématiques de \TFEL{}. En particulier, nous
445vérifions que toutes les opérations mathématiques sont valides avec
446des conventions très strictes\footnote{Par exemple, il n'est pas
447  possible d'affecter un objet dont le type numérique est en double
448  précision à un objet dont le type numérique est en double
449  précision. De manière générale, il n'est pas possible d'affecter un
450  résultat basé sur un certain type numérique à un résultat sur un
451  type plus petit. La classification des types numériques standard est
452  assuré par une classe nommée \tclass{Promote}}.
453
454\subsubsection{Tenseurs d'ordre $2$ symétriques}
455
456La  classe  \tclass{stensor}   représente  des  tenseurs  d'ordre  $2$
457symétriques.  Il  s'agit  de  la principale  implantation  du  concept
458\tclass{StensorConcept}\footnote{La notion de concept dans \TFEL{} est
459  décrite au paragraphe~\ref{sec:notion-de-concept}}. Ces classes sont
460particulièrement utilisée pour l'implantation des lois de comportement
461mécanique.
462
463Cette classe {\tt template} est paramétrée par~:
464\begin{enumerate}
465\item la dimension d'espace~;
466\item le type numérique utilisé~;
467\item une classe de stockage des valeurs.
468\end{enumerate}
469
470\paragraph{Stockage des valeurs} L'idée d'utiliser différentes classes
471de stockage s'est avérée avoir peu d'intérêt pratique~: seul le
472stockage par défaut, fourni par la classe \tclass{StensorStatic}, est
473utilisée. Cette classe stocke les valeurs du tenseur dans un tableau
474de taille fixe et permet d'y accéder directement.
475
476La classe \tclass{stensor} n'utilisant aucune méthode virtuelle,
477l'utilisation de la classe \tclass{StensorStatic} assure également que
478la taille d'un tenseur symétrique est exactement la taille de son
479tableau de valeur. Il est donc licite de convertir un pointeur de
480taille fixe vers un pointeur de tenseur symétrique, ce qui est très
481utilisé en pratique, par exemple dans la gestion de champs de
482l'architecture \pleiades{}.
483
484\paragraph{Premiers éléments d'optimisation} L'utilisation de la
485classe \tclass{StensorStatic} présente plusieurs
486avantages\footnote{Pour pouvoir bénéficier de ces avantages, les lois
487  de comportement générées par \mfront{} sont implantées par des
488  classes {\tt template} paramétrées par l'hypothèse de modélisation
489  qui fixe la dimension de l'espace. Elles sont instanciées un fois
490  par hypothèse de modélisation supportée.}~:
491\begin{enumerate}
492\item aucune allocation dynamique n'est faite si l'objet est défini
493  sur la pile (les allocations dynamiques sont coûteuses)~;
494\item les accès aux valeurs sur la pile permettent au compilateur
495  d'effectuer des optimisations très poussées du code~;
496\item le compilateur peut contrôler à la compilation si l'accès aux
497  valeurs est valide.
498\end{enumerate}
499
500\paragraph{Convention} La classe \tclass{stensor} utilise une
501convention particulière, adoptée par certains codes aux éléments
502finis~\cite{doghri_mechanics_2000,bornert_homogeneisation_2001,edf_site_2013}. Un
503tenseur d'ordre \(2\) symétrique est représenté par un vecteur. Les
504trois premières composantes du vecteur représentent les composantes
505diagonales du tenseur et les suivants les composantes extra-diagonales
506multipliées par un facteur \(\sqrt{2}\)~:
507\begin{center}
508  \begin{tabular}[h]{ccc}
509    \(
510    \begin{pmatrix}
511      s_{00} & s_{01} & s_{02} \\
512      s_{00} & s_{11} & s_{12} \\
513      s_{02} & s_{12} & s_{22} \\
514    \end{pmatrix}
515    \) &\(\Rightarrow\) &
516    \(
517    \begin{pmatrix}
518      s_{00} \\
519      s_{11} \\
520      s_{22} \\
521      \sqrt{2}\,s_{01}\\
522      \sqrt{2}\,s_{02}\\
523      \sqrt{2}\,s_{12}\\
524    \end{pmatrix}
525    \)\\
526    Représentation matricielle & &  Représentation vectorielle
527  \end{tabular}
528\end{center}
529
530Cette représentation vectorielle est telle que le produit contracté de
531deux tenseurs d'ordre \(2\) symétriques est égal au produit scalaire
532de leurs représentations vectorielles. Dans la suite, nous ne ferons
533plus de distinction entre la représentation matricielle et la
534représentation tensorielle d'un vecteur\footnote{Notons que le code
535  aux éléments finis utilise une autre convention, celle de
536  \nom{Voigt}. Cette convention représente également les tenseurs
537  d'ordre \(2\) symétriques par des vecteurs mais différencie les
538  contraintes et les déformations~: les composantes extradiagonales
539  des contraintes ne sont affectées d'aucun facteur, et celles des
540  déformations sont affectées d'un facteur \(2\). Cette dissymétrie
541  rend pratiquement impossible une écriture systématique des
542  opérations tensorielles.}.
543
544\begin{table}[htbp]
545  \centering
546  \begin{tabular}{|c|c|}
547    \hline
548    Dimension & Nombre de composantes \\
549    \hline
550    \hline
551    1 & 3 \\
552    \hline
553    2 & 4 \\
554    \hline
555    3 & 6 \\
556    \hline
557  \end{tabular}
558  \caption{Nombre de composantes des tenseurs d'ordre $2$ symétriques en fonction de la dimension.}
559  \label{tab:tfel:stensor_size}
560\end{table}
561
562\paragraph{Nombre de composantes} En fonction de la dimension
563d'espace, certaines composantes extradiagonales peuvent être nulles et
564ne sont pas stockées. Le tableau~\ref{tab:tfel:stensor_size} donne le
565nombre de composantes des tenseurs d'ordre \(2\) symétriques en
566fonction de la dimension d'espace.
567
568\paragraph{Accès aux composantes du tenseur} L'accès à une composante
569d'un tenseur d'ordre \(2\) symétrique se fait par l'opérateur
570\toperator{stensor}{[]} ou par l'opérateur
571\toperator{stensor}{()}. Ces opérateurs prennent le numéro de la
572composante en argument.
573
574\paragraph{Opérations mathématiques} Les opérations suivantes sont
575permises sur les tenseurs d'ordre \(2\) symétriques~:
576\begin{enumerate}
577\item la négation~;
578\item multiplication à droite et à gauche par un scalaire~;
579\item division à droite par un scalaire~;
580\item addition et soustraction de deux tenseurs~;
581\item produit contracté de deux tenseurs. Pour cette opération,
582  l'opérateur {\tt |} est utilisé~;
583\item produit tensoriel de deux tenseurs. Pour cette opération,
584  l'opérateur \(\Hat\) est utilisé. Le résultat est une application
585  linéaire sur les tenseurs d'ordre \(2\) symétriques décrite au
586  paragraphe~\ref{sec:appl-line-sur}.
587\end{enumerate}
588Les règles de priorité du C++ ne permettent pas de reproduire les
589règles de priorité naturelle pour les produits contracté et tensoriel,
590l'emploi de parenthèse est parfois nécessaire.
591
592Ces opérations sont implantées par des techniques particulières,
593appelées {\tt expression
594  templates}~\cite{veldhuizen_expression_1995,vandevoorde_c++_2002},
595qui permettent au compilateur de générer un code optimisée. Ces
596techniques sont partiellement décrites au
597paragraphe~\ref{sec:tfel::quelq-techn-de}.
598
599\paragraph{Importation et exportation} Les codes aux éléments finis
600utilisent différentes représentations des tenseurs. En particulier, le
601code aux éléments finis \castem{} utilise la convention de
602\nom{Voigt}~\cite{cea_site_2013}. Deux méthodes assurent les
603conversions, si nécessaire~:
604\begin{enumerate}
605\item la méthode {\tt importVoigt} permet de convertir des valeurs
606  utilisant la convention de \nom{Voigt} pour les déformations~;
607\item la méthode {\tt importTab} permet de convertir des valeurs
608  utilisant la convention de \nom{Voigt} pour les contraintes.
609\end{enumerate}
610
611\paragraph{Calcul des valeurs propres} Les tenseurs d'ordre \(2\)
612symétriques sont toujours diagonalisables. La méthode
613\tmethodb{stensor}{computeEigenValues}{compute\-Eigen\-Values} permet
614de calculer les valeurs propres d'un tenseur d'ordre 2 symétrique. En
615\(1D\), aucun calcul n'est fait. En \(2D\), la troisième composante
616est nécessairement une valeur propre et les deux autres s'obtiennent
617en trouvant les racines d'un polynômes d'ordre \(2\). En \(3D\), le
618polynôme caractéristique a trois racines que l'on calcule par la
619méthode de \nom{Cardan}.
620
621\paragraph{Calcul des vecteurs propres} La méthode
622\tmethodb{stensor}{computeEigenVectors}{compute\-Eigen\-Vectors}
623permet de calculer les valeurs propres et les vecteurs propres d'un
624tenseur d'ordre \(2\) symétrique.
625
626\paragraph{Changement de base} La méthode
627\tmethodb{stensor}{changeBasis}{change\-Basis} de changer un tenseur
628de base. Elle prend en argument une matrice de rotation. En \(1D\),
629aucune opération n'est faite (seule matrice identité est valide). En
630\(2D\), on suppose que la troisième direction est invariante. Pour des
631raisons de performances, aucune vérification de ces hypothèses n'est
632faite.
633
634\paragraph{Tenseur identité} Le tenseur identité, noté
635\(\tenseur{I}\), est accessible via la méthode statique
636\tmethod{stensor}{Id}.
637
638\paragraph{Trace} La fonction \tfunc{trace} permet de calculer la
639trace du tenseur passé en argument, c'est à dire la somme de ses
640termes diagonaux~:
641\[
642\mathop{trace}\paren{a}=\sum_{i=0}^{3}a_{ii}=\tenseur{a}\colon\tenseur{I}
643\]
644
645\paragraph{Contrainte équivalente au sens de \nom{Von Mises}} La
646fonction \tfunc{sigmaeq} retourne la contrainte équivalente
647\(\sigmaeq\) au sens de \nom{Von Mises} du tenseur passé en argument~:
648\[
649\sigmaeq\paren{\tsigma} = \sqrt{\Frac{3}{2}\,\tenseur{s}\colon\tenseur{s}}\quad\text{avec}\quad\tenseur{s}=\tsigma-\Frac{1}{3}\mathop{trace}\paren{\tsigma}\,\tenseur{I}
650\]
651
652\paragraph{Contrainte équivalente au sens de \nom{Tresca}} La fonction
653\tfunc{tresca} retourne la contrainte équivalente \(\sigmaeq^{T}\) au
654sens de \nom{Tresca} du tenseur passé en argument~:
655\[
656\sigmaeq^{T}\paren{\tsigma} = \max_{i,j\\i!=j}\left|s^{p}_{i}-s^{p}_{j}\right|
657\]
658où \(s^{p}_{i}\) est la \(i\)\ieme valeur propre du tenseur
659\(\tsigma\).
660
661\paragraph{Compatibilité avec la librairie standard} La classe
662\tclass{stensor} présente toutes les caractéristiques d'un container
663de la librairie standard du C++~\cite{stroustrup_langage_2004}. Elle
664définit~:
665\begin{enumerate}
666\item les alias nécessaires, dont les principaux sont
667  \ttypedef{stensor}{iterator}, \ttypedef{stensor}{const\_iterator},
668  et \ttypedef{stensor}{value\_type}~;
669\item les méthodes \tmethod{stensor}{begin}, \tmethod{stensor}{end},
670  \tmethod{stensor}{rbegin}, \tmethod{stensor}{rend} et
671  \tmethod{stensor}{size}.
672\end{enumerate}
673
674\subsubsection{Applications linéaires sur les tenseurs d'ordre $2$
675  symétriques}
676\label{sec:appl-line-sur}
677
678L'écriture des lois de comportements mécaniques fait intervenir des
679tenseurs d'ordre \(4\), c'est à dire des applications linéaires qui
680s'appliquent sur des tenseurs d'ordre \(2\).
681
682Dans ce paragraphe, nous nous intéressons plus particulièrement aux
683tenseurs d'ordre \(4\) qui préservent la symétrie des tenseurs d'ordre
684\(2\) symétriques. Ils sont représentés par la classe
685\tclass{st2tost2}.
686
687La classe \tclass{st2tost2} est une classe {\tt template} paramétrée
688par~:
689\begin{enumerate}
690\item la dimension d'espace~;
691\item le type numérique utilisé.
692\end{enumerate}
693
694
695\paragraph{Représentation matricielle} Les tenseurs d'ordre \(4\) sont
696caractérisés par des composantes à quatre indices. En s'appuyant sur
697la représentation vectorielle des tenseurs d'ordre \(2\), une
698représentation matricielle est également possible~: le résultat de
699l'application d'un tenseur d'ordre \(4\) sur un tenseur d'ordre \(2\)
700est égal au produit de leur représentation matricielle et vectorielle
701respectivement.
702
703\paragraph{Stockage des valeurs} La classe \tclass{st2tost2} stocke
704ses valeurs dans un tableau de taille fixe. La classe
705\tclass{st2tost2} n'utilise aucune méthode virtuelle~: sa taille est
706exactement celle de son tableau de valeurs.
707
708Ces choix présentent les mêmes avantages que pour les tenseurs d'ordre
709\(2\) symétriques~:
710\begin{enumerate}
711\item aucune allocation dynamique n'est faite si l'objet est défini
712  sur la pile~;
713\item les accès aux valeurs sur la pile permettent au compilateur
714  d'effectuer des optimisations très poussées du code~;
715\item il est licite de convertir un pointeur vers un tableau de
716  valeurs vers un pointeur d'objet de type \tclass{st2tost2} et
717  inversement~;
718\item le compilateur peut contrôler à la compilation si l'accès aux
719  valeurs est valide.
720\end{enumerate}
721
722\subsubsection{Tenseurs d'ordre 2}
723
724La classe \tclass{tensor} implémente des tenseurs d'ordre \(2\) non
725symétriques.
726
727\paragraph{Fonctions utiles} Différentes fonctions sont les tenseurs
728d'ordre \(2\) ont été implantées~:
729\begin{enumerate}
730\item la fonction \tfunc{det} calcule le déterminant d'un tenseur~;
731\item la fonction \tfunc{computeRightCauchyGreenTensor} calcule le
732  tenseur de \nom{Cauchy}-\nom{Green} droit \(C\) d'un tenseur \(F\)~:
733  \[
734  C = \transpose{F}\,\dot\,F
735  \]
736  Le résultat est un tenseur d'ordre \(2\) symétrique de type
737  \tclass{stensor}.
738\item la fonction \tfunc{computeLeftCauchyGreenTensor} calcule le
739  tenseur de \nom{Cauchy}-\nom{Green} gauche \(B\) d'un tenseur
740  \(F\)~:
741  \[
742  B = F\,\dot\,\transpose{F}
743  \]
744  Le résultat est un tenseur d'ordre \(2\) symétrique de type
745  \tclass{stensor}.
746\item la fonction \tfunc{syme} symétrise un tenseur. Le résultat est
747  un tenseur d'ordre \(2\) symétrique.
748\end{enumerate}
749
750\subsubsection{Vecteurs}
751
752Deux types de vecteurs sont implantés~:
753\begin{enumerate}
754\item des vecteurs de petite taille connue à la compilation. Ils sont
755  implantés par la classe \tclass{tvector}~;
756\item des vecteurs de taille quelconque. Ils sont implantés dans la
757  classe \tclass{vector}
758\end{enumerate}
759
760Ces deux classes implémentent le concept
761\tclass{VectorConcept}\footnote{La notion de concept dans \TFEL{} est
762  décrite au paragraphe~\ref{sec:notion-de-concept}}.
763
764\paragraph{Vecteurs de petite taille connue}
765
766\paragraph{Vecteurs quelconques}
767
768\subsubsection{Matrices}
769
770Deux types de matrices sont implantés~:
771\begin{enumerate}
772\item des matrices de petite taille connue à la compilation. Ils sont
773  implantés par la classe \tclass{tmatrix}~;
774\item des matrices de taille quelconque. Ils sont implantés dans la
775  classe \tclass{matrix}
776\end{enumerate}
777
778Ces deux classes implémentent le concept
779\tclass{MatrixConcept}\footnote{La notion de concept dans \TFEL{} est
780  décrite au paragraphe~\ref{sec:notion-de-concept}}.
781
782\paragraph{Matrices de petite taille connue}
783
784\paragraph{Matrices quelconques}
785
786\subsubsection{Tableaux multi-dimensionnels}
787
788\subsubsection{Objets composites}
789
790\subsection{Algorithmes mathématiques}
791
792\subsubsection{Résolution de systèmes linéaires par un décomposition
793  {\tt LU}}
794
795\paragraph{Décomposition {\tt LU}}
796
797\paragraph{Résolution par descente/remontée}
798
799\paragraph{Calcul de l'inverse d'une matrice}
800
801\subsubsection{Résolution de systèmes linéaires par un décomposition
802  {\tt QR}}
803
804\paragraph{Décomposition {\tt QR}}
805
806Toute matrice \(A\) de format \(\paren{M,N}\) admet une décomposition
807de la forme~:
808\[
809A = Q\,R
810\]
811où~:
812\begin{minipage}[htbp]{0.9\linewidth}
813  \begin{enumerate}
814  \item \(Q\) est une matrice orthogonale de format \(\paren{M,M}\)~;
815  \item \(R\) est une matrice triangulaire supérieure de format
816    \(M,N\).
817  \end{enumerate}
818\end{minipage}
819
820Une telle décomposition peut être obtenue par une série de
821transformations de \nom{HouseHolder}. De telles transformations sont
822représentées par des matrices de la forme~:
823\begin{equation}
824  \label{eq:tfel:QR:Hi}
825  H_{i}=I+\Frac{1}{\beta_{i}}\transpose{v}_{i}\,v_{i}
826\end{equation}
827où \(\beta\) est un coefficient de normalisation.
828
829À la fin de la décomposition, la matrice \(Q\) est le produit ces
830matrices~:
831\begin{equation}
832  \label{eq:tfel:QR:Q}
833  Q = H_{1}\,\cdots\,H_{n}
834\end{equation}
835
836L'algorithme utilisé pour la décomposition de la matrice est extrait
837du livre de P. Lascaux et R. Théodor~\cite{lascaux_analyse_1994}.
838
839La classe \tclass{QRDecomp} réalise cette factorisation par la méthode
840de \nom{HouseHolder} et propose différentes méthodes pour travailler
841avec cette décomposition~:
842\begin{enumerate}
843\item la méthode \tmethod{QRDecomp}{exe} réalise la décomposition de
844  la matrice. Cette méthode s'appuie sur un vecteur auxiliaire qui
845  contient les éléments diagonaux de la matrice \(R\) (voir paragraphe
846  précédent). La décomposition est faite sur place, c'est à dire que
847  la matrice \(A\) est utilisée pour stocker les matrices \(Q\) et
848  \(R\). Deux vecteurs supplémentaires, correctement dimensionnés,
849  sont nécessaires pour stocker les termes diagonaux de \(R\) et les
850  coefficients de normalisation qui interviennent dans la
851  normalisation des vecteurs \(\beta\) définissant les transformations
852  de \nom{HouseHolder}~;
853\item la méthode \tmethod{QRDecomp}{tq\_product} réalise le produit de
854  la matrice \(\transpose{Q}\) (transposée de la matrice \(Q\)) et
855  d'un vecteur \(v\).
856\item la méthode \tmethod{QRDecomp}{back\_substitute} résout le
857  problème~:
858  \[
859  R\,x = b
860  \]
861\end{enumerate}
862
863\paragraph{Stockage de la décomposition} Les termes diagonaux de \(R\)
864sont stockés dans un vecteur annexe. Les termes non situés sur la
865diagonale de matrice \(R\) est stockés dans la partie triangulaire de
866la matrice \(A\).  La matrice \(Q\) n'est pas stockée explicitement,
867mais on stocke dans partie inférieure de \(A\) les vecteurs \(v_{i}\)
868qui apparaissent dans les transformations de
869\nom{HouseHolder}~\eqref{eq:tfel:QR:Hi}. Les coefficients de
870normalisation \(beta_{i}\) sont stockés dans un vecteur annexe.
871
872\paragraph{Application de la décomposition $QR$ à la résolution de
873  systèmes linéaires}. Si \(A\) est une matrice, \(b\) un
874vecteur. \(A\) se décompose en une matrice orthogonale \(Q\) et
875matrice triangulaire supérieure \(R\).
876
877La matrice \(Q\) étant orthogonale, son inverse est sa égale à sa
878transposée.
879
880Le problème linéaire \(A\,x=b\) est donc équivalent au problème~:
881\begin{equation}
882  \label{eq:tfel:QR:lin_solve}
883  R\,x=y \quad\text{ avec }\quad y=\transpose{Q}\,b
884\end{equation}
885
886La solution du problème~\eqref{eq:tfel:QR:lin_solve} peut être obtenue
887par les opérations suivantes~:
888\begin{enumerate}
889\item décomposition de la matrice \(A\) par la méthode
890  \tmethod{QRDecomp}{exe}~;
891\item calcul du vecteur \(y\) par la méthode
892  \tmethod{QRDecomp}{tq\_product}~;
893\item inversion du système triangulaire \(R\,x=y\) par la méthode
894  \tmethod{QRDecomp}{back\_substitute}.
895\end{enumerate}
896
897À la fin de ses opérations, le vecteur \(b\) contient la solution du
898problème~\eqref{eq:tfel:QR:lin_solve} et la matrice \(A\) contient les
899matrices \(Q\) et \(R\).
900
901% \paragraph{Résolution d'un problème de moindres carrés} Les problèmes de moindres carrés
902
903
904\subsubsection{Résolutions de systèmes d'équations non linéaires}
905
906\paragraph{Algorithmes de \nom{Newton}}
907
908\paragraph{Algorithmes de \nom{Broyden}}
909
910\subsubsection{Intégration des systèmes différentiels par des méthodes
911  de \nom{Runge-Kutta}}
912
913\subsubsection{Interpolation de données par splines cubiques}
914
915\subsubsection{Interpolation de données par krigeage}
916
917\begin{figure}[htbp]
918  \centering
919  \includegraphics[width=0.6\linewidth]{@abs_top_srcdir@/docs/tfel/images/EllipticFuelRodPowerDensity.eps}\\
920  \includegraphics[width=0.6\linewidth]{@abs_top_srcdir@/docs/tfel/images/EllipticFuelRodPowerDensityLegend.eps}
921  \caption{Interpolation des puissances calculées par le code
922    {\tt TRIPOLI} sur un maillage utilisé par un calcul
923    thermo-mécanique effectué avec le code \licos{}.}
924  \label{fig:PowerDensityInterpolation}
925\end{figure}
926
927\subsubsection{Identifications de paramètres par la méthode de
928  \nom{Levenberg-Marquardt}}
929
930\subsection{Évaluation d'expressions mathématiques}
931
932\newpage
933\clearpage
934\section{Description du module {\tt TFEL/Material}}
935
936\newpage
937\clearpage
938\section{Description du module {\tt TFEL/System}}
939
940\subsection{Gestion des librairies externes}
941
942\subsection{Gestion des processus}
943
944\subsection{Gestion des signaux}
945
946\newpage
947\clearpage
948\section{Description du module {\tt TFEL/Utilities}}
949
950\subsection{La classe {\tt GenType}}
951
952\subsection{Lecture de fichier texte}
953
954\subsection{Lecture d'un jeu de données}
955
956\newpage
957\clearpage
958\section{Quelques techniques de programmation sous-tendant la
959  librairie de calculs tensoriels de \TFEL{}}
960\label{sec:tfel::quelq-techn-de}
961
962Nous décrivons ici quelques techniques de programmation sous-tendant
963la bibliothèque de calculs tensoriels de \TFEL{}. Ces techniques, aux
964quels de nombreux travaux ont été consacrés, se différencient
965notamment de techniques plus traditionnelles et ont été développées
966pour combiner simplicité d'utilisation par la surcharge des opérateurs
967mathématiques usuels et performances optimales, au moins égales à
968celles obtenues en \fortran{}.
969
970\subsection{Utilisation de la mémoire}
971
972Le nombre de composantes d'un tenseur, et donc la taille mémoire qu'il
973utilise, dépend {\em a priori} de la dimension~: un tenseur a \(3\)
974composantes en \(1D\), \(4\) composantes en \(2D\) et \(6\)
975composantes en \(3D\).
976
977Étant de petite taille, la zone mémoire associée peut être initialisée
978sur la pile (nommée \texttt{stack} en anglais), ou sur le tas (nommé
979\texttt{heap}). L'allocation sur le tas est coûteuse et ne peut être
980utilisée pour des petits calculs, tels que ceux utilisés pour
981l'intégration des lois de comportement, sans réduire considérablement
982les performances. L'allocation sur la pile est en comparaison sans
983coût. Elle permet par ailleurs une meilleure localisation des données
984(et donc des optimisations par le compilateur) et est compatible sans
985précautions particulières avec une utilisation des exceptions.
986
987L'allocation sur la pile peut se faire en stockant de manière
988systématique un tableau de taille \(6\) qui est la taille maximale des
989tenseurs quelque soit la dimension. Il est alors nécessaire de stocker
990la dimension d'espace dans le tenseur. Toutes les opérations
991tensorielles doivent faire appel à des boucles sur allant de \(0\) à la
992taille du tenseur. Cette méthode présente plusieurs désavantages~:
993\begin{enumerate}
994  \item la définition d'un champ de tenseur, où l'on attribue un tenseur
995  à chaque point de discrétisation d'un domaine géométrique, conduit à
996  une gaspillage de mémoire~;
997  \item il n'est pas possible au compilateur de dérouler ces boucles et
998  d'optimiser les opérations tensorielles~;
999  \item le compilateur ne peut vérifier que l'accès aux données est
1000  valide, c'est à dire qu'un indice trop grand n'est pas utilisé. Une
1001  telle vérification peut être faite par des tests, mais cela alourdit
1002  le code et ralentit l'exécution~;
1003  \item il est nécessaire de passer la dimension d'espace au
1004  constructeur des objets, ce qui alourdit l'écriture.
1005\end{enumerate}
1006
1007Nous avons choisi une solution qui nous est apparue plus avantageuse et
1008consistant à paramétrer les tenseurs par la dimension d'espace~: un
1009tenseur \(1D\) est un objet différent d'un objet \(2D\). Ce choix permet
1010d'utiliser un ensemble de techniques de programmation générique
1011permettant par exemple de \og~dérouler les boucles\fg{} à la compilation
1012et au compilateur de vérifier notre code\footnote{De manière générale,
1013  nous avons privilégié dans \TFEL{} des techniques de programmation
1014  permettant de détecter au plus tôt, c'est à dire dès la phase de
1015  compilation, des erreurs qui ne sont détectables dans d'autres
1016  langages qu'à l'exécution.}.
1017
1018Ce paramétrage par la dimension d'espace est masqué dans \mfront{}~:
1019une loi de comportement est en fait paramétrée par la dimension
1020d'espace et est spécialisée pour chaque dimension d'espace, produisant
1021un code optimisé dans chaque cas (au détriment du temps de compilation
1022et de la taille du code généré, mais ces aspects ne sont pas
1023problématiques pour les lois de comportement).
1024
1025\subsection{Choix du type numérique}
1026
1027L'ensemble des objets mathématiques de \TFEL{} sont également
1028paramétrés par le type numérique utilisé.
1029
1030Ce paramétrage du type numérique est masqué dans \mfront{}. \mfront{}
1031propose d'utiliser un type opaque \texttt{real} pour les opérations
1032mathématiques. Dans le cas de l'interface \texttt{umat}, la loi de
1033comportement est spécialisée en utilisant un nombre flottant en double
1034précision. D'autres codes peuvent faire des choix différents~: le code
1035de résolution par transformées rapides développé au sein du projet
1036\pleiades{} permet de choisir le type numérique à utiliser à la
1037compilation.
1038
1039\subsection{Élimination des objets temporaires}
1040\label{sec:tfel:elim-des-objets}
1041
1042Il est classique de vanter, pour des applications scientifiques, la
1043possibilité dans le langage \cpp{} de surcharger les opérateurs
1044mathématiques afin de rapprocher l'écriture du code de l'écriture
1045mathématique usuelle.
1046
1047Une implantation \og~naïve~\fg{} de la surcharge des opérateurs
1048consiste à écrire, dans le cas particulier de l'addition, que la somme
1049de deux tenseurs est un tenseur. Ainsi, la somme \texttt{d} de trois
1050tenseurs \texttt{a}, \texttt{b} et \texttt{c} s'écrit~:
1051\begin{center}
1052  \texttt{d} =  \texttt{a} + \texttt{b} + \texttt{c}
1053\end{center}
1054Cette expression est interprétée par le compilateur en introduisant
1055des objets temporaires, résultats des opérations prises deux à deux~:
1056\begin{center}
1057  \texttt{d} =  \texttt{a} + \texttt{b} + \texttt{c}
1058  \(\quad\Rightarrow\quad
1059  \left\{
1060      \begin{array}[p]{rl}
1061        \text{\texttt{tmp1}} &= \text{\texttt{a}}    + \text{\texttt{b}} \\
1062        \text{\texttt{tmp2}} &= \text{\texttt{tmp1}} + \text{\texttt{c}} \\
1063        \text{\texttt{d}}    &= \text{\texttt{tmp3}}
1064      \end{array}
1065    \right.
1066    \)
1067\end{center}
1068
1069L'évaluation et l'affectation des ces temporaires conduit à trois
1070boucles (qui peuvent être éventuellement déroulées), là où une doit
1071suffire.
1072
1073Une solution à cela est d'utiliser une évaluation paresseuse des
1074opérations~: le résultat de la somme de deux tenseurs étant un objet
1075particulier \og~résultat de la somme de deux tenseurs~\fg{} dont le
1076rôle est de porter l'information des opérations à effectuer jusqu'au
1077moment de leur évaluation effective, c'est à dire jusqu'au moment de
1078l'affectation au tenseur \texttt{d}. Le résultat de la somme de trois
1079tenseurs est un objet du type \og~résultat de la somme du résultat de
1080la somme de deux tenseurs et d'un tenseur~\fg{}.
1081
1082Nous utilisons le compilateur pour générer en arrière plan de tels
1083objets (en nous appuyant sur la notion de concept développée au
1084paragraphe suivant) et les éliminer au moment de l'évaluation
1085effective du résultat. Cette technique, appelée \texttt{expression
1086  template}, couplée aux techniques de déroulement de boucles, permet
1087de transformer l'addition de trois tenseurs à du code équivalent à~:
1088\begin{center}
1089  \texttt{d} =  \texttt{a} + \texttt{b} + \texttt{c}
1090  \(\quad\Rightarrow\quad
1091  \left\{
1092      \begin{array}[p]{rl}
1093        d[0] &= \texttt{a}[0] + \texttt{b}[0] + \texttt{c}[0] \\
1094        d[1] &= \texttt{a}[1] + \texttt{b}[1] + \texttt{c}[1] \\
1095        d[2] &= \texttt{a}[2] + \texttt{b}[2] + \texttt{c}[2] \\
1096      \end{array}
1097    \right.
1098    \)
1099\end{center}
1100si les tenseurs \texttt{a}, \texttt{b}, \texttt{c} et \texttt{d} sont
1101des tenseurs \(1D\).
1102
1103Le moteur d'\texttt{expression template} de \TFEL{} se compare
1104favorablement, en terme de fonctionnalités, à toutes les implantations
1105publiées à notre connaissance, en particulier car nous avons développé
1106une notion de concept qui est maintenant décrite.
1107
1108\subsection{Notion de concept}
1109\label{sec:notion-de-concept}
1110
1111Nous avons décrit brièvement le moteur d'\texttt{expression template}
1112qui sous-tend les opérations mathématiques dans \TFEL{}. Chaque
1113opération conduit à des objets dont le type est généré automatiquement
1114par le compilateur. D'un point de vue pratique, il est nécessaire que
1115ses objets se comportent comme des tenseurs \og~normaux~\fg{} afin de
1116pouvoir les utiliser dans des fonctions tensorielles usuelles (trace,
1117contrainte équivalente, etc..).
1118
1119Il pourrait être tenté d'utiliser une classe mère abstraite et des
1120méthodes virtuelles associées. Cette approche est incompatible avec
1121les choix de conception précédent~:
1122\begin{enumerate}
1123\item il est nécessaire d'allouer les objets sur le tas et de
1124  manipuler des pointeurs ce qui est à la fois inefficace et
1125  incompatible avec une écriture proche de l'écriture mathématique
1126  usuelle~;
1127\item l'utilisation de méthodes virtuelles ruine toutes les
1128  optimisations que nous avons cherchées à mettre en place dans les
1129  paragraphes précédents.
1130\end{enumerate}
1131
1132Une autre technique d'abstraction est donc nécessaire. De nombreuses
1133recherches ont permis de dégager la notion de \og~concept~\fg{}. Cette
1134notion aurait dû être un des piliers du futur standard du langage
1135\cpp{} mais son introduction a été différée par manque de maturité.
1136
1137\TFEL{} propose une notion de \og~concept\fg{} beaucoup moins étendue et
1138générale que celle proposée pour le futur standard mais qui est basée
1139sur le standard actuel. La notion de concept dans \TFEL{} repose sur la
1140combinaison de différentes techniques de programmation relativement
1141pointues~:
1142\begin{enumerate}
1143  \item une classe \texttt{S} implante la notion de concept en dérivant
1144  de la classe \texttt{StensorConcept<S>}~: \texttt{S} hérite d'une
1145  classe dont elle est paramètre. Cette technique, appelée
1146  \texttt{Curiously Recurring Template Pattern}, a été énormément
1147  utilisée en programmation générique pour obtenir une flexibilité
1148  équivalente aux méthodes virtuelles sans en payer le coût~;
1149  \item une classe à deux paramètres \texttt{Implements} qui contient
1150  une variable statique \varcpp{cond}. Si une \texttt{S} implante le
1151  concept \texttt{StensorConcept}, la variable statique
1152  \texttt{Implements<S,StensorConcept>::cond} vaut \texttt{true},
1153  \texttt{false} dans le cas contraire. L'implantation effective de la
1154  classe \texttt{Implements} repose sur les capacités d'introspection de
1155  l'opérateur \texttt{sizeof}~;
1156  \item le recours au principe \texttt{SFINAE}, \texttt{Substitution
1157    Failure Is Not An Error} pour filtrer les paramètres valides d'une
1158  fonction. Ce principe stipule que lorsque le compilateur examine la
1159  définition d'une fonction paramétrée pour savoir si elle applicable
1160  dans une contexte particulier, si la substitution du paramètre conduit
1161  à un échec, alors cette fonction est simplement {\em éliminée} de la
1162  liste des candidats {\em sans causer d'erreur}.
1163
1164  L'application de ce principe se fait dans \TFEL{} par la classe
1165  \texttt{EnableIf} qui paramétrée par une variable booléenne et une
1166  type \texttt{T}. La classe \texttt{EnableIf<true,T>} est implantée
1167  et contient un alias nommé \texttt{type} égal à \texttt{T}. La
1168  classe \texttt{EnableIf<false,T>} n'est jamais définie. Ainsi,
1169  l'alias \texttt{EnableIf<cond,T>::type} n'est défini que si la
1170  variable \texttt{cond} vaut \texttt{true}.
1171
1172  Ces préliminaires permettent de comprendre la déclaration de la
1173  fonction \texttt{trace} dans \TFEL{}~:
1174
1175  \begin{center}
1176    \begin{minipage}{0.8\textwidth}
1177      \mbox{}\\
1178      \hlkwc{template}\hlstd{}\hlsym{$<$}\hlstd{}\hlkwc{class }\hlstd{T}\hlsym{$>$}\hspace*{\fill}\\
1179      \hlstd{TFEL\textunderscore MATH\textunderscore INLINE\hspace*{\fill}\\
1180        typename tfel}\hlsym{::}\hlstd{meta}\hlsym{::}\hlstd{EnableIf}\hlsym{$<$}\hspace*{\fill}\\
1181      \hlstd{}\hlstd{\ \ }\hlstd{tfel}\hlsym{::}\hlstd{meta}\hlsym{::}\hlstd{Implements}\hlsym{$<$}\hlstd{T}\hlsym{,}\hlstd{StensorConcept}\hlsym{$>$::}\hlstd{cond}\hlsym{,}\hspace*{\fill}\\
1182      \hlstd{}\hlstd{\ \ }\hlstd{typename StensorTraits}\hlsym{$<$}\hlstd{T}\hlsym{$>$::}\hlstd{NumType}\hspace*{\fill}\\
1183      \hlsym{$>$::}\hlstd{type}\hspace*{\fill}\\
1184      \hlkwd{trace}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const }\hlstd{T}\hlsym{\&);}\\
1185    \end{minipage}
1186  \end{center}
1187
1188  L'utilisation de la classe \texttt{EnableIf} conduit à ce que cette
1189  fonction ne puisse être appliquée que si la classe \texttt{T}
1190  implante le concept \texttt{StensorConcept}. Ce filtre permet
1191  d'éviter un conflit possible avec la déclaration de la fonction
1192  \texttt{trace} d'une matrice~:
1193
1194  \begin{center}
1195    \begin{minipage}{0.8\textwidth}
1196      \mbox{}\\
1197      \hlkwc{template}\hlstd{}\hlsym{$<$}\hlstd{}\hlkwc{class }\hlstd{T}\hlsym{$>$}\hspace*{\fill}\\
1198      \hlstd{TFEL\textunderscore MATH\textunderscore INLINE\hspace*{\fill}\\
1199        typename tfel}\hlsym{::}\hlstd{meta}\hlsym{::}\hlstd{EnableIf}\hlsym{$<$}\hspace*{\fill}\\
1200      \hlstd{}\hlstd{\ \ }\hlstd{tfel}\hlsym{::}\hlstd{meta}\hlsym{::}\hlstd{Implements}\hlsym{$<$}\hlstd{T}\hlsym{,}\hlstd{MatrixConcept}\hlsym{$>$::}\hlstd{cond}\hlsym{,}\hspace*{\fill}\\
1201      \hlstd{}\hlstd{\ \ }\hlstd{typename MatrixTraits}\hlsym{$<$}\hlstd{T}\hlsym{$>$::}\hlstd{NumType}\hspace*{\fill}\\
1202      \hlsym{$>$::}\hlstd{type}\hspace*{\fill}\\
1203      \hlkwd{trace}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const }\hlstd{T}\hlsym{\&);}\\
1204    \end{minipage}
1205  \end{center}
1206
1207\end{enumerate}
1208
1209L'application de toutes ces techniques permet au compilateur de
1210traduire la trace de la somme de deux tenseurs \texttt{s1} et
1211\texttt{s2} en un code équivalent à~:
1212\begin{center}
1213  \texttt{trace(s1+s2)}
1214  \(\quad\Rightarrow\quad
1215  \texttt{s1}[0] + \texttt{s2}[0] +
1216  \texttt{s1}[1] + \texttt{s2}[1] +
1217  \texttt{s1}[2] + \texttt{s2}[2]
1218  \)
1219\end{center}
1220
1221\newpage
1222\clearpage
1223\section{Documentation informatique}
1224\label{sec:mfront:doc:info}
1225
1226\TFEL{} est développé en C++ sur la base du standard de \(1998\). Nous
1227détaillons dans ce paragraphe quels sont les plate-formes et les
1228compilateurs supportés.
1229
1230Ces différents points permettent d'apprécier la qualité logicielle de
1231\TFEL{}.
1232
1233\subsection{Plate-formes supportées}
1234
1235\subsubsection{Systèmes \unix{}}
1236
1237Sous \unix{}, nous nous sommes appuyés sur la norme {\tt POSIX} pour
1238réaliser les appels système~\cite{blaess_developpement_2011}. Le
1239principal utilisé est \linux{} et des tests de portabilité ont été
1240effectués sur les systèmes {\tt Solaris} et {\tt FreeBSD}.
1241
1242La compatibilité POSIX permet également de compiler \TFEL{} dans un
1243environnement \cygwin{}\footnote{\cygwin{} fournit une surcouche POSIX
1244  au-dessus des systèmes \windows{}}. Pour différentes raisons, un
1245portage natif sous \windows{} est préférable et l'utilisation de \TFEL{}
1246dans un environnement \cygwin{} est amené à tomber en désuétude.
1247
1248\subsubsection{Systèmes \windows{}}
1249
1250Il est possible de compiler \TFEL{} pour les systèmes \windows{} à
1251l'aide de la suite \msys{}.
1252
1253\subsection{Compilateurs supportées}
1254
1255\paragraph{Compilateur GNU} Les compilateurs de la suite {\tt gcc } et
1256développé dans le cadre du projet {\tt GNU} sont les compilateurs
1257disponibles par défaut sur les distributions \linux{}.
1258
1259Toutes les versions du compilateur depuis la version \(3.4\) sont
1260supportées. Les versions antérieures ne supportent pas de manière
1261satisfaisantes la norme \(98\).
1262
1263\paragraph{Compilateur Clang} Le compilateur
1264
1265\paragraph{Compilateur Intel}
1266
1267\paragraph{Compilateur Pathscale}
1268
1269\subsection{Compilateurs non supportées}
1270
1271Différents tests ont été menés avec des compilateurs
1272
1273SunStudio dans la version 12.3. Visual C++
1274
1275\newpage
1276\clearpage
1277\section{Notice d'installation}
1278
1279\TFEL{} propose aujourd'hui deux méthodes de compilation et
1280d'installation. La première est basée sur le \og~moteur de
1281production~\fg \cmake{}. Cette méthode est aujourd'hui conseillée. La
1282seconde est basée sur les traditionnels \autotools{}.
1283
1284\subsection{Compilation, installation et
1285  génération de binaires à l'aide de \cmake{}}
1286
1287L'installation de \TFEL{} nécessite une version supérieure
1288à \(2.8\) de \cmake{}.
1289
1290À partir du répertoire racine des sources, il est conseillé de créer un
1291sous-répertoire pour la construction des binaires~:
1292\bash{
1293  mkdir build \\
1294  \$ cd build
1295}
1296
1297\paragraph{Préparation de la compilation}
1298La commande \cmake{} est invoquée pour préparer la compilation~:
1299\bash{
1300  cmake ../ -DCMAKE\textunderscore{}\-INSTALL\textunderscore{}\-PREFIX=... -DCMAKE\textunderscore{}\-BUILD\textunderscore{}\-TYPE="Release" [options]
1301}
1302
1303La variable
1304\varcpp{CMAKE\textunderscore{}\-INSTALL\textunderscore{}\-PREFIX} permet
1305de préciser le répertoire d'installation.
1306
1307La variable
1308\varcpp{CMAKE\textunderscore{}\-BUILD\textunderscore{}\-TYPE} précise le
1309type de compilation souhaitée. Deux valeurs sont possibles~:
1310\texttt{Release} (version de production) et \texttt{Debug} (version de
1311développement).
1312
1313Pour certains systèmes, il est également possible de préciser la
1314variable \varcpp{LIB\textunderscore{}\-SUFFIX} pour modifier le nom du
1315répertoire d'installation des librairies. Ainsi, pour être compatible
1316avec les conventions des distributions \mandriva{} (entre autres), on
1317utilisera l'option \varcpp{-DLIB\textunderscore{}\-SUFFIX=64}.
1318
1319Les options suivantes sont disponibles~:
1320\begin{enumerate}
1321  \item \varcpp{-DENABLE-STATIC=ON/OFF}, qui demande la
1322  compilation de librairies statiques en plus de librairies dynamiques.
1323  Par défaut, cette option est désactivée~;
1324  \item \varcpp{-Denable-fortran=ON/OFF}, qui permet d'activer ou
1325  de désactiver la compilation de l'interface \texttt{fortran}. Par
1326  défaut, cette option est désactivée~;
1327  \item \varcpp{-Denable-python=ON/OFF}, qui permet d'activer ou
1328  de désactiver la compilation de l'interface \texttt{python}. Par
1329  défaut, cette option est activée si un interpréteur \python{} adéquat
1330  est trouvée~;
1331  \item \varcpp{-Denable-aster=ON/OFF}, qui permet d'activer ou
1332  de désactiver la compilation de l'interface \texttt{aster}. Par
1333  défaut, cette option est désactivée~;
1334  \item \varcpp{-Dlocal-castem-header=ON/OFF}, qui permet
1335  d'activer ou de désactiver la compilation des interfaces
1336  \texttt{castem} (propriétés matériau) et \texttt{umat} (loi de
1337  comportement) sans utiliser une installation de \castem{}. \TFEL{}
1338  fournira alors sa propre version du fichier d'entête
1339  \texttt{castem.h}. Par défaut, cette option est désactivée~;
1340\end{enumerate}
1341
1342Cette phase de préparation va automatiquement rechercher~:
1343\begin{enumerate}
1344  \item un installation valide de \castem{}, si l'option
1345  \varcpp{-Dlocal-castem-header} n'a pas été spécifiée. Cette recherche
1346  peut être facilitée en définissant la variable
1347  \varcpp{CASTEM\textunderscore{}\-INSTALL\textunderscore{}\-PATH} par
1348  l'option
1349  \varcpp{-DCASTEM\textunderscore{}\-INSTALL\textunderscore{}\-PATH=...}
1350  ou en définissant une variable d'environnement \env{CASTEMHOME}. Si la
1351  recherche réussie, les interfaces \texttt{castem} (propriétés
1352  matériau) et \texttt{umat} (loi de comportement) seront construites~;
1353  \item une installation valide de \gnuplot{}. Si la recherche
1354  réussie, l'interface \texttt{gnuplot} (propriétés matériau) est
1355  construite~;
1356  \item une installation valide de \doxygen{}~;
1357  \item une installation valide de \latex{}~;
1358\end{enumerate}
1359
1360Il est possible de préciser le compilateur à utiliser par les
1361variables d'environnement \env{CC} (compilateur \texttt{c}), \env{CXX}
1362(compilateur \cpp), \env{LD} (éditeur de liens).
1363
1364Enfin, cette phase de préparation va tenter de trouver les options
1365de compilation optimales ainsi que des drapeaux de compilation assez
1366contraignants. Ces mêmes options seront utilisées par \mfront{} pour la
1367compilation des sources générées\footnote{Pour connaître les options retenues,
1368  il est possible d'interroger la commande {\tt tfel-config}~:
1369  \bash{
1370    \#retourne les avertissements retenus             \\
1371    \$ tfel-config --warning                          \\
1372    \$ \#retourne les options d'optimisation retenues \\
1373    \$ tfel-config --oflags
1374  }
1375}.
1376
1377\paragraph{Compilation} La compilation de \TFEL{}
1378est lancée par la commande \make{}~:
1379\bash{
1380  make -j x
1381}
1382où \texttt{x} est le nombre de processeurs affectés à cette
1383
1384\paragraph{Installation des binaires} Les
1385binaires sont installés par la commande~:
1386\bash{
1387  make install
1388}
1389
1390\paragraph{Exécution des tests} La base des cas test
1391de \TFEL{} peut être lancée par la commande suivante~:
1392\bash{
1393  make check
1394}
1395
1396\paragraph{Génération de la documentation} La
1397documentation de \TFEL{} est générée par la commande~:
1398\bash{
1399  make doc
1400}
1401
1402Cette documentation se décompose en deux parties~:
1403\begin{enumerate}
1404  \item une documentation informatique générée par \doxygen{} (si
1405  cet outil est disponible). Cette documentation peut être générée
1406  indépendamment par la commande~:
1407  \bash{make doc-html}
1408  \item la présente documentation, au format \texttt{pdf}, si
1409  \latex{} est disponible. Cette documentation peut être générée
1410  indépendamment par la commande~:
1411  \bash{make doc-pdf}
1412\end{enumerate}
1413
1414\paragraph{Installation de la documentation} La
1415documentation de \TFEL{} est installée par la commande~:
1416\bash{
1417  make doc-install
1418}
1419
1420La documentation informatique générée par \doxygen{} peut être
1421installée par la commande~:
1422\bash{
1423  make doc-html-install
1424}
1425
1426Les différentes documentations {\tt pdf} peuvent être
1427installées par la commande~:
1428\bash{
1429  make doc-pdf-install
1430}
1431
1432\paragraph{Installation des fichiers de tests} Il est possible
1433d'installer les fichiers de tests par la commande suivante~:
1434\bash{
1435  make tests-install
1436}
1437
1438\paragraph{Génération de paquets RPM} Des paquets
1439RPM, utilisés par les distributions \linux{} \redhat{} et \mandriva{}
1440(entre autres) peuvent être générés par la commande~:
1441\bash{cpack -G RPM}
1442
1443\paragraph{Génération de paquets DEB} Des paquets
1444DEB, utilisés par les distributions \linux{} \debian{} et \ubuntu{}
1445(entre autres) peuvent être générés par la commande~:
1446\bash{cpack -G DEB}
1447
1448\paragraph{Génération d'installateur \windows{}} Il est possible de
1449créer un installateur pour \windows{} à l'aide de l'outil
1450\nsis{}\footnote{\texttt{Nullsoft Scriptable Install System} est un
1451  produit open-source disponible à l'adresse~:
1452  \begin{center}
1453    \url{http://nsis.sourceforge.net/}
1454  \end{center}
1455}~:
1456\bash{cpack -G NSIS}
1457
1458\subsection{Compilation, installation et
1459  génération de binaires à l'aide des \autotools{}}
1460
1461Si les sources ont été récupérées à partir de la gestion de
1462configuration, il est nécessaire d'initialiser l'environnement de
1463construction des binaires. Pour cela, il faut taper, dans le répertoire
1464racine des sources, la commande suivante~:
1465\bash{
1466  ./bootstrap.sh
1467}
1468
1469Il est conseillé de créer un sous-répertoire pour la construction des
1470binaires~:
1471\bash{
1472  mkdir build \\
1473  \$ cd build
1474 }
1475
1476\paragraph{Préparation de la compilation}
1477La commande \cmake{} est invoquée pour préparer la compilation~:
1478\bash{
1479  ../configure -{}-prefix=... [options]
1480}
1481
1482L'option \varcpp{-{}-prefix} permet de préciser le répertoire
1483d'installation.
1484
1485Les options suivantes sont disponibles~:
1486\begin{enumerate}
1487  \item \varcpp{-{}-enable-production}, qui permet de produire
1488  une version optimisée (choix par défaut)~;
1489  \item \varcpp{-{}-enable-debug}, qui permet de produire une
1490  version de développement~;
1491  \item \varcpp{-{}-enable-tests}, qui permet d'activer la
1492  compilation des cas test~;
1493  \item \varcpp{-{}-enable-fortran}, qui permet d'activer ou de
1494  désactiver la compilation de l'interface \texttt{fortran}. Par défaut,
1495  cette option est désactivée~;
1496  \item \varcpp{-{}-enable-python}, qui permet d'activer ou de
1497  désactiver la compilation de l'interface \texttt{python}. Par défaut,
1498  cette option est activée si un interpréteur \python{} adéquat est
1499  trouvée~;
1500  \item \varcpp{-{}-enable-aster}, qui permet d'activer ou de
1501  désactiver la compilation de l'interface \texttt{aster}. Par défaut,
1502  cette option est désactivée~;
1503  \item \varcpp{-{}-local-castem-header}, qui permet d'activer ou
1504  de désactiver la compilation des interfaces \texttt{castem}
1505  (propriétés matériau) et \texttt{umat} (loi de comportement) sans
1506  utiliser une installation de \castem{}. \TFEL{} fournira alors sa
1507  propre version du fichier d'entête \texttt{castem.h}. Par défaut,
1508  cette option est désactivée~;
1509  \item \varcpp{-{}-with-castem=xxx} qui permet de préciser le
1510  répertoire d'installation de \castem{}~;
1511\end{enumerate}
1512
1513Cette phase de préparation va automatiquement rechercher~:
1514\begin{enumerate}
1515  \item un installation valide de \castem{}, si l'option
1516  \varcpp{-{}-local-castem-header} n'a pas été spécifiée. Cette
1517  recherche peut être facilitée en utilisant l'option
1518  \varcpp{-{}-with-castem=xxx} ou ou en définissant une variable
1519  d'environnement \env{CASTEMHOME}. Si la recherche réussie, les
1520  interfaces \texttt{castem} (propriétés matériau) et \texttt{umat} (loi
1521  de comportement) seront construites~;
1522  \item une installation valide de \gnuplot{}. Si la recherche
1523  réussie, l'interface \texttt{gnuplot} (propriétés matériau) est
1524  construite~;
1525  \item une installation valide de \doxygen{}~;
1526  \item une installation valide de \latex{}~;
1527\end{enumerate}
1528
1529Il est possible de préciser le compilateur à utiliser par les
1530variables d'environnement \env{CC} (compilateur \texttt{c}), \env{CXX}
1531(compilateur \cpp), \env{LD} (éditeur de liens).
1532
1533Enfin, cette phase de préparation va tenter de trouver les options
1534de compilation optimales ainsi que des drapeaux de compilation assez
1535contraignants. Ces mêmes options seront utilisées par \mfront{} pour la
1536compilation des sources générées\footnote{Pour connaître les options retenues,
1537  il est possible d'interroger la commande {\tt tfel-config}~:
1538  \bash{
1539    \#retourne les avertissements retenus             \\
1540    \$ tfel-config --warning                          \\
1541    \$ \#retourne les options d'optimisation retenues \\
1542    \$ tfel-config --oflags
1543  }
1544}.
1545
1546\paragraph{Compilation} La compilation de \TFEL{}
1547est lancé par la commande \make{}~:
1548\bash{
1549  make -j x
1550}
1551où \texttt{x} est le nombre de processeurs affectés à cette
1552
1553\paragraph{Installation des binaires} Les
1554binaires sont installés par la commande~:
1555\bash{
1556  make install
1557}
1558
1559\paragraph{Exécution des tests} La base des cas test
1560de \TFEL{} peut être lancée par la commande suivante~:
1561\bash{
1562  make check
1563}
1564
1565\paragraph{Installation de la documentation} La
1566documentation de \TFEL{} est installée par la commande~:
1567\bash{
1568  make doc-install
1569}
1570
1571Cette documentation se décompose en deux parties~:
1572\begin{enumerate}
1573  \item une documentation informatique générée par \doxygen{} (si
1574  cet outil est disponible). Cette documentation peut être générée
1575  indépendamment par la commande~:
1576  \bash{ make doc-html}
1577  \item la présente documentation, au format \texttt{pdf}, si
1578  \latex{} est disponible. Cette documentation peut être générée
1579  indépendamment par la commande~:
1580  \bash{ make doc-pdf}
1581\end{enumerate}
1582
1583\subsection{Description du répertoire d'installation}
1584
1585Le répertoire d'installation contient quatre répertoires~:
1586\begin{enumerate}
1587  \item le répertoire \texttt{bin} contient les exécutables
1588  produits~;
1589  \item le répertoire \texttt{lib} contient les librairies
1590  produites~;
1591  \item le répertoire \texttt{include} contient les fichiers
1592  d'entête des différentes librairies de \TFEL{}~
1593  \item le répertoire \texttt{share} contient des tests et des
1594  fichiers d'exemple.
1595\end{enumerate}
1596
1597Le répertoire \texttt{share/mfront/tests/behaviours} contient un
1598ensemble de fichiers de tests \mfront{} qui peut servir d'exemple.
1599
1600\newpage
1601\clearpage
1602\section{Calculs des dérivées des valeurs et vecteurs propres d'un
1603  tenseur symétrique}
1604
1605Un tenseur symétrique \(\tenseur{s}\) peut toujours être
1606diagonalisé. Soient \(\lambda_{1},\lambda_{2},\lambda_{3}\) ses trois
1607valeurs propres et \(\vec{e}_{1},\vec{e}_{2},\vec{e}_{3}\) les
1608vecteurs propres associés. \(\tenseur{s}\) se décompose ainsi~:
1609\[
1610\tenseur{s}=\sum_{i=1}^{3}\lambda_{i}\,\vec{e}_{i}\otimes\vec{e}_{i}
1611\]
1612
1613Définissons les tenseurs symétriques suivants~:
1614\[
1615\tenseur{n}_{ij} =
1616\left\{
1617  \begin{aligned}
1618    \vec{e}_{i}\otimes\vec{e}_{i} & \text{ si }  i=j \\
1619    \Frac{1}{\sqrt{2}}\paren{\vec{e}_{i}\otimes\vec{e}_{j}+\vec{e}_{j}\otimes\vec{e}_{i}}    & \text{ si } i \neq j
1620  \end{aligned}
1621\right.
1622\]
1623Les tenseurs \(\tenseur{n}_{ij}\) forment une base orthonormée des
1624tenseurs d'ordre \(2\) symétriques. Le tenseur \(\tenseur{s}\) se
1625décompose ainsi~:
1626\begin{equation}
1627  \label{eq:reference-guide:s}
1628  \tenseur{s} = \sum_{i=1}^{3}\lambda_{i}\,\tenseur{n}_{i}
1629\end{equation}
1630
1631Les vecteurs propres de \(\tenseur{s}\) sont orthornomés~:
1632\[
1633\vec{t}_{i}\,.\,\vec{t}_{j}=\delta_{ij}
1634\]
1635
1636Par différentiation~:
1637\[
1638\vec{\dtot\,t}_{i}\,.\,\vec{t}_{j}+\vec{\dtot\,t}_{i}\,.\,\vec{t}_{j}=0
1639\]
1640
1641Cette propriété nous permet de montrer une propriété importante des
1642différentielles des tenseurs \(\tenseur{n}_{ij}\)~:
1643\begin{equation}
1644  \label{eq:reference-guide:n_iin_ii}
1645  n_{ii}\,\colon\,{\dtot n_{ii}}=0
1646\end{equation}
1647
1648D'après l'équation~\eqref{eq:reference-guide:s}, la différentielle du
1649tenseur \(\tenseur{s}\) s'écrit~:
1650\[
1651\dtot\,\tenseur{s}=\sum_{i=1}^{3}\lambda_{i}\,\dtot\,\tenseur{n}_{ii}+\tenseur{n}_{ii}\,\dtot\,\lambda_{i}
1652\]
1653En utilisant la propriété~\eqref{eq:reference-guide:n_iin_ii}, la
1654projection suivant \(\tenseur{n}_{ii}\) donne~:
1655\[
1656\dtot\,\lambda_{i}=\dtot\,\tenseur{s}\,\colon\,\tenseur{n}_{ii}
1657\]
1658
1659En particulier~:
1660\[
1661\deriv{\lambda_{i}}{\tenseur{s}}=\deriv{\tenseur{s}}{\tenseur{s}}\,\colon\,\tenseur{n}_{ii}=\tenseur{n}_{ii}
1662\]
1663
1664Nous nous intéressons maintenant aux termes \(\deriv{\tenseur{n}_{ii}}{\tenseur{s}}\).
1665
1666On montre que~:
1667\begin{equation}
1668  \label{eq:tfel:reference_guide:n_derivate}
1669  \deriv{\tenseur{n}_{11}}{\tenseur{s}} = \Frac{1}{\lambda_{1}-\lambda_{2}}\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}+\Frac{1}{\lambda_{1}-\lambda_{3}}\tenseur{n}_{13}\,\otimes\,\tenseur{n}_{13}
1670\end{equation}
1671
1672\subsection{Régularisation}
1673
1674L'expression~\eqref{eq:tfel:reference_guide:n_derivate} de la dérivée
1675présente une singularité lorsque deux valeurs propres sont égales.
1676
1677\begin{figure}[htbp]
1678  \centering
1679  \includegraphics[width=0.5\linewidth]{@abs_top_srcdir@/docs/tfel/images/r-epsilon.eps}
1680  \caption{représentation des fonctions $r_{1}\paren{x}$,
1681    $r_{\pfrac{1}{4}}\paren{x}$ et $r_{\pfrac{1}{2}}\paren{x}$.}
1682  \label{fig:r-epsilon}
1683\end{figure}
1684
1685Nous proposons d'utiliser la fonction de régularisation
1686\(r_{\epsilon}\paren{x}\) suivante~:
1687\[
1688r_{\epsilon}\paren{x}=p_{1}\paren{\Frac{x}{\epsilon}}
1689\]
1690où \(r_{1}\paren{x}\) est définie par~:
1691\[
1692r_{1}\paren{x}=
1693\left\{
1694  \begin{aligned}
1695    \Frac{x^{2}}{3}\paren{4-x^{2}} & \text{si} & \left|x\right| \leq 1 \\
1696    1                             & \text{si} & \left|x\right| > 1\\
1697  \end{aligned}
1698\right.
1699\]
1700
1701\begin{figure}[htbp]
1702  \centering
1703  \includegraphics[width=0.5\linewidth]{@abs_top_srcdir@/docs/tfel/images/r-epsilon-2.eps}
1704  \caption{représentation des fonctions $\pfrac{r_{1}\paren{x}}{x}$ et
1705    $\pfrac{r_{\pfrac{1}{4}}\paren{x}}{x}$}
1706  \label{fig:r-epsilon}
1707\end{figure}
1708
1709Les fonctions sont telles que~:
1710\begin{enumerate}
1711\item \(r_{\epsilon}\paren{\epsilon}=1\)
1712\item \(r_{\epsilon}\paren{-\epsilon}=1\)
1713\item \(r_{\epsilon}\paren{0}=0\)
1714\item \(\displaystyle\lim_{x\rightarrow 0} \Frac{r_{\epsilon}\paren{x}}{x}=0\)
1715\item \(\displaystyle\max_{x\in\mathbb{R}}\Frac{r_{\epsilon}\paren{x}}{x}\,\approx\,1,1\,\epsilon\)
1716\end{enumerate}
1717
1718\subsection{Application aux fonctions isotropes de tenseurs symétriques}
1719
1720Une fonction \(\tenseur{f}\) de tenseur d'ordre \(2\) symétrique est dite {\em
1721  isotrope} si elle vérifie~:
1722\[
1723\tenseur{f}\paren{\tilde{\tenseur{s}}}=\widetilde{\tenseur{f}\paren{\tenseur{s}}}
1724\]
1725pour changement de base représenté par \(\tilde{\mbox{}}\).
1726
1727Toute fonction définie par une série entière est isotrope. Ainsi les
1728fonctions logarithme \(\log\) et exponentielle \(\exp\) sont des
1729fonctions isotropes. Dans ce cas, \(f\) désigne à la fois une fonction
1730réelle et une fonction de tenseur d'ordre \(2\) symétrique.
1731
1732Une telle fonction peut être évaluée à l'aide des vecteurs propres et
1733des tenseurs propres~:
1734\[
1735f\paren{\tenseur{s}}=\sum_{i=1}^{3}f\paren{\lambda_{i}}\tenseur{n}_{i}
1736\]
1737
1738La dérivée de \(f\) par rapport à son argument est alors~:
1739\[
1740\begin{aligned}
1741\deriv{f}{\tenseur{s}}&=\sum_{i=1}^{3}f\primeexp\paren{\lambda_{i}}\tenseur{n}_{i}\,\otimes\,\tenseur{n}_{i}+\sum_{i=1}^{3}f\paren{\lambda_{i}}\deriv{\tenseur{n}_{i}}{\tenseur{s}}\\
1742&= \sum_{i=1}^{3}f\primeexp\paren{\lambda_{i}}\tenseur{n}_{i}\,\otimes\,\tenseur{n}_{i}
1743+ \Frac{f\paren{\lambda_{1}}-f\paren{\lambda_{2}}}{\lambda_{1}-\lambda_{2}}\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}
1744+ \Frac{f\paren{\lambda_{1}}-f\paren{\lambda_{3}}}{\lambda_{1}-\lambda_{3}}\tenseur{n}_{13}\,\otimes\,\tenseur{n}_{13}
1745+ \Frac{f\paren{\lambda_{2}}-f\paren{\lambda_{3}}}{\lambda_{2}-\lambda_{3}}\tenseur{n}_{23}\,\otimes\,\tenseur{n}_{23}
1746\end{aligned}
1747\]
1748
1749\paragraph{Cas où deux valeurs propres sont égales}
1750
1751Supposons que les valeurs propres \(\lambda_{1}\) et \(\lambda_{2}\)
1752sont égales. Nous avons alors~:
1753\[
1754\begin{aligned}
1755\deriv{f}{\tenseur{s}}&= \sum_{i=1}^{3}f\primeexp\paren{\lambda_{i}}\tenseur{n}_{i}\,\otimes\,\tenseur{n}_{i}
1756+ f\primeexp\paren{\lambda_{1}}\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}
1757+ \Frac{f\paren{\lambda_{1}}-f\paren{\lambda_{3}}}{\lambda_{1}-\lambda_{3}}
1758\left[\tenseur{n}_{13}\,\otimes\,\tenseur{n}_{13}+\tenseur{n}_{23}\,\otimes\,\tenseur{n}_{23}\right]
1759\end{aligned}
1760\]
1761
1762\paragraph{Cas où trois valeurs propres sont égales}
1763
1764Supposons que les trois propres \(\lambda_{1}\), \(\lambda_{2}\) et
1765\(\lambda_{3}\) sont égales. Nous avons alors~:
1766\[
1767\begin{aligned}
1768\deriv{f}{\tenseur{s}}&= f\primeexp\paren{\lambda_{1}}\left[
1769\sum_{i=1}^{3}\tenseur{n}_{i}\,\otimes\,\tenseur{n}_{i}
1770+\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}
1771+\tenseur{n}_{13}\,\otimes\,\tenseur{n}_{13}+\tenseur{n}_{23}\,\otimes\,\tenseur{n}_{23}\right]
1772\end{aligned}
1773\]
1774
1775Finalement,
1776\[
1777\begin{aligned}
1778\deriv{f}{\tenseur{s}}&= f\primeexp\paren{\lambda_{1}}\tenseurq{I}
1779\end{aligned}
1780\]
1781
1782\subsection{Cas particulier des parties positives et négatives des tenseurs}
1783
1784\subsubsection{Cas scalaire}
1785
1786La partie positive \(\ppos{x}\) d'un scalaire \(x\) est définie par~:
1787\[
1788\ppos{x}=
1789\left\{
1790    \begin{aligned}
1791      0 & \quad\text{si}\quad & x <    0 \\
1792      x & \quad\text{si}\quad & x \geq 0
1793    \end{aligned}
1794\right.
1795\]
1796
1797De même, la partie négative \(\pneg{x}\) est définie par~:
1798\[
1799\pneg{x}=
1800\left\{
1801    \begin{aligned}
1802      x & \quad\text{si}\quad & x \geq 0 \\
1803      0 & \quad\text{si}\quad & x >    0
1804    \end{aligned}
1805\right.
1806\]
1807
1808% ![Parties positive et négative d'un scalaire](img/ppos "Parties
1809% positive et négative d'un scalaire")
1810
1811Les parties positive et négative sont différentiables partout, sauf à
1812l'orgine qui constitue un point singulier. Nous proposons d'étendre la
1813définition classique de la dérivée ainsi~:
1814\[
1815\deriv{\ppos{x}}{x}=
1816\left\{
1817    \begin{aligned}
1818      0           & \quad\text{si}\quad & x < 0 \\
1819      \frac{1}{2} & \quad\text{si}\quad & x = 0 \\
1820      1           & \quad\text{si}\quad & x >    0
1821    \end{aligned}
1822\right.
1823\quad
1824\text{et}
1825\quad
1826\deriv{\pneg{x}}{x}=
1827\left\{
1828    \begin{aligned}
1829      1           & \quad\text{si}\quad & x < 0 \\
1830      \frac{1}{2} & \quad\text{si}\quad & x = 0 \\
1831      0           & \quad\text{si}\quad & x >    0
1832    \end{aligned}
1833\right.
1834\]
1835
1836\subsubsection{Définition dans le cas d'un tenseur}
1837
1838La décomposition spectrale d'un tenseur symétrique est défini ainsi~:
1839\[
1840\tepsilon=\sum_{i=1}^{3}\lambda_{i}\,\tenseur{n}_{i}
1841\]
1842où apparaissent les valeurs propres \(\lambda_{i}\) et les tenseurs
1843propres \(\tenseur{n}_{i}\) (voir la documentation de référence de
1844`TFEL` pour une définition). Ces tenseurs propres vérifient~:
1845\[
1846\tenseur{n}_{i}\,\colon\,\tenseur{n}_{j}=\delta_{ij}
1847\]
1848
1849La partie positive d'un tenseur est alors définie ainsi~:
1850\[
1851\ppos{\tepsilon}=\sum_{i=1}^{3}\ppos{\lambda_{i}}\,\tenseur{n}_{i}
1852\]
1853
1854Les parties positive et négative sont alors définies ainsi~:
1855\[
1856\begin{aligned}
1857  \ppos{\tepsilon}&=\sum_{i=1}^{3}\ppos{\lambda_{i}}\,\tenseur{n}_{i}\\
1858  \pneg{\tepsilon}&=\sum_{i=1}^{3}\pneg{\lambda_{i}}\,\tenseur{n}_{i}\\
1859\end{aligned}
1860\]
1861
1862\paragraph{Propriétés} Les parties positive et négative ont les
1863propriétés suivantes~:
1864\[
1865\begin{aligned}
1866  \tepsilon&=\ppos{\tepsilon}+\pneg{\tepsilon}  \\
1867  \ppos{\tepsilon}\,\colon\,\pneg{\tepsilon}&=0 \\
1868  \tepsilon\colon\,\tepsilon&=\ppos{\tepsilon}\,\colon\,\ppos{\tepsilon}+\pneg{\tepsilon}\,\colon\,\pneg{\tepsilon} \\
1869\end{aligned}
1870\]
1871
1872\paragraph{Calcul de la dérivée} Si toutes les valeurs propres sont
1873différentes, la dérivée de la partie positive d'un tenseur s'écrit~:
1874\[
1875\deriv{\ppos{\tepsilon}}{\tepsilon}=\sum_{i=1}^{3}\tenseur{n}_{i}\,\otimes\,\deriv{\ppos{\lambda_{i}}}{\tepsilon}+\ppos{\lambda_{i}}\,\deriv{\tenseur{n}_{i}}{\tepsilon}
1876\]
1877
1878Avec les résultats établis précédemment, nous avons~:
1879\[
1880\deriv{\ppos{\tepsilon}}{\tepsilon}=\sum_{i=1}^{3}\deriv{\ppos{\lambda_{i}}}{\lambda_{i}}\tenseur{n}_{i}\,\otimes\,\tenseur{n}_{i}
1881+\sum_{j\neg i}\Frac{\ppos{\lambda_{i}}}{\lambda_{i}-\lambda_{j}}\tenseur{n}_{ij}\,\otimes\,\tenseur{n}_{ij}
1882\]
1883
1884Cette définition admet une limite bien définie quand deux valeurs
1885propres sont égales. Supposons que \(\lambda_{1}\) et \(\lambda_{2}\)
1886soient proches. En rapprochant les termes en
1887\(\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}\) (en utilisant la
1888symétrie rappelée plus haut) et en faisant tendre \(\lambda_{1}\) vers
1889\(\lambda_{2}\), nous obtenons~:
1890\[
1891\displaystyle\Frac{\ppos{\lambda_{2}}-\ppos{\lambda_{1}}}{\lambda_{2}-\lambda_{1}}\,\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}
1892\rightarrow_{\lambda_{1}\rightarrow\lambda_{2}}\left.\deriv{\ppos{\lambda}}{\lambda}\right|_{\lambda=\lambda_{2}}\tenseur{n}_{12}\,\otimes\,\tenseur{n}_{12}
1893\]
1894
1895De même, si trois valeurs propres sont égales, nous avons le résultat
1896suivant~:
1897\[
1898\deriv{\ppos{\tepsilon}}{\tepsilon}=\deriv{\ppos{\lambda}}{\lambda}\,\tenseurq{I}
1899\]
1900
1901Pour conclure ce paragraphe, rappelons également quelques résultats
1902classiques~:
1903\[
1904\begin{aligned}
1905  \deriv{\trace{\ppos{\tepsilon}}^{2}}{\tepsilon}&=2\,\trace{\ppos{\tepsilon}} \\
1906  \deriv{\ppos{\tepsilon}\,\colon\,\ppos{\tepsilon}}{\tepsilon}&=2\,\ppos{\tepsilon}
1907\end{aligned}
1908\]
1909
1910\subsection{Dérivées première et seconde de fonctions des valeurs
1911  propres d'un tenseur symétrique}
1912
1913Considérons une fonction
1914\(f\paren{\lambda_{1},\lambda_{2},\lambda_{3}}\) des trois valeurs
1915propres \(\lambda_{1},\lambda_{2},\lambda_{3}\) d'un tenseur
1916symétrique \(\tenseur{s}\).
1917
1918\subsubsection{Dérivée première}
1919
1920La dérivée première se calcule simplement~:
1921\[
1922  \deriv{f}{\tenseur{s}}=\sum_{i=1}^{3}\deriv{f}{\lambda_{i}}\,\tenseur{n}_{ii}
1923\]
1924
1925\subsubsection{Dérivée seconde}
1926
1927La dérivée seconde se calcule ainsi~:
1928\[
1929  \Frac{\partial^{2}f}{\partial s\,\partial\tenseur{s}}=\sum_{i=1}^{3}\sum_{j=1}^{3}\Frac{\partial^{2}\,f}{\partial\lambda_{i}\,\partial\lambda_{j}}\,\tenseur{n}_{ii}\otimes\tenseur{n}_{jj}+\sum_{i=1}^{3}\deriv{f}{\lambda_{i}}\,\deriv{\tenseur{n}_{ii}}{\tenseur{s}}
1930\]
1931
1932\paragraph{Cas \(\lambda_{1}=\lambda_{2}\)} Dans ce cas, apparaît dans
1933l'expression précédente un terme singulier de la forme~:
1934\[
1935  \lim_{\lambda_{1}\rightarrow 0}\Frac{1}{\lambda_{1}-\lambda_{2}}\paren{\deriv{f}{\lambda_{1}}-\deriv{f}{\lambda_{2}}}
1936\]
1937
1938
1939\clearpage
1940\newpage
1941\referencecea
1942\listetableaux
1943\listefigures
1944
1945\newpage
1946\printindex{tclass}{Index des classes et des fonctions}
1947
1948\end{document}