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

SEG3 — segment quadratique

En bref

Le segment à trois nœuds, un au milieu : l’interpolation est parabolique, et le segment peut être courbe. C’est le bord d’une surface quadratique.

nom"SEG3"
nœuds3 : les extrémités, puis le milieu
interpolation"LAGRANGE2" : quadratique
dimension1 ; dans des Coords 1-D, 2-D ou 3-D
bordses deux extrémités
quadrature"GAUSS" : 3 points, degré 5 ; "REDUCED" : 1 point
parent linéaireSEG2
obtenu parline, arc, circle avec element_type="SEG3" ; to_quadratic

Élément de référence

\( \xi \in [-1, +1] \), le nœud milieu en \( \xi = 0 \).

Nœud\( \xi \)rôle
0\( -1 \)extrémité
1\( +1 \)extrémité
2\( 0 \)milieu de \( (0,1) \)

Fonctions de forme

\[ N_0 = \tfrac12\,\xi(\xi - 1), \qquad N_1 = \tfrac12\,\xi(\xi + 1), \qquad N_2 = 1 - \xi^2. \]

La géométrie s’interpole de même : un nœud milieu hors de la corde courbe le segment en arc de parabole.

Dérivées de référence

\[ \frac{\partial N_0}{\partial \xi} = \xi - \tfrac12, \qquad \frac{\partial N_1}{\partial \xi} = \xi + \tfrac12, \qquad \frac{\partial N_2}{\partial \xi} = -2\xi. \]

Degrés de liberté

physiqueinconnues par nœudpar maille
conduction, diffusionT3
échanges, rayonnement, sur le bord d’une surface quadratiqueT3

Quadrature

"GAUSS" : Gauss-Legendre à 3 points, exacte au degré 5.

\[ \xi_g = \left(-\sqrt{\tfrac35},\ 0,\ +\sqrt{\tfrac35}\right), \qquad w_g = \left(\tfrac59,\ \tfrac89,\ \tfrac59\right), \qquad \sum_g w_g = 2. \]

La masse, de degré 4, est exacte sur un segment droit dont le nœud milieu est au milieu.

"REDUCED" : un point en \( \xi = 0 \), de poids 2.

Exemple

import pyrucast

# Un type quadratique demande l'interpolation de degré 2.
seg3 = pyrucast.FiniteElementSpace(
    pyrucast.Mesh(pyrucast.Coords(1), "SEG3"), interpolation="LAGRANGE2"
)[0]
print(seg3.nodes_per_cell, seg3.gauss_count)  # 3 3

# Les trois points en −√(3/5), 0, +√(3/5), de poids 5/9, 8/9, 5/9.
print([round(seg3.gauss_xi(g)[0], 6) for g in range(3)])  # [-0.774597, 0.0, 0.774597]
poids = [round(seg3.gauss_weight(g), 6) for g in range(3)]
print(poids)  # [0.555556, 0.888889, 0.555556]
# Au point du milieu, ξ = 0, seule la fonction du nœud 2 est non nulle.
print([i for i, v in enumerate(seg3.n_at_g(1)) if v != 0.0])  # [2]
# Les dérivées (ξ − ½, ξ + ½, −2ξ) au premier point.
print([round(v, 6) for v in seg3.dn_at_g(0)])  # [-1.274597, -0.274597, 1.549193]

Côté Rust

Seg3 (src/atoms/element_kind/seg3.rs) implémente ElementKind.