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}