The Friction Module¶
2D materials are inherently pretty good candidates for low-friction coatings, since their interlayer interactions are generally vdW-type. If you want to know just how good a lubricant your material might be, you’ve come to the right module.
Mapping the gamma surface¶
The first thing you’ll want to do is understand the gamma surface between two layers of your 2D material. The gamma surface is the map of energy vs. lateral displacement as you slide one layer around on top of the other. It’s easy to see why this is important for friction, because it will tell us where the minimum energy stacking configurations are, along with the maxima and saddle points, etc. To map the gamma surface for a 2D material, you just need to have a converged relaxation run and then perform the following:
import os
from twod_materials.friction.startup import run_gamma_calculations
os.chdir('MoS2') # There should be a CONTCAR and all that jazz in here.
run_gamma_calculations(step_size=0.5) # step_size is in Angstroms
os.chdir('../')
and several jobs will be submitted to the queue. You can reduce the number of
calculations (at the expense of getting a coarser gamma surface) by increasing
step_size
, and vice sersa. Your directory should look something like this:
MoS2/
friction/
lateral/
0x0 0x1 0x2 0x3 0x4 ...
When all of those calculations are finished, you can plot the gamma surface like this:
import os
from twod_materials.friction.analysis import plot_gamma_surface
os.chdir('MoS2/friction/lateral')
plot_gamma_surface()
os.chdir('../../../')
It should have some symmetry to it if all your calculations converged nicely.
You can clearly see the bins and peaks in this plot, but if you want to identify
where they are automatically- like if you are doing this for lots of materials
at once- then there’s a function called get_basin_and_peak_locations()
, also
in twod_materials.friction.analysis
. This might come in handy later.
Running normal force calculations¶
Now that you know what the energy landscape looks like when you slide the layers laterally, you need to know what happens when you shift them closer together or farther apart. The idea is to run a few more calculations at a range of interlayer spacings for the minimum and maximum energy (basin and peak) locations on your gamma surface. These calculations can be run automatically:
import os
from twod_materials.friction.startup import run_normal_force_calculations
from twod_materials.friction.analysis import get_basin_and_peak_locations
os.chdir('MoS2/friction')
run_normal_force_calculations(get_basin_and_peak_locations())
os.chdir('../../')
As per the function’s documentation, you can also specify the basin and peak
locations by hand, like run_normal_force_calculations((0x0, 3x6))
.
Calculating normallateral forces and the coefficient of friction¶
Once these calculations are done running, you’re done running jobs. The normal
force between the two layers (F_N) can be calculated as the instantaneous slope
of the energy vs. interlayer spacing data you just generated. The lateral
friction force (F_f) can be calculated for each interlayer spacing as the
maximum slope of the sinusoidal curve with the energy difference between the
basin energy and the peak energy as its amplitude. In other words, you have
everything you need to know about F_f and F_N. F_f/F_N will give us the unitless
coefficient of friction (mu). mu is not necessarily a constant, and can
actually be described as a function of F_N. So twod_materials
has a
function, get_mu_vs_F_N
that will return a list of all your normal forces,
along with the corresponding F_f’s and mu’s:
import os
from twod_materials.friction.analysis import get_basin_and_peak_locations,\
get_mu_vs_F_N
os.chdir('MoS2/friction')
print get_mu_vs_F_N(get_basin_and_peak_locations()[0])
os.chdir('../')
Plotting your data¶
In typical twod_materials
fashion, you can also plot a lot of this data
automagically. The functions are pretty self-explanatory, so I’ll just show them
below:
import os
from twod_materials.friction.analysis import get_basin_and_peak_locations,\
plot_friction_force, plot_normal_force, plot_mu_vs_F_N
os.chdir('MoS2/friction')
basin_and_peak = get_basin_and_peak_locations()
basin, peak = basin_and_peak[0], basin_and_peak[1]
plot_friction_force()
plot_normal_force(basin)
plot_mu_vs_F_N(basin)
And shazam, you’ve got a lot of nice results to report on.