35 PROFILE(
"sirius::K_point::initialize");
37 zil_.resize(ctx_.unit_cell().lmax_apw() + 1);
38 for (
int l = 0; l <= ctx_.unit_cell().lmax_apw(); l++) {
39 zil_[l] = std::pow(std::complex<T>(0, 1), l);
42 l_by_lm_ =
sf::l_by_lm(ctx_.unit_cell().lmax_apw());
44 int bs = ctx_.cyclic_block_size();
67 int nst = ctx_.num_bands();
69 auto mem_type_evp = ctx_.std_evp_solver().host_memory_t();
70 auto mem_type_gevp = ctx_.gen_evp_solver().host_memory_t();
73 generate_gkvec(ctx_.gk_cutoff());
75 generate_gklo_basis();
77 if (ctx_.full_potential()) {
78 if (ctx_.cfg().control().use_second_variation()) {
80 RTE_ASSERT(ctx_.num_fv_states() > 0);
86 for (
int is = 0; is < ctx_.num_spinors(); is++) {
91 std::vector<int> num_mt_coeffs(unit_cell_.num_atoms());
92 for (
int ia = 0; ia < unit_cell_.num_atoms(); ia++) {
93 num_mt_coeffs[ia] = unit_cell_.atom(ia).mt_lo_basis_size();
97 fv_eigen_vectors_slab_ = std::make_unique<wf::Wave_functions<T>>(
99 ctx_.host_memory_t());
101 fv_eigen_vectors_slab_->zero(sddk::memory_t::host,
wf::spin_index(0),
103 for (
int i = 0; i < ctx_.num_fv_states(); i++) {
104 for (
int igloc = 0; igloc < gkvec().gvec_count(comm().rank()); igloc++) {
105 int ig = igloc + gkvec().gvec_offset(comm().rank());
117 if (ctx_.cfg().iterative_solver().type() ==
"exact") {
121 ctx_.blacs_grid(), bs, bs, mem_type_gevp);
124 ctx_.blacs_grid(), bs, bs, mem_type_gevp);
127 int ncomp = ctx_.cfg().iterative_solver().num_singular();
129 ncomp = ctx_.num_fv_states() / 2;
132 singular_components_ = std::make_unique<wf::Wave_functions<T>>(
137 for (
int i = 0; i < ncomp; i++) {
138 for (
int igloc = 0; igloc < gkvec().count(); igloc++) {
139 int ig = igloc + gkvec().offset();
153 for (
int ia = 0; ia < unit_cell_.num_atoms(); ia++) {
154 num_mt_coeffs[ia] = unit_cell_.atom(ia).mt_basis_size();
156 fv_states_ = std::make_unique<wf::Wave_functions<T>>(gkvec_, num_mt_coeffs,
wf::num_mag_dims(0),
159 spinor_wave_functions_ = std::make_unique<wf::Wave_functions<T>>(gkvec_, num_mt_coeffs,
162 RTE_THROW(
"not implemented");
165 spinor_wave_functions_ = std::make_unique<wf::Wave_functions<T>>(gkvec_,
wf::num_mag_dims(ctx_.num_mag_dims()),
168 if (ctx_.hubbard_correction()) {
170 int nwfh = unit_cell_.num_hubbard_wf().first;
171 int nwf = unit_cell_.num_ps_atomic_wf().first;
173 hubbard_wave_functions_ = std::make_unique<wf::Wave_functions<T>>(gkvec_,
wf::num_mag_dims(0),
175 hubbard_wave_functions_S_ = std::make_unique<wf::Wave_functions<T>>(gkvec_,
wf::num_mag_dims(0),
177 atomic_wave_functions_ = std::make_unique<wf::Wave_functions<T>>(gkvec_,
wf::num_mag_dims(0),
179 atomic_wave_functions_S_ = std::make_unique<wf::Wave_functions<T>>(gkvec_,
wf::num_mag_dims(0),
191 PROFILE(
"sirius::K_point::generate_hubbard_orbitals");
193 if (ctx_.so_correction()) {
194 RTE_THROW(
"Hubbard+SO is not implemented");
196 if (ctx_.gamma_point()) {
197 RTE_THROW(
"Hubbard+Gamma point is not implemented");
200 auto num_ps_atomic_wf = unit_cell_.num_ps_atomic_wf();
201 int nwf = num_ps_atomic_wf.first;
204 std::vector<int> atoms(ctx_.unit_cell().num_atoms());
205 std::iota(atoms.begin(), atoms.end(), 0);
207 this->generate_atomic_wave_functions(atoms, [&](
int iat){
return &ctx_.unit_cell().atom_type(iat).indexb_wfs(); },
208 *ctx_.ri().ps_atomic_wf_, *atomic_wave_functions_);
210 auto pcs = env::print_checksum();
212 auto cs = atomic_wave_functions_->checksum(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nwf));
213 if (this->comm().rank() == 0) {
214 print_checksum(
"atomic_wave_functions", cs, RTE_OUT(std::cout));
219 auto q_op = (unit_cell_.augment()) ? std::make_unique<Q_operator<T>>(ctx_) :
nullptr;
221 auto mem = ctx_.processing_unit_memory_t();
223 std::unique_ptr<wf::Wave_functions<T>> wf_tmp;
224 std::unique_ptr<wf::Wave_functions<T>> swf_tmp;
227 auto mg1 = atomic_wave_functions_->memory_guard(mem, wf::copy_to::device | wf::copy_to::host);
228 auto mg2 = atomic_wave_functions_S_->memory_guard(mem, wf::copy_to::host);
231 auto bp_gen = beta_projectors().make_generator();
232 auto bp_coeffs = bp_gen.prepare();
234 sirius::apply_S_operator<T, std::complex<T>>(mem, wf::spin_range(0), wf::band_range(0, nwf), bp_gen, bp_coeffs,
235 *atomic_wave_functions_, q_op.get(), *atomic_wave_functions_S_);
237 if (ctx_.cfg().hubbard().full_orthogonalization()) {
240 wf_tmp = std::make_unique<wf::Wave_functions<T>>(gkvec_, wf::num_mag_dims(0), wf::num_bands(nwf),
241 ctx_.host_memory_t());
242 swf_tmp = std::make_unique<wf::Wave_functions<T>>(gkvec_, wf::num_mag_dims(0), wf::num_bands(nwf),
243 ctx_.host_memory_t());
245 auto mg3 = wf_tmp->memory_guard(mem, wf::copy_to::host);
246 auto mg4 = swf_tmp->memory_guard(mem, wf::copy_to::host);
248 wf::copy(mem, *atomic_wave_functions_, wf::spin_index(0), wf::band_range(0, nwf),
249 *wf_tmp, wf::spin_index(0), wf::band_range(0, nwf));
250 wf::copy(mem, *atomic_wave_functions_S_, wf::spin_index(0), wf::band_range(0, nwf),
251 *swf_tmp, wf::spin_index(0), wf::band_range(0, nwf));
253 int BS = ctx_.cyclic_block_size();
254 la::dmatrix<std::complex<T>> ovlp(nwf, nwf, ctx_.blacs_grid(), BS, BS);
261 wf::transform(ctx_.spla_context(), mem, *B, 0, 0, 1.0, *atomic_wave_functions_,
269 *atomic_wave_functions_, q_op.get(), *atomic_wave_functions_S_);
283 auto cs = atomic_wave_functions_S_->checksum(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nwf));
284 if (this->comm().rank() == 0) {
285 print_checksum(
"atomic_wave_functions_S", cs, RTE_OUT(std::cout));
289 auto num_hubbard_wf = unit_cell_.num_hubbard_wf();
291 for (
int ia = 0; ia < ctx_.unit_cell().num_atoms(); ia++) {
292 auto& atom = ctx_.unit_cell().atom(ia);
293 auto& type = atom.type();
294 if (type.hubbard_correction()) {
296 for (
auto e : type.indexr_hub()) {
298 auto& hd = type.lo_descriptor_hub(e.idxrf);
300 int mmax = 2 * l + 1;
302 int idxr_wf = hd.idx_wf();
304 int offset_in_wf = num_ps_atomic_wf.second[ia] + type.indexb_wfs().index_of(
rf_index(idxr_wf));
305 int offset_in_hwf = num_hubbard_wf.second[ia] + type.indexb_hub().index_of(e.idxrf);
307 wf::copy(sddk::memory_t::host, *atomic_wave_functions_, wf::spin_index(0),
308 wf::band_range(offset_in_wf, offset_in_wf + mmax), *hubbard_wave_functions_,
309 wf::spin_index(0), wf::band_range(offset_in_hwf, offset_in_hwf + mmax));
311 wf::copy(sddk::memory_t::host, *atomic_wave_functions_S_, wf::spin_index(0),
312 wf::band_range(offset_in_wf, offset_in_wf + mmax), *hubbard_wave_functions_S_,
313 wf::spin_index(0), wf::band_range(offset_in_hwf, offset_in_hwf + mmax));
318 if (ctx_.cfg().hubbard().full_orthogonalization()) {
320 wf::copy(sddk::memory_t::host, *wf_tmp, wf::spin_index(0), wf::band_range(0, nwf),
321 *atomic_wave_functions_, wf::spin_index(0), wf::band_range(0, nwf));
322 wf::copy(sddk::memory_t::host, *swf_tmp, wf::spin_index(0), wf::band_range(0, nwf),
323 *atomic_wave_functions_S_, wf::spin_index(0), wf::band_range(0, nwf));
327 auto cs1 = hubbard_wave_functions_->checksum(sddk::memory_t::host,
wf::spin_index(0),
329 auto cs2 = hubbard_wave_functions_S_->checksum(sddk::memory_t::host,
wf::spin_index(0),
331 if (comm().rank() == 0) {
332 print_checksum(
"hubbard_wave_functions", cs1, RTE_OUT(std::cout));
333 print_checksum(
"hubbard_wave_functions_S", cs2, RTE_OUT(std::cout));
342 PROFILE(
"sirius::K_point::generate_gkvec");
344 gkvec_partition_ = std::make_shared<fft::Gvec_fft>(
345 this->gkvec(), ctx_.comm_fft_coarse(), ctx_.comm_band_ortho_fft_coarse());
347 const auto fft_type = gkvec_->reduced() ? SPFFT_TRANS_R2C : SPFFT_TRANS_C2C;
348 const auto spfft_pu = ctx_.processing_unit() == sddk::device_t::CPU ? SPFFT_PU_HOST : SPFFT_PU_GPU;
349 auto const& gv = gkvec_partition_->gvec_array();
351 spfft_transform_.reset(
new fft::spfft_transform_type<T>(ctx_.spfft_grid_coarse<T>().create_transform(
352 spfft_pu, fft_type, ctx_.fft_coarse_grid()[0], ctx_.fft_coarse_grid()[1], ctx_.fft_coarse_grid()[2],
353 ctx_.spfft_coarse<
double>().local_z_length(), gkvec_partition_->count(), SPFFT_INDEX_TRIPLETS,
354 gv.at(sddk::memory_t::host))));
357 ctx_.cyclic_block_size());
358 num_gkvec_row_ = spl_ngk_row.local_size();
362 ctx_.cyclic_block_size());
363 num_gkvec_col_ = spl_ngk_col.local_size();
366 for (
int rank = 0; rank < comm().size(); rank++) {
367 auto gv = gkvec_->gvec_local(rank);
368 for (
int igloc = 0; igloc < gkvec_->gvec_count(rank); igloc++) {
369 int ig = gkvec_->gvec_offset(rank) + igloc;
370 auto loc_row = spl_ngk_row.location(ig);
371 auto loc_col = spl_ngk_col.location(ig);
372 if (loc_row.ib == comm_row().rank()) {
373 for (
int x : {0, 1, 2}) {
374 gkvec_row(x, loc_row.index_local) = gv(x, igloc);
377 if (loc_col.ib == comm_col().rank()) {
378 for (
int x : {0, 1, 2}) {
379 gkvec_col(x, loc_col.index_local) = gv(x, igloc);
384 gkvec_row_ = std::make_shared<fft::Gvec>(vk_, unit_cell_.reciprocal_lattice_vectors(), num_gkvec_row_,
385 &gkvec_row(0, 0), comm_row(), ctx_.gamma_point());
387 gkvec_col_ = std::make_shared<fft::Gvec>(vk_, unit_cell_.reciprocal_lattice_vectors(), num_gkvec_col_,
388 &gkvec_col(0, 0), comm_col(), ctx_.gamma_point());
395 PROFILE(
"sirius::K_point::update");
397 gkvec_->lattice_vectors(ctx_.unit_cell().reciprocal_lattice_vectors());
398 gkvec_partition_->update_gkvec_cart();
400 if (ctx_.full_potential()) {
401 if (ctx_.cfg().iterative_solver().type() ==
"exact") {
402 alm_coeffs_row_ = std::make_unique<Matching_coefficients>(unit_cell_, *gkvec_row_);
403 alm_coeffs_col_ = std::make_unique<Matching_coefficients>(unit_cell_, *gkvec_col_);
405 alm_coeffs_loc_ = std::make_unique<Matching_coefficients>(unit_cell_, gkvec());
408 if (!ctx_.full_potential()) {
410 beta_projectors_ = std::make_unique<Beta_projectors<T>>(ctx_, gkvec());
412 if (ctx_.cfg().iterative_solver().type() ==
"exact") {
413 beta_projectors_row_ = std::make_unique<Beta_projectors<T>>(ctx_, *gkvec_row_);
414 beta_projectors_col_ = std::make_unique<Beta_projectors<T>>(ctx_, *gkvec_col_);
417 if (ctx_.hubbard_correction()) {
418 generate_hubbard_orbitals();
427 RTE_ASSERT((
int)fv_evec__.size(0) >= gklo_basis_size());
428 RTE_ASSERT((
int)fv_evec__.size(1) == ctx_.num_fv_states());
429 RTE_ASSERT(gklo_basis_size_row() == fv_eigen_vectors_.num_rows_local());
437 for (
int ist = 0; ist < ctx_.num_fv_states(); ist++) {
438 for (
int igloc = 0; igloc < this->num_gkvec_loc(); igloc++) {
439 int ig = this->gkvec().offset() + igloc;
442 this->comm().allgather(fv_evec__.at(sddk::memory_t::host, 0, ist), this->gkvec().count(),
443 this->gkvec().offset());
445 }
catch(std::exception
const& e) {
447 s << e.what() << std::endl;
448 s <<
"Error in getting plane-wave coefficients";
453 for (
int ist = 0; ist < ctx_.num_fv_states(); ist++) {
456 for (
int ia = 0; ia < ctx_.unit_cell().num_atoms(); ia++) {
458 int nlo = ctx_.unit_cell().atom(ia).mt_lo_basis_size();
460 if (loc.ib == this->comm().rank()) {
461 for (
int xi = 0; xi < nlo; xi++) {
462 fv_evec__(this->num_gkvec() + offs + xi, ist) =
469 auto& mtd = fv_eigen_vectors_slab_->mt_coeffs_distr();
470 this->comm().allgather(fv_evec__.at(sddk::memory_t::host, this->num_gkvec(), ist),
471 mtd.counts.data(), mtd.offsets.data());
473 }
catch(std::exception
const& e) {
475 s << e.what() << std::endl;
476 s <<
"Error in getting muffin-tin coefficients";
542 if (comm().rank() == 0) {
544 HDF5_tree fout(name__, hdf5_access_t::read_write);
547 fout[
"K_point_set"][id__].
write(
"vk", &vk_[0], 3);
548 fout[
"K_point_set"][id__].
write(
"band_energies", band_energies_);
549 fout[
"K_point_set"][id__].
write(
"band_occupancies", band_occupancies_);
559 for (
int i = 0; i < num_gkvec(); i++) {
560 auto v = gkvec().template gvec<index_domain_t::global>(i);
561 for (
int x : {0, 1, 2}) {
565 fout[
"K_point_set"][id__].
write(
"gvec", gv);
567 for (
int i = 0; i < ctx_.num_bands(); i++) {
569 fout[
"K_point_set"][id__][
"bands"][i].
create_node(
"spinor_wave_function");
570 for (
int ispn = 0; ispn < ctx_.num_spins(); ispn++) {
571 fout[
"K_point_set"][id__][
"bands"][i][
"spinor_wave_function"].
create_node(ispn);
587 RTE_THROW(
"re-implement");
607 RTE_THROW(
"not implemented");
682 PROFILE(
"sirius::K_point::generate_atomic_wave_functions");
688 std::vector<int> offset;
690 for (
int ia : atoms__) {
692 int iat = unit_cell_.atom(ia).type_id();
693 n += indexb__(iat)->size();
697 std::vector<sddk::mdarray<std::complex<T>, 2>> wf_t(unit_cell_.num_atom_types());
698 for (
int ia : atoms__) {
699 int iat = unit_cell_.atom(ia).type_id();
700 if (wf_t[iat].size() == 0) {
702 get_memory_pool(sddk::memory_t::host));
706 #pragma omp parallel for schedule(static)
707 for (
int igk_loc = 0; igk_loc < this->num_gkvec_loc(); igk_loc++) {
712 std::vector<double> rlm(
lmmax);
716 std::vector<sddk::mdarray<double, 1>> ri_values(unit_cell_.num_atom_types());
717 for (
int iat = 0; iat < unit_cell_.num_atom_types(); iat++) {
718 if (wf_t[iat].size() != 0) {
719 ri_values[iat] = ri__.
values(iat, vs[0]);
722 for (
int iat = 0; iat < unit_cell_.num_atom_types(); iat++) {
723 if (wf_t[iat].size() == 0) {
726 auto const& indexb = *indexb__(iat);
727 for (
auto const& e: indexb) {
728 auto z = std::pow(std::complex<double>(0, -1), e.am.l()) *
fourpi / std::sqrt(unit_cell_.omega());
730 wf_t[iat](igk_loc, e.xi) =
static_cast<std::complex<T>
>(z * rlm[e.lm] * ri_values[iat](e.idxrf));
735 for (
int ia : atoms__) {
737 T phase =
twopi * dot(gkvec().vk(), unit_cell_.atom(ia).position());
738 auto phase_k = std::exp(std::complex<T>(0.0, phase));
741 std::vector<std::complex<T>> phase_gk(num_gkvec_loc());
742 #pragma omp parallel for
743 for (
int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) {
744 auto G = gkvec().template gvec<index_domain_t::local>(igk_loc);
746 phase_gk[igk_loc] =
std::conj(
static_cast<std::complex<T>
>(ctx_.gvec_phase_factor(G, ia)) * phase_k);
749 int iat = unit_cell_.atom(ia).type_id();
751 for (
int xi = 0; xi < static_cast<int>(indexb__(iat)->size()); xi++) {
752 #pragma omp for nowait
753 for (
int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) {
755 wf_t[iat](igk_loc, xi) * phase_gk[igk_loc];
767 ctx_.cyclic_block_size());
772 ctx_.cyclic_block_size());
775 if (ctx_.full_potential()) {
785 for (
int ia = 0; ia < unit_cell_.num_atoms(); ia++) {
786 auto& atom = unit_cell_.atom(ia);
787 auto& type = atom.type();
789 int lo_index_offset = type.mt_aw_basis_size();
791 for (
int j = 0; j < type.mt_lo_basis_size(); j++) {
792 int l = type.indexb(lo_index_offset + j).am.
l();
793 int lm = type.indexb(lo_index_offset + j).lm;
794 int order = type.indexb(lo_index_offset + j).order;
795 int idxrf = type.indexb(lo_index_offset + j).idxrf;
796 lo_desc.
ia =
static_cast<uint16_t
>(ia);
797 lo_desc.
l =
static_cast<uint8_t
>(l);
798 lo_desc.
lm =
static_cast<uint16_t
>(
lm);
799 lo_desc.
order =
static_cast<uint8_t
>(order);
800 lo_desc.
idxrf =
static_cast<uint8_t
>(idxrf);
802 if (spl_nlo_row.
location(num_gkvec() + idx).ib == rank_row_) {
803 lo_basis_descriptors_row_.push_back(lo_desc);
805 if (spl_nlo_col.
location(num_gkvec() + idx).ib == rank_col_) {
806 lo_basis_descriptors_col_.push_back(lo_desc);
812 RTE_ASSERT(idx == unit_cell_.mt_lo_basis_size());
814 atom_lo_cols_.clear();
815 atom_lo_cols_.resize(unit_cell_.num_atoms());
816 for (
int i = 0; i < num_lo_col(); i++) {
817 int ia = lo_basis_descriptor_col(i).ia;
818 atom_lo_cols_[ia].push_back(i);
821 atom_lo_rows_.clear();
822 atom_lo_rows_.resize(unit_cell_.num_atoms());
823 for (
int i = 0; i < num_lo_row(); i++) {
824 int ia = lo_basis_descriptor_row(i).ia;
825 atom_lo_rows_[ia].push_back(i);
831#ifdef SIRIUS_USE_FP32
Interface to the HDF5 library.
HDF5_tree create_node(int idx)
Create node by integer index.
void write(const std::string &name, T const *data, std::vector< int > const &dims)
Write a multidimensional array.
K-point related variables and methods.
void generate_atomic_wave_functions(std::vector< int > atoms__, std::function< basis_functions_index const *(int)> indexb__, Radial_integrals_atomic_wf< false > const &ri__, wf::Wave_functions< T > &wf__)
Generate plane-wave coefficients of the atomic wave-functions.
void update()
Update the reciprocal lattice vectors of the G+k array.
void generate_gkvec(double gk_cutoff__)
Find G+k vectors within the cutoff.
void get_fv_eigen_vectors(sddk::mdarray< std::complex< T >, 2 > &fv_evec__) const
Collect distributed first-variational vectors into a global array.
void initialize()
Initialize the k-point related arrays and data.
void generate_gklo_basis()
Generate G+k and local orbital basis sets.
void save(std::string const &name__, int id__) const
Save data to HDF5 file.
Radial integrals of the atomic centered orbitals.
Spline< double > const & values(int iwf__, int iat__) const
Retrieve a value for a given orbital of an atom type.
A helper class to establish various index mappings for the atomic basis functions.
void zero(memory_t mem__, size_t idx0__, size_t n__)
Zero n elements starting from idx0.
splindex< Index_t >::location_t location(typename Index_t::global idx__) const
Return "local index, rank" pair for a global index.
value_type local_size(block_id block_id__) const
Return local size of the split index for a given block.
Wave-functions representation.
auto & pw_coeffs(int ig__, spin_index ispn__, band_index i__)
Return reference to the plane-wave coefficient for a given plane-wave, spin and band indices.
Describe a range of bands.
Describe a range of spins.
Compute inverse square root of the matrix.
Contains definition of sirius::K_point class.
auto inverse_sqrt(la::dmatrix< T > &A__, int N__)
Compute inverse square root of the matrix.
auto spherical_coordinates(vector< double > vc)
Transform Cartesian coordinates [x,y,z] to spherical coordinates [r,theta,phi].
int lmax(int lmmax__)
Get maximum orbital quantum number by the maximum lm index.
int lmmax(int lmax)
Maximum number of combinations for a given .
int lm(int l, int m)
Get composite lm index by angular index l and azimuthal index m.
std::vector< int > l_by_lm(int lmax__)
Get array of orbital quantum numbers for each lm component.
void spherical_harmonics(int lmax, double theta, double phi, std::complex< double > *ylm)
Optimized implementation of complex spherical harmonics.
std::enable_if_t< std::is_same< T, real_type< F > >::value, void > inner(::spla::Context &spla_ctx__, sddk::memory_t mem__, spin_range spins__, W const &wf_i__, band_range br_i__, Wave_functions< T > const &wf_j__, band_range br_j__, la::dmatrix< F > &result__, int irow0__, int jcol0__)
Compute inner product between the two sets of wave-functions.
std::enable_if_t< std::is_same< T, real_type< F > >::value, void > transform(::spla::Context &spla_ctx__, sddk::memory_t mem__, la::dmatrix< F > const &M__, int irow0__, int jcol0__, real_type< F > alpha__, Wave_functions< T > const &wf_in__, spin_index s_in__, band_range br_in__, real_type< F > beta__, Wave_functions< T > &wf_out__, spin_index s_out__, band_range br_out__)
Apply linear transformation to the wave-functions.
void copy(sddk::memory_t mem__, Wave_functions< T > const &in__, wf::spin_index s_in__, wf::band_range br_in__, Wave_functions< F > &out__, wf::spin_index s_out__, wf::band_range br_out__)
Copy wave-functions.
Namespace of the SIRIUS library.
strong_type< int, struct __block_id_tag > block_id
ID of the block.
strong_type< int, struct __rf_index_tag > rf_index
Radial function index.
strong_type< int, struct __n_blocks_tag > n_blocks
Number of blocks to which the global index is split.
auto conj(double x__)
Return complex conjugate of a number. For a real value this is the number itself.
Contains declaration of sirius::Non_local_operator class.
Descriptor of the local-orbital part of the LAPW+lo basis.
uint8_t l
Index of orbital quantum number .
uint8_t order
Order of the local orbital radial function for the given orbital quantum number .
uint8_t idxrf
Index of the local orbital radial function.
uint16_t ia
Index of atom.
uint16_t lm
Combined lm index.