Nanoindentation Library
Classes to evaluate indentation data and indenter tip
Methods: iso, multiple unloading segments, csm
Vendor: Agilent, Hysitron, FischerScope, Micromaterials
Indenter tip: shape of indenter tip and gantry stiffness (that what you calibrate)
UNITS: one should use mSI units in this code, since Agilent area function is unit-dependent
[mN], [um], [GPa] (force, length, stress)
Variables: differentiate different length
array of full length: force, time, depth, validMask, … [used for plotting]
array of valid length: E,H,Ac,hc, … [only has the length where these values are valid]
force[validMask] = pMax
all these are vectors: OliverPharr et al methods are only vector functions
- class micromechanics.indentation.Indentation(fileName: str = '', nuMat: float = 0.3, tip: Tip | None = None, surface: dict[str, dict[str, Any]] | None = None, model: dict[str, float | bool | str] | None = None, output: dict[str, Any] | None = None)
Bases:
IndentationInputMixin,IndentationMainMixin,IndentationTheoryMixin,IndentationHertzMixin,IndentationPlotMixin,IndentationCalibrationMixin,IndentationVerificationMixinMain class of indentation
- __init__(fileName: str = '', nuMat: float = 0.3, tip: Tip | None = None, surface: dict[str, dict[str, Any]] | None = None, model: dict[str, float | bool | str] | None = None, output: dict[str, Any] | None = None) None
Initialize indentation experiment data
- Parameters:
fileName (str) – fileName to open (.xls, .hld)
nuMat (float) – material’s Poisson ratio.
tip (tip) – tip class to use; None=perfect
surface (dict) – dictionary describing the surface find
model (dict) – numerical parameters that determine the evaluation
output (dict) – links that describe the output (graphs and print-to-screen)
- fillVendorDefaults() None
fill defaults depending on vendor, if information is not yet present
- class micromechanics.indentation.Tip(shape: Any = 'perfect', interpFunction: Callable[[ndarray], Any] | None = None, compliance: float = 0.0, plot: bool = False, verbose: int = 0)
Bases:
objectThe main class to define indenter shape and other default values.
- __init__(shape: Any = 'perfect', interpFunction: Callable[[ndarray], Any] | None = None, compliance: float = 0.0, plot: bool = False, verbose: int = 0)
Initialize indenter shape
- Parameters:
shape (list) – list of prefactors (default = “perfect”)
interpFunction (function) – tip-shape function Ac = f(hc), when it is given, other information is superseded
compliance (float) – additional compliance in test [um/mN] (sensible values: 0.0001..0.01)
plot (bool) – plot indenter shape
verbose (bool) – output
- areaFunction(h: ndarray) ndarray
AREA FUNCTION: from contact depth hc calculate area
analytical functions inside are using [nm]; the outside of this function uses [um]|br| hence at the start and end there is conversion. Interpolation functions use the outside units directly: contact depth [um] and projected area [um^2].prefactors:
“iso” type area function A=ax^2+bx^1+cx^0.5…, [nm]
“perfect” type area function of a perfect Berkovich A=3*sqrt(3)*tan(65.27)^2 hc^2 = 24.494 hc^2
- “sphere” type: A=pi(2Rh-h^2), h=depth, R indenter radius; for small h-> h^2=0
prefactors [-pi, 2piR], R in nm does not account for cone at top
- Parameters:
h – contact depth in um
- areaFunctionInverse(area: ndarray, hc0: ndarray | None = None) ndarray | None
INVERSE AREA FUNCTION: from area calculate contact depth hc
using Newton iteration with initial guess contact depth hc0prefactors:
“perfect” type area function uses the direct inverse of a perfect Berkovich tip
other monotonic area functions are inverted numerically
- Parameters:
area (numpy.array) – projected contact area
hc0 (numpy.array) – initial Guess contact depth
- Returns:
h = total penetration depth
- Return type:
numpy.array
- plotIndenterShape(maxDepth: float = 1, steps: int = 50, show: bool = True, tipLabel: str = 'this tip', fileName: str = '') None
check indenter shape: plot shape function against perfect Berkovich
analytical: perfect shape is 2.792254*x- Parameters:
maxDepth (numpy.array) – maximum depth [um] to plot; default=10um
steps (int) – number of steps for plotting
show (bool) – show figure
tipLabel (str) – label for this tip
fileName (str) – if given, save to file
- property prefactors: list[Any] | None
Backward-compatible representation of the tip area function.
- Returns:
area-function prefactors followed by the shape name, or None for interpolation tips.
- Return type:
list[Any] | None
- setInterpolationFunction(interpFunction: Callable[[ndarray], Any]) None
The interpolation of tip-shape function Ac = f(hc)
From Oliver-Pharr Method, projected area of contact Ac can be obtained by measuring contact depth hc.
When the interpolation function is given, other information is superseded.
The interpolation function takes contact depth in um and returns projected area in um^2.
- Parameters:
interpFunction (function) – interpolation function from contact depth [um] to projected area [um^2].
Default Dictionaries
Default Model
Key |
Default |
Description |
|---|---|---|
nuTip |
0.07 |
|
modulusTip |
1140 |
GPa from Oliver,Pharr Method paper |
beta |
0.75 |
beta: contact depth coefficient |
nonMetal |
1 |
switch between metal=0 and nonMetal=amorphous=default=1. |
driftRate |
0 |
drift rate in [um/s] |
unloadPMax |
0.99 |
upper end of fitting domain of unloading stiffness: Vendor-specific change |
unloadPMin |
0.5 |
lower end of fitting domain of unloading stiffness: Vendor-specific change |
unloadInitialM |
-1 |
initial value of m that is used to determine the initial values of B and hf, which are then used to fit the unloading curve. 1<m0<10, if -1 then best m0 is automatically identified |
relForceRateNoise |
0.02 |
threshold of dp/dt use to identify start of loading: Vendor-specific change |
relForceRateNoiseFilter |
‘median’ |
|
forceNoise |
0.001 |
threshold force to identify start of loading |
evaluateSAtMax |
True |
evaluate stiffness at maximum or at end of power-law fit domain |
maxSizeFluctuations |
10 |
maximum size of small fluctuations that are removed in identifyLoadHoldUnload |
cropSlopeToLoading |
True |
crop the slope to the domain between the surface and loading, after those are identified |
Vendor Dependent Defaults
Vendor |
unloadPMax |
unloadPMin |
relForceRateNoise |
Description |
|---|---|---|---|---|
Agilent |
0.999 |
0.5 |
0.02 |
|
Hysitron |
0.95 |
0.4 |
0.2 |
|
Micromaterials |
0.99 |
0.5 |
0.02 |
|
FischerScope |
0.95 |
0.21 |
0.01 |
|
Hdf5 |
0.99 |
0.5 |
0.02 |
|
AgilentHDF5 |
0.99 |
0.5 |
0.02 |
|
KLAHDF5 |
0.99 |
0.5 |
0.007 |
enhanced accuracy |
FischerScopeHDF5 |
0.99 |
0.21 |
0.02 |
reduced accuracy |
MicromaterialsHDF5 |
0.99 |
0.5 |
0.02 |
|
HysitronHDF5 |
0.99 |
0.5 |
0.04 |
|
FemtotoolsHDF5 |
0.99 |
0.5 |
0.04 |
|
SurfaceHDF5 |
0.99 |
0.5 |
0.04 |
Default Output
Key |
Default |
Description |
|---|---|---|
verbose |
2 |
the higher, the more information printed: 2=default, 1=minimal, 0=print nothing |
plotLoadHoldUnload |
False |
plot intermediate steps; helpful for debugging |
ax |
None |
matplotlib axis to use for plotting |
plotWithLabel |
False |
plot legend |
progressBar |
None |
callback function to use for plotting progress bar f(value, location) |
successTest |
[] |
list of all test with valid load-hold-unload sequence |
Default Surface
Key |
Default |
Description |
|---|---|---|
surfaceIdx |
{} |