d4.06.12 Structure de Données sd_l_charge#

Objet SD_L_CHARGES – Ancienne version#

Arborescence#

sd_l_charges (K19) ::=record

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

(o) '.LCHA' : OJB S V K24

(o) '.FCHA' : OJB S V K24

Contenu des objets#

Objet .INFC#

Soit nchar le nombre de charges utilisées dans la commande globale (nombre d’occurrences du mot-clef EXCIT)

  • dimension =4 x nchar + 7 en mécanique

  • dimension =2 x nchar + 1 en thermique

En mécanique

.INFC(1) = nchar

Les valeurs INFC(2) à INFC(1+nchar) sont réservées aux charges de type Dirichlet:

Pour 1 ≤ichar ≤nchar

INFC (1+ichar) = code

= 0 si pas de charge de Dirichlet (dualisée) (ou si la charge ne contient que des relations éliminées) = 1 si la charge est issue de AFFE_CHAR_MECA = 2 si la charge est issue de AFFE_CHAR_MECA_F et si elle est indépendante du temps = 3 si la charge est issue de AFFE_CHAR_MECA_F et si elle est dépendante du temps = 4 force suiveuse = 5 force pilotée issue de AFFE_CHAR_MECA = 6 force pilotée issue de AFFE_CHAR_MECA_F = -1 si la charge est issue de AFFE_CHAR_CINE = -2 si la charge est issue de AFFE_CHAR_CINE_F et si elle est indépendante du temps = -3 si la charge est issue de AFFE_CHAR_CINE_F et si elle est dépendante du temps

Les valeurs infc (2+nchar) à infc (1+2*nchar) sont réservées aux charges mécaniques de

type Neuman :

Pour 1 ≤ ichar ≤ nchar

INFC (1+nchar+ichar)

= 0 si pas de charge

= 1 si la charge est issue de AFFE_CHAR_MECA

= 2 si la charge est issue de AFFE_CHAR_MECA_F et si elle estindépendante du

temps

= 3 si la charge est issue de AFFE_CHAR_MECA_F et si elle est dépendante du temps

= 4 si la charge est suiveuse

= 5 si la charge est pilotée

= 6 si la charge est de type ONDE_PLANE

= 8si la charge est pilotée et fonction

= 9si la charge est pilotée et suiveuse

= 55 si la charge est de type PRE_SIGM

= 10 si la charge correspond à des éléments tardifs de contact/frottement: ce qui permet d'identifier le LIGREL. Ce type de charge est strictement interne à STAT_NON_LINEet n'est jamais défini en dehors.

= 11si la charge est pilotée, fonction et suiveuse

= 20 si la charge est de type FORCE_SOL


.INFC(1+2*nchar+1) = inutilisé

.INFC(1+2*nchar+2) = nombre de charges donnant des forces de Laplace.

Les valeurs infc(3+3*nchar+1) à infc(3+4*nchar) sont réservées aux charges différentielles (DIDI):

Pour 1 ≤ ichar ≤ nchar

INFC(3+3*nchar+ichar)

= 1 si la charge est différentielle (DIDI)

= 0 sinon

En thermique

.INFC(1) = nchar

Les valeurs INFC(2) à INFC(1+nchar) sont réservées aux charges de type Dirichlet :

Pour 1 ≤ ichar ≤ nchar


INFC (1+ichar) = code

= 0 si pas de charge de Dirichlet (dualisée) (ou si la charge ne contient que des relations éliminées) = 1 si la charge est issue de AFFE_CHAR_THER = 2 si la charge est issue de AFFE_CHAR_THER_Fet si elle est indépendante du temps = 3 si la charge est issue de AFFE_CHAR_THER_Fet si elle est dépendante du temps = 4 force suiveuse = -1 si la charge est issue de AFFE_CHAR_CINE = -2 si la charge est issue de AFFE_CHAR_CINE_Fet si elle est indépendante du temps = -3 si la charge est issue de AFFE_CHAR_CINE_Fet si elle est dépendante du temps

Les valeurs INFC(1+nchar+1) à INFC(1+2*nchar) sont réservées aux charges de type Neuman :

Pour 1 ≤ ichar ≤ nchar


INFC (1+nchar+ichar)

= 0 si pas de charge

= 1 si la charge est issue de AFFE_CHAR_THER

= 2 si la charge est issue de AFFE_CHAR_THER_F et si elle est indépendante du             temps

= 3 si la charge est issue de AFFE_CHAR_THER_F et si elle est dépendante du temps

Objet .LCHA#

.LCHA : S V K24 dimension = nchar

LCHA contient le nom de toutes les charges impliquées dans la commande globale.

Objet .FCHA#

.FCHA : S V K24 dimension = nchar

FCHA contient le nom de la fonction multiplicatrice appliquée à la charge.

Objet SD_L_CHARGES – Nouvelle version#

Principes#

Un chargement, qu’est-ce que c’est ?#

Un chargement est en général défini en deux temps:

  • Description du chargement dans les opérateurs AFFE_CHAR_* ;

  • Application du chargement dans la commande (sous le mot-clef EXCIT/CHARGE)

Il existe néanmoins un deuxième moyen de définir un chargement:*

  • Définition d’un CHAM_NO(VECT_ASSE) ou d’un VECT_ASSE_GENEà l’aide des opérateurs de manipulations des vecteurs (CALC_VECT_ELEM, ASSE_VECTEUR, etc) ou suite à un calcul précédent;

  • Application du chargement dans la commande (sous le mot-clef EXCIT/VECT_ASSE);

Cette deuxième manière de faire est très utilisée en dynamique.

Dans le mot-clef EXCIT, on peut également définir:

  • une fonction multiplicatrice du temps réelle ou complexe;

  • Un type d’application du chargement (mot clef TYPE_CHARGE)utilisé surtout dans les opérateurs non-linéaires;

Fonction multiplicatrice#

En interne des commandes, on utilise toujours une fonction multiplicatrice (FONC_MULT ou FONC_MULT_C). Si l’utilisateur n’a pas précisé, c’est une fonction constante unité définie en interne, ou aussi une fonction non-unité avec un coefficient donné par l’utilisateur par COEF_MULT ou COEF_MULT_C. Dans le cas complexe, il est possible de donner la phase (PHAS_DEG) et la puissance de la pulsation (PUIS_PULS) du chargement complexe , écrit sous forme d’exponentielle complexe.

Définition du type de charge#

Quand l’utilisateur définit un chargement dans AFFE_CHAR_* , il utilise un mot-clef particulier. AFFE_CHAR_* procède alors de plusieurs manières différentes:

1. Création d’une CARTEcontenant l’information nécessaire sur toutle modèle. Par exemple, si le chargement est une pression répartie, ça veut dire que la pression sera définie non-nulle uniquement sur les mailles affectées par le chargement. Sur le reste du MODELE, la pression sera nulle [1] ;

  1. Création d’une CARTEsur une partie du modèle (GROUP_MAdéfini);

  2. Création d’objets spécifiques qui ne sont pas des cartes.

Le cas 1 est le plus fréquent. Le cas 2 est beaucoup plus rare: il ne concerne en mécanique que les chargements de Dirichlet et FORCE_NODALE.

Le cas 3 concerne quelques chargements (en mécanique: EVOL_CHAR, FORCE_ELEC et AFFE_CHAR_CINE par exemple).

L’information sur le type de chargement est retrouvable par le nom de l’objet (CARTEou autre objet) créée par AFFE_CHAR_MECA. Mais il y a quelques cas ambigus(information perdue). Entout état de cause, le lieu d’application de la charge est perdu car, en général, on défini la CARTEsur toutle MODELE(cas 2).

La notion de genre de charge#

Un genre de charge regroupe les chargements ayant les points communs suivants:

  • Unité phénoménologique: Neumann/Dirichlet sur un PHENOMENEdonné;

  • Unité de description: le chargement est décrit dans le même opérateur (AFFE_CHAR_* par exemple) et est construit de la même façon: même objet (carte) et un paramètre associé, un LIGREL, une option;

  • Unité de programmation: le calcul du chargement est fait dans une seule routine

Il y a (actuellement) quinze genres de charge:

  • DIRI_DUAL: AFFE_CHAR_MECA avec Dirichlet dualisés;

  • DIRI_ELIM: AFFE_CHAR_CINE;

  • NEUM_MECA: Chargement de Neumann en mécanique;

  • PRE_SIGM: comme son nom l’indique;

  • VITE_FACE: comme son nom l’indique;

  • IMPE_FACE: comme son nom l’indique;

  • EVOL_CHAR: comme son nom l’indique;

  • SIGM_CABLE: comme son nom l’indique;

  • FORCE_ELEC: comme son nom l’indique;

  • INTE_ELEC: comme son nom l’indique;

  • ONDE_FLUI: comme son nom l’indique;

  • ONDE_PLANE: comme son nom l’indique;

  • VECT_ASSE_CHAR: VECT_ASSE défini par AFFE_CHAR_MECA;

  • VECT_ASSE: CHAMNO directement en entrée d’EXCIT;

  • VECT_ASSE_GENE: VECT_ASSE_GENE directement en entrée d’EXCIT;

Un genre regroupe plusieurs types de chargement. Par exemple NEUM_MECA regroupe des chargements de type Neumann en mécanique, définis dans AFFE_CHAR_MECA* et avec des mots-clefs aussi divers que FORCE_NODALE ou FORCE_COQUE.

La notion de mot-clef de charge#

Identifiable par le nom de la carte ou de l’objet (sauf les cas ambigus). Ne sert que dans quelques cas (impressions de débogage, repérer des chargements particuliers comme la pesanteur ou commande CALC_G).

Multiplicité des genres/mots-clefs#

Dans un seul AFFE_CHAR_* , on peut définir plusieurs chargements très différents (plusieurs genre et mots-clefs). Or le nom de la charge (concept du AFFE_CHAR_* ou nom du VECT_ASSE/VECT_ASSE_GENE) sert d’itérateurs dans la sd_l_charges.

Il y a autant de charges que d’occurrences du mots-clef facteur EXCIT. Mais il y a plusieurs chargements par occurrence.

Pour identifier le genre, on utilise donc un entier codé et donc 30 genres de charges différents sont possibles. Par décodage de cet entier, on peut dire si ce genre ou pas est présent dans l’occurrence de la charge.

Pour identifier le mot-clef de charge, on utilise donc deux entiers codés et donc 60 mots-clefs de charges différents sont possibles.

Notion d’objet et de préfixe#

Un chargement est défini par un ou plusieurs objets.

Le nom de l’objet est toujours préfixé de la même manière dans le cas d’AFFE_CHAR_* . Le préfixe PREFOB est construit sur la base suivante:

  • PREFOB(1:8): nom du concept issu d’AFFE_CHAR_* ;

  • PREFOB(9:13): chaine identifiant le phénomène soit .CHAC, .CHMEou .CHTH(respectivement, acoustique: AFFE_CHAR_ACOU, mécanique: AFFE_CHAR_MECA,ou thermique: AFFE_CHAR_THER);

Avec ce préfixe:

  • On identifie l’objet: une carteou un autre objet. En identifiant l’objet, on peut identifier le genreet, éventuellement le mot-clef;

  • Pour les chargements à LIGRELréduit, on peut construire le nom du LIGRELà partir du préfixe;

Contenu de la SD et accès aux informations#

Arborescence#

sd_l_charges (K19) ::=record

(o) “.NCHA” : OJB S V K8 LONUTI=nchar (o) “.CODC” : OJB S V I LONUTI=nchar (o) “.TYPC” : OJB S V K8 LONUTI=nchar (o) “.TYPA” : OJB S V K16 LONUTI=nchar (o) “.PREO” : OJB S V K24 LONUTI=nchar (o) “.NFON” : OJB S V K8 LONUTI=nchar (o) “.TFON” : OJB S V K16 LONUTI=nchar (o) “.VFON” : OJB S V R LONUTI=nchar

Tous ces objets sont indicé par le numéro de charge ichar , sachant que nchar correspond au nombre d’occurrences du mot-clef facteur EXCIT .

  • “.NCHA’contient le nom des charges(concept issu d’AFFE_CHAR_* ou VECT_ASSE) –Accès en lecture par lislch.f;

  • “.CODC’contient le genre des charges (entier codé) – Accès en lecture par lislco.f;

  • “.TYPC’contient le type de la charge (complexe, réel, fonction): REEL, COMP, FONC_F0(fonction [2]

quelconque) et FONC_FT(fonction du temps) – Accès en lecture par lisltc.f;

  • “.TYPA’contient le type d’application de la charge (chargement fixe, piloté, suiveur, Dirichlet différentiel): FIXE_CSTE, FIXE_PILO, SUIVet DIDI– Accès en lecture par lislta.f;

  • “.PREO’contient le préfixe des objets de la charge – Accès en lecture par lisllc.f;

  • “.NFON’contient le nom de la fonction multiplicatrice – Accès en lecture par lislnf.f;

  • “.TFON’contient le type de la fonction multiplicatrice: fonction ou constante réelle ou complexe (FONCT_REEL, FONCT_COMP, CONST_REEL et CONST_COMP) – Accès en lecture par lisltf.f;

  • “.VFON’contient les paramètres de l’exponentielle complexe dans le casd’unefonction multiplicatrice complexe– Accès en lecture par lispcp.f;

Important: il est interdit d’accéder directement aux objets de la SD par leur nom, il faut utiliser les routines d’accès.

Routines utilitaires#

On crée la SD (objets vides) dans la routine liscrs.f.

On imprime son contenu (mode INFO=2) grâce a lisimp.f.

On lit le mot-clef EXCIT et on remplit la SD dans lislec.f .

Vérifications de la liste des charges#

Quelques vérifications sont proposées en standard dans la SD. La routine faisant ces vérifications est lischk.f, elle est appelée systématiquement après la création et le remplissage de la SD. Ces vérifications sont:

  • Cohérence des modèles:toutes les charges reposent sur le même modèleet sont cohérentes avec le modèledu calcul (cette limitation est provisoire, en attendant de réfléchir au cas des transitoires) –routine liscom.f;

  • Cohérence entre les chargements et le phénomène: toutes les charges reposent sur le même phénomèneet sont cohérentes avec le phénomènede l’opérateur –routine lisccp.f;

  • Cohérence entre les chargements et la commande: le genre de chargement est calculable sur la commande –routine lisccm.f;

  • Interdiction des doublons: on interdit que le même chargement soit présent deux fois –routine lisdbl.f;

  • Vérifications du types charge. Pour l’instant, pas assez automatique, quelques vérifications diverses (pilotage, chargements suiveurs). À terme, ces incompatibilités seront probablement plus automatisées –routine lisver.f;

Calcul des chargements#

Principe général#

Pour calculer effectivement un chargement (et donc créer le second membre pour l’intégrer dans une résolution), il y a deux cas:

  1. Les chargements standards: ilsse construisent à partir de l’assemblage dans un CHAM_NOde vecteurs élémentaires. Il y a donc une phase de calcul de ces VECT_ELEM(appel à CALCUL) et une phase d’assemblage);

  2. Les chargements non-standards: le CHAM_NOest recopié de l’objet déjà construit par ailleurs (VECT_ASSE par exemple) ou c’est un chargement particulier (contact par exemple);

Les routines de calcul des chargements#

La routine la plus importante est vechme.f. Calcule le genre NEUM_MECA, EVOL_CHAR et d’autres choses en glutant parfois. Dans la nouvelle version, vechme.f est remplacé par vechms.f, et calcule uniquement le genre NEUM_MECA, il est séparé en deux morceaux:

  • Préparation des champs d’entrée (standard avec une carte de paramètre) –Routine vechmp.f;

  • Calcul effectif des VECT_ELEM– Routine vechmx.f;

Pour la sensibilité: on passe de vechde.f à vechd2.f (provisoire avant résorption sensibilité)

Pour les Dirichlet dualisés: on passe de vedime.f à vedimd.f

Pour EVOL_CHAR, on passe de vechme.f à veevoc.f. En pratique un EVOL_CHAR contient des chargements de type NEUM_MECA. Donc, pour le calcul veevoc.f va appeler vechmp.f/vechmx.f en construisant une sd_l_charges provisoire.

Le traitement des VECT_ASSE/VECT_ASSE_GENE est prévu dans cnvesl.f.

Le traitement de VECT_ASSE venant d’AFFE_CHAR_MECA (genre VECT_ASSE_CHAR) est prévu dans veassc.f.

Les routines de pré-assemblage#

Comme tous les chargements sont construits à l’aide d’une fonction multiplicatrice, on fait l’assemblage en deux séquences:

  • Pré-assemblage: les VECT_ELEM sont assemblésdans une liste de CHAM_NO, dansla routine asvepr.fqui construit une liste;

  • Combinaison linéaire des CHAM_NO: on combine les CHAM_NOpré-assemblésavec les fonctions multiplicatrices dans laroutine ascomb.f;

Ajout d’un nouveau chargement#

Pour ajouter un nouveau chargement, il faut:

  • Faire les impacts nécessaires dans AFFE_CHAR_* ;

  • Identifier le genrede la charge par comparaison avec ce qui existe déjà;

  • Identifier les opérateurs permettant l’utilisation de cette charge;

  • Écrireles routines qui calculeront cette charge (§ 3.3.2 et éventuels calculs élémentaires);

  • Impacter la routine principale lisdef.f(compléter les DATA);

  • Ajouter des protections d’usage dans lischk.f(identifier les opérateurs permettant l’utilisation de cette charge par exemple, rendre incompatible avec le pilotage, etc…)