Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Détails des physiques

Une physique est un sous-modèle (SubModel) que construit un opérateur de pyrucast.model. L’opérateur reçoit son support, un espace éléments finis ou les maillages que relie une contrainte, et rend un modèle qui le couvre en entier : un sous-modèle par zone. Les physiques se composent par | : une conduction et la contrainte qui fige sa température sur un bord forment un seul modèle.

Cette page dit ce qu’ont en commun toutes les physiques : leur tag, leur type, leurs variables, et ce que chacune sait produire. Chaque page qui suit décrit une physique selon le même plan (voir le plan des pages).

Les tags

Chaque sous-modèle porte un ou plusieurs tags, qui disent à quelle physique il appartient. sub.physics() les donne, et un modèle se restreint à un tag (voir Modèle). Les pages sont rangées par tag :

tagphysiques
thermalconduction ; rayonnement, qui porte aussi radiation
diffusiondiffusion de Fick
mechanicalélasticité, plasticité, endommagement, barre, poutres, coques
constraintDirichlet, multi-points, baignage, contact

Les échanges et le flux imposé n’ont pas de tag propre : ils prennent celui de la physique qu’ils visent, thermal sur une conduction, mechanical sur une élasticité. Une contrainte porte constraint et le tag de la physique dont elle fige les inconnues.

Les types de modèle

Une physique est de l’un de trois types, selon ce qu’elle sait faire :

typece qu’il faitphysiques
domaine avec comportementintègre sur un sous-espace éléments finis, lit un matériau, et porte une loi : de ce que la solution produit (gradient, déformation, courbures), elle calcule un flux, une contrainte ou des efforts, plus un éventuel étatconduction, rayonnement, Fick, élasticité, plasticité, endommagement, barre, poutres, coques
domaine sans comportementintègre sur un sous-espace et lit un matériau, sans loiéchange de bord, transfert d’interface, flux imposé
contrainteimpose des relations linéaires entre inconnues par des multiplicateurs de Lagrange ; aucun sous-espace, aucun matériauDirichlet, multi-points, baignage, contact

Ce que les accesseurs d’un sous-modèle répondent :

domaine avec comportementdomaine sans comportementcontrainte
label()le nom de la physique : "HeatConduction", "Radiation", "Fick", "Elasticity", "Plasticity", "Damage", "Truss", "Bernoulli", "Timoshenko", "Shell""BoundaryTransfer", "InterfaceTransfer", "Flux""Dirichlet", "Mpc", "Embedded", "Contact"
material_components()les composantes matériau requisesles composantes requisesNone
fespace()le sous-espace où elle intègrele sous-espace où elle intègre (le côté A d’un transfert d’interface)None
has_behaviorTrueFalseFalse
multiplier_mesh()videvideles nœuds multiplicateurs, un par relation

Seul un domaine avec comportement se prête aux opérateurs de comportement de pyrucast.element_field : strain, integrate_behavior, et la tangente pyrucast.matrix.tangent (voir Comportement).

Les variables

Chaque physique nomme ses variables :

  • les primales (primal_vars()) sont les inconnues, les colonnes de la matrice : T, u_x… ;
  • les duales (dual_vars()) sont les lignes, où se lit le second membre : q, f_x… La duale d’une primale est ce qui travaille avec elle : un flux de chaleur avec une température, une force avec un déplacement ;
  • le matériau est un champ aux points de Gauss qui porte les composantes requises (material_components()) et, au besoin, des composantes facultatives ;
  • l’entrée du comportement est ce que strain(modele, solution, materiaux) calcule depuis la solution : un gradient, une déformation, des courbures ;
  • la sortie du comportement est ce que rend integrate_behavior(modele, entrée, materiaux, prev, dt) : le flux, la contrainte ou les efforts, puis l’état que la loi relira au pas suivant (prev) ;
  • les forces internes (pyrucast.node_field.internal_forces) sont ce que la sortie exerce sur les duales : ∫ Bᵀσ, où B est l’opérateur qui produit l’entrée depuis la solution. Chaque page dit comment sa physique les calcule.

Une contrainte n’a qu’une primale, lambda (le multiplicateur), et une duale, imposed (la ligne de la relation, où s’écrit la valeur imposée).

Ce que chaque physique produit

Les tableaux disent, pour chaque physique, les matrices qu’elle apporte et comment s’obtient sa tangente. Un tiret dit qu’elle n’y contribue rien : une masse assemblée sur un modèle qui contient un échange ignore simplement l’échange.

La tangente est ce que rend pyrucast.matrix.tangent. « = raideur » dit que la physique répond à une demande de tangente par sa raideur ; « analytique » qu’elle a une formule ; « perturbation » qu’elle la calcule par différences finies sur sa loi ; « aucune » qu’elle refuse la demande.

thermal

physiquetyperaideurmassegéométriquetangente
heat_conductionavec comportementconductioncapacité ρ·cp—= raideur
radiationavec comportementfilm linéarisé——analytique

diffusion

physiquetyperaideurmassegéométriquetangente
fickavec comportementdiffusionstockage poro—= raideur

Le tag de la cible

physiquetyperaideurmassegéométriquetangente
boundary_transfersans comportementfilm——= raideur
interface_transfersans comportementquatre blocs——= raideur
fluxsans comportement————

mechanical

physiquetyperaideurmassegéométriquetangente
elasticityavec comportementouiouiouianalytique
plasticity_perfect, plasticity_isotropicavec comportementélastiqueouiouianalytique
drucker_prager, ottosen, gursonavec comportementélastiqueouiouiperturbation
creep_norton, creep_blackburn, creep_lemaitre, viscoplasticity_chaboche, viscoplasticity_lemaitre_chabocheavec comportementélastiqueouiouiperturbation
mazars, damage_tc, damage_sic_sicavec comportementnon endommagéeouiouiaucune
trussavec comportementouiouioui= raideur
bernoulli, timoshenkoavec comportementouiouioui, sauf en 1-D= raideur
shellavec comportementoui——= raideur

constraint

physiquetyperaideurmassegéométriquetangente
dirichlet, mpc, embedded, contactcontrainteblocs C et Cᵀ——= raideur

Le plan des pages

Chaque physique est décrite dans cet ordre :

  1. En bref : ce qu’elle modélise, son opérateur Python, son tag, son type, et les éléments qu’elle accepte ;
  2. Théorie : les équations, de la forme locale à la matrice élémentaire ;
  3. Variables : primales, duales, matériau, entrée et sortie du comportement, état ;
  4. Ce qu’elle produit : matrices, tangente, forces internes et externes ;
  5. Exemple en Python ;
  6. Côté Rust.

Une page qui regroupe plusieurs lois d’une même physique (les lois plastiques, de fluage, d’endommagement) donne l’en-bref et les variables communes une fois, puis la théorie et le matériau loi par loi.

Côté Rust

Une physique est un struct de src/models/ qui implémente le trait SubModelKind : ses variables (primal_vars, dual_vars), ses tags (physics), son nom (label), et ses capacités, qu’elle expose par trois méthodes :

  • as_domain() rend Some(&dyn Domain) pour un domaine : le sous-espace où lire le matériau (material_fespace), les composantes requises et facultatives, les matrices élémentaires ;
  • as_behavior() rend Some(&dyn Behavior) pour un domaine qui porte une loi : son entrée (deformation_reads, produite par strain_operator), sa sortie (behavior_output_components), l’état qu’elle relit (state_reads), sa tangente au point (tangent_point, tangent_source), et requires_dt pour une loi qui dépend du pas de temps ;
  • as_constraint() rend Some(&dyn Constraint) pour une contrainte : ses nœuds multiplicateurs et ses relations.

Le code générique (assembleur, comportement, sauvegarde) ne passe que par ce trait : SubModel::as_kind est le seul match sur les physiques. Les matrices qu’une physique apporte se déclarent par matrix_layout(kind), une par genre (MatrixKind : raideur, masse, géométrique, tangente) ; une contrainte ou un transfert d’interface rend ses blocs par contributions. Pour en écrire une, voir Ajouter une physique.