Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • wslda wslda
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • wtools
  • wsldawslda
  • Wiki
  • Constraining densities and potentials

Constraining densities and potentials · Changes

Page history
Update Constraining densities and potentials authored Feb 20, 2026 by Gabriel Wlazłowski's avatar Gabriel Wlazłowski
Show whitespace changes
Inline Side-by-side
Constraining-densities-and-potentials.md
View page @ b03092ff
......@@ -2,14 +2,14 @@
# Imposing constraints on densities and potentials
In each iteration, the user can impose *by hand* various constraints on densities or potentials. [problem-definition.h](https://gitlab.fizyka.pw.edu.pl/wtools/wslda/-/blob/public/st-project-template/problem-definition.h) file provides handlers for these operations.
If you want to constrain density, you need to provide a body of the function:
If you want to constrain density, you need to provide the body of the function:
```c
/**
* THIS FUNCTION IS CALLED DURING THE SELF-CONSISTENT PROCESS.
* Before each diagonalization process, user can modify arbitrarily densities
* Before each diagonalization process, the user can modify densities arbitrarily.
* @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 h_densities structure with densities, see (wiki) documentation for the list of fields
* @param params array of input parameters, before the 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()
* */
......@@ -32,22 +32,21 @@ void modify_densities(int it, wslda_density h_densities, double *params, size_t
// ... below you can modify them at your wish ...
ixyz++; // go to next point, it should be last line of the triple loop
ixyz++; // go to the next point, it should be the last line of the triple loop
}
}
```
If you want to constrain potentials, you need to provide a body of the function:
```c
/**
* THIS FUNCTION IS CALLED DURING THE SELF-CONSISTENT PROCESS.
* Before each diagonalization process, user can arbitrarily modify potentials
* Before each diagonalization process, the user can modify potentials arbitrarily.
* @param it iteration number
* @param h_densities structure with densities, see (wiki) documentation for list of fields
* NOTE: densities structure is processed by modify_densities(...) function before call ot this function.
* @param h_potentials struture with potentials, 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 h_densities structure with densities, see (wiki) documentation for the list of fields
* NOTE: densities structure is processed by modify_densities(...) function before call of this function.
* @param h_potentials structure with potentials, see (wiki) documentation for list of fields
* @param params array of input parameters, before the 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()
* */
......@@ -70,10 +69,9 @@ void modify_potentials(int it, wslda_density h_densities, wslda_potential h_pote
// ... below you can modify them at your wish ...
ixyz++; // go to next point, it should be last line of the triple loop
ixyz++; // go to the next point, it should be the last line of the triple loop
}
}
```
## Order of function calls
......@@ -91,15 +89,15 @@ while( not (convergence criteria) )
....
}
```
For the complete workflow, see [here](st-workflow-chart).
## Example: imprinting vortex in the center of the system
The standard method of imprinting quantum vortex is to impose that the order parameter has the following structure:
The standard method of imprinting a quantum vortex is to impose that the order parameter has the following structure:
```math
\Delta(\vec{r})=|\Delta(\vec{r})|e^{i\phi}
```
where $`\phi`$ is angle in cylindrical system, i.e $`\phi=\arctan(y/x)`$. The procedure is implemented in the function below:
```c
void modify_potentials(int it, wslda_density h_densities, wslda_potential h_potentials, double *params, size_t extra_data_size, void *extra_data)
{
......@@ -120,29 +118,29 @@ void modify_potentials(int it, wslda_density h_densities, wslda_potential h_pote
double phi = atan2(y,x); // compute by hand phase
h_potentials.delta[ixyz] = cexp(I*phi)*d_abs; // save new pattern of paring field
ixyz++; // go to next point, it should be last line of the triple loop
ixyz++; // go to next point, it should be the last line of the triple loop
}
}
```
# Constrained density functional theory calculations
In the standard approach, we provide an external potential $`V_{ext}(\bm{r})`$, and after the minimization process, we obtain the density distribution. However, we can treat the external potential $`V_{ext}(\bm{r})`$ as a generalized Lagrange multiplier that controls the density. For example, we can ask: _What is the shape of the external potential that provides the desired density distribution_ $`n_0(\bm{r})`$? Such a type of minimization is popular in nuclear physics and can also be implemented with API provided by W-SLDA Toolkit.
In the standard approach, we provide an external potential $`V_{ext}(\bm{r})`$, and after the minimization process, we obtain the density distribution. However, we can treat the external potential $`V_{ext}(\bm{r})`$ as a generalized Lagrange multiplier that controls the density. For example, we can ask: _What is the shape of the external potential that provides the desired density distribution_ $`n_0(\bm{r})`$? Such a type of minimization is popular in nuclear physics and can also be implemented with the API provided by the W-SLDA Toolkit.
In order to find such a potential, one can introduce a procedure similar to adjusting the chemical potential:
```math
V_{ext}^{(it+1)}(\bm{r}) := V_{ext}^{(it)}(\bm{r}) + ab^{it}\frac{n^{(it)}(\bm{r}) - n_0(\bm{r})}{n_0(\bm{r}) + c}
```
where $`a,b,c`$ are parameters that need to be adjusted to achieve convergence, $`it`$ stands for the iteration number.
As an example, let us consider the quasi-1D case, where we search for the external potential that produces density distribution in the form of two Gaussians:
As an example, let us consider the quasi-1D case, where we search for the external potential that produces a density distribution in the form of two Gaussians:
```math
n_0(\bm{r}) = A_1\exp\left(-\frac{(x-x_1)^2}{2\sigma_1^2}\right) + A_2\exp\left(-\frac{(x-x_2)^2}{2\sigma_2^2}\right)
```
In the figure below, the requested density is plotted by red, while with the blue color, we plot the density obtained after iterating the code with the prescription for the update of the external potential $`V_{ext}^{(it+1)}(\bm{r})`$:
In the figure below, the requested density is plotted in red, while the blue color we to plot the density obtained after iterating the code with the prescription for the update of the external potential $`V_{ext}^{(it+1)}(\bm{r})`$:
![image](uploads/89ebc8d36f87f9f2000f0a17e0701c73/image.png)
The resulting external potential has a form as presented in the figure below:
![image](uploads/dd648890418d2b9c87db7a2c7a697c17/image.png)
Inspect the attached files to learn about the example implementation of the protocol. The most important functions used in the implementation are
Inspect the attached files to learn about the protocol's example implementation. The most important functions used in the implementation are
* `get_extra_data_size(...)`: prepares buffers for the external potential and the desired shape of the density.
* `load_extra_data(...)`: initializes the guess for the external potential and shape of the density.
* `modify_potentials(...)`: implements the external potential update protocol.
......
Clone repository

Content of Documentation
Official webpage
W-BSK Toolkit