Film Modeling Classes

Introduction

This section details the modeling classes that exist in Ferro. Currently implemented is a hysteron-based multidomain Preisach model. This was implemented as a stepping stone towards a multidomain Landau model. LandauFilm is the base class for these modeled films, with the goal of eventually having a LandauSimple model for single-temperature measurements and a LandauFull model that handles the temperature-dependence of film hysteresis. LanduaDomain is a class that is used to represent individual ferroelectric domains in the film.

I had hoped to implement the complete Landau model as part of my MS thesis work but did not get around to it. The functions are mostly implemented but I have not gotten around to testing them fully as I was having trouble getting good convergance on calculation of Landau Parameters from experimental data. If you are interested in working on this model to get it running, I would be glad to help you if you have any questions.

LandauFilm

class ferro.models.LandauFilm(thickness=1.3e-06, area=6.606e-05, c=0, pr=0)

Base class for Landau Modeling of ferroelectric thin films using alpha and beta parameters.

LandauSimple models behaviour at one temperature (solves for alpha rather than alpha0 and Curie Temperature). It also asumes a viscosity coefficient of 0.

LandauFull implements rho, Tc, and a0 for more detailed analysis.

c_calc(hyst_data, plot=False)

Calculates non-ferroelectric sample capacitance for the landau film given a list of tf1000 DHM measurement CSV files, with the DHM measurements taken at different frequencies

Calculates non-ferroelectric sample capacitance from the slope of i = C dV/dt using the median abs(current) value at different freq (will give non-switching current value)

Parameters:
  • hyst_data (array_like of HysteresisData files.) –
  • plot (Boolean) – Toggles display of matplotlib plot with data fit.
Returns:

i_fit[0] – Capacitance in farads

Return type:

float

c_compensation(data, plot=False)

Calculates Pr value by subtracting out effect of capacitance in PV curve

Parameters:
  • data (HysteresisData object) –
  • plot (Boolean) – Toggles display of matplotlib plot of original and compensated data.
Returns:

  • comp_data (HysteresisData object) – identical to input but with C*dv/dt current subtracted out and polarization recalculated from new current
  • pr (float) – remnant polarization value

calc_efe_preisach(esweep, domains, init_state=None, plot=False, c_add=False)

Models domains as simple hystereons using ec, pr

Parameters:
  • esweep (np array of field values for which to calculate Pr) –
  • domains (list containing all domain objects in the film) –
  • init_state (np array containing initial state of hysterons (-1 or 1)) –
  • plot (bool, triggers plotting of generated hysteresis curve) –
Returns:

  • p (np array, polarization charge values for film (C/cm^2))
  • state (np array, final state of hysterons)

domain_gen(e, er, prob, n=100, plot=False, retParms=False)

Creates N ferroelectric domains with Ebias and Ec based on the given FORC probability distribution.

Gd: HfO2 forms columnar grains roughly 1:1 aspect ratio:
n = Area/thickness^2

(See Hoffmann et al., 2016, DOI: 10.1002/adfm.201602869)

Parameters:
  • e (1d array of uniformly spaced field values from FORC) –
  • er (1d array of uniformly spaced reverse field values from FORC) –
  • prob (2d array of probabilities (0 to 1) from FORC calculation) –
  • n (int, number of domains) –
  • plot (bool, triggers plotting of generated parms) –
  • retParms (bool, triggers return of array of domain parms) –
Returns:

  • domain_list (list containing domain objects created from generated) – parameters.
  • domains (2d array of length n by 4 containing domain parameters:) – domains[:,0] = E domains[:,1] = Er domains[:,2] = Ec domains[:,3] = Ebias

e_plot(pvals, efe, ec=None, ebias=0)

Plots E vs P for landau film.

Parameters:
  • pvals (1d np array of polarization charge values) –
  • efe (1d np array of electric field calculated at xVals.) –
  • ec (float, overlays dotted line at ec+ebias and -ec+ebias on plot) –
  • ebias (float, defines ebias. Used only if ec defined) –
Returns:

Return type:

n/a

get_ufe(pvals, domains)

Sums potential energy of all ferroelectric domains in a film to get the overall energy landscape.

Parameters:
  • pvals (np array of polarization values at which to solve Ufe) –
  • domains (list containing all domain objects in the film) –
Returns:

uFE

Return type:

potential energy density landscape of film

u_plot(pvals, ufe)

Plots U vs P for landau film.

Parameters:
  • pvals (1d np array of polarization charge values) –
  • ufe (1d np array of energy densities calculated at xVals.) –
Returns:

Return type:

n/a

LandauSimple

class ferro.models.LandauSimple(a=0, **kwargs)

Simplified implementation of Landau model. See LandauBase for more info.

LandauFull

class ferro.models.LandauFull(a0=0, T0=0, rho=0, **kwargs)

Full implementation of Landau model. See LandauBase for more info.

a0_calc(hystData)

IN DEVELOPMENT - needs further testing

Calculates an a0 for the landau film given a list of tf1000 DHM measurement CSV files, with the DHM measurements taken at different frequencies

Parameters:files (array_like of HysteresisData files.) –
Returns:
Return type:n/a - not implemented yet
rho_calc(hyst_data)

IN DEVELOPMENT - needs further testing

Calculates a viscosity coefficient for the landau film given a list of tf1000 DHM measurement CSV files, with the DHM measurements taken at different frequencies

Parameters:files (array_like of HysteresisData files.) –
Returns:
Return type:n/a - not implemented yet

LandauDomain

class ferro.models.LandauDomain(landau, area, ec, ebias, a_term=0, b=0, g=0)
IN DEVELOPMENT - includes different experimental solving methods for
landau parameters

Represents individual ferroelectric domains in the film. Used to calculate domain-specific beta parameter for multidomain simulation. aTerm is alpha or alpha*(T-Tc) coefficient, depending on film model used.

con(p)

Defines parameter constraints.

get_efe(pvals)
Parameters:pvals (np array) – p values for which to solve efe
Returns:efe values
Return type:np array
get_ufe(pvals)
Parameters:pvals (np array) – p values for which to solve ufe
Returns:ufe values
Return type:np array