Programmation C++/Les templates
Définitions des templates.
Un template est un patron définissant un modèle de fonction ou de classe dont certaines parties sont des paramètres (type traité, taille maximale).
Le patron de fonction sert à généraliser un même algorithme, une même méthode de traitement, à différents cas ou types de données.
Le mot clé codice_1 est suivi de la liste des paramètres du patron entre les signes codice_2 et codice_3, suivi de la définition de la fonction ou de la classe.
L'instanciation d'un patron permet la création effective d'une fonction ou d'une classe.
Patron de fonction.
Un patron de fonction est un modèle de fonction précédé du mot clé codice_1 et de la liste des paramètres du patron entre les signes codice_2 et codice_3.
Exemple avec un patron de fonction calculant la valeur maximale d'un tableau de données (le type étant le paramètre du patron de fonction) :
template<class T>
T max(T array[], int length)
 T vmax = array[0];
 for (int i = 1; i < length; i++)
 if (array[i] > vmax)
 vmax = array[i];
 return vmax;
Le type codice_7 utilisé pour le paramètre codice_8 est en fait un type de données, pas forcément une classe.
La norme a introduit plus tard le mot clé codice_9 qui peut venir se substituer à codice_7 dans ce cas-là.
Exemple d'utilisation :
int values[]={ 100, 50, 35, 47, 92, 107, 84, 11 };
cout « max(values, 8);
Le compilateur crée une fonction max à partir du type des arguments, en remplaçant le paramètre codice_8 par le type codice_12 dans le cas précédent.
Après remplacement le compilateur génère la fonction suivante :
int max(int array[], int length)
 int vmax = array[0];
 for (int i = 1; i < length; i++)
 if (array[i] > vmax)
 vmax = array[i];
 return vmax;
Si on utilise la fonction codice_13 avec différents types (codice_12, codice_15, ...), le compilateur générera autant de fonctions.
Les patrons permettent donc d'éviter d'écrire plusieurs fonctions pour chaque type de donnée traité. Quand on sait que la duplication inutile de code est source d'erreur, on comprend l'intérêt de mettre en facteur plusieurs fonctions potentielles dans un même patron de fonction.
Patron de classe.
La déclaration d'un patron de classe utilise une syntaxe similaire.
Exemple d'une classe gérant un tableau de données :
template<class T,int maxsize>
class CDataArray
 public:
 CDataArray();
 int getSize();
 T get(int index);
 bool add(T element); // true si l'élément a pu être ajouté
 private:
 T array[maxsize];
 int length;
L'implémentation du constructeur et des méthodes de la classe exige une syntaxe un peu plus complexe.
Par exemple, pour le constructeur :
template<class T,int maxsize>
CDataArray<T,maxsize>::CDataArray()
 : length(0) // Liste d'initialisation des données membres
La première ligne rappelle qu'il s'agit d'un patron de classe.
Le nom du constructeur est précédé du nom de la classe suivi des paramètres du patron de classe, afin que le compilateur détermine de quelle classe il s'agit.
Car en pratique, on peut très bien combiner patron de classe et patron de méthode, par exemple.
Les méthodes sont implémentées de manière identique :
template<class T,int maxsize>
int CDataArray<T,maxsize>::getSize()
 return length;
template<class T,int maxsize>
T CDataArray<T,maxsize>::get(int index)
 return array[index];
template<class T,int maxsize>
bool CDataArray<T,maxsize>::add(T element)
 if (length>=maxsize) return false;
 array[length++]=element;
 return true;
Contrairement aux patrons de fonctions, l'instanciation d'un patron de classe exige la présence de la valeur des paramètres à la suite du nom de la classe.
Exemple :
CDataArray<int,100> listeNumeros;
listeNumeros.add(10);
listeNumeros.add(15);
cout « listeNumeros.getSize() « endl;
Le compilateur génère une classe pour chaque ensemble de valeurs de paramètres d'instanciation différent.

Calcul tensoriel/Espace euclidien/Coordonnées sphériques/Tenseur métrique

En coordonnées sphériques
formula_1,
où formula_2 est l'angle azimutal et formula_3
est la colatitude,
le carré d'un élément de longueur vaut
formula_4
et donc le tenseur métrique vaut
formula_5
La racine carrée du déterminant du tenseur métrique vaut
formula_6.
L'inverse du tenseur métrique vaut
formula_7
Puisque le tenseur métrique en coordonnées cylindriques est diagonal, la
base naturelle
formula_8
est orthogonale et la
base orthonormée
s'écrit
formula_9.

Calcul tensoriel/Notions élémentaires/Transformation contraco

On transforme les composantes contravariantes d'un tenseur en composantes covariantes
au moyen du tenseur métrique :
Étant donné que formula_2 est la matrice inverse de formula_3,
on a

Calcul tensoriel/Espace-temps plan/Événement

Mercredi 22 février 2006, à 13 h GMT, le battant du carillon de Big-Ben est entré en contact avec sa cloche en un point bien précis.
Ce point de l'espace-temps est appelé événement.
Dans un système de coordonnées,
un événement de l'univers est décrit par 4 nombres. Par exemple, dans le système de coordonnées terrestre et l'heure GMT, on donnera la latitude, la longitude, l'altitude et l'instant. On dit que l'espace-temps est quadridimensionnel.

Calcul tensoriel/Notions élémentaires/Tenseur de courbure

La dérivée covariante seconde d'un champ scalaire "f" est un tenseur d'ordre 2
formula_1
Elle est symétrique parce que le
symbole de Christoffel
formula_2
est invariant par échange des indices bas
(espace sans torsion).
En revanche pour un champ de vecteurs formula_3, les dérivations covariantes ne commutent pas. 
Le tenseur de courbure de Riemann formula_4 permet de calculer
leur différence
formula_5

Calcul tensoriel/Notions élémentaires/Tenseur de Ricci

Le tenseur de Ricci est obtenu en contractant le
tenseur de courbure
entre un indice de la première paire et un indice de la seconde paire :
formula_1
Grâce à la symétrie par paires du tenseur de courbure, le tenseur de Ricci est symétrique.
Le tenseur de Ricci complètement contracté est un scalaire :
formula_2
La divergence du tenseur d'Einstein
formula_3
est nulle :
formula_4
Cette équation fondamentale se démontre en mettant en jeu la
nullité de la dérivée covariante du tenseur métrique.
C'est en identifiant le tenseur d'Einstein et le tenseur d'énergie-impulsion que l'on obtient l'équation
d'Einstein qui fonde la relativité générale.

Calcul tensoriel/Poubelle/Base naturelle

La base naturelle
formula_1
associée à un système de coordonnées
formula_2
permet d'écrire un élément de longueur infinitésimal sous la forme
formula_3
On a donc
formula_4

Calcul tensoriel/Notions élémentaires/Tenseur dualiseur