- General info
- Defining reference scales for static calculation
- Defining reference scales for time-dependent calculations
General info
During the computation process, W-SLDA codes exploit information about typical scales present in the problem. Precisely, reference scales define typical orders of magnitude for computed quantities. The most important reference scale is Fermi momentum. For uniform system it is defined as
k_F^{(1D)}=\frac{\pi n}{2}
k_F^{(2D)}=\sqrt{2\pi n}
k_F^{(3D)}=(3\pi^2 n)^{1/3}
Other reference scales computed automatically from k_F
are:
-
\varepsilon_F=\frac{1}{2}k_F^2
- Fermi energy, -
E_{\textrm{ffg}}=c_E N\varepsilon_F
- energy of free Fermi gas, where the coefficient in front depends on dimensionality:-
c_E^{(1D)}=\frac{1}{3}
, -
c_E^{(2D)}=\frac{1}{2}
, -
c_E^{(3D)}=\frac{3}{5}
.
-
Finally, chemical potentials also serve as reference scales for static problems:
-
\mu_{\uparrow}
- chemical potential is spin-up particles (particles of typea
), -
\mu_{\downarrow}
- chemical potential is spin-down particles (particles of typeb
).
Defining reference scales for static calculation
kF
Fermi momentum There are the following methods of defining the k_F
reference scale:
-
via input file:
k_F
is provided by user in input file. To activate this mode you need to uncomment tagreferencekF
:
referencekF 1.0 # hard set for reference value of kF
- via problem-definition.h file: (VERSION>=2022.02.21) by editing function:
/**
* This function computes Fermi momentum, which is used as the reference value.
* Other reference scales are set automatically to: eF=kF^2/2, Effg=(3/5)*N*eF (N-total number of particles)
* For more details see: https://gitlab.fizyka.pw.edu.pl/wtools/wslda/-/wikis/Reference%20scales
* NOTE units are: hbar=m=k_b=1
* @param it iteration number
* @param h_densities structure with densities, see (wiki) documentation for list of fields
* @param params array of input parameters, before call of this routine the params array is processed by process_params() routine
* @param extra_data_size size of extra_data in bytes, if extra_data size=0 the optional data is not uploaded
* @param extra_data optional set of data uploaded by load_extra_data()
* @return value of Fermi momentum for your problem
* */
double referencekF(int it, wslda_density h_densities, double *params, size_t extra_data_size, void *extra_data)
{
if(input->referencekF>0.0) return input->referencekF; // take it from input file
// define here your prescription for computing kF
// ...
// default: extract max density and use it for definition of kF
double max_dens=0.0, kF;
int ixyz;
for(ixyz=0; ixyz<h_densities.nx*h_densities.ny*h_densities.nz; ixyz++)
if(h_densities.rho_a[ixyz]+h_densities.rho_b[ixyz]>max_dens) max_dens=h_densities.rho_a[ixyz]+h_densities.rho_b[ixyz];
// depending on dimensionality of the problem
if(NY==1 && NZ==1) kF = 0.5*M_PI*max_dens; // 1D
else if(NZ==1) kF = pow(2.0*M_PI*max_dens,1./2.); // 2D
else kF = pow(3.*M_PI*M_PI*max_dens,1./3.); // 3D
return kF;
}
eF
Fermi energy Over the entire code, it is defined as \varepsilon_F=\frac{1}{2}k_F^2
.
Effg
Free Fermi gas energy API_VERSION>=20221120
The quantity is used only for reporting values of the energy. The definition can be controlled via logger.h
file, by changing the body of the function energy_unit(...)
. Default values are computed as:
/**
* This function defines the unit in which energies are printed in stdout.
* @param kF typical Fermi momentum scale of the problem, value returned by referencekF() function.
* @param mu array with chemical potentials: mu[SPINA], mu[SPINB].
* @param npart array with computed particle numbers: npart[SPINA] and npart[SPINB].
* @param params array of input parameters, before call of this routine the params array is processed by process_params() routine
* @param extra_data_size size of extra_data in bytes, if extra_data size=0 the optional data is not uploaded
* @param extra_data optional set of data uploaded by load_extra_data()
* */
double energy_unit(double kF, double *mu, double *npart,
double *params, size_t extra_data_size, void *extra_data)
{
double Effg;
double eF = kF*kF/2.0; // Fermi energy
double N = npart[SPINA]+npart[SPINB]; // total number of particles
// depending on dimensionality of the problem
if(NY==1 && NZ==1) Effg=(1./3.)*N*eF; // 1D
else if(NZ==1) Effg=(1./2.)*N*eF; // 2D
else Effg=(3./5.)*N*eF; // 3D
return Effg;
}
mu
Chemical potentials Chemical potentials are adjusted automatically when mode with fixed particle number is executed. For mode with fixed chemical potential see here.
Examples
Fermi momentum is fixed by density in the box center
double referencekF(int it, wslda_density h_densities, double *params, size_t extra_data_size, void *extra_data)
{
if(input->referencekF>0.0) return input->referencekF; // take it from input file
// Fermi momentum is fixed by density in the box center
// DETERMINE LOCAL SIZES OF ARRAYS (CODE DIMENSIONALITY DEPENDENT)
int lNX=h_densities.nx, lNY=h_densities.ny, lNZ=h_densities.nz; // local sizes
// take value of density in box center and save it to extra_data
int ixyz = lNZ/2 + lNZ*lNY/2 + lNZ*lNY*lNX/2;
double dens = h_densities.rho_a[ixyz]+h_densities.rho_b[ixyz];
// depending on dimensionality of the problem
double kF;
if(NY==1 && NZ==1) kF = 0.5*M_PI*dens; // 1D
else if(NZ==1) kF = pow(2.0*M_PI*dens,1./2.); // 2D
else kF = pow(3.*M_PI*M_PI*dens,1./3.); // 3D
return kF;
}
Defining reference scales for time-dependent calculations
All reference scales are provided together with an initial state, i.e. binary files produced by static codes contain this information. Presently there is no option of changing values for reference scales.