Tutorial¶
This is a tutorial demonstrating the basics of the Python package statmechcrack
.
Model Creation¶
The crack model is imported from the package as the Crack
class,
[1]:
from statmechcrack import Crack
Instantiating the class creates a particular model instance,
[2]:
model = Crack()
Keyword arguments allow model features to be selected during instantiation, such as choosing 8 repeat units behind the crack tip and a nondimensional energy scale of 88 ahead of the crack tip:
[3]:
model = Crack(N=8, varepsilon=88)
Model Methods¶
A crack model instance has many methods available, such as v
, the nondimensional end separation as a function of the nondimensional end force
[4]:
model.v
[4]:
<bound method Crack.v of <statmechcrack.core.Crack object at 0x7fb5945fc190>>
[5]:
model.v(1)
[5]:
array([4.28297647])
An array of nondimensional forces can be input, and the results plotted:
[6]:
import numpy as np
import matplotlib.pyplot as plt
from statmechcrack import Crack
model = Crack(N=8, varepsilon=88)
p = np.linspace(0, 1, 100)
plt.plot(model.v(p) - 1, p)
plt.xlabel(r'$\Delta v$')
plt.ylabel(r'$p$')
plt.show()

Thermodynamic Ensembles¶
Generally, results will differ when either a constant end force or a constant end separation is applied to the crack model system. These are the isotensional and isometric thermodynamic ensembles, respectively. The ensemble
can be specified when computing a result using a class method. For example, the nondimensional end force under a nondimensional end separation of 3 (isometric) is not exactly the same force that will cause a nondimensional end separation of 3 in the isotensional
ensemble:”
[7]:
model.p(3, ensemble='isometric')
[7]:
array([0.60998242])
[8]:
model.v(0.60998242, ensemble='isotensional')
[8]:
array([3.00010209])
Thermodynamic Limit¶
As the model system becomes large (many repeat units), the results from any ensemble tend to converge. This is referred to as the thermodynamic limit.
[9]:
model = Crack(N=25, M=25, varepsilon=88)
model.p(3, ensemble='isometric')
[9]:
array([0.03067685])
[10]:
model.v(0.03067685, ensemble='isotensional')
[10]:
array([2.99999971])
Calculations Approaches¶
The coupling between degrees of freedom in this model system prevents thermodynamic functions (the class methods) from being evaluated analytically. Two calculation approaches are provided: an analytic, asymptotically-valid approximation approach, and a Monte Carlo approach. The asymptotic approach
is the default. As the bonds ahead of the crack tip become stiff, the asymptotic approach becomes valid:
[11]:
v = np.linspace(1, 11, 33)
_ = plt.figure()
for varepsilon in [10, 25, 100, 800]:
model = Crack(varepsilon=varepsilon)
p = model.p(v, approach='asymptotic')
_ = plt.plot(v - 1, p, label=r'$\varepsilon=$'+str(varepsilon))
p_0 = model.p_0_isometric(v, [1, 1])
_ = plt.plot(v - 1, p_0, 'k--', label='limit')
_ = plt.xlabel(r'$\Delta v$')
_ = plt.ylabel(r'$p$')
_ = plt.legend()
plt.show()

The infinitely-stiff limit is given by the reference system, which is where the bonds ahead of the crack tip are rigidly constrained, and which is analytically solvable in this case.