medypt.imt ========== .. py:module:: medypt.imt .. autoapi-nested-parse:: Class for simulating mesoscopic dynamics of insulator-metal transitions in materials. Classes ------- .. autoapisummary:: medypt.imt.IMTModel Module Contents --------------- .. py:class:: IMTModel Bases: :py:obj:`medypt.model.ModelBase` Class for simulating mesoscopic dynamics of insulator-metal transitions in materials. The names of the fields are: * ``'op'``: Order parameter (vector field) * ``'u'``: Displacement (vector field) * ``'ge'``: Reduced chemical potential for electrons (scalar field). Equivalent to specifying electron density. For definition, see note. * ``'gh'``: Reduced chemical potential for holes (scalar field). Equivalent to specifying hole density. For definition, see note. * ``'phi'``: Electrical potential (scalar field) * ``'T'``: Temperature (scalar field) * ``'gd'``: Reduced chemical potential for neutral defects (scalar field). * ``'gdi'``: Reduced chemical potential for ionized defects (scalar field). Combined with ``'gd'`` to determine both neutral and ionized defect density. * ``'j0'``: Helper real-element field representing the *average* outward current density on the boundary tagged by 0. Boundary current is ``j0`` multiplied by the area of the boundary. If you need to use boundary current in defining your problem, make sure to tag the corresponding boundary with 0 in the mesh. Units used in this class are: * Length: nm * Time: ns * Energy: eV (temperature absorbs the Boltzmann constant and is also in this unit) * Charge: e (positive elementary charge) .. note:: ``ge`` = (mu_e - ``charge_gap(op)`` / 2 - ``gap_center(op)`` + e ``phi``) / ``T``, ``gh`` = (mu_h - ``charge_gap(op)`` / 2 + ``gap_center(op)`` - e ``phi``) / ``T``, where mu_e and mu_h are the electron and hole quasi-chemical potentials, respectively. The chemical potential and the electronic energy (including the electrostatic energy) share the same reference level E_ref which will cancel out. The expressions of ``ge`` and ``gh`` imply that ``phi`` = 0 corresponds to the intrinsic situation free of electrostatic influence, i.e., the system is moved infinitely far away from any charges. This means that the reference point of ``phi`` itself can be considered to be the infinitly far point away from the system (the most common choice in electrodynamics), regardless of the choice of E_ref. Hence the grounded boundary condition corresponds to ``phi`` = 0 as usual. .. py:attribute:: params A dictonary defining physical parameters. Contents include: * ``'stiffness'`` (array-like, eV / nm^3): Stiffness tensor. 1D array-like (containing Young's modulus and Poisson's ratio: isotropic) or 2D array-like (full tensor in Voigt notation) * ``'e_eff_mass'`` (float, dimensionless): Electron effective mass devided by free electron mass * ``'h_eff_mass'`` (float, dimensionless): Hole effective mass devided by free electron mass * ``'therm_expan_coeff'`` (float | array-like, eV^-1): Thermal expansion coefficient. Scalar (isotropic) or 1D array-like (full vector in Voigt notation) * ``'therm_expan_Tref'`` (float, eV): Reference temperature for thermal expansion * ``'op_relax_rate_const'`` (float | array-like, nm^3 / (eV ns)): Order-parameter relaxation rate constant. Scalar (isotropic) or 2D array-like (full tensor) * ``'e_mobility'`` (float | array-like, nm^2 / (V ns)): Electron mobility. Scalar (isotropic) or 2D array-like (full tensor) * ``'h_mobility'`` (float | array-like, nm^2 / (V ns)): Hole mobility. Scalar (isotropic) or 2D array-like (full tensor) * ``'eh_recomb_rate_const'`` (float, nm^3 / ns): Electron-hole recombination rate constant * ``'back_diel_const'`` (float | array-like, dimensionless): Background dielectric constant. Scalar (isotropic) or 2D array-like (full tensor) * ``'vol_heat_cap'`` (float, nm^-3): Volumetric heat capacity * ``'therm_conduct'`` (float | array-like, nm^-1 ns^-1): Thermal conductivity. Scalar (isotropic) or 2D array-like (full tensor) * ``'d_max_density'`` (float, nm^-3): Maximum defect density * ``'d_neutral_max_diffus'`` (float | array-like, nm^2 / ns): Maximum diffusivity for neutral defects. Scalar (isotropic) or 2D array-like (full tensor) * ``'d_neutral_act_energy'`` (float, eV): Activation energy for neutral defect diffusion * ``'d_ionized_max_diffus'`` (float | array-like, nm^2 / ns): Maximum diffusivity for ionized defects. Scalar (isotropic) or 2D array-like (full tensor) * ``'d_ionized_act_energy'`` (float, eV): Activation energy for ionized defect diffusion * ``'d_valence'`` (int, dimensionless): Valence of the defect * ``'d_elec_level'`` (float, eV): Electronic level of the defect * ``'d_neutral_volume'`` (float, nm^3): Volume change induced by one neutral defect * ``'d_ionized_volume'`` (float, nm^3): Volume change induced by one ionized defect * ``'d_ionize_rate_const'`` (float, nm^(3 * d_valence) / ns): Ionization rate constant of the defect .. py:method:: load_physics(phys: collections.abc.Sequence[str], **kwargs: Any) Load physics components of the insulator-metal transition model. :param phys: Sequence of strings specifying which physics components to load. Order does not matter. Possible values are: * ``'op'``: Order parameter relaxation. Creates ``op`` field. Needs * temperature: load ``'T'`` or pass a float to ``T`` in ``kwargs``. * ``'T'``: Heat conduction and generation. Creates ``T`` field. * ``'phi'``: Electrostatics. Creates ``phi`` field. * ``'u'``: Mechanical equilibrium. Creates ``u`` field. Needs * temperature: load ``'T'`` or pass a float to ``T`` in ``kwargs``. * ``'eh'``: Electron-hole transport and recombination. Creates ``ge`` and ``gh`` fields. Needs * Temperature: load ``'T'`` or pass a float to ``T`` in ``kwargs``. * Charge gap: load ``'op'`` and pass a callable to ``charge_gap`` in ``kwargs``; or pass a float to ``charge_gap`` in ``kwargs``. * Gap center: load ``'op'`` and pass a callable to ``gap_center`` in ``kwargs``; or pass a float to ``gap_center`` in ``kwargs``. * ``'d'``: Defect diffusion and ionization. Creates ``gd`` and ``gdi`` fields. Needs * temperature: load ``'T'`` or pass a float to ``T`` in ``kwargs``. * ``'j0'``: Average outward current density on boundary tagged by 0. Creates ``j0`` field. Requires ``'eh'`` to be loaded. * ``'lambda'``: Lagrange multiplier for fixing average electrical potential to zero. Creates ``lambda`` field. Requires ``'phi'`` to be loaded. Coupling between different physics components will be automatically added when multiple components are loaded. :type phys: Sequence[str] :param kwargs: Additional keyword arguments required for loading certain physics components: * ``op_dim`` (int): Dimension of the order parameter field. Required when loading ``'op'``. * ``intrinsic_f`` (Callable[[Any, Any, Any], Any]): Callable returning the intrinsic free energy density, with a calling signature ``intrinsic_f(T, op, dop)``, where ``op`` is treated as a 1D array and ``dop`` is the gradient of ``op`` treated as a 2D array with a shape ``(op_dim, mesh_dim)``. Required when loading ``'op'``. * ``trans_strn`` (Callable[[Any], Any]): Callable returning the eigenstrain in Voigt notation, with a calling signature ``trans_strn(op)``. Required when loading ``'u'`` along with ``'op'``. * ``charge_gap`` (Callable[[Any], Any] | float): Callable returning the energy gap with a calling signature ``charge_gap(op)``, required when loading ``'eh'`` along with ``'op'``; or a float, required when loading ``'eh'`` without loading ``'op'``. * ``gap_center`` (Callable[[Any], Any] | float): Callable returning the center of the gap measured from a fixed energy level (reference level) with a calling signature ``gap_center(op)``, required when loading ``'eh'`` along with ``'op'``; or a float, required when loading ``'eh'`` without loading ``'op'``. * ``light_intens`` (:py:class:`dolfinx.fem.Function` | :py:class:`dolfinx.fem.Constant` | float): Light intensity field in unit of eV / (nm^2 ns). Optional when loading ``'eh'``. * ``light_freq`` (float): Light frequency (multiplied by h) in unit of eV. Optional when loading ``'eh'``. Must be provided together with ``light_intens`` to enable photoexcitation. :type kwargs: dict[str, Any] :returns: ``None``