matscipy.fracture_mechanics.crackpathsel

function coordination(r, cutoff, transition_width)
if r > cutoff

f = 0.0 df = 0.0

elseif r > cutoff-transition_width

f = 0.5 * ( cos(pi*(r-cutoff+transition_width)/transition_width) + 1.0 ) df = - 0.5 * pi * sin(pi*(r-cutoff+transition_width)/transition_width) / transition_width

else

f = 1.0 df = 0.0

end f

end

function dcoordination(r, cutoff, transition_width)
if r > cutoff

df = 0.0

elseif r > cutoff-transition_width

df = - 0.5 * pi * sin(pi*(r-cutoff+transition_width)/transition_width) / transition_width

else

df = 0.0

end df

end

function energy(pos, neighb_j, neighb_rij, cutoff, transition_width, epsilon)

N = size(pos, 2)

n = zeros(Float64, N) energies = zeros(Float64, N)

for i = 1:N
for (m, j) in enumerate(neighb_j[i])

r_ij = neighb_rij[i][m] #@printf(“i %d j %d r_ij %f

“, i, j, r_ij)

r_ij > cutoff && continue

f_ij = coordination(r_ij, cutoff, transition_width) n[i] += f_ij

end energies[i] += (n[i] - 3)^2

end

for i = 1:N

sum_B_ij = 0.0

for (m, j) in enumerate(neighb_j[i])

r_ij = neighb_rij[i][m] r_ij > cutoff && continue

f_ij = coordination(r_ij, cutoff, transition_width) B_ij = (n[j] - 3.0)^2*f_ij sum_B_ij += B_ij

end

Eb_i = epsilon*(n[i] - 3.0)^2*sum_B_ij energies[i] += Eb_i

end

E = sum(energies) return (E, energies, n)

end

function force(pos, neighb_j, neighb_rij, cutoff, transition_width, epsilon, dx)

N = size(pos, 2) f = zeros(Float64, (3, N)) p = zeros(Float64, (3, N))

p[:, :] = pos for i = 1:N

for j = 1:3

p[j, i] += dx ep, local_e_p, n_p = energy(p, neighb_j, neighb_rij, cutoff, transition_width, epsilon) p[j, i] -= 2dx em, local_e_m, n_m = energy(p, neighb_j, neighb_rij, cutoff, transition_width, epsilon) f[j, i] = -(ep - em)/(2dx) p[j, i] += dx

end

end f

end