Internals

Functions to generate and access internal structures. Kinetics are initalized with diverge_model_internals_common(). Backend-specific interaction internals with diverge_model_internals_tu(), diverge_model_internals_patch(), diverge_model_internals_grid(), or diverge_model_internals_any().

Internals can be accessed through several getter functions that may break when using non-standard models (custom Hamiltonians etc.):

int diverge_model_validate(diverge_model_t *model)
[source]

Check for errors in the user defined model

void diverge_model_internals_common(diverge_model_t *model)
[source]

Prepare the common part of the internals_t struct, including Hamiltonian, Eigenvectors/Eigenvalues, momentum meshes, etc.

void diverge_model_internals_any(diverge_model_t *model, const char *mode, ...)
[source]

Prepare internal structure for the computation mode specified as string in mode; can be "grid", "patch", or "tu". Dispatches to the corrseponding function, i.e.,

For diverge_model_internals_grid(), no additional parameters are needed.

For diverge_model_internals_patch(), one additional parameter (index_t np_ibz) must be passed. Documentation found in diverge_model_internals_patch().

For diverge_model_internals_tu(), one additional parameter (double max_dist) must be passed. Documentation found in diverge_model_internals_tu().

void diverge_model_internals_grid(diverge_model_t *model)
[source]

Prepare the grid FRG part of the internals_t structure.

void diverge_model_internals_patch(diverge_model_t *model, index_t np_ibz)
[source]

Prepare the patch part of the internals_t struct as well as the mom_patching_t struct (diverge_model_t.patching) if it is not allocated.

Note

divERGe can only generate and operate on the npatch backend if there is no refinement set through diverge_model_t.nkf, i.e., ones in those spots where diverge_model_t.nk is nonzero. Some of the patching routines further assume a two-dimensional model – not the actual FRG kernels, merely some helper functions.

Parameters:
void diverge_model_internals_patch_fg(diverge_model_t *model, index_t np_ibz, index_t np_ibz_search, index_t ngroups, const double *alpha_beta_gamma, index_t kmeans_seed)
[source]

same as diverge_model_internals_patch(), but with more control over the automatic refinement/patch finding options as in diverge_patching_find_fs_pts() and diverge_patching_autofine().

Parameters:
  • model (diverge_model_t*) – model instance

  • np_ibz (index_t) – number of patches in the IBZ

  • np_ibz_search (index_t) – number of sorted energies to consider as patches. if <0 use default: MAX(100,np_ibz)

  • ngroups (index_t) – number of groups for the autofine function, if <0 use default: 40

  • alpha_beta_gamma (double[3]) – the parameters alpha, beta, gamma for autofine, if NULL use default: (0.5, 1.0, 0.7)

  • kmeans_seed – the random generator seed used in kmeans_lloyd for grouping. If ==-1 use default, if ==-2 use time(), else use this number as seed.

void diverge_model_internals_tu(diverge_model_t *model, double max_dist)
[source]

Prepare the TU part of the internals_t struct.

Parameters:
  • model (diverge_model_t) – model instance

  • max_dist (double) – distance up to which formfactors should be included. If the return value of diverge_max_dist_iobi() is passed (a special ‘nan’), formfactors that adhere to the IOBI approximation are generated.

double diverge_max_dist_iobi(void)
[source]

return magic value for formfactor setup (max_dist value in diverge_model_internals_tu()) of TUFRG such that only on-site intraorbital formfactors are generated (IOBI approximation). Uses quiet nan payload, i.e., returns ‘nan’. Might break if non-IEEE floating point numbers are in use.

void diverge_model_internals_reset(diverge_model_t *model)
[source]

Reset all internal structures of the model and free their resources. Does not reset the patching. Usage is discouraged.

double *diverge_model_internals_get_E(const diverge_model_t *model)
[source]

returns the internally generated energies (nk*nkf, nb).

diverge_model_internals_common() must have been called, otherwise NULL is returned.

complex128_t *diverge_model_internals_get_U(const diverge_model_t *model)
[source]

returns the internally generated orbital to band transform (nk*nkf, nb, nb). Note that this array is ordered as (k, band, orb); contrary to what you might expect from pure C ordered eigensolvers; reason being CUDA.

diverge_model_internals_common() must have been called, otherwise NULL is returned.

complex128_t *diverge_model_internals_get_H(const diverge_model_t *model)
[source]

returns the internally generated hamiltonian (nk*nkf, nb, nb)

diverge_model_internals_common() must have been called, otherwise NULL is returned.

double *diverge_model_internals_get_kmesh(const diverge_model_t *model)
[source]

returns the internally generated coarse momentum mesh (nk, 3)

diverge_model_internals_common() must have been called, otherwise NULL is returned.

double *diverge_model_internals_get_kfmesh(const diverge_model_t *model)
[source]

returns the internally generated coarse momentum mesh (nk*nkf, 3)

diverge_model_internals_common() must have been called, otherwise NULL is returned.

gf_complex_t *diverge_model_internals_get_greens(const diverge_model_t *model)
[source]

returns the internal Green’s function buffer (2, nk*nkf, nb, nb)

diverge_model_internals_common() must have been called, otherwise NULL is returned.

index_t diverge_model_internals_get_dim(const diverge_model_t *model)
[source]

returns the dimension (diverge_model_internals_common() should be called prior)

diverge_lattice_t diverge_model_internals_get_rlattice(const diverge_model_t *model)
[source]

return the reciprocal lattice (diverge_model_internals_common() should be called prior)