Fracture mechanics

matscipy-quasistatic-crack

This command carries out a quasistatic K-field-controlled crack calculation on a small cluster. The outer boundaries of the cluster are fixed according to the near field solution of linear elastic fracture mechanics, considering elastic anisotropy, as described in Sih, Paris, Irwin, Int. J. Fract. Mech. 1, 189 (1965). The crack advances by stepwise updates of \(K_\textrm{I}\) and and crack tip position.

The command does not take any arguments but can be configured using a params.py file in the current directory. An example params.py file follows:

import numpy as np

import ase.io

from matscipy.fracture_mechanics.clusters import diamond, set_groups

from atomistica import TersoffScr, Tersoff_PRB_39_5566_Si_C__Scr

###
# Interaction potential
calc = TersoffScr(**Tersoff_PRB_39_5566_Si_C__Scr)

# Fundamental material properties
el = 'C'
a0 = 3.57

# Elastic constants: either specify explicitly or compute automatically
compute_elastic_constants = True
# C11 = 1220.   # GPa
# C12 = -3.    # GPa
# C44 = 535.    # GPa

# Surface energy
surface_energy = 2.7326 * 10  # GPa*A = 0.1 J/m^2

# Crack system
crack_surface = [1, 1, 1]  # Normal of crack face
crack_front = [1, -1, 0]  # Direction of crack front
# bond = (10, 11)
bondlength = 1.7  # Bond length for crack tip detection
bulk_nn = 4  # Number of nearest neighbors in the bulk

vacuum = 6.0  # Vacuum surrounding the cracked cluster

# Simulation control
nsteps = 31
# Increase stress intensity factor
k1 = np.linspace(0.8, 1.2, nsteps)
# Don't move crack tip
tip_dx = np.zeros_like(k1)
tip_dz = np.zeros_like(k1)

fmax = 0.05  # Tolerance for quasistatic optimizer

# The actual crack system
n = [1, 1, 1]
skin_x, skin_y = 1, 1
cryst = diamond(el, a0, n, crack_surface, crack_front)
set_groups(cryst, n, skin_x, skin_y)  # Outer fixed atoms
ase.io.write('cryst.xyz', cryst, format='extxyz')  # Dump initial crack system (without notch)

matscipy-sinclair-crack

This command carries out a relaxation of an atomistic fracture system with flexible boundary conditions, following the approach of Sinclair (1975). It reads a params.py which is similar to that used for matscipy-quasi-static-fracture described above.

An example parameter file for silicon using the screened Kumagai potential from Atomistica is given below:

import numpy as np
from matscipy.fracture_mechanics.clusters import diamond, set_groups, set_regions
import ase.io
import atomistica

# Interaction potential
calc = atomistica.KumagaiScr()

# Fundamental material properties
el = 'Si'
a0 = 5.429
surface_energy = 1.08 * 10  # GPa*A = 0.1 J/m^2

elastic_symmetry = 'cubic'

# Crack system
crack_surface = [1, 1, 1]
crack_front = [1, -1, 0]

vacuum = 6.0

# Simulation control
ds = 0.01
nsteps = 10000
continuation = True

k0 = 0.9
dk = 1e-4

fmax = 1e-2
max_steps = 50

r_I = 15.0
cutoff = 6.0
r_III = 40.0

n = [2 * int((r_III + cutoff)/ a0), 2 * int((r_III + cutoff)/ a0) - 1, 1]
print('n=', n)

# Setup crack system and regions I, II, III and IV
cryst = diamond(el, a0, n, crack_surface, crack_front)
cluster = set_regions(cryst, r_I, cutoff, r_III)  # carve circular cluster

ase.io.write('cryst.cfg', cryst)
ase.io.write('cluster.cfg', cluster)

matscipy-sinclair-continuation

This command build on the functionality of matscipy-sinclair-crack by carrying out numerical continuation to map out a solution path containing both stable and unstable equilibria, following the approach described in Buze and Kermode (2021).

The params.py parameter file given above for matscipy-sinclair-crack is also suitable as an example input file for this script.