2. Les tables#

Les structures de données table sont produites dans Aster par création (CREA_TABLE), par lecture depuis un fichier (LIRE_TABLE) ou récupération dans un autre concept (RECU_TABLE). Ce sont fonctionnellement des tableaux de données hétérogènes (entiers, réels, chaînes de caractères) dont les colonnes sont identifiées par des noms de label.

Ce sont des structures pratiques dont l’emploi est généralisé dans le code. Par exemple, la plupart des commandes de post-traitement produisent des tables: pour relever des contraintes en des lieux géométriques donnés, pour produire des grandeurs macroscopiques calculées (post-traitements de mécanique de la rupture).

Soit par exemple la table tab1 suivanteissue d’un calcul Aster :

NOEUD

NUME_ORDRE

DX

\(\mathit{N2}\)

14

0.93

\(\mathit{N2}\)

15

1.16

\(\mathit{N1}\)

3

0.70

\(\mathit{N1}\)

2

0.46

\(\mathit{N1}\)

1

0.23

Tableau 2-1

Elle aurait aussi pu être directement créée comme concept Aster de type table par:

tab1=CREA_TABLE(LISTE = (

_F( PARA=’NOEUD’, LISTE_K=(‘N2’,’N2’,’N1’,’N1’,’N1’),), _F( PARA=’NUME_ORDRE’, LISTE_I=(14,15,3,2,1),), _F( PARA=’DX’, LISTE_R=(0.93,1.16,0.70,0.46,0.23),),)

On peut directement récupérer une valeur quelconque de la table dont on connaît la clé d’accès (nom de label de colonne) et le numéro de ligne:

>>> print tab1[’DX’,3]

0.70

Il est aussi possible de récupérer la totalité de la table dans l’environnement python via une classe dédiée, produite par la méthode EXTR_TABLE, attachée à la classe du concept ASTER :

tab2 = tab1.EXTR_TABLE()

tab2 est un objet python, instance de la classe Table du module Utilitai.Table. Il est manipulable avec les méthodes associées à cette classe; on pourra faire help(Table) pour connaître les méthodes de cette classe.

La table tab2 aurait aussi pu être définie directement par un dictionnaire:

From Utilitai.Table import Table

listdic = [    {'NOEUD': 'N2' ,'NUME_ORDRE': 14,'DX': 0.93, },

{“NOEUD”: “N2” ,”NUME_ORDRE”: 15,”DX”: 1. 16,}, {“NOEUD”: “N1” ,”NUME_ORDRE”: 3 ,”DX”: 0.70, }, {“NOEUD”: “N1” ,”NUME_ORDRE”: 2 ,”DX”: 0.46, }, {“NOEUD”: “N1” ,”NUME_ORDRE”: 1 ,”DX”: 0.23, }, ]

listpara=[“NOEUD”,”NUME_ORDRE”,”DX”]

listtype=[“K8”,”I”,”R”]

tab2=Table(listdic,listpara,listtype)

Les opérations possibles sur tab2 sont décrites ci-après.

2.1. Impression#

>>> tab2

----------------------------------------------

NOEUD        NUME_ORDRE    DX

N2            14                9.30000E-01

N2            15                1.16000E+00

N1            3                7.00000E-01

N1            2                4.60000E-01

N1            1                2.30000E-01

Aussi possible :

>>> print tab2

Affichage d’un seul paramètre :

>>> t.DX

----------------------------------------------

DX

9.30000E-01

1.16000E+00

7.00000E-01

4.60000E-01

2.30000E-01

La commande IMPR_TABLE exploite les fonctionnalités d’impression offertes par cette classe. Le lecteur intéressé pourra lire la programmation python de cette macro-commande. En particulier la possibilité d’imprimer des tableaux croisés.

2.2. Création ou impression d’une sous-table extraite par filtre#

Extraction suivant un seul critère :

>>> print tab2.NUME_ORDRE <=5

----------------------------------------------

NOEUD        NUME_ORDRE    DX

N1            3                7.00000E-01

N1            2                4.60000E-01

N1            1                2.30000E-01

Extraction suivant deux critères avec association logique «&» / ET:

>>> print (t.NUME_ORDRE < 10) & (t.DX>=0.3)

----------------------------------------------

NOEUD        NUME_ORDRE    DX

N1            3                7.00000E-01

N1            2                4.60000E-01

Extraction suivant deux critères avec association logique «|» / OU:

>>> print (t.NUME_ORDRE < 2) | (t.DX<0.5)

----------------------------------------------

NOEUD        NUME_ORDRE    DX

N1            1                2.30000E-01

N1            2                4.60000E-01

Extraction d’un nombre restreint de labels:

>>> t['DX','NUME_ORDRE']

----------------------------------------------

DX                NUME_ORDRE

9.30000E-01    14

1.16000E+00    15

7.00000E-01    3

4.60000E-01    2

2.30000E-01    1

Extraction suivant un critère d’égalité (ici avec valeur du critère déduite elle-même de la table)

>>> t.DX == max(t.DX)

----------------------------------------------

NOEUD        NUME_ORDRE    DX

N2            15                1.16000E+00

2.3. Tris#

Tri de la table entière suivant un label :

>>> t.sort('NUME_ORDRE')

>>> t


----------------------------------------------

NOEUD        NUME_ORDRE    DX

N1            1                2.30000E-01

N1            2                4.60000E-01

N1            3                7.00000E-01

N2            14                9.30000E-01

N2            15                1.16000E+00

Pour trier selon plusieurs labels, l’ordre de préséance étant celui dans lequel sont déclarés les labels, il faut fournir les labels sous forme de liste ou de tuple :

>>> t.sort(['NUME_ORDRE',’DX’])

Un second argument ordre, valant “CROISSANT” ou “DECROISSANT”, permet de préciser l’ordre de tri :

>>> t.sort(['NUME_ORDRE',’DX’],'DECROISSANT')

2.4. Accès aux valeurs#

Le contenu de la table est accessible par la méthode values() qui produit un dictionnaire dont les clés sont les paramètres d’accès de la table et les valeurs les colonnes :

>>> tab2.values()

{'NOEUD': [:ref:`'N1', 'N1', 'N1', 'N2', 'N2' <'N1', 'N1', 'N1', 'N2', 'N2'>`], 'NUME_ORDRE': [:ref:`1, 2, 3, 14, 15 <1, 2, 3, 14, 15>`], 'DX': [:ref:`0.23, 0.46, 0.70, 0.93, 1.156 <0.23, 0.46, 0.70, 0.93, 1.156>`]}

Les paramètres sont donnés par l’attribut para(idem tab2.values().keys() )

>>> tab2.para

['NOEUD', 'NUME_ORDRE', 'DX']