d4.06.01 Structures de données sd_maillage, sd_voisinage, sd_squelette et sd_grille#

Table des matières

Arborescence des Structures de Données#

sd_maillage (K8) ::= record


(o) '.DIME' : OJB S V I

'.NOMNOE' : OJB S N K8

'.COORDO' : sd_cham_no(GEOM_R)


(f) '.GROUPENO' : OJB XD     V I NO()

(f) '.PTRNOMNOE': OJB S        N K24


% si le maillage contient des mailles :

|        (o)    '.NOMMAI'     : OJB S N K8

'.TYPMAIL'     : OJB S V I

'.CONNEX'     : OJB XC V I NU()

(f) “.GROUPEMA” : OJB XD V I NO() (f) “.PTRNOMMAI”: OJB S N K24

% si le maillage contient des super-mailles (sous-structuration statique) :

(o) “.NOMACR” : OJB S V K8

“.PARA_R” : OJB S V R

“.SUPMAIL” : OJB XD V I NO()

% si le maillage a été obtenu par CREA_MAILLAGE / RESTREINT :

(o) “.MAOR” : OJB S V K8 long=1

“.CRNO” : OJB S V I

“.CRMA” : OJB S V I

% si le maillage contient une carte d’abscisse curviligne :

  1. “.ABSC_CURV” : sd_carte(ABSC_R)

  1. “.ABSCNO” : OJB S V R

    % si le maillage a été raffiné par Homard :

(o) “.GRLI” : OJB V I (o) “.GRLR” : OJB V R

Contenu des objets jeveux#

Objet .DIME#

'.DIME' : S V I LONG = 6


V(1) :    nb_no             : nombre de nœuds physiques du maillage

V(2) :    nb_nl             : nombre de nœuds de Lagrange du maillage

nb_nl > 0 : il existe des super-mailles : sous-structuration statique (sss)

V(3) : nb_ma : nombre de mailles du maillage

V(4) : nb_sm : nombre de super-mailles du maillage

nb_sm > 0 : sous-structuration statique

V(5) : nb_sm_mx : majorant du nombre de super-mailles

V(6) : dim_coor : /2 (si maillage 2D)

/3 (si maillage 3D)

Objet .NOMNOE#

'.NOMNOE' : S N K8 LONG = nb_no

C’est le pointeur de noms donnant la correspondance :

nom_de_nœud ↔ numéro_de_nœud

Objet .GROUPENO#

'.GROUPENO' : XD V I NO() VARI NB_OJB = nb_gno
  • nombre de group_no nb_gno = NUTIOC (“.GROUPENO”)

Soit V = “.GROUPENO” (nom_gno)

nb_no_gno = nombre de nœuds de nom_gno = LONUTI (V)

pour i = 1, nb_no_gno

V(i) : numéro du ièmenœud de nom_gno

Remarque importante :

Un group_no peut être vide (0 nœud). Un groupe vide est représenté par un vecteur de LONMAX=1 et LONUTI=0 *. Quand on veut savoir le nombre de d’éléments d’un groupe, il faut donc utiliser* JELIRA/LONUTI . Quand on crée un groupe, il faut penser à renseigner ( JEECRA ) les deux attributs ( LONMAX et LONUTI ).

Attention :

Le nombre de group_no d’un maillage peut changer : on peut modifier un maillage (commande DEFI_GROUP ) pour lui ajouter des group_no *.*

Objet .PTRNOMNOE#

“.PTRNOMNOE” : S N K24 LONG = nb_grno

C’est le pointeur de nom externe servant à stocker les noms de groupes de nœuds.

Objet .NOMMAIL#

'.NOMMAI' : S V K8 LONG = nb_ma

C’est le pointeur de noms donnant la correspondance :

nom_de_maille ↔ numero_de_maille

Objet .TYPMAIL#

'.TYPMAIL' : S V I LONGB = nb_ma

V(ima) : numéro du type de maille associé à la maille de numéro ima

  • les types de maille sont définis dans le catalogue /compelem/type_maille__.cata :

SEG2, TRIA3, QUAD4, …, HEXA20

  • les types de maille reconnus par Aster sont décrits dans [U3.01]

  • la correspondance : nom_de_type_de_maille ↔ numero_de_type_de_maille est accessible par le pointeur de nom : “&CATA.TM.NOMTM” cf. [D4.04.01].

Objet .CONNEX#

'.CONNEX' : XC V I NU() NB_OJB = nb_ma

Soit V = “.CONNEX” (ima)

V(1) : numéro du 1ier nœud de la maille de numéro : ima

V(n) : numéro du dernier nœud de la maille de numéro : ima

n = nombre de nœuds de la maille ima = LONMAX (V)

Le nombre de nœuds d’une maille est toujours le nombre de nœuds associé au type de maille

qui lui est attaché (voir objet “&CATA.TM.NBNO” [D4.04.01])

Objet .GROUPEMA#

'.GROUPEMA' : XD V I NO() VARI NB_OJB = nb_gma
  • nombre de group_ma nb_gma = NUTIOC (“.GROUPEMA”)

Soit V = “.GROUPEMA” (nom_gma)

nb_ma_gma = nombre de mailles de nom_gma = LONUTI (V)

pour i = 1, nb_ma_gma

V(i) : numéro de la ième maille de nom_gma

Remarque importante :

Un group_ma peut être vide (0 maille). Un groupe vide est représenté par un vecteur de LONMAX=1 et LONUTI=0 *. Quand on veut savoir le nombre de d’éléments d’un groupe, il faut donc utiliser* JELIRA/LONUTI . Quand on crée un groupe, il faut penser à renseigner ( JEECRA ) les deux attributs ( LONMAX et LONUTI ).

Attention :

Le nombre de GROUP_MA d’un maillage peut changer : on peut modifier un maillage (commande DEFI_GROUP ) pour lui ajouter des group_ma .

Objet .PTRNOMMAI#

“.PTRNOMMAI” : S N K24 LONG = nb_grma

C’est le pointeur de nom externe servant à stocker les noms de groupes de mailles.

Objets .NOMACR,.PARA_R, .SUPMAIL et .TYPL#

'.NOMACR' : S V K8 LONG = nb_sm

pour i = 1, nb_sm

V(i) : nom du MACR_ELEM_STAT associé à la super-maille \(i\)

'.PARA_R' : S V R LONG = 14*nb_sm

pour i = 1, nb_sm :

V(14*(i-1)+1) : TX

V(14*(i-1)+2) : TY

V(14*(i-1)+3) : TZ

V(14*(i-1)+4) : alpha

V(14*(i-1)+5) : beta

V(14*(i-1)+6) : gamma

V(14*(i-1)+7) : PX

V(14*(i-1)+8) : PY

V(14*(i-1)+9) : PZ

V(14*(i-1)+13) : dmini

V(14*(i-1)+14) : dmaxi

  • (TX, TY, TZ) sont les valeurs de translation de la transformation géométrique associée à la super-maille i

  • (alpha, beta, gamma) sont les angles nautiques (en radians) définissant la rotation de la transformation géométrique,

  • (PX, PY, PZ) définit le centre de la rotation précédente.

Soit macrost le MACR_ELEM_STAT associé à la super-maille i, la position de la super-maille i est définie par isométrie des nœuds de macrost. L’isométrie est la composition dans l’ordre : rotation PUIS translation.

  • Dmini : distance minimale entre 2 nœuds de la maille i,

  • dmaxi : distance maximale entre 2 nœuds de la maille i.

'.SUPMAIL' : XD V I NO() VARI NB_OJB = nb_sm

Soit V = “.SUPMAIL” (nom_sma)

V est un vecteur contenant les numéros des nœuds de la super-maille nom_sma. Les nœuds d’une super-maille peuvent être de type « physique » ou de type « Lagrange ».

Soit :

inop un numéro de nœud « physique » de la super-maille nom_sma

inol un numéro de nœud « Lagrange » de la super-maille nom_sma


1 ≤ inop ≤ nb_no

nb_no + 1 ≤ inol ≤ nb_no + nb_nl

V est une forme de recopie de l’objet “.CONX” du MACR_ELEM_STAT [D4.08.01].

V définit la connectivité des super-mailles.

Les super-mailles se « recollent » par des nœuds « physiques ».

Les nœuds de « Lagrange » hérités des MACR_ELEM_STAT ne sont jamais communs à plusieurs super-mailles.

Nombre total de nœuds (« physique » + « Lagrange ») de nom_sma = LONMAX (V)

Le pointeur de noms (interne) de l’objet “.SUPMAIL” donne la correspondance :

numero(super_maille)↔nom(super_maille)

'.TYPL' : S V I LONG = nb_nl

pour i = 1, nb_nl

V(i) : /-1 si le nœud de « Lagrange » i est de type « avant »

/-2 si le nœud de « Lagrange » i est de type « après »

Objet .ADAPTATION#

'.ADAPTATION' : S V I LONG = 1

V(1) : niveau d’adaptation (par Homard) du maillage.

Ce niveau est 0 en général. Il n’est non nul que si le maillage a été raffiné par Homard. Cette information n’est utilisée que par Homard.

Objet (11).FORM#

'(11).FORM' : S V K32 LONG = 2

Cet objet n’existe que si le maillage a été lu au format “MED”

V(1) : “MED”.

V(2) : nom du maillage MED.

Objets .MAOR, .CRMA et .CRNO#

Ces objets n'existent que dans un maillage obtenu par la commande:

CREA_MAILLAGE / RESTREINT.


.MAOR(1): contient le nom du maillage dont est issu le maillage (maillage «origine»).


L'objet .CRMA donne la correspondance entre les numéros des mailless du maillage origine et du maillage restreint:

.CRMA(ima_re)-> ima_orig


L'objet .CRNO donne la correspondance entre les numéros des nœuds du maillage origine et du maillage restreint:

.CRNO(ino_re)-> ino_orig

Objets .PTVOIS et .ELVOIS#

Ces objets décrivent les voisins des mailles d’un maillage.

Chaque voisin (i.e. maille voisine) a un type :

3D PAR FACE : F3 : 1

2D PAR FACE : F2 : 2

3D PAR ARRETE : A3 : 3

2D PAR ARRETE : A2 : 4

1D PAR ARRETE : A1 : 5

3D PAR SOMMET : S3 : 6

2D PAR SOMMET : S2 : 7

1D PAR SOMMET : S1 : 8

0D PAR SOMMET : S0 : 9

On stocke dans les objets .PTVOIS et .ELVOIS :

Pour toute maille M0 du maillage :

Nombre total de voisins NVTOT

Pour chaque voisin MV :

type du voisin

numéro de la maille

nombre de sommets communs entre M0 et MV : nso_com

Pour is = 1, nso_com :

Numéro local dans M0

Numéro local dans MV

Objets “.PATCH”, “.CONOPA”, “.COMAPA”#

Une macro-maille est un objet de la collection “.PATCH” et se caractérise par 3 objets: “.CONOPA”, “.COMAPA” et “.PTRNOMPAT” :

'.PATCH' : il s'agit d'une collection d'objets entiers contiguë à accès par numéro de patch de longueur variable


'.CONOPA' : il s'agit d'un objet vecteurs d'entiers permettant de créer la connectivité inverse d'un nœud à sa macro-maille.


'.COMAPA' : il s'agit d'un objet vecteurs d'entiers permettant de créer la connectivité inverse d'une maille à sa macro-maille.'.PTRNOMPAT' : il s'agit d'un vecteurs de K24 permettant de relier le numéro du patch au nom du groupe de maille associé.

Spécificité de la structure de données squelette#

Un squelette étant le maillage de restitution d’un calcul par sous-structuration, la structure de données squelette est calquée sur celle de la structure de données d’un maillage. On y retrouve tous les éléments décrits précédemment. On y ajoute l’objet “.INV.SKELETON” afin de préciser, pour chaque nœud du squelette, la sous-structure dont il fait partie à l’origine et à quel nœud de cette sous-structure il correspond :

Soit nb_no le nombre de nœuds du maillage inclu dans le squelette.

'.INV.SKELETON' : OJB V I LONG = 2 * nb_no

Soit V = “.INV.SKELETON”

pour i = 1 , nb_no

V(i) : numéro de la sous-structure d’origine du nœud i

pour i = nb_no + 1, 2 * nb_no

V(i) : numéro du nœud i dans sa sous-structure d’origine

Si le squelette a été obtenu à partir d’un squelette (DEFI_SQUELETTE / RECO_GLOBAL):

'.CORRES' : OJB V I LONG = nb_no-nbmoi


C’est un objet facultatif, il existe seulement lorsqu’on crée un squelette en modifiant un ancien (mot clé SQUELETTE est renseigné dans le catalogue de la commande). Dans ce cas, on va fusionner les nœuds des interfaces (toutes les interfaces ou seulement celles données par l’utilisateur) selon un critère indiqué derrière le mot-clé CRITERE. On effectue donc le «recollement». Ici nbmoi est le nombre de nœuds fusionnés aux interfaces dynamiques (n’existe plus dans le nouveau squelette).

Pour le nœud ino du squelette, .CORRES(ino) est le numéro du nœud du squelette initial (avant «recollement»).

'.NOMSST' : OJB V K8 LONG = nbss

Objet facultatif qui existe dans le cas d ‘un squelette dit « classique » (squelette initial lorsqu’on renseigne les sous-structures qui vont le former). Sa longueur est égale au nombre des sous-structures qui forment le squelette.

Il contient les noms des sous-structures qui forment le squelette.

Remarque:

Cet objet ne sert pas en dehors de la commande DEFI_SQUELETTE. Néanmoins, il doit (malheureusement !) faire partie de la sd_squelette. En effet, si l’on fait :

SQUEL1= DEFI_SQUELETTE(...)

SQUEL2= DEFI_SQUELETTE(..., SQUELETTE=SQUEL1, ...)

L’objet SQUEL1.NOMSST sera utilisé pour construire SQUEL2.

Si le squelette a été obtenu à partir d’un maillage (DEFI_SQUELETTE / MAILLAGE) :

'.ANGL_NAUT': V K8 LONG = 3

angles nautiques de la rotation du squelette par rapport au maillage dont il est issu.

'.TRANS': V K8 LONG = 3

coordonnées du vecteur qui donne la translation du squelette par rapport au maillage dont il est issu.

Spécificité de la structure de donnés grille#

La spécificité d’une grille est que ses nœuds sont alignés selon les directions d’une base locale de la grille. Ce type de maillage est utilisé avec des algorithmes basés sur des méthodes aux différences finies. En conséquence, la base locale \(({X}_{\mathit{loc}},{Y}_{\mathit{loc}},{Z}_{\mathit{loc}})\) , la table de connexion des nœuds et la distance entre deux nœuds alignés de la grille doivent être stockés en ajoutant ces informations dans la sd_maillage.

Soit nb_no le nombre de nœuds du maillage qui forment la grille.

'.GRLI' : OJB V I LONG = 6*nb_no

Dans cet objet on stocke la table de connexion des nœuds de la grille.

Soit V= “.GRLI”:

pour i = 1 : nb_no

V(6*(i-1)+1) : nœud suivant le nœud \(i\) selon la direction du vecteur \({X}_{\mathit{loc}}\)

V(6*(i-1)+2) : nœud précédent le nœud \(i\) selon la direction du vecteur \({X}_{\mathit{loc}}\)

V(6*(i-1)+3) : nœud suivant le nœud \(i\) selon la direction du vecteur \({Y}_{\mathit{loc}}\)

V(6*(i-1)+4) : nœud précédent le nœud \(i\) selon la direction du vecteur \({Y}_{\mathit{loc}}\)

V(6*(i-1)+5) : nœud suivant le nœud \(i\) selon la direction du vecteur \({Z}_{\mathit{loc}}\)

V(6*(i-1)+6) : nœud précédent le nœud \(i\) selon la direction du vecteur \({Z}_{\mathit{loc}}\)

Si le nœud \(i\) n’a pas de nœud suivant ou précédent dans l’une des trois directions, l’élément correspondant du vecteur \(V\) est mis à zéro. Dans ce cas le nœud \(i\) est sur la surface libre de la grille.

'.GRLR' : OJB V R LONG = 10+6*nb_no

Dans cet objet on stocke la longueur de la plus petite arête de la grille, la base locale \(({X}_{\mathit{loc}},{Y}_{\mathit{loc}},{Z}_{\mathit{loc}})\) et la distance entre les nœuds connectés de la grille.

Soit \(W='.\mathit{GRLR}'\)

W(1) : longueur de la plus petite arête de la grille

W(2) : composante \(X\) du premier vecteur \({X}_{\mathit{loc}}\) de la base locale de la grille

W(3): composante \(Y\) du premier vecteur \({X}_{\mathit{loc}}\) de la base locale de la grille

W(4) : composante \(Z\) du premier vecteur \({X}_{\mathit{loc}}\) de la base locale de la grille

W(5) : composante \(X\) du deuxième vecteur \({Y}_{\mathit{loc}}\) de la base locale de la grille

W(6) : composante \(Y\) du deuxième vecteur \({Y}_{\mathit{loc}}\) de la base locale de la grille

W(7) : composante \(Z\) du deuxième vecteur \({Y}_{\mathit{loc}}\) de la base locale de la grille

W(8) : composante \(X\) du troisième vecteur \({Z}_{\mathit{lo}}\) cde la base locale de la grille

W(9) : composante \(Y\) du troisième vecteur \({Z}_{\mathit{loc}}\) de la base locale de la grille

W(10) : composante \(Z\) du troisième vecteur \({Z}_{\mathit{loc}}\) de la base locale de la grille

pour i = 1 : nb_no

W(10+6*(i-1)+1) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+1)suivant selon la direction du vecteur \({X}_{\mathit{loc}}\)

W(10+6*(i-1)+2) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+2)précédent selon la direction du vecteur \({X}_{\mathit{loc}}\)

W(10+6*(i-1)+3) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+3)suivant selon la direction du vecteur \({Y}_{\mathit{loc}}\)

W(10+6*(i-1)+4) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+4)précédent selon la direction du vecteur \({Y}_{\mathit{loc}}\)

W(10+6*(i-1)+5) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+5)suivant selon la direction du vecteur \({Z}_{\mathit{loc}}\)

W(10+6*(i-1)+6) : valeur absolue de la distance entre le nœud \(i\) et le nœud V(6*(i-1)+6)précédent selon la direction du vecteur \({Z}_{\mathit{loc}}\)

Si le nœud \(i\) n’a pas de nœud suivant ou précédent dans l’une des trois directions, l’élément correspondant du vecteur \(W\) est mis à zéro. Dans ce cas le nœud \(i\) est sur la surface libre de la grille.