Pesquisa / Fratura e dano

Fratura por campo de fase de uma placa entalhada

A partir de Nathan Shauer, “Less than 500 lines self-contained Python finite element implementation of the phase-field method for fracture mechanics”, Advances in Engineering Software (2025), doi:10.1016/j.advengsoft.2025.104013.

Frente ao código do autor
30 de 30 verificações aprovadas· ver as verificações
Frente às figuras do artigo
Não comparado: não tivemos acesso ao texto completo

Pesquisa, não uma ferramenta de projeto. Nada aqui é um resultado de engenharia.

Uma placa quadrada com um entalhe da borda esquerda até o centro é tracionada pelo topo. O modelo de campo de fase AT2 representa a fissura como um campo de dano d entre 0 (íntegro) e 1 (rompido), distribuído ao longo de um comprimento ℓ. O painel do experimento executa a implementação Rust do Stabileo em seu visualizador; a curva laranja é o que o código Python do autor calculou.

O que o artigo mostra

O artigo apresenta um código autônomo de elementos finitos em Python, com menos de 500 linhas, para fratura frágil pelo método de campo de fase, e o aplica a três exemplos: uma barra sob tração comparada com a solução unidimensional AT2, uma placa com entalhe em uma borda sob tração (esta página) e um ensaio de flexão em três pontos. Lemos todo o código (não tivemos acesso ao texto do artigo) e tudo abaixo sobre o método vem dele.

Na reprodução o dano cresce suavemente à frente do entalhe enquanto cresce linearmente até ; no incremento seguinte , após , e a força cai para quase zero. mostra a fissura aberta na placa deformada.

O modelo

Deslocamento u e o dano d são ambos bilineares em quadriláteros, integrados com 2×2 pontos de Gauss; estado plano de deformação, pequenas deformações, carregamento quase estático.

  • Elasticidade com d fixo: div(g(d) C : ε(u)) = 0 com g(d) = (1 − d)², aplicado a toda a tensão.
  • Dano (AT2) com valor fixo de u: (Gc/ℓ + 2H) d − Gc ℓ Δd = 2H.
  • Energia motriz: H = ψ+ = ½ Σ σi εi sobre as deformações principais positivas, com σi as tensões principais sem dano: a elasticidade é degradada integralmente enquanto o dano é impulsionado apenas pela tração, uma formulação “híbrida”.
  • Solução alternada por passo de carga: resolver u com o d atual, depois d com o novo u, até que o resíduo de elasticidade ‖K(d)u − f‖ fique abaixo de 10−5.
  • Irreversibilidade: nenhuma no código de referência; o dano é recalculado a partir da energia atual e não é limitado por 1. para mantê-lo durante o descarregamento (não está na referência).

As unidades são kN e mm. A tensão máxima homogênea AT2 σc = √(27 E Gc / 256 ℓ) ≈ 2.82 kN/mm² aqui, portanto ℓ atua tanto como uma resistência quanto como um comprimento de regularização: e a carga máxima diminui. A malha também importa: a faixa da fissura precisa de elementos algumas vezes menores que ℓ; .

Como reproduzimos

  1. O código do autor (commit 61037c6, licença MIT) foi executado sem modificações para seus três exemplos em Python 3.12.15 com numpy 2.1.3 e scipy 1.14.1; a força, a contagem de iterações, o resíduo e a faixa de dano de cada passo, e os campos nodais em passos selecionados, foram salvos com um manifesto de versões e somas de verificação.
  2. A implementação Rust regenera as mesmas malhas (idênticas bit a bit), aplica as mesmas condições de contorno, laço e critério de parada, e resolve com a fatoração de Cholesky esparsa do motor do Stabileo.
  3. 30 verificações nomeadas comparam as duas implementações, cada uma com uma tolerância declarada, na integração contínua. O pacote do navegador e a reprodução desta página são verificados separadamente em relação à compilação nativa.

Comparação com a referência

30 verificações de validação executadas em CI, cada uma com sua tolerância
VerificaçãoObservadoTolerânciaResultado
ex1: mesh identical to the reference (node and element fingerprints)igual—✓ aprovado
ex1: same number of load stepsigual—✓ aprovado
ex1: same number of staggered iterations at every stepigual—✓ aprovado
ex1: maximum damage at every step8,3 × 10−121 × 10−9✓ aprovado
ex1: stress at the bar centre at every step1,1 × 10−121 × 10−9✓ aprovado
ex1: nodal damage at step 504,5 × 10−101 × 10−8✓ aprovado
ex1: nodal damage at step 733,8 × 10−101 × 10−8✓ aprovado
ex1: nodal displacement at step 501,6 × 10−101 × 10−8✓ aprovado
ex1: centre stress vs 1D AT2 homogeneous solution while max damage < 0.257,3 × 10−51 × 10−3✓ aprovado
ex2: mesh identical to the reference (node and element fingerprints)igual—✓ aprovado
ex2: same number of load stepsigual—✓ aprovado
ex2: same number of staggered iterations at every stepigual—✓ aprovado
ex2: peak force at the same load stepigual—✓ aprovado
ex2: peak force1,2 × 10−121 × 10−9✓ aprovado
ex2: force at every step up to the peak1,6 × 10−121 × 10−9✓ aprovado
ex2: maximum damage at every step up to the peak4,2 × 10−121 × 10−9✓ aprovado
ex2: force at every step, including fracture (comparison tolerance)2,2 × 10−71 × 10−5✓ aprovado
ex2: nodal damage at the peak step 565 × 10−111 × 10−8✓ aprovado
ex2: nodal displacement at the peak step 568,5 × 10−111 × 10−8✓ aprovado
ex2: nodal damage at step 57, reference or its mirror image2,9 × 10−51 × 10−4✓ aprovado
ex2: nodal damage at step 78, reference or its mirror image3,1 × 10−101 × 10−8✓ aprovado
ex3: mesh identical to the reference (node and element fingerprints)igual—✓ aprovado
ex3: same number of load stepsigual—✓ aprovado
ex3: same number of staggered iterations at every stepigual—✓ aprovado
ex3: peak force at the same load stepigual—✓ aprovado
ex3: force at every step up to the peak4 × 10−111 × 10−9✓ aprovado
ex3: force at every step, including fracture (comparison tolerance)1 × 10−61 × 10−4✓ aprovado
ex3: nodal damage at the peak step 566,9 × 10−111 × 10−8✓ aprovado
ex3: nodal displacement at the peak step 561,1 × 10−101 × 10−8✓ aprovado
ex3: nodal damage at the last step 98, reference or its mirror image4,1 × 10−101 × 10−8✓ aprovado

Uma constatação: a placa é simétrica em relação ao plano do entalhe, e a fissura percorre a fileira de elementos logo acima em um código e logo abaixo no outro. A fileira escolhida depende do arredondamento em ponto flutuante; em relação à imagem espelhada os campos de dano finais diferem em 3.085970368132962 × 10−10. Os limiares da tabela são tolerâncias de comparação, não limites matemáticos do erro. Os campos de deslocamento são comparados no exemplo 1 passo 50, exemplo 2 passo 56 e exemplo 3 passo 56.

Tabela de passos (79 passos)
passou, mmF, kNiteraçõesresíduomax dF de referência, kN
00,000100,0134528712,8 × 10−80,00010,01345287
10,000200,0269047511,7 × 10−70,00040,02690475
20,000300,0403544314,3 × 10−70,00090,04035443
30,000400,053800717,9 × 10−70,00160,0538007
40,000500,0672423611,3 × 10−60,00240,06724236
50,000600,0806781911,9 × 10−60,00350,08067819
60,000700,0941069812,6 × 10−60,00480,09410698
70,000800,107527513,4 × 10−60,00630,1075275
80,000900,120938614,4 × 10−60,00790,1209386
90,001000,13433915,5 × 10−60,00980,134339
100,001100,147727616,7 × 10−60,01190,1477276
110,001200,16110318 × 10−60,01420,161103
120,001300,174464219,4 × 10−60,01660,1744642
130,001400,187788723,5 × 10−70,01940,1877887
140,001500,201114324,5 × 10−70,02230,2011143
150,001600,214421825,9 × 10−70,02550,2144218
160,001700,227709827,6 × 10−70,02890,2277098
170,001800,240977129,6 × 10−70,03240,2409771
180,001900,254222621,2 × 10−60,03620,2542226
190,002000,26744521,5 × 10−60,04030,267445
200,002100,280642921,8 × 10−60,04460,2806429
210,002200,293815322,2 × 10−60,04910,2938153
220,002300,306960822,7 × 10−60,05390,3069608
230,002400,320078223,2 × 10−60,05890,3200782
240,002500,333166223,8 × 10−60,06410,3331662
250,002600,346223524,5 × 10−60,06970,3462235
260,002700,359248925,3 × 10−60,07550,3592489
270,002800,37224126,1 × 10−60,08160,372241
280,002900,385198627,1 × 10−60,08800,3851986
290,003000,398120328,3 × 10−60,09470,3981203
300,003100,411004829,6 × 10−60,10170,4110048
310,003200,423841132 × 10−60,10920,4238411
320,003300,436645632,4 × 10−60,11680,4366456
330,003400,449408632,9 × 10−60,12490,4494086
340,003500,462128633,5 × 10−60,13330,4621286
350,003600,474804134,3 × 10−60,14210,4748041
360,003700,487433735,1 × 10−60,15130,4874337
370,003800,500015636,2 × 10−60,16090,5000156
380,003900,512548337,4 × 10−60,17100,5125483
390,004000,5250338,9 × 10−60,18160,52503
400,004100,53745243,3 × 10−60,19290,537452
410,004200,549824944,1 × 10−60,20460,5498249
420,004300,56214145,1 × 10−60,21700,562141
430,004400,57439846,5 × 10−60,22990,574398
440,004500,586593548,2 × 10−60,24370,5865935
450,004600,598718754,2 × 10−60,25840,5987187
460,004700,610781455,5 × 10−60,27390,6107814
470,004800,622773357,4 × 10−60,29030,6227733
480,004900,634690459,9 × 10−60,30800,6346904
490,005000,646520566,8 × 10−60,32720,6465205
500,005100,6582769,7 × 10−60,34790,65827
510,005200,669918178 × 10−60,37080,6699181
520,005300,681459687,6 × 10−60,39620,6814596
530,005400,692876598,5 × 10−60,42500,6928765
540,005500,704134118,1 × 10−60,45880,704134
550,005600,7151725148,7 × 10−60,50060,7151725
560,005700,7257948229,3 × 10−60,56060,7257948
570,005800,00047543893088,3 × 10−61,00810,0004752194
580,005900,000454193924,6 × 10−71,00810,0004541974
590,006000,000433467822,5 × 10−71,00830,0004334679
600,006100,000413999222,3 × 10−71,00850,0004139992
610,006200,000395713222,1 × 10−71,00870,0003957132
620,006300,000378519822 × 10−71,00880,0003785198
630,006400,000362336521,9 × 10−71,00890,0003623365
640,006500,000367766319,6 × 10−61,00910,0003677663
650,006600,000352428319,2 × 10−61,00920,0003524283
660,006700,000337749318,9 × 10−61,00930,0003377493
670,006800,000323894718,5 × 10−61,00940,0003238947
680,006900,000310807618,2 × 10−61,00940,0003108076
690,007000,00029843417,9 × 10−61,00950,000298434
700,007100,000286724817,6 × 10−61,00950,0002867248
710,007200,000275635117,4 × 10−61,00950,0002756351
720,007300,000265123317,1 × 10−61,00960,0002651233
730,007400,000255151616,9 × 10−61,00960,0002551516
740,007500,000245684916,7 × 10−61,00960,0002456849
750,007600,00023669116,4 × 10−61,00960,000236691
760,007700,0002281416,2 × 10−61,00960,00022814
770,007800,000220004516 × 10−61,00960,0002200045
780,007900,00021225915,8 × 10−61,00950,000212259

Comparação com o artigo

Não realizada: não tivemos acesso ao texto completo do artigo, portanto nenhum número publicado nele foi comparado. As figuras aqui vêm das nossas próprias execuções.

Limitações

  • A concordância com um código de referência não é uma validação em relação a experimentos, e nada disso é uma certificação de engenharia.
  • A malha de referência refina apenas uma caixa de 0.04 × 0.04 mm ao redor da ponta do entalhe; fora dela a fissura atravessa elementos mais largos que 3ℓ.
  • Sem restrições de limite: o dano pode exceder ligeiramente 1 (a referência atinge 1.0096 aqui e 1.0021897551918642 no exemplo 1) e ficar abaixo de 0. Os resultados de referência Python registrados têm danos nodais mínimos de 3.076336950017797e-08 (exemplo 1), -0.0031224948220514573 (exemplo 2) e -0.06024191772700118 (exemplo 3). Isso também ocorre na discretização AT2 sem restrições do código de referência. Dano negativo não é físico: (1-d)² no mínimo do exemplo 3 é aproximadamente 1.124, acima da rigidez íntegra. A montagem usa dano interpolado nos pontos de quadratura, portanto isso não é um erro de 12.4% na rigidez montada. O solver não limita o dano; o campo nodal quantizado da reprodução e a escala de cores o limitam para exibição.
  • O esquema alternado não é acelerado; durante o crescimento instável da fissura pode exigir centenas de iterações em um passo.
  • As execuções no navegador são limitadas em tamanho de malha e faixa de parâmetros.

Código e referências

Citar isto

Stabileo Research, “Fratura por campo de fase de uma placa entalhada”, reprodução de Nathan Shauer (2025), doi:10.1016/j.advengsoft.2025.104013. Implementação: research/fracture/shauer-2025 no commit 0ce459e9eb75. Motor: o motor do Stabileo no mesmo commit. Estão previstos links permanentes para esta compilação exata.