d4.06.10 Structure de Données sd_matr_asse#
Résumé:
Ce document décrit les structures de données sd_matr_asse : les matrices creuses.
Table des matières
Arborescences#
sd_matr_asse(K19) ::=record
♦ '.REFA' : OJB S V K24
♦ “.VALM” : OJB XD V R/C NUM() nbobj=1/2
◊ # si il existe des ddls de Lagrange :
♦”.CONL” : OJB S V R
◊ # si la sd_matr_asse a été « factorisée » (routine preres.F90) :
/ # si factorisée avec MULT_FRONT :
♦ '.VALF : OJB XD V R/C NUM()
◊ # si la matrice est non symétrique :
♦ '.WALF : OJB XD V R/C NUM()
/ # si factorisée avec LDLT :
♦ '.UALF : OJB XD V R/C NUM()
/ # si factorisée avec GCPC + LDLT_INC :
♦ '.PERM : OJB S V I
/ # si factorisée avec LDLT ou MULT_FRONT :
♦ '.DIGS : OJB S V R/C
◊ # si il existe des charges cinématiques :
♦ '.CCID' : OJB S V I
♦ '.CCLL' : OJB S V I
♦ '.CCVA' : OJB S V R/C
♦ '.CCII' : OJB S V I
Contenu des OJB#
Objet .REFA#
.REFA S V K24 dim=20
.REFA(1) = nom du sd_maillage sous-jacent.
.REFA(2) = nom du sd_nume_ddl.
.REFA(3) = “ “ / “ELIMF” / “ELIML”
“ “ : Il n’existe pas de charges cinématiques.
“ELIMF”: Il existe des charges cinématiques.
Une partie du .VALMa été copiée dans .CCVA
.VALMa été partiellement remplacé par une matrice unité (sur les ddls éliminés)
“ELIML” : Il existe des charges cinématiques.
.CCVA n’a pas encore été créé
.VALM n’a pas encore été recopié dans .CCVA
voir mtmchc.f pour les détails
.REFA(4) = nom de l’OPTION de calcul (ou bien la chaine: “&&MELANGE”).
.REFA(5) = “ “
.REFA(6) = “ “
.REFA(7) = “ “ / nomsolv
nomsolv : nom du solveur à utiliser (par défaut) lors des résolutions.
.REFA(8) = “ “ / “ASSE” / “DECT” / “DECP”
“ “ ou “ASSE” : matrice dans son état initial (non factorisée)
“DECT” : matrice entièrement factorisée
“DEPT” : matrice partiellement factorisée (possible uniquement si LDLT)
.REFA(9) = “MS” / “MR”
“MS” : matrice symétrique
“MR” : matrice non-symétrique
.REFA(10) = / “NOEU”: les ddls de la matrice sont portés par des nœuds
/ “GENE”: les ddls de la matrice sont des ddls généralisés.
.REFA(11) = “MPI_COMPLET” / “MPI_INCOMPLET” / “MATR_DISTR”
“MPI_COMPLET” : Les objets .VALM (et .CCVA) sont « complets »
“MPI_INCOMPLET” : Les objets .VALM (et .CCVA) sont « incomplets » du fait d’un calcul MPI distribué. Chaque processeur n’assemble que les éléments finis qui lui sont affectés.
“MATR_DISTR” : Si MATR_DISTRIBUEE=”OUI”
Cette option dimensionne au plus juste la matrice assemblée en fonction du nombre d’inconnues présentes sur le processeur courant.
Remarque :
si “ MPI_INCOMPLET” , les objets .VALM et .CCVA sont alloués à leur taille normale, mais ils sont partiellement remplis de « 0 » . si “ MATR_DISTR” , l’objet .VALM est cette fois d’une taille plus petite que dans le cas “MPI_INCOMPLET” .
.REFA(17) = “ “ / “XFEM_PRECOND”
“ “ : Aucun pré-conditionneur XFEM n’a été appliqué à la matrice. La résolution se poursuit sans traitement particulier, relatif au pré-conditionnement XFEM.
“XFEM_PRECOND” : La matrice a été modifiée à l’aide du pré-conditionneur XFEM. Il faut prendre en compte cette modification dans la suite du calcul.
Remarque :
Si la matrice est modifiée par le pré-conditionneur XFEM, cela implique, qu’il y a au moins un objet pré-conditionneur stocké en mémoire. Cet objet est utile pour la suite du calcul (pour la modification du second membre et de la solution).
.REFA(18) = “ “ / “&&XFEM_PC_1”
“ “ : Aucun pré-conditionneur XFEM n’est stocké.
“&&XFEM_PC_1” : Le pré-conditionneur XFEM est stocké dans un emplacement «JEVEU» fixe .
Concernant le format de stockage de l’objet «JEVEU», la matrice de pré-conditionnement est stockée dans une nouvelle sd_matr_asse. On génère un nouvel .VALM (non-symétrique) et un nouveau NUME_DDL respectant la numérotation des équations de la matrice initiale. La gestion de l’objet pré-conditionneur XFEM s’effectue comme une «sd_matr_asse» classique, décrite dans ce document.
Remarque :
Même si l’adresse du pré-conditionneur est stockée dans le . REFA de la matrice originale, il n’existe pas de chaînage des adresses «sd_matr_asse». En effet, l’adresse du pré-conditionneur est fixe et on n’a pas besoin de connaître l’adresse de la matr_asse pour tester l’existence d’un pré-conditionneur, ce qui simplifie la gestion en mémoire de ces deux objets interdépendants.
Par ailleurs, comme le pré-conditionneur XFEM n’est effectif qu’en calcul séquentiel, l’application réciproque de l’adresse d’un pré-conditionneur vers la matr_asse originale n’est pas construite pour le moment.
.REFA(19) = matred / “ “
Nom de la matrice «réduite» obtenue en supprimant les équations de Lagrange (fonctionnalité SOLVEUR / ELIM_LAGR=”OUI”).On parle aussi de matrice «fille»
.REFA(20) = matmere / “ “
Nom de la matrice «mère» de la matrice si celle-ci a été obtenue en supprimant les équations de Lagrange de matmere (fonctionnalité SOLVEUR / ELIM_LAGR=”OUI”).
DOCU(“.REFA”) = / “ASSE” matrice initiale,
/ “DECT” matrice complètement factorisée,
/ “DECP” matrice partiellement factorisée.
Objet .VALM#
.VALM XD V R/C NUM()
Cet objet contient les valeurs des termes non nuls de la matrice (au format Morse). Il y a 1 (ou 2) élément(s) dans cette collection (2 si la matrice est non symétrique).
Le 1er élément de la collection contient la partie supérieure de la matrice,
Le 2ème contient la partie inférieure.
Remarques :
** Pour les matrices non-symétriques, la diagonale est donc stockée 2 fois;*
On convient de n’utiliser que la diagonale stockée dans la partie supérieure (VALM(1));
** L’arrangement des termes de la matrice dans les blocs est expliqué dans la documentation*
de la sd_stockage [D4.06.07];
** Même si la matrice n’est pas symétrique, son profil (mapping des termes non nuls) reste symétrique. Un seul profil s’applique donc sur ses deux parties supérieure et inférieure.*
Objet .CONL#
.CONL S V R dim=neq
neq est le nombre d’équations du système
Cet objet facultatif n’est présent que si il existe au moins un ddl de type “LAGR” :
V(ieq) = csi ieq correspond à un DDL nommé “LAGR”,
1.sinon.
c est le coefficient de conditionnement des ddls de Lagrange.
Objet .DIGS#
.DIGS S V R/C dim=2*neq
neq est le nombre d’équations du système
Cet objet n’est présent que si la matrice a été factorisée par “LDLT” ou “MULT_FRONT”
DIGS(1:neq) : valeurs de la diagonale de la matrice initiale
DIGS(neq+1:2*neq) : valeurs de la diagonale de la matrice factorisée
Objet .PERM#
.PERM S V I dim=neq
neq est le nombre d’équations du système
Cet objet n’est présent que si la matrice est le résultat du pré-conditionnement par “GCPC” + “LDLT_INC” d’une autre matrice. Il sert à établir la correspondance entre la numérotation des équations dans la matrice initiale et sa matrice de pré-conditionnement. En effet, la matrice de pré-conditionnement a été renumérotée avec l’algorithme “RCMK” (Reverse CUTHILL - Mc KEE)
Soit: B=FACTORISER(MATR_ASSE=A, METHODE=”GCPC”, PRE_COND=”LDLT_INC”)
PERM(ieq_A) : ieq_B
où ieq_A et ieq_B sont les numéros d’équations dans les matrices A et B.
Cet objet a le même contenu que l’objet .M2LC de la sd_stockage.
Objets .UALF, .VALF, .WALF#
Ces collections contiennent les termes de la matrice factorisée.
.UALF contient la matrice factorisée avec LDLT:
symétrique : collection de taille nblocs
non-symétrique : collection de taille 2*nblocs
.VALF contient la matrice factorisée avec MULT_FRONT de la partie supérieure
.WALF contient la matrice factorisée avec MULT_FRONT de la partie inférieure
Remarques :
** L’arrangement des termes de la matrice dans les blocs est expliqué dans la documentation*
de la sd_stockage [D4.06.07];
** Pour le stockage LDLT (* .UALF ), le nombre de blocs est doublé en cas d’une matrice non symétrique. Les nblocs premiers correspondent aux valeurs associées à la partie supérieure de la matrice tandis que les derniers nblocs correspondent à la partie inférieure de la matrice.
** Même si la matrice n’est pas symétrique, son profil (mapping des termes non nuls) reste symétrique. Un seul profil s’applique donc sur ses deux parties supérieure et inférieure.*
Objets liés à la présence de charges cinématiques éliminées#
.CCID S V I dim=neq+1
.CCID(ieq)= 1 si le ddl ieq éliminé,
0 sinon.
.CCID(neq)= nelim : nombre de ddls éliminés
.CCLL S V I dim=3*nelim
nelim est le nombre de ddls « éliminés ».
.CCLL((i-1)*3+1) : ieq
.CCLL((i-1)*3+2) : i1
.CCLL((i-1)*3+3) : i2
ieq est le numéro de l’équation correspondante au ième ddl éliminé,
i1 est le nombre de termes stockés pour l’équation ieq
i2 est le nombre cumulé de termes stockés pour les équations j < i
.CCVA S V R/C
L’objet .CCVA contient les colonnes de la matrice initiale correspondantes aux ddls à éliminer (ceux qui sont imposés par une charge « cinématique »). Plus précisément, on stocke la sous-matrice des termes sur des lignes correspondantes à des DDLs libres et des colonnes à des DDLs imposés.
.CCII S V I
L’objet .CCII a la même structure que l’objet .CCVA. Il contient les indices de lignes des termes stockés dans le .CCVA
Lorsque la matrice est distribuée,
L’objet .CCID est identique sur tous les processeurs et sa dernière valeur (nelim) est le nombre total (global) de ddls éliminés.
L’objet .CCLL est de même longueur sur tous les processeurs mais son contenu est différent car il contient des numéros d’équations locaux.
Les objets .CCII et .CCVA sont de longueurs différentes sur les différents processeurs et leurs contenus sont liés au matrices locales.