d4.07.02 Structures de données sd_resu_dyna, sd_dyna_phys et sd_dyna_gene#
Résumé:
Ce document décrit les structures de données utilisées pour le calcul de réponse transitoire ou harmonique à l’aide de l’opérateur DYNA_VIBRA.
Table des matières
Construction des structures de données des opérateurs de la dynamique#
La figure ci-dessous illustre l’organisation des structures de données de l’ensemble de types produits par des opérateurs de la dynamique listés dans la section précédente.
Arborescence d’une Structure de Données sd_resu_dyna#
Toute structure de données de type sd_resu_dyna doit contenir obligatoirement les objets “.REFD” et “.INDI” dont l’arborescence est donnée ci-dessous:
'sd_resu_dyna' (K19) ::== record
(o) '.REFD' OJB XC V K24
'.INDI' OJB S V I
Contenu des objets JEVEUX d’une sd_resu_dyna#
Objet “.REFD”#
Cet objet est une collection de vecteurs contenant les informations sur les matrices de masse, amortissement et rigidité mais également d’autres informations telles que la numérotation (NUME_DDL) ou encore la liste d’interfaces dynamiques et statiques ayant servi au calcul produisant le concept.
Objet “.INDI”#
Cet objet fait l’indirection entre le numéro d’ordre des champs enregistrés et les objets enregistrés dans la collection “.REFD”.
- Remarque
De manière générale, la longueur de l’objet “.INDI” est égale au nombre d’occurrences de la collection “.REFD”. En revanche, lorsque la longueur de l’objet “.INDI” est égale à 1 et sa valeur à -1, on considère que tous les champs sont en rapport avec la première occurrence de l’objet “.REFD”.
Routines utilitaires pour la manipulation des sd_resu_dyna#
L’accès aux informations contenues dans les objets JEVEUX “.REFD” et “.INDI” des structures de données sd_dyna_resu peut se faire via l’utilitaire DISMOI tel que décrit dans la documentation [D6.07.05].
Par ailleurs, les routines Fortran suivantes sont disponibles pour la modification des objets “.REFD” et “.INDI” des sd_resu_dyna.
subroutine refdaj(arret, result, nbordr, numer, typre, conre, codret)
But : Ajouter une nouvelle entrée de référence à un resultat dynamique s’appuyant sur une sd_resu-dyna. Les objets “.REFD” et “.INDI” seront enrichis.
Exemples:
call refdaj ('F', modmec, nbordr, prchno, 'DYNAMIQUE', matric,iret)
call refdaj ('F', tragen, nbordr, numddl, 'DYNAMIQUE', matric,iret)
call refdaj ('F', ritzba, nbordr, numddl, 'INTERF_DYNA', intdyn, iret)
subroutine refdcp(resin, resout)
But : Copier le contenu des références dynamiques du résultat resin dans le résultat resout
subroutine refdag(resin)
But : Doubler la taille des objets conteneurs des références dynamiques “.REFD” et “.INDI”.
- Note
Cette routine est automatiquement appelée dans refdaj quand il y a besoin d’agrandir la taille des objets conteneurs des références dynamiques.
Arborescence des Structures de Données sd_dyna_phys#
Tous les concepts de la dynamique sont exprimés sur une base physique qui s’appuie sur la structure de données sd_dyna_phys. Celle-ci hérite, comme l’illustre la figure de la section 2, à la fois des propriétés des sd_resu_dyna décrits plus haut mais également des propriétés des sd_resultat. Le lecteur est invité à consulter la documentation [D4.06.08] pour connaître les détails de cette dernière structure de données.
Arborescence des Structures de Données sd_dyna_gene#
Tous les concepts de la dynamique exprimés dans une base généralisée (à l’exception de mode_gene) s’appuient sur la structure de données sd_dyna_gene. A l’instar de la sd_dyna_phys, celle-ci hérite des propriétés des structures sd_resu_dyna décrites plus haut. Par ailleurs elle est complétée, en fonction du concept produit, par l’arborescence ci-dessous:
sd_dyna_gene (K8)
’(11).DESC’ : OJB S V I
’(11).REFD’ : OJB S V K24
’(11).DISC’ : OJB S V R
’(11).ORDR’ : OJB S V I
’(11).DEPL’ : OJB S V Rou C
’(11).VITE’ : OJB S V R ou C
’(11).ACCE’ : OJB S V R ou C
# si calcul transitoire :
’(11).PTEM’ : OJB S V R
# si EXCIT dans le cas d’un calcul transitoire :
’(11).FACC’ : OJB S V K8
’(11).FDEP’ : OJB S V K8
’(11).FVIT’ : OJB S V K8
# si MULT_APPUI ou CORR_STAT :
’(11).IPSD’ : OJB S V R
# si produit par PROJ_MESU_MODAL :
’.PROJM’ : sd_resu ( cf. documentation [D4.08.05])
# si COMPORTEMENT :
’(8).NL.TYPE’ : OJB S V I
’(8).NL.VINT’ : OJB S V R
’(8).NL.VIND’ : OJB S V I
’(8).NL.INTI’ : OJB S V K24
Contenu des objets JEVEUX d’une sd_dyna_gene#
Définition de quelques variables#
nbmode : nombre de modes (= dimension de la matrice de masse généralisée)
nbnoli : nombre de non-linéarité
nbsauv : nombre de pas de temps sauvegardés (mot clé ARCHIVAGE)
nbexcit : nombre d’excitations (nombre d’occurrences du mot clé EXCIT)
Objet .DESC#
’(11).DESC’ : S V I LONG=5
V(1):1,2,3, ou 4.
2 si calcul transitoire avec nbnoli > 0
3 si calcul transitoire avec pas adaptatif
1si calcul transitoire autre que dans les cas précédents
4 si calcul harmonique
V(2): nombre de vecteurs de base (nbmode)
V(3):nombre de non-linéarités (nbnoli)
V(4):nombre de variables internes par instant d’archivage (nbvint)
V(5): indicateur de correction statique (0/1)
Objet .DEPL#
Dans le cas d’un calcul transitoire, cet objet contient des réels et est obligatoire. Pour un calcul harmonique, en revanche, il contient des complexes et est un objet facultatif.
’(11).DEPL’ : S V R/C LONG=nbsauv*nbmode
V((isauv-1)*nbmod+1 à isauv*nbmode):valeur du déplacement généralisé pour le «isauv»ièmepas de discrétisation (temporelle ou fréquentielle selon le type de calcul)
Objet .VITE#
Dans le cas d’un calcul transitoire, cet objet contient des réels et est obligatoire. Pour un calcul harmonique, en revanche, il contient des complexes et est un objet facultatif.
’(11).VITE’ : S V R/C LONG=nbsauv*nbmode
V((isauv-1)*nbmod+1 à isauv*nbmode):valeur de la vitesse généralisée pour le «isauv»ièmepas de discrétisation (temporelle ou fréquentielle selon le type de calcul)
Objet .ACCE#
Dans le cas d’un calcul transitoire, cet objet contient des réels et est obligatoire. Pour un calcul harmonique, en revanche, il contient des complexes et est un objet facultatif.
’(11).ACCE’ : S V R LONG=nbsauv*nbmode
V((isauv-1)*nbmod+1 à isauv*nbmode):valeur de l’accélération généralisée pour le «isauv»ièmepas de discrétisation (temporelle ou fréquentielle selon le type de calcul)
Objet .ORDR#
’(11).ORDR’ : S V I LONG=nbsauv
V(i): ièmenuméro d’ordre archivé
Objet .DISC#
’(11).DISC’ : S V R LONG=nbsauv
V(i):ièmevaleur de l’instant sauvegardé (pour un calcul transitoire) ou de la fréquence de calcul (pour le cas harmonique).
Objet .PTEM#
Cet objet existe uniquement pour les calculs transitoires.
’(11).PTEM’ : S V R LONG=nbsauv
V(i):valeur du pas de temps au ièmeinstant de calcul sauvegardé.
Objets liés à la présence du mot clé facteur COMPORTEMENT#
Les objets liés à la présence du mot clé COMPORTEMENTexiste uniquement dans le cas d’un calcul transitoire sur base modale.
’(8).NL.TYPE’ : OJB S V I
’(8).NL.VINT’ : OJB S V R
’(8).NL.VIND’ : OJB S V I
’(8).NL.INTI’ : OJB S V K24
Objet .NL.TYPE#
’(8).NL.TYPE’ : S V I LONG=nbnoli
Liste d’entiers donnant le type de chaque linéarité
Objet .NL.VINT#
’(8).NL.VINT’ : S V R LONG=nbvint*nbsauv
Les variables internes réels, stockées dans l’ordre indiqué par .NL.VIND, pour chaque pas d’archivage.
Objet .NL.VIND#
’(8).NL.VIND’ : S V I LONG=nbnoli+1
Liste des indices d’indirection vers .NL.VINT pour chaque non-linéarité.
Pour l’illustrer, on prend l’exemple suivant:
Si: VIND = [1, 5, 12, 25]
Cela correspond à la présence de 3 non-linéarités (nbnoli = 3)
Le nombre total de variables internes pour chaque pas d’archivage est: nbvint = 24 = (25-1)
A chaque pas d’archivage isauv, on a, dans VINT, à partir de la position pos = nbvint*isauv:
De VINT(pos+1) à VINT(pos+4): variables internes de la non-linéarité numéro 1
De VINT(pos+5) et VINT(pos+11): variables internes de la non-linéarité numéro 2
De VINT(pos+12) et VINT(pos+24): variables internes de la non-linéarité numéro 3
Objet .NL.INTI#
’(8).NL.INTI’ : S V K24 LONG=nbnoli*5
Ce vecteur contient les caractéristiques de chaque non-linéarité.
Pour la non-linéarité numéro nli, on a:
V(5*(nli-1)+1): intitulé de la non-linéarité numéro nli
V(5*(nli-1)+2):nom du premier nœud (nœud 1) de la non-linéarité numéro nli
V(5*(nli-1)+3):nom du deuxième nœud (nœud 2) de la non-linéarité numéro nli
V(5*(nli-1)+4): nom de sous-structure du nœud 1
V(5*(nli-1)+5): nom de la sous-structure du nœud 2
Objets liés à la présence du mot clé facteur EXCIT dans le cas d’un calcul transitoire#
Les objets .FACC, .FDEPet .FVITexistent uniquement dans le cas d’un calcul transitoire.
Objet .FACC#
’(11).FACC’ : S V K8 LONG=2*nbexcit
V(1 à nbexcit):noms des fonctions d’excitation de type accélération
V(nbexcit+1 à 2*nbexcit):type de la fonction (’CONSTANT’, ’FONCTION’, ’NAPPE’, …)
Objet .FDEP#
’(11).FDEP’ : S V K8 LONG=2*nbexcit
V(1 à nbexcit):noms des fonctions d’excitation de type déplacement
V(nbexcit+1 à 2*nbexcit):type de la fonction
Objet .FVIT#
’(11).FVIT’ : S V K8 LONG=2*nbexcit
V(1 à nbexcit):noms des fonctions d’excitation de type vitesse
V(nbexcit+1 à 2*nbexcit):type de la fonction
Objet liés à la présence des mots clés MULT_APPUI ou CORR_STAT#
L’objet .IPSDpeut exister uniquement dans le cas d’un calcul transitoire.
Objet .IPSD#
’(11).IPSD’ : S V I LONG=nbexcit*neq
neqcorrespond aux nombres d’équations (i.e. le rank de la matrice de rigidité).
V(1+neq*(iexcit-1) à neq*iexcit):Composante du vecteur PSI*directiondu séisme dans le cas d’un calcul sismique multi-supporté (cas multi-appui) ou composante du vecteur des modes propres corrigés (cas correction statique).
Découpage en blocs dans le cas d’un calcul transitoire#
Dans le cas d’un calcul transitoire, la SD tran_gene peut contenir beaucoup d’incréments. Afin de réduire l’impact sur la mémoire JEVEUX, les champs sont découpés en blocs.
Objets liés au découpage#
Objet .BLOC#
'(11).BLOC' : S V I LONG=n_blocs
Valeurs des derniers numéros d’ordre pour chaque bloc
l’objet .BLOC n’existe pas pour les SD tran_gene non découpées.
Exemple :
(4, 7, 12)
le premier bloc contient les champs pour les numéros d’ordres inférieurs ou égal à 4
le deuxième bloc contient les champs pour les numéros d’ordres compris entre 4 et 7
le troisième bloc contient les champs pour les numéros d’ordres compris entre 7 et 12
Objet .BLO2#
'(11).BLO2' : S V R LONG=n_blocs
Valeurs des derniers instants de calcul pour chaque bloc
l’objet .BLO2 n’existe pas pour les SD tran_gene non découpées.
Exemple :
(4.0, 7.0, 12.0)
le premier bloc contient les champs pour les instants inférieurs ou égal à 4.0
le deuxième bloc contient les champs pour les instants compris entre 4.0 et 7.0
le troisième bloc contient les champs pour les instants compris entre 7.0 et 12.0
Champs concernés par la découpe#
Tous les champs qui dépendent de nbsauv sont découpés :
'.ORDR', '.DISC', '.PTEM', '.DEPL', '.VITE', '.ACCE' et '.NL.VINT'
Ils sont subdivisés en n_blocs objets JEVEUX de nom composé :
du nom de la sd_tran_gene
resultatdes 7 caractères associés au numéro de bloc
i_blocde 3 blancs sauf pour le cham
'.NL.VINT'des caractères associés au champ
cham
K8 K1 K7 K3 K1 K4 = K24
resultat//'.'//i_bloc//' '//'.'//cham
Exemple :
Soit ‘000000d1’ un nom de concept de type tran_gene et l’objet 000000d1 .BLOC contient 3 valeurs,
alors le déplacement est contenu dans 3 objets de noms :
000000d1.0000001 .DEPL000000d1.0000002 .DEPL000000d1.0000003 .DEPL
les variables internes sont contenues dans 3 objets de noms :
000000d1.0000001.NL.VINT000000d1.0000002.NL.VINT000000d1.0000003.NL.VINT
Mise en oeuvre de la découpe#
Nombre d’incréments par bloc#
On défini un nombre d’incréments par bloc \(nbstep\) proportionnel au nombre de blocs :
\(nbstep \simeq 100 \cdot n_{blocs}\)
Sachant que \(nbsauv \simeq nbstep \cdot n_{blocs}\)
Alors le nombre d’incrément par bloc \(nbstep\) en fonction du nombre total d’incréments \(nbsauv\) s’écrit :
\(nbsteps \simeq 10 \cdot \sqrt{nbsauv}\)
Instanciation des blocs#
Dans DYNA_VIBRA, lorsqu’un bloc atteint nbstep, un nouveau bloc est alloué
pour les champs '.ORDR', '.DISC', '.PTEM', '.DEPL', '.VITE', '.ACCE' et '.NL.VINT'
Les valeurs du dernier incrément du bloc sont dupliquées dans le nouveau bloc. Un bloc contient donc au moins 2 incréments.
Le dernier bloc contient un nombre d’incrément inférieur ou égal à nbstep.
Dans le cas d’un DYNA_VIBRA avec reuse#
Le bloc contenant l’instant initial est tronqué, les blocs suivants sont supprimés
Les nouveau blocs calculés sont ajoutés à la suite en respectant la continuité de la numérotation
Accéder aux champs découpés en blocs#
Pour faciliter l’accès en lecture aux champs découpés en blocs, notamment pour les opérateurs de post-traitement,
on utilise la classe Fortran DynaGene du module DynaGene_module.
Méthodes disponibles#
DynaGene%get_values_by_index(field_type, idx, shift, length, vr, vi)
DynaGene%get_values_by_disc(field_type, disc, shift, length, vr, vi)
DynaGene%get_values_by_ordr(field_type, ordr, shift, length, vr, vi)
DynaGene%get_values(field_type, i_bloc, shift, length, vr, vi)
Retourne les valeurs du champ field_type (ordr, disc, ptem, depl, vite, acce ou vint) dans un pointeur vi ou vr.
Charge le bloc correspondant :
au numéro d’index
idx,au l’instant de calcul
disc,au numéro d’ordre
ordr,au numéro de bloc
i_bloc.
retourne facultativement :
le décalage absolu du bloc
shift,la longueur du bloc
length.
DynaGene%get_current_bloc(field_type, i_bloc)
Retourne le numéro de bloc i_bloc chargé en mémoire en fonction de field_type.
DynaGene%has_field(field_type, iret)
Indique si le champ field_type existe.
Gestion automatique de la mémoire#
DynaGene charge et décharge automatiquement la mémoire ainsi :
Récupération du bloc demandé en fonction de
idx,disc,ordroui_blocSi un bloc est déjà chargé en mémoire pour ce champ, c’est le même bloc qu’on demande, on retourne
vrouvi- Si un bloc différent est déjà chargé :
call jelibesur le bloc déjà chargé
call jeveuosur le bloc demandé, on retourne pointeur vr ou vi
Utilisation dans les routines de post-traitement#
Chaque routine qui a besoin de lire les champs doit initialiser un objet DynaGene en début de routine :
call dyna_gene%init(resultat(1:8)),
il est ensuite possible d’utiliser les méthodes disponibles.
Exemple :
Récupération du déplacement pour l’index idx
call dyna_gene%get_values_by_index(dyna_gene%depl, idx, shift=shift, vr=depl)
d = depl(idx-shift)
Enfin on doit libérer la mémoire en fin de routine :
call dyna_gene%free.