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) |
Calculate propagators
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.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(material), | intent(inout) | :: | this |
Material that will be updated |
||
logical, | intent(in), | optional | :: | bootstrap |
Disable calculation of observables |
Calculate propagators (in equilibrium)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(material), | intent(inout), | target | :: | this |
Calculate propagators (nonequilibrium)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(material), | intent(inout), | target | :: | this |
Saves the state of the material
Save a backup of the current material state.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(material), | intent(inout) | :: | this |
Loads the state of the material
Load a backup of a previous material state.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(material), | intent(inout) | :: | this |
Boundary condition (left)
Calculate residuals from the boundary conditions at the left interface.
Type | Intent | Optional | 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 |
Boundary condition (right)
Calculate residuals from the boundary conditions at the right interface.
Type | Intent | Optional | 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 |
Boundary condition (left)
Calculate proportionality matrices for the boundary conditions at the left interface.
Type | Intent | Optional | 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 |
Boundary condition (right)
Calculate proportionality matrices for the boundary conditions at the right interface.
Type | Intent | Optional | 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 |
Construct propagators
Constructs a superconducting material that is initialized to a superconducting state.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Initialize propagators
Redefine the default initializer.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Diffusion equation
Use the diffusion equation to calculate the second derivatives of the Riccati parameters at point z.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(in) | :: | this | |||
type(propagator), | intent(inout) | :: | p | |||
complex(kind=wp), | intent(in) | :: | e | |||
real(kind=wp), | intent(in) | :: | z |
Kinetic equation
Calculate the self-energies in the kinetic equation.
Type | Intent | Optional | 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 |
Calculate the superconducting order parameter
Interpolate the superconducting correlations Δ(z) to a higher resolution, to make the calculations more stable near strong ferromagnetic materials.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Superconductor object |
Boost the convergence of the order parameter (Steffensen's method)
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.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Update the internal variables before calculating the propagators
Code to execute before running the update method of a class(superconductor) object.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Update the superconducting order parameter from the propagators
Updates the superconducting order parameter based on the propagators of the system.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this |
Return the superconducting order parameter at a given position
Returns the superconducting order parameter at the given location.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(in) | :: | this | |||
real(kind=wp), | intent(in) | :: | location |
Configure material parameters
Configure a material property based on a key-value pair.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(superconductor), | intent(inout) | :: | this | |||
character(len=*), | intent(in) | :: | key | |||
character(len=*), | intent(in) | :: | val |