|
|
The `st-wslda` codes support the following initialization modes:
|
|
|
```bash
|
|
|
inittype 0 # 0 - create uniform solution and start from it
|
|
|
# 10 - read uniform solution from file `inprefix`/uniform.solution
|
|
|
#
|
|
|
# 5 - start from st-wslda checkpoint, inprefix points to folder with checkpoint binary file
|
|
|
#
|
|
|
# -1 - custom initialization
|
|
|
```
|
|
|
[[_TOC_]]
|
|
|
|
|
|
# Initializing solver with a uniform solution
|
|
|
The simplest way to start the self-consistent process is to initialize buffers with a solution of a uniform problem. To generate the uniform solution user should use:
|
|
|
```bash
|
|
|
inittype 0 # 0 - create uniform solution and start from it
|
|
|
```
|
|
|
|
|
|
Alternatively, if a uniform solution is already existing the user can read it from file:
|
|
|
```bash
|
|
|
inittype 10 # 10 - read uniform solution from file `inprefix`/uniform.solution
|
|
|
inprefix test # uniform solution is stored in this location
|
|
|
```
|
|
|
|
|
|
Following flags in the *input* file are used to control the generation process of the uniform solution:
|
|
|
```bash
|
|
|
# ----------- IN CASE OF: inittype=0 ----------------
|
|
|
# init0Na 28.0 # requested number of particles of type a, default=Na
|
|
|
# init0Nb 28.0 # requested number of particles of type b, default=Nb
|
|
|
# init0muchange 0.1 # change rate of chemical potentials, default muchange
|
|
|
# init0Tstart 0.1 # start temperature, in units of eF, default value is equal to init0Tstop
|
|
|
# init0Tstop 0.01 # Temperature, in units of eF, default=temperature
|
|
|
# init0DeltaT 0.01 # change of temperature in units of eF, default 0.01
|
|
|
# init0eps 1.0e-9 # epsilon for convergence, default 1.0e-9
|
|
|
# init0scmix 0.5 # mixing parameter in self-consistent process, default=linearmixing
|
|
|
# init0maxiter 1000 # maximum number of iterations, default=10000
|
|
|
init0debug 1 # debug level, default=0 (no debug info), 1 (basic debug info), 2 (detailed debug info)
|
|
|
init0save 1 # 0 - no saving of solution to file, 1 - save solution to the file
|
|
|
```
|
|
|
Note that, many of them are commented out, and then the values are taken from corresponding tags of the main code.
|
|
|
|
|
|
For spin symmetric systems to code typically converges without any problems. For spin-imbalanced systems, the uniform solution typically is hard to obtain. To overcome this problem, we introduced a method where we start from the solution at finite temperature `init0Tstart` and we gradually decrease the temperature to destination temperature `init0Tstop` with step `init0DeltaT`. Such a problematic case is shown below (for `temperature 0.01`):
|
|
|
```
|
|
|
# CREATING UNIFORM SOLUTION...
|
|
|
# DEBUG: n_a=0.017708, n_b=0.018750
|
|
|
# DEBUG: eF_a=0.516086, eF_b=0.536132, eF_avg=0.526157
|
|
|
# DEBUG: N_a=17.000000, N_b=18.000000
|
|
|
# DEBUG: p=-0.028571
|
|
|
# DEBUG: alph_a=1.089111, alph_b=1.098021, alph_plus=1.093566
|
|
|
# DEBUG: dalphm_dna=4.393928, dalphm_dnb=-4.149821
|
|
|
# DEBUG: dalphp_dna=0.856253, dalphp_dnb=-0.808683
|
|
|
# DEBUG: dtildeC_dna=-0.323965, dtildeC_dnb=-0.274273
|
|
|
# DEBUG: dD_dna=-0.289825, dD_dnb=-0.265175
|
|
|
# DEBUG: D=-0.006063, tC=-0.032638
|
|
|
# DEBUG: tau_a=0.010967, tau_b=0.012063
|
|
|
# DEBUG: delta=0.258043, nu=0.007702
|
|
|
# TEMPCONV: T=0.010000, iter=10000, delta/eF_a=0.509012, mu_a/eF_a=-0.061340, delta/eF_b=0.489980, mu_b/eF_b=0.911447
|
|
|
# WARNING: MAXITER REACHED!
|
|
|
# TEMPCONV: T=0.010000, energy_kin=1.923270, energy_pot=-0.526501, energy_pair=-0.967234, energy_tot=0.429535
|
|
|
# ENERGY CUT-OFF: EC1=5.150865
|
|
|
# ENERGY CUT-OFF: EC2=-4.682460
|
|
|
# ENERGY CUT-OFF: EC=4.909640
|
|
|
# UNIFORM SOLUTION: delta/eF_a= 0.5090, mu_a/eF_a= -0.0613, delta/eF_b= 0.4900, mu_b/eF_b= 0.9114, ec= 4.9096
|
|
|
# UNIFORM SOLUTION: energy_kin= 1.923270037681, energy_pot= -0.526501268447, energy_pair= -0.967234017120, energy_tot= 0.429534752115
|
|
|
# UNIFORM SOLUTION: nwf=970
|
|
|
```
|
|
|
It was obtained for default values, and the code indicates `# WARNING: MAXITER REACHED!` which means that the self-consistency was not obtained. However, when setting:
|
|
|
```bash
|
|
|
init0Tstart 0.1 # start temperature, in units of eF,
|
|
|
```
|
|
|
we obtain:
|
|
|
```
|
|
|
# CREATING UNIFORM SOLUTION...
|
|
|
# DEBUG: n_a=0.017708, n_b=0.018750
|
|
|
# DEBUG: eF_a=0.516086, eF_b=0.536132, eF_avg=0.526157
|
|
|
# DEBUG: N_a=17.000000, N_b=18.000000
|
|
|
# DEBUG: p=-0.028571
|
|
|
# DEBUG: alph_a=1.089111, alph_b=1.098021, alph_plus=1.093566
|
|
|
# DEBUG: dalphm_dna=4.393928, dalphm_dnb=-4.149821
|
|
|
# DEBUG: dalphp_dna=0.856253, dalphp_dnb=-0.808683
|
|
|
# DEBUG: dtildeC_dna=-0.323965, dtildeC_dnb=-0.274273
|
|
|
# DEBUG: dD_dna=-0.289825, dD_dnb=-0.265175
|
|
|
# DEBUG: D=-0.006063, tC=-0.032638
|
|
|
# DEBUG: tau_a=0.010967, tau_b=0.012063
|
|
|
# DEBUG: delta=0.258043, nu=0.007702
|
|
|
# TEMPCONV: T=0.100000, iter=2911, delta/eF_a=0.503474, mu_a/eF_a=0.195268, delta/eF_b=0.484650, mu_b/eF_b=0.668692
|
|
|
# TEMPCONV: T=0.100000, energy_kin=1.915994, energy_pot=-0.526501, energy_pair=-0.948608, energy_tot=0.440885
|
|
|
# TEMPCONV: T=0.090000, iter=1873, delta/eF_a=0.503667, mu_a/eF_a=0.163986, delta/eF_b=0.484835, mu_b/eF_b=0.698980
|
|
|
# TEMPCONV: T=0.090000, energy_kin=1.916098, energy_pot=-0.526501, energy_pair=-0.949330, energy_tot=0.440267
|
|
|
# TEMPCONV: T=0.080000, iter=1482, delta/eF_a=0.503698, mu_a/eF_a=0.132936, delta/eF_b=0.484865, mu_b/eF_b=0.729129
|
|
|
# TEMPCONV: T=0.080000, energy_kin=1.915824, energy_pot=-0.526501, energy_pair=-0.949435, energy_tot=0.439888
|
|
|
# TEMPCONV: T=0.070000, iter=1130, delta/eF_a=0.503659, mu_a/eF_a=0.102453, delta/eF_b=0.484828, mu_b/eF_b=0.758759
|
|
|
# TEMPCONV: T=0.070000, energy_kin=1.915372, energy_pot=-0.526501, energy_pair=-0.949276, energy_tot=0.439595
|
|
|
# TEMPCONV: T=0.060000, iter=822, delta/eF_a=0.503586, mu_a/eF_a=0.072729, delta/eF_b=0.484758, mu_b/eF_b=0.787641
|
|
|
# TEMPCONV: T=0.060000, energy_kin=1.914814, energy_pot=-0.526501, energy_pair=-0.948989, energy_tot=0.439323
|
|
|
# TEMPCONV: T=0.050000, iter=561, delta/eF_a=0.503481, mu_a/eF_a=0.043927, delta/eF_b=0.484656, mu_b/eF_b=0.815579
|
|
|
# TEMPCONV: T=0.050000, energy_kin=1.914134, energy_pot=-0.526501, energy_pair=-0.948580, energy_tot=0.439052
|
|
|
# TEMPCONV: T=0.040000, iter=351, delta/eF_a=0.503324, mu_a/eF_a=0.016246, delta/eF_b=0.484505, mu_b/eF_b=0.842323
|
|
|
# TEMPCONV: T=0.040000, energy_kin=1.913266, energy_pot=-0.526501, energy_pair=-0.947983, energy_tot=0.438782
|
|
|
# TEMPCONV: T=0.030000, iter=223, delta/eF_a=0.503090, mu_a/eF_a=-0.010016, delta/eF_b=0.484280, mu_b/eF_b=0.867514
|
|
|
# TEMPCONV: T=0.030000, energy_kin=1.912119, energy_pot=-0.526501, energy_pair=-0.947102, energy_tot=0.438515
|
|
|
# TEMPCONV: T=0.020000, iter=221, delta/eF_a=0.502800, mu_a/eF_a=-0.034271, delta/eF_b=0.484001, mu_b/eF_b=0.890670
|
|
|
# TEMPCONV: T=0.020000, energy_kin=1.910759, energy_pot=-0.526501, energy_pair=-0.946017, energy_tot=0.438242
|
|
|
# TEMPCONV: T=0.010000, iter=112, delta/eF_a=0.502792, mu_a/eF_a=-0.054949, delta/eF_b=0.483994, mu_b/eF_b=0.911258
|
|
|
# TEMPCONV: T=0.010000, energy_kin=1.910379, energy_pot=-0.526501, energy_pair=-0.945957, energy_tot=0.437921
|
|
|
# ENERGY CUT-OFF: EC1=5.146473
|
|
|
# ENERGY CUT-OFF: EC2=-4.682285
|
|
|
# ENERGY CUT-OFF: EC=4.907524
|
|
|
# UNIFORM SOLUTION: delta/eF_a= 0.5028, mu_a/eF_a= -0.0549, delta/eF_b= 0.4840, mu_b/eF_b= 0.9113, ec= 4.9075
|
|
|
# UNIFORM SOLUTION: energy_kin= 1.910378825876, energy_pot= -0.526501268447, energy_pair= -0.945956681969, energy_tot= 0.437920875460
|
|
|
# UNIFORM SOLUTION: nwf=970
|
|
|
```
|
|
|
|
|
|
Depending on the settings you will need to also modify other `init0` parameters.
|
|
|
|
|
|
# Starting from checkpoint
|
|
|
The code can be initialized by an already existing solution generated by `st-wslda`.
|
|
|
It is the most commonly used option. To activate this option you need to set:
|
|
|
```bash
|
|
|
inittype 5 # 5 - start from st-wslda checkpoint, inprefix points to folder with checkpoint binary file
|
|
|
inprefix test
|
|
|
```
|
|
|
|
|
|
**NOTE**: Present implementation does not allow for initializing higher dimensional calculations via checkpoint generated by lower-dimensional code, for example: 3D code cannot be initialized by checkpoint generated by 2D or 1D code.
|
|
|
|
|
|
# Custom initialization of the solver
|
|
|
The static codes can start the self-consistent process from arbitrary initial conditions. To activate this option user must specify in the input file:
|
|
|
```bash
|
|
|
inittype -1 # -1 - custom initialization
|
|
|
```
|
|
|
|
|
|
Using this functionality it is mandatory to initialize value of potentials via `modify_potentials(...)` routine. Initializtion iteration has index `it=-1`. Below we present example of such initialization.
|
|
|
```c
|
|
|
void modify_potentials(int it, wslda_density h_densities, wslda_potential h_potentials, double *params, size_t extra_data_size, void *extra_data)
|
|
|
{
|
|
|
// DETERMINE LOCAL SIZES OF ARRAYS (CODE DIMENSIONALITY DEPENDENT)
|
|
|
int lNX=h_densities.nx, lNY=h_densities.ny, lNZ=h_densities.nz; // local sizes
|
|
|
int ix, iy, iz, ixyz;
|
|
|
|
|
|
if(it==-1 && wsldapid==0) printf("SETTING MY VALUES FOR STARTING POINT\n");
|
|
|
|
|
|
// ITERATE OVER ALL POINTS
|
|
|
ixyz=0;
|
|
|
if(it==-1) for(ix=0; ix<lNX; ix++) for(iy=0; iy<lNY; iy++) for(iz=0; iz<lNZ; iz++)
|
|
|
{
|
|
|
double x = DX*(ix-lNX/2);
|
|
|
double y = DY*(iy-lNY/2); // for 1d code y will be always 0
|
|
|
double z = DZ*(iz-lNZ/2); // for 1d and 2d codes z will be always 0
|
|
|
|
|
|
// my custom initialization of the solver
|
|
|
|
|
|
h_densities.rho_a[ixyz]=h_densities.rho_b[ixyz]=0.018; // guess for the density, here I set constant value
|
|
|
|
|
|
// all potentials must be filled, since they are used to construct BdG matrix
|
|
|
h_potentials.delta[ixyz]=0.1 + I*0.0; // guess for delta
|
|
|
h_potentials.alpha_a[ixyz]=h_potentials.alpha_b[ixyz]=1.0; // bare mass
|
|
|
h_potentials.V_a[ixyz]=h_potentials.V_b[ixyz]=0.0; // no mean-field
|
|
|
h_potentials.A_a_x[ixyz]=h_potentials.A_b_x[ixyz]=0.0; // no current potentials
|
|
|
h_potentials.A_a_y[ixyz]=h_potentials.A_b_y[ixyz]=0.0; // no current potentials
|
|
|
h_potentials.A_a_z[ixyz]=h_potentials.A_b_z[ixyz]=0.0; // no current potentials
|
|
|
|
|
|
ixyz++; // go to next point, it should be last line of the triple loop
|
|
|
}
|
|
|
|
|
|
// my guess for chemical potentials
|
|
|
if(it==-1)
|
|
|
{
|
|
|
h_potentials.mu[SPINA]=0.5;
|
|
|
h_potentials.mu[SPINB]=0.5;
|
|
|
}
|
|
|
}
|
|
|
``` |
|
|
\ No newline at end of file |