Qué muestra el artículo
El artículo presenta un código autónomo de elementos finitos en Python, de menos de 500 líneas, para la fractura frágil con el método de campo de fase, y lo aplica a tres ejemplos: una barra a tracción comparada con la solución unidimensional AT2, una placa con entalla en un borde sometida a tracción (esta página) y un ensayo de flexión en tres puntos. Leímos todo el código (no tuvimos acceso al texto del artículo) y todo lo que sigue sobre el método proviene de él.
En la reproducción el daño crece suavemente por delante de la entalla mientras crece linealmente hasta ; en el siguiente incremento , después de , y la fuerza cae casi a cero. muestra la grieta abierta en la placa deformada.
El modelo
Desplazamiento u y el daño d son ambos bilineales en cuadriláteros, integrados con 2×2 puntos de Gauss; deformación plana, pequeñas deformaciones, carga cuasiestática.
- Elasticidad con d fijo: div(g(d) C : ε(u)) = 0 con g(d) = (1 − d)², aplicado a toda la tensión.
- Daño (AT2) con valor fijo de u: (Gc/ℓ + 2H) d − Gc ℓ Δd = 2H.
- Energía impulsora: H = ψ+ = ½ Σ σi εi sobre las deformaciones principales positivas, con σi las tensiones principales sin daño: la elasticidad se degrada por completo mientras que el daño es impulsado solo por la tracción, una formulación «híbrida».
- Solución alternada por paso de carga: resolver u con el d actual, luego d con el nuevo u, hasta que el residuo de elasticidad ‖K(d)u − f‖ sea menor que 10−5.
- Irreversibilidad: ninguna en el código de referencia; el daño se recalcula a partir de la energía actual y no está acotado por 1. para conservarlo durante la descarga (no está en la referencia).
Las unidades son kN y mm. La tensión máxima homogénea AT2 σc = √(27 E Gc / 256 ℓ) ≈ 2.82 kN/mm² aquí, por lo que ℓ actúa tanto como una resistencia como una longitud de regularización: y la carga máxima baja. La malla también importa: la banda de la grieta necesita elementos varias veces más pequeños que ℓ; .
Cómo lo reprodujimos
- El código del autor (commit 61037c6, licencia MIT) se ejecutó sin modificaciones para sus tres ejemplos en Python 3.12.15 con numpy 2.1.3 y scipy 1.14.1; la fuerza, el número de iteraciones, el residuo y el rango de daño de cada paso, y los campos nodales en pasos seleccionados, se guardaron con un manifiesto de versiones y sumas de comprobación.
- La implementación Rust regenera las mismas mallas (idénticas bit a bit), aplica las mismas condiciones de contorno, bucle y criterio de parada, y resuelve con la factorización de Cholesky dispersa del motor de Stabileo.
- 30 controles con nombre comparan ambas implementaciones, cada uno con una tolerancia declarada, en integración continua. El paquete del navegador y la reproducción de esta página se verifican por separado frente a la compilación nativa.
Comparación con la referencia
| Control | Observado | Tolerancia | Resultado |
|---|---|---|---|
| ex1: mesh identical to the reference (node and element fingerprints) | igual | — | ✓ aprobado |
| ex1: same number of load steps | igual | — | ✓ aprobado |
| ex1: same number of staggered iterations at every step | igual | — | ✓ aprobado |
| ex1: maximum damage at every step | 8,3 × 10−12 | 1 × 10−9 | ✓ aprobado |
| ex1: stress at the bar centre at every step | 1,1 × 10−12 | 1 × 10−9 | ✓ aprobado |
| ex1: nodal damage at step 50 | 4,5 × 10−10 | 1 × 10−8 | ✓ aprobado |
| ex1: nodal damage at step 73 | 3,8 × 10−10 | 1 × 10−8 | ✓ aprobado |
| ex1: nodal displacement at step 50 | 1,6 × 10−10 | 1 × 10−8 | ✓ aprobado |
| ex1: centre stress vs 1D AT2 homogeneous solution while max damage < 0.25 | 7,3 × 10−5 | 1 × 10−3 | ✓ aprobado |
| ex2: mesh identical to the reference (node and element fingerprints) | igual | — | ✓ aprobado |
| ex2: same number of load steps | igual | — | ✓ aprobado |
| ex2: same number of staggered iterations at every step | igual | — | ✓ aprobado |
| ex2: peak force at the same load step | igual | — | ✓ aprobado |
| ex2: peak force | 1,2 × 10−12 | 1 × 10−9 | ✓ aprobado |
| ex2: force at every step up to the peak | 1,6 × 10−12 | 1 × 10−9 | ✓ aprobado |
| ex2: maximum damage at every step up to the peak | 4,2 × 10−12 | 1 × 10−9 | ✓ aprobado |
| ex2: force at every step, including fracture (comparison tolerance) | 2,2 × 10−7 | 1 × 10−5 | ✓ aprobado |
| ex2: nodal damage at the peak step 56 | 5 × 10−11 | 1 × 10−8 | ✓ aprobado |
| ex2: nodal displacement at the peak step 56 | 8,5 × 10−11 | 1 × 10−8 | ✓ aprobado |
| ex2: nodal damage at step 57, reference or its mirror image | 2,9 × 10−5 | 1 × 10−4 | ✓ aprobado |
| ex2: nodal damage at step 78, reference or its mirror image | 3,1 × 10−10 | 1 × 10−8 | ✓ aprobado |
| ex3: mesh identical to the reference (node and element fingerprints) | igual | — | ✓ aprobado |
| ex3: same number of load steps | igual | — | ✓ aprobado |
| ex3: same number of staggered iterations at every step | igual | — | ✓ aprobado |
| ex3: peak force at the same load step | igual | — | ✓ aprobado |
| ex3: force at every step up to the peak | 4 × 10−11 | 1 × 10−9 | ✓ aprobado |
| ex3: force at every step, including fracture (comparison tolerance) | 1 × 10−6 | 1 × 10−4 | ✓ aprobado |
| ex3: nodal damage at the peak step 56 | 6,9 × 10−11 | 1 × 10−8 | ✓ aprobado |
| ex3: nodal displacement at the peak step 56 | 1,1 × 10−10 | 1 × 10−8 | ✓ aprobado |
| ex3: nodal damage at the last step 98, reference or its mirror image | 4,1 × 10−10 | 1 × 10−8 | ✓ aprobado |
Un hallazgo: la placa es simétrica respecto al plano de la entalla, y la grieta avanza por la fila de elementos justo encima en un código y justo debajo en el otro. La fila elegida depende del redondeo en coma flotante; frente a la imagen especular los campos de daño finales difieren en 3.085970368132962 × 10−10. Los umbrales de la tabla son tolerancias de comparación, no cotas matemáticas del error. Los campos de desplazamiento se comparan en el ejemplo 1 paso 50, el ejemplo 2 paso 56 y el ejemplo 3 paso 56.
Tabla de pasos (79 pasos)
| paso | u, mm | F, kN | iteraciones | residuo | max d | F de referencia, kN |
|---|---|---|---|---|---|---|
| 0 | 0,00010 | 0,01345287 | 1 | 2,8 × 10−8 | 0,0001 | 0,01345287 |
| 1 | 0,00020 | 0,02690475 | 1 | 1,7 × 10−7 | 0,0004 | 0,02690475 |
| 2 | 0,00030 | 0,04035443 | 1 | 4,3 × 10−7 | 0,0009 | 0,04035443 |
| 3 | 0,00040 | 0,0538007 | 1 | 7,9 × 10−7 | 0,0016 | 0,0538007 |
| 4 | 0,00050 | 0,06724236 | 1 | 1,3 × 10−6 | 0,0024 | 0,06724236 |
| 5 | 0,00060 | 0,08067819 | 1 | 1,9 × 10−6 | 0,0035 | 0,08067819 |
| 6 | 0,00070 | 0,09410698 | 1 | 2,6 × 10−6 | 0,0048 | 0,09410698 |
| 7 | 0,00080 | 0,1075275 | 1 | 3,4 × 10−6 | 0,0063 | 0,1075275 |
| 8 | 0,00090 | 0,1209386 | 1 | 4,4 × 10−6 | 0,0079 | 0,1209386 |
| 9 | 0,00100 | 0,134339 | 1 | 5,5 × 10−6 | 0,0098 | 0,134339 |
| 10 | 0,00110 | 0,1477276 | 1 | 6,7 × 10−6 | 0,0119 | 0,1477276 |
| 11 | 0,00120 | 0,161103 | 1 | 8 × 10−6 | 0,0142 | 0,161103 |
| 12 | 0,00130 | 0,1744642 | 1 | 9,4 × 10−6 | 0,0166 | 0,1744642 |
| 13 | 0,00140 | 0,1877887 | 2 | 3,5 × 10−7 | 0,0194 | 0,1877887 |
| 14 | 0,00150 | 0,2011143 | 2 | 4,5 × 10−7 | 0,0223 | 0,2011143 |
| 15 | 0,00160 | 0,2144218 | 2 | 5,9 × 10−7 | 0,0255 | 0,2144218 |
| 16 | 0,00170 | 0,2277098 | 2 | 7,6 × 10−7 | 0,0289 | 0,2277098 |
| 17 | 0,00180 | 0,2409771 | 2 | 9,6 × 10−7 | 0,0324 | 0,2409771 |
| 18 | 0,00190 | 0,2542226 | 2 | 1,2 × 10−6 | 0,0362 | 0,2542226 |
| 19 | 0,00200 | 0,267445 | 2 | 1,5 × 10−6 | 0,0403 | 0,267445 |
| 20 | 0,00210 | 0,2806429 | 2 | 1,8 × 10−6 | 0,0446 | 0,2806429 |
| 21 | 0,00220 | 0,2938153 | 2 | 2,2 × 10−6 | 0,0491 | 0,2938153 |
| 22 | 0,00230 | 0,3069608 | 2 | 2,7 × 10−6 | 0,0539 | 0,3069608 |
| 23 | 0,00240 | 0,3200782 | 2 | 3,2 × 10−6 | 0,0589 | 0,3200782 |
| 24 | 0,00250 | 0,3331662 | 2 | 3,8 × 10−6 | 0,0641 | 0,3331662 |
| 25 | 0,00260 | 0,3462235 | 2 | 4,5 × 10−6 | 0,0697 | 0,3462235 |
| 26 | 0,00270 | 0,3592489 | 2 | 5,3 × 10−6 | 0,0755 | 0,3592489 |
| 27 | 0,00280 | 0,372241 | 2 | 6,1 × 10−6 | 0,0816 | 0,372241 |
| 28 | 0,00290 | 0,3851986 | 2 | 7,1 × 10−6 | 0,0880 | 0,3851986 |
| 29 | 0,00300 | 0,3981203 | 2 | 8,3 × 10−6 | 0,0947 | 0,3981203 |
| 30 | 0,00310 | 0,4110048 | 2 | 9,6 × 10−6 | 0,1017 | 0,4110048 |
| 31 | 0,00320 | 0,4238411 | 3 | 2 × 10−6 | 0,1092 | 0,4238411 |
| 32 | 0,00330 | 0,4366456 | 3 | 2,4 × 10−6 | 0,1168 | 0,4366456 |
| 33 | 0,00340 | 0,4494086 | 3 | 2,9 × 10−6 | 0,1249 | 0,4494086 |
| 34 | 0,00350 | 0,4621286 | 3 | 3,5 × 10−6 | 0,1333 | 0,4621286 |
| 35 | 0,00360 | 0,4748041 | 3 | 4,3 × 10−6 | 0,1421 | 0,4748041 |
| 36 | 0,00370 | 0,4874337 | 3 | 5,1 × 10−6 | 0,1513 | 0,4874337 |
| 37 | 0,00380 | 0,5000156 | 3 | 6,2 × 10−6 | 0,1609 | 0,5000156 |
| 38 | 0,00390 | 0,5125483 | 3 | 7,4 × 10−6 | 0,1710 | 0,5125483 |
| 39 | 0,00400 | 0,52503 | 3 | 8,9 × 10−6 | 0,1816 | 0,52503 |
| 40 | 0,00410 | 0,537452 | 4 | 3,3 × 10−6 | 0,1929 | 0,537452 |
| 41 | 0,00420 | 0,5498249 | 4 | 4,1 × 10−6 | 0,2046 | 0,5498249 |
| 42 | 0,00430 | 0,562141 | 4 | 5,1 × 10−6 | 0,2170 | 0,562141 |
| 43 | 0,00440 | 0,574398 | 4 | 6,5 × 10−6 | 0,2299 | 0,574398 |
| 44 | 0,00450 | 0,5865935 | 4 | 8,2 × 10−6 | 0,2437 | 0,5865935 |
| 45 | 0,00460 | 0,5987187 | 5 | 4,2 × 10−6 | 0,2584 | 0,5987187 |
| 46 | 0,00470 | 0,6107814 | 5 | 5,5 × 10−6 | 0,2739 | 0,6107814 |
| 47 | 0,00480 | 0,6227733 | 5 | 7,4 × 10−6 | 0,2903 | 0,6227733 |
| 48 | 0,00490 | 0,6346904 | 5 | 9,9 × 10−6 | 0,3080 | 0,6346904 |
| 49 | 0,00500 | 0,6465205 | 6 | 6,8 × 10−6 | 0,3272 | 0,6465205 |
| 50 | 0,00510 | 0,65827 | 6 | 9,7 × 10−6 | 0,3479 | 0,65827 |
| 51 | 0,00520 | 0,6699181 | 7 | 8 × 10−6 | 0,3708 | 0,6699181 |
| 52 | 0,00530 | 0,6814596 | 8 | 7,6 × 10−6 | 0,3962 | 0,6814596 |
| 53 | 0,00540 | 0,6928765 | 9 | 8,5 × 10−6 | 0,4250 | 0,6928765 |
| 54 | 0,00550 | 0,704134 | 11 | 8,1 × 10−6 | 0,4588 | 0,704134 |
| 55 | 0,00560 | 0,7151725 | 14 | 8,7 × 10−6 | 0,5006 | 0,7151725 |
| 56 | 0,00570 | 0,7257948 | 22 | 9,3 × 10−6 | 0,5606 | 0,7257948 |
| 57 | 0,00580 | 0,0004754389 | 308 | 8,3 × 10−6 | 1,0081 | 0,0004752194 |
| 58 | 0,00590 | 0,0004541939 | 2 | 4,6 × 10−7 | 1,0081 | 0,0004541974 |
| 59 | 0,00600 | 0,0004334678 | 2 | 2,5 × 10−7 | 1,0083 | 0,0004334679 |
| 60 | 0,00610 | 0,0004139992 | 2 | 2,3 × 10−7 | 1,0085 | 0,0004139992 |
| 61 | 0,00620 | 0,0003957132 | 2 | 2,1 × 10−7 | 1,0087 | 0,0003957132 |
| 62 | 0,00630 | 0,0003785198 | 2 | 2 × 10−7 | 1,0088 | 0,0003785198 |
| 63 | 0,00640 | 0,0003623365 | 2 | 1,9 × 10−7 | 1,0089 | 0,0003623365 |
| 64 | 0,00650 | 0,0003677663 | 1 | 9,6 × 10−6 | 1,0091 | 0,0003677663 |
| 65 | 0,00660 | 0,0003524283 | 1 | 9,2 × 10−6 | 1,0092 | 0,0003524283 |
| 66 | 0,00670 | 0,0003377493 | 1 | 8,9 × 10−6 | 1,0093 | 0,0003377493 |
| 67 | 0,00680 | 0,0003238947 | 1 | 8,5 × 10−6 | 1,0094 | 0,0003238947 |
| 68 | 0,00690 | 0,0003108076 | 1 | 8,2 × 10−6 | 1,0094 | 0,0003108076 |
| 69 | 0,00700 | 0,000298434 | 1 | 7,9 × 10−6 | 1,0095 | 0,000298434 |
| 70 | 0,00710 | 0,0002867248 | 1 | 7,6 × 10−6 | 1,0095 | 0,0002867248 |
| 71 | 0,00720 | 0,0002756351 | 1 | 7,4 × 10−6 | 1,0095 | 0,0002756351 |
| 72 | 0,00730 | 0,0002651233 | 1 | 7,1 × 10−6 | 1,0096 | 0,0002651233 |
| 73 | 0,00740 | 0,0002551516 | 1 | 6,9 × 10−6 | 1,0096 | 0,0002551516 |
| 74 | 0,00750 | 0,0002456849 | 1 | 6,7 × 10−6 | 1,0096 | 0,0002456849 |
| 75 | 0,00760 | 0,000236691 | 1 | 6,4 × 10−6 | 1,0096 | 0,000236691 |
| 76 | 0,00770 | 0,00022814 | 1 | 6,2 × 10−6 | 1,0096 | 0,00022814 |
| 77 | 0,00780 | 0,0002200045 | 1 | 6 × 10−6 | 1,0096 | 0,0002200045 |
| 78 | 0,00790 | 0,000212259 | 1 | 5,8 × 10−6 | 1,0095 | 0,000212259 |
Comparación con el artículo
No realizada: no tuvimos acceso al texto completo del artículo, por lo que no se comparó ningún número publicado en él. Las figuras aquí provienen de nuestras propias ejecuciones.
Limitaciones
- La concordancia con un código de referencia no es una validación frente a experimentos, y nada de esto es una certificación de ingeniería.
- La malla de referencia refina solo una caja de 0.04 × 0.04 mm alrededor de la punta de la entalla; fuera de ella la grieta cruza elementos más anchos que 3ℓ.
- Sin restricciones de cota: el daño puede superar ligeramente 1 (la referencia alcanza 1.0096 aquí y 1.0021897551918642 en el ejemplo 1) y caer por debajo de 0. Los resultados de referencia Python registrados tienen daños nodales mínimos de 3.076336950017797e-08 (ejemplo 1), -0.0031224948220514573 (ejemplo 2) y -0.06024191772700118 (ejemplo 3). Esto también ocurre en la discretización AT2 sin restricciones del código de referencia. El daño negativo no es físico: (1-d)² en el mínimo del ejemplo 3 es aproximadamente 1.124, por encima de la rigidez intacta. El ensamblaje usa daño interpolado en puntos de cuadratura, así que esto no es un error de 12.4% en la rigidez ensamblada. El solver no recorta el daño; el campo nodal cuantizado de la reproducción y la escala de colores lo recortan para su visualización.
- El esquema alternado no está acelerado; durante el crecimiento inestable de la grieta puede requerir cientos de iteraciones en un paso.
- Las ejecuciones en el navegador están limitadas en tamaño de malla y rango de parámetros.
Código y referencias
- Implementación, pruebas y resultados de referencia: shauer-2025 (generadores de malla y bucle adaptados de la referencia MIT, con atribución en el código fuente).
- Código de referencia: github.com/nathanshauer/phasefield-jr-py, MIT, © 2025 Nathan Shauer.
Citar esto
Stabileo Research, “Fractura por campo de fase de una placa entallada”, reproducción de Nathan Shauer (2025), doi:10.1016/j.advengsoft.2025.104013. Implementación: research/fracture/shauer-2025 en el commit 0ce459e9eb75. Motor: el motor de Stabileo en el mismo commit. Se prevén enlaces permanentes a esta compilación exacta.