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, IndentationVerificationMixin

Main 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: object

The 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 hc0

prefactors:

  • “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

{}