1. Présentation générale et justification#

La définition des types real et double precision par la norme FORTRAN 77 ne permet pas de réaliser des logiciels scientifiques portables, avec unicité de source et des performances numériques comparables [bib1], [bib2]. FORTRAN 90 intègre la notion de longueur lors de la déclaration des différents types mais malheureusement ceci n’apporte aucune assurance quant à la précision réelle utilisée, cette dernière dépendant de l’implémentation du compilateur.

La norme IEEE-P745 [3] définit les bornes de précision binaire mais n’est pas appliquée par tous:

type

chiffres significatifs

toujours

parfois

simple précision

6

7 ou 8

double précision

15

16

simple étendue

>9

double étendue

>18

Il est donc nécessaire de suppléer aux imperfections de la norme FORTRAN 77, qui ne fixe pas de règles de représentation des nombres, bien qu’il existe des algorithmes appropriés permettant de déterminer certains paramètres dynamiquement.

Cette version d’ENVIMA est issue d’une précédente réalisation datant de 1990 qui s’est révélée trop foisonnante, de nombreuses fonctions n’ayant jamais été utilisées dans Code_Aster . Leur réalisation en FORTRAN a été remplacée par un code écrit en C permettant de les regrouper avec l’ensemble des fonctions présentant des adhérences aux machines et/ou aux systèmes d’exploitation. À cette occasion, les fonctions de type complexe dont l’usage était marginal, et qui présentent une réelle difficulté de portabilité le type complexe existant en FORTRAN mais pas en C, ont été purement supprimées.

Le progiciel ENVIMA regroupe plusieurs fonctions sans arguments, de nom —EM, qui permettent d’accéder, à partir de n’importe quelle routine FORTRAN, aux paramètres nécessaires caractérisant la machine sur laquelle le traitement est réalisé.

Les paramètres sont définis statiquement dans chaque version du progiciel pour:

  • les entiers: longueur, valeurs extrémales ;

  • les logiques: longueur ;

  • les flottants: base du système de représentation, longueur de la mantisse, précision relative, valeurs extrémales représentables ;

  • les constantes: constantes particulières (\(\pi\) , NaN, ..) ;

  • les fichiers: tailles limites (liées aux contraintes d’exploitation des machines).

Quatre groupes de fonctions sont disponibles:

  • paramètres arithmétiques (définition des nombres),

  • paramètres pour l’utilisation de la mémoire centrale,

  • paramètres pour l’utilisation des mémoires auxiliaires (fichiers),

  • valeurs de constantes.

Quelques définitions :

  • Unité d’adressage : Chaque constructeur définit pour une machine un mode d’adressage des informations en mémoire; l’unité de mesure de cette adresse est l’unité d’adressage: le mot était utilisé autrefois sur certaines plates-formes, c’est maintenant l’octet sur la plupart des stations de travail à base de processeurs x86.

  • Longueur : Chaque type de variable est caractérisé par une longueur de représentation en machine ; celle-ci peut être mesurée en bits, en octets ou en unités d’adressage. Le gestionnaire de mémoire JEVEUX utilisé dans Code_Aster requiert cette information lors de la définition de l’attribut de type des objets créés.

1.1. Paramètres arithmétiques#

1.1.1. Représentation des nombres entiers#

Quatre paramètres sont disponibles pour les variables de type entier standard (integer):

  • la longueur d’un entier mesurée en bits, en octets, ou en unités d’adressage;

  • le nombre maximum de chiffres significatifs pour représenter le nombre en décimal;

  • la valeur maximale représentable c’est à dire le plus grand entier positif \(i\) tel que tous les entiers de l’intervalle \([-i,+i]\) soient représentés par le type entier;

  • la gamme définie par le plus grand entier \(i\) tel que:

    • \(-i\) soit exact,

    • pour formule \(-i<{i}_{a},{i}_{b}<+i\) l’opération formule \(\mid {i}_{a}\oplus {i}_{b}\mid ` avec formule :math:\)oplus in lbrace +,-,ast rbrace` : soit exacte et n’excède pas formule \(i\) en valeur absolue.

1.1.2. Représentation des nombres réels#

La définition du type réel standard dans la norme FORTRAN 77 ne permet pas de réaliser des logiciels portables avec unicité de source et performances numériques comparables. Pour atteindre cet objectif, nous avons choisi d’utiliser dans l’ensemble de Code_Aster le type hors norme REAL*8, admis par de très nombreux compilateurs et qui conduit aux représentations les plus voisines (64 bits sur toute plate forme).

On peut donner l’image suivante de la représentation machine des nombres flottants:

\(x=\sigma {B}^{E}\sum_{k=1}^{N}x(k){B}^{-k}\) où \(x\) désigne un nombre réel,

\(\sigma\) le signe,

\(B\) la base de représentation (2 la plupart du temps),

\(E\) l’exposant ( \({E}_{min}\le E<{E}_{max}\) ),

\(N\) le nombre de digits alloués à la mantisse.

Cette représentation impose évidemment \(0<x(1)<B\) et \(0<x(i)<B\) pour \(1<i<N\) . On constate donc que deux réels distincts \({x}_{1}\) et \({x}_{2}\) dont la représentation ci-dessus s’écrit avec le même exposant \(E\) peuvent différer au minimum de \({B}^{N}\) . Lorsque l’exposant diffère d’une unité, la différence entre les deux réels est au minimum de \({B}^{1-N}\) .

Les valeurs \(B,N,{E}_{min}\) et \({E}_{max}\) ont été introduites dans le logiciel et peuvent être récupérées par la fonction adéquate.

Il est alors aisé de définir les valeurs caractéristiques suivantes : le plus petit réel positif : \({B}^{{E}_{min}-1}\) , le plus grand réel positif : \({B}^{{E}_{max}}(1-{B}^{N})\) , le plus petit incrément relatif : \({B}^{-N}\) , le plus grand incrément relatif : \({B}^{1-N}\)

Les paramètres disponibles sont:

  • la longueur en bits, en octets ou en unités d’adressage;

  • le nombre maximum de chiffres significatifs pour représenter le nombre en décimal;

  • la base de représentation B des nombres flottants;

  • la longueur de la mantisse;

  • la précision relative est telle qu’aucun réel autre que 1.0 ne soit représenté par: formule \(1.0-{\varepsilon}_{1}<1.0<1.0+{\varepsilon}_{2}\) avec \({\varepsilon}_{1}=(1/b){\varepsilon}_{2}\)

  • les valeurs extrémales positives représentables: maximum (overflow) et minimum (underflow);

  • la gamme est définie par le plus grand réel tel que si \({\varepsilon}_{1,}{\varepsilon}_{2,}{\varepsilon}_{3}\) sont de l’ordre de la précision relative formule \({\varepsilon}_{1}\) :

    • formule \(-x\) soit correctement représentable par formule \(-x(1.\pm {\varepsilon}_{1})\) ;

    • pour formule \(1/x<\mid a\mid ,\mid b\mid <x\) l’opération formule \(a\oplus b\) avec \(\oplus \in \lbrace +,-,\mathrm{\ast },/\rbrace ` est telle que formule :math:`1/x<\mid a\oplus b\mid <x\) est correctement représentée par formule \(a(1\pm {\varepsilon}_{2})\oplus b(1\pm {\varepsilon}_{3})\) .

1.1.3. Représentation des logiques#

Un seul paramètre est nécessaire:

  • la longueur en octets.

1.2. Valeurs spéciales#

La valeur réelle NaN (Not a Number) peut être obtenue sur les machines supportant une arithmétique IEEE. Historiquement sur les serveurs CRAY la valeur utilisée était UNDEF, elle pouvait s’appliquer aux flottants mais aussi aux entiers. Cette valeur est utilisée dans certains cas (recherche de bug) pour réinitialiser les zones mémoire associées aux objets gérés par JEVEUX.

L’affectation de variables par la valeur NaN permet ensuite de détecter leur usage dans des opérations flottantes car elle provoque immédiatement un arrêt du code avec émission d’un signal (handler) qui peut être récupéré.

1.3. Paramètre lié à l’utilisation de la mémoire centrale#

La longueur en octets de l’unité d’adressage de la machine est le seul paramètre accessible.

1.4. Paramètres d’utilisation des fichiers#

Deux paramètres sont disponibles:

  • la taille maximum en octets d’un fichier,

  • la taille maximum en octets de l’ensemble des fichiers ouverts.

Ils ont été introduits uniquement en raison des contraintes liées à l’exploitation de ressources partagées (sur le serveur centralisé aster, limitation de l’espace temporaire de fichiers associé à un travail batch) et sont utilisés dans la gestion des fichiers d’accès direct binaire du gestionnaire de mémoire.

1.5. Constantes mathématiques#

Un jeu de constantes universelles (optimales dans le type demandé) est fourni à l’utilisateur.

Ces constantes sont (actuellement):

  • les valeurs de \(\pi\) et de \(2\pi\) ,

  • la valeur du zéro absolu pour la température,

  • les paramètres de conversion radian/degré et degré/radian.