예제 #1
0
void compute_Tnl_legendre(int n_matsubara, int n_legendre, boost::multi_array<std::complex<double>,2> &Tnl) {
  double sign_tmp = 1.0;
  Tnl.resize(boost::extents[n_matsubara][n_legendre]);
  for (int im = 0; im < n_matsubara; ++im) {
    std::complex<double> ztmp(0.0, 1.0);
    for (int il = 0; il < n_legendre; ++il) {
      Tnl[im][il] = sign_tmp * ztmp * std::sqrt(2 * il + 1.0) * boost::math::sph_bessel(il, 0.5 * (2 * im + 1) * M_PI);
      ztmp *= std::complex<double>(0.0, 1.0);
    }
    sign_tmp *= -1;
  }
}
예제 #2
0
파일: zone.hpp 프로젝트: ybouret/yocto4
 Zones(const bitmap &src, const unit_t window_size) :
 _Zones( Zone::MetaPatchFor(src,window_size) ),
 W( width.x ),
 H( width.y )
 {
     _Zones &self = *this;
     const vertex count(W,H);
     for(unit_t j=0;j<H;++j)
     {
         for(unit_t i=0;i<W;++i)
         {
             const vertex indx(i,j);
             Zone ztmp(src,indx,count);
             bswap(ztmp,self[j][i]);
             self[j][i].allocate();
         }
     }
 }
예제 #3
0
inline void Band::set_fv_h_o_apw_lo(K_point* kp, 
                                    Atom_type const& type, 
                                    Atom const& atom, 
                                    int ia, 
                                    mdarray<double_complex, 2>& alm_row, // alm_row comes conjugated 
                                    mdarray<double_complex, 2>& alm_col, 
                                    mdarray<double_complex, 2>& h, 
                                    mdarray<double_complex, 2>& o) const
{
    /* apw-lo block */
    for (int i = 0; i < kp->num_atom_lo_cols(ia); i++) {
        int icol = kp->lo_col(ia, i);
        /* local orbital indices */
        int l = kp->gklo_basis_descriptor_col(icol).l;
        int lm = kp->gklo_basis_descriptor_col(icol).lm;
        int idxrf = kp->gklo_basis_descriptor_col(icol).idxrf;
        int order = kp->gklo_basis_descriptor_col(icol).order;
        /* loop over apw components */ 
        for (int j1 = 0; j1 < type.mt_aw_basis_size(); j1++) {
            int lm1 = type.indexb(j1).lm;
            int idxrf1 = type.indexb(j1).idxrf;
                    
            double_complex zsum = atom.radial_integrals_sum_L3<spin_block_t::nm>(idxrf, idxrf1, gaunt_coefs_->gaunt_vector(lm1, lm));

            if (std::abs(zsum) > 1e-14) {
                for (int igkloc = 0; igkloc < kp->num_gkvec_row(); igkloc++) {
                    h(igkloc, icol) += zsum * alm_row(igkloc, j1);
                }
            }
        }

        for (int order1 = 0; order1 < (int)type.aw_descriptor(l).size(); order1++) {
            for (int igkloc = 0; igkloc < kp->num_gkvec_row(); igkloc++) {
                o(igkloc, icol) += atom.symmetry_class().o_radial_integral(l, order1, order) * 
                                   alm_row(igkloc, type.indexb_by_lm_order(lm, order1));
            }
        }
    }

    std::vector<double_complex> ztmp(kp->num_gkvec_col());
    /* lo-apw block */
    for (int i = 0; i < kp->num_atom_lo_rows(ia); i++) {
        int irow = kp->lo_row(ia, i);
        /* local orbital indices */
        int l = kp->gklo_basis_descriptor_row(irow).l;
        int lm = kp->gklo_basis_descriptor_row(irow).lm;
        int idxrf = kp->gklo_basis_descriptor_row(irow).idxrf;
        int order = kp->gklo_basis_descriptor_row(irow).order;

        std::memset(&ztmp[0], 0, kp->num_gkvec_col() * sizeof(double_complex));
        /* loop over apw components */ 
        for (int j1 = 0; j1 < type.mt_aw_basis_size(); j1++) {
            int lm1 = type.indexb(j1).lm;
            int idxrf1 = type.indexb(j1).idxrf;
                    
            double_complex zsum = atom.radial_integrals_sum_L3<spin_block_t::nm>(idxrf1, idxrf, gaunt_coefs_->gaunt_vector(lm, lm1));

            if (std::abs(zsum) > 1e-14) {
                for (int igkloc = 0; igkloc < kp->num_gkvec_col(); igkloc++) {
                    ztmp[igkloc] += zsum * alm_col(igkloc, j1);
                }
            }
        }

        for (int igkloc = 0; igkloc < kp->num_gkvec_col(); igkloc++) {
            h(irow, igkloc) += ztmp[igkloc]; 
        }

        for (int order1 = 0; order1 < (int)type.aw_descriptor(l).size(); order1++) {
            for (int igkloc = 0; igkloc < kp->num_gkvec_col(); igkloc++) {
                o(irow, igkloc) += atom.symmetry_class().o_radial_integral(l, order, order1) * 
                                   alm_col(igkloc, type.indexb_by_lm_order(lm, order1));
            }
        }
    }
}