superconductor Derived Type

type, public, extends(ferromagnet) :: superconductor


Components

Type Visibility Attributes Name Initial
real(kind=wp), public :: length = 1.00_wp

Material length (L/ξ)

real(kind=wp), public :: thouless = 1.00_wp

Thouless energy (ħD/L²)

real(kind=wp), public :: scattering = 0.01_wp

Inelastic scattering (η/Δ₀)

logical, public :: transparent_a = .false.

Interface transparency (left)

logical, public :: transparent_b = .false.

Interface transparency (right)

logical, public :: phaselock = .false.

Lock the center-of-mass phase?

logical, public :: nonequilibrium = .false.

Equilibrium?

logical, public :: transverse = .false.

Transverse potential gradients?

real(kind=wp), public :: voltage = 0.00_wp

Voltage (eV/Δ₀)

real(kind=wp), public :: temperature = 0.01_wp

Temperature (T/Tc)

real(kind=wp), public :: spinvoltage = 0.00_wp

Spin-voltage (eVs/Δ₀)

real(kind=wp), public :: spintemperature = 0.00_wp

Spin-temperature (Ts/Tc)

real(kind=wp), public, dimension(1:3) :: spinaxis = [0, 0, 1]

Spin quantization axis

real(kind=wp), public, allocatable :: energy(:)

Energy domain

real(kind=wp), public, allocatable :: location(:)

Position domain

type(propagator), public, allocatable :: propagator(:,:)

Propagator values

type(propagator), public, allocatable :: backup(:,:)

Propagator backups

real(kind=wp), public, allocatable :: density(:,:,:)

Spin-resolved density of states

real(kind=wp), public, allocatable :: supercurrent(:,:)

Charge, spin, heat, and spin-heat supercurrents

real(kind=wp), public, allocatable :: lossycurrent(:,:)

Charge, spin, heat, and spin-heat dissipative currents

real(kind=wp), public, allocatable :: accumulation(:,:)

Charge, spin, heat, and spin-heat accumulation

real(kind=wp), public, allocatable :: magnetization(:,:)

Magnetization due to exchange and Zeeman effects

complex(kind=wp), public, allocatable :: correlation(:)

Superconducting pair-correlations

integer, public :: order = 1

Simulation priority of this material

class(material), public, pointer :: material_a => null()

Material to the left (default: vacuum)

class(material), public, pointer :: material_b => null()

Material to the right (default: vacuum)

integer, public :: iteration = 0

Used to keep track of selfconsistent iteration cycles

logical, public :: selfconsistent = .true.

Whether to selfconsistently calculate the superconducting gap

logical, public :: boost = .true.

Whether to use convergence acceleration methods

integer, public :: scaling = 128

Maximal mesh increase (range: 2^N, N>1)

integer, public :: method = 4

Runge—Kutta order (range: 2, 4, 6)

integer, public :: control = 2

Error control (1: defect, 2: global error, 3: 1 then 2, 4: 1 and 2)

real(kind=wp), public :: tolerance = 1e-10_wp

Error tolerance (maximum defect or global error)

integer, public :: information = 0

Debug information (range: [-1,2])

real(kind=wp), public :: difference = 1e+10_wp

Difference between iterations

character(len=128), public :: type_string = 'MATERIAL'

Name of this material

type(spinscattering), public, allocatable :: spinscattering

Spin-dependent scattering

type(spinorbit), public, allocatable :: spinorbit

Spin-orbit coupling

type(spinactive), public, allocatable :: spinactive_a

Spin-active interface (left)

type(spinactive), public, allocatable :: spinactive_b

Spin-active interface (right)

real(kind=wp), public, allocatable :: zeeman

How easy the material is magnetized by spin accumulation

real(kind=wp), public, allocatable :: exchange(:,:)

Magnetic exchange field as a function of position

complex(kind=wp), public, allocatable :: gap_history(:,:)

Superconducting order parameter as a function of location (backup of previously calculated gaps on the location mesh)

complex(kind=wp), public, allocatable :: gap_function(:)

Superconducting order parameter as a function of location (relative to the zero-temperature gap of a bulk superconductor)

real(kind=wp), public, allocatable :: gap_location(:)

Location array for the gap function (required because we interpolate the gap to a higher resolution than the propagators)


Type-Bound Procedures

procedure, public :: update => material_update

Calculate propagators

  • private subroutine material_update(this, bootstrap)

    This subroutine updates the state of the material by solving the diffusion equations for the equilibrium propagators, the kinetic equations for the nonequilibrium propagators, and then calculating physical observables.

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(inout) :: this

    Material that will be updated

    logical, intent(in), optional :: bootstrap

    Disable calculation of observables

procedure, public :: update_diffusion => diffusion_update

Calculate propagators (in equilibrium)

  • interface

    private module subroutine diffusion_update(this)

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(inout), target :: this

procedure, public :: update_kinetic => kinetic_update

Calculate propagators (nonequilibrium)

  • interface

    private module subroutine kinetic_update(this)

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(inout), target :: this

procedure, public :: save => material_save

Saves the state of the material

  • private subroutine material_save(this)

    Save a backup of the current material state.

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(inout) :: this

procedure, public :: load => material_load

Loads the state of the material

  • public subroutine material_load(this)

    Load a backup of a previous material state.

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(inout) :: this

procedure, public :: diffusion_equation_a => conductor_diffusion_equation_a

Boundary condition (left)

  • private pure subroutine conductor_diffusion_equation_a(this, p, a, r, rt)

    Calculate residuals from the boundary conditions at the left interface.

    Arguments

    Type IntentOptional Attributes Name
    class(conductor), intent(in) :: this
    type(propagator), intent(in) :: p
    type(propagator), intent(in) :: a
    type(spin), intent(inout) :: r
    type(spin), intent(inout) :: rt

procedure, public :: diffusion_equation_b => conductor_diffusion_equation_b

Boundary condition (right)

  • private pure subroutine conductor_diffusion_equation_b(this, p, b, r, rt)

    Calculate residuals from the boundary conditions at the right interface.

    Arguments

    Type IntentOptional Attributes Name
    class(conductor), intent(in) :: this
    type(propagator), intent(in) :: p
    type(propagator), intent(in) :: b
    type(spin), intent(inout) :: r
    type(spin), intent(inout) :: rt

procedure, public :: kinetic_equation_a => conductor_kinetic_equation_a

Boundary condition (left)

  • private pure subroutine conductor_kinetic_equation_a(this, Gp, Ga, Cp, Ca)

    Calculate proportionality matrices for the boundary conditions at the left interface.

    Arguments

    Type IntentOptional Attributes Name
    class(conductor), intent(in) :: this
    type(propagator), intent(in) :: Gp
    type(propagator), intent(in) :: Ga
    complex(kind=wp), intent(out), dimension(0:7,0:7) :: Cp
    complex(kind=wp), intent(out), dimension(0:7,0:7) :: Ca

procedure, public :: kinetic_equation_b => conductor_kinetic_equation_b

Boundary condition (right)

  • private pure subroutine conductor_kinetic_equation_b(this, Gp, Gb, Cp, Cb)

    Calculate proportionality matrices for the boundary conditions at the right interface.

    Arguments

    Type IntentOptional Attributes Name
    class(conductor), intent(in) :: this
    type(propagator), intent(in) :: Gp
    type(propagator), intent(in) :: Gb
    complex(kind=wp), intent(out), dimension(0:7,0:7) :: Cp
    complex(kind=wp), intent(out), dimension(0:7,0:7) :: Cb

procedure, public :: construct => superconductor_construct

Construct propagators

  • private subroutine superconductor_construct(this)

    Constructs a superconducting material that is initialized to a superconducting state.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

procedure, public :: initialize => superconductor_initialize

Initialize propagators

  • private subroutine superconductor_initialize(this)

    Redefine the default initializer.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

procedure, public :: diffusion_equation => superconductor_diffusion_equation

Diffusion equation

  • private pure subroutine superconductor_diffusion_equation(this, p, e, z)

    Use the diffusion equation to calculate the second derivatives of the Riccati parameters at point z.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(in) :: this
    type(propagator), intent(inout) :: p
    complex(kind=wp), intent(in) :: e
    real(kind=wp), intent(in) :: z

procedure, public :: kinetic_equation => superconductor_kinetic_equation

Kinetic equation

  • private pure subroutine superconductor_kinetic_equation(this, Gp, R, z)

    Calculate the self-energies in the kinetic equation.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(in) :: this
    type(propagator), intent(in) :: Gp
    complex(kind=wp), intent(inout), dimension(0:7,0:7) :: R
    real(kind=wp), intent(in) :: z

procedure, public :: update_gap => superconductor_update_gap

Calculate the superconducting order parameter

  • private subroutine superconductor_update_gap(this)

    Interpolate the superconducting correlations Δ(z) to a higher resolution, to make the calculations more stable near strong ferromagnetic materials.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

    Superconductor object

procedure, public :: update_boost => superconductor_update_boost

Boost the convergence of the order parameter (Steffensen's method)

  • private subroutine superconductor_update_boost(this)

    Boost the convergence of the order parameter using Steffensen's method.

    The basic idea is that a selfconsistent solution of the Usadel equations can be regarded as a fixpoint iteration problem Δ=f(Δ), where the function f consists of solving the diffusion and gap equations one time. We're seeking the point where f'(Δ)=0, and this can be done more efficiently using e.g. Newtons method than a straight-forward fixpoint-iteration. Using Newtons method, we get: Δ_{n+1} = Δ_{n} - f'(Δ_n)/f''(Δ_n) Using a finite-difference approximation for the derivatives, we arrive at the Steffensen iteration scheme, which yields an improved 2nd-order convergence: Δ_{n+3} = Δ_{n} - (Δ_{n+1} - Δ_{n})²/(Δ_{n+2} - 2Δ_{n+1} + Δ_{n}) In most of my tests, the simulation time is then reduced by a factor 2x to 5x.

    Note

    : I have also experimented with several higher-order methods, including methods that utilize the 3rd derivative or perform multiple successive boosts. However, my experience so far is that these are less stable than Steffensen's method, and often converged more slowly. These methods have therefore been discarded.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

procedure, public :: update_prehook => superconductor_update_prehook

Update the internal variables before calculating the propagators

  • private subroutine superconductor_update_prehook(this)

    Code to execute before running the update method of a class(superconductor) object.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

procedure, public :: update_posthook => superconductor_update_posthook

Update the superconducting order parameter from the propagators

  • private subroutine superconductor_update_posthook(this)

    Updates the superconducting order parameter based on the propagators of the system.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this

procedure, public :: gap => superconductor_gap

Return the superconducting order parameter at a given position

  • private pure function superconductor_gap(this, location) result(gap)

    Returns the superconducting order parameter at the given location.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(in) :: this
    real(kind=wp), intent(in) :: location

    Return Value complex(kind=wp)

procedure, public :: conf => superconductor_conf

Configure material parameters

  • private subroutine superconductor_conf(this, key, val)

    Configure a material property based on a key-value pair.

    Arguments

    Type IntentOptional Attributes Name
    class(superconductor), intent(inout) :: this
    character(len=*), intent(in) :: key
    character(len=*), intent(in) :: val