Superconducting Toolkit
Revisión | 056b3169bd86fc86535431ccf4fcb929d16a7a3a (tree) |
---|---|
Tiempo | 2020-10-31 20:44:54 |
Autor | giannozz <paolo.giannozzi@uniu...> |
Commiter | giannozz |
Merge branch 'devel-compute_mmn' into 'develop'
Increased performance on routine compute_mmn in pw2wannier90 program.
See merge request QEF/q-e!1176
@@ -425,7 +425,7 @@ PROGRAM pw2wannier90 | ||
425 | 425 | IF(write_mmn ) CALL print_clock( 'compute_mmn' ) |
426 | 426 | IF(write_unk ) CALL print_clock( 'write_unk' ) |
427 | 427 | IF(write_unkg ) CALL print_clock( 'write_parity' ) |
428 | - !! not sure if this should be called also in 'library' mode or not !! | |
428 | + ! not sure if this should be called also in 'library' mode or not !! | |
429 | 429 | CALL environment_end ( 'PW2WANNIER' ) |
430 | 430 | IF ( ionode ) WRITE( stdout, * ) |
431 | 431 | CALL stop_pp |
@@ -2148,72 +2148,7 @@ SUBROUTINE compute_mmn | ||
2148 | 2148 | ! |
2149 | 2149 | Mkb(:,:) = (0.0d0,0.0d0) |
2150 | 2150 | ! |
2151 | - IF (any_uspp) THEN | |
2152 | - ijkb0 = 0 | |
2153 | - DO nt = 1, ntyp | |
2154 | - IF ( upf(nt)%tvanp ) THEN | |
2155 | - DO na = 1, nat | |
2156 | - ! | |
2157 | - arg = dot_product( dxk(:,ind), tau(:,na) ) * tpi | |
2158 | - phase1 = cmplx( cos(arg), -sin(arg) ,kind=DP) | |
2159 | - ! | |
2160 | - IF ( ityp(na) == nt ) THEN | |
2161 | - DO jh = 1, nh(nt) | |
2162 | - jkb = ijkb0 + jh | |
2163 | - DO ih = 1, nh(nt) | |
2164 | - ikb = ijkb0 + ih | |
2165 | - ! | |
2166 | - DO m = 1,nbnd | |
2167 | - IF (excluded_band(m)) CYCLE | |
2168 | - IF (gamma_only) THEN | |
2169 | - DO n=1,m ! Mkb(m,n) is symmetric in m and n for gamma_only case | |
2170 | - IF (excluded_band(n)) CYCLE | |
2171 | - Mkb(m,n) = Mkb(m,n) + & | |
2172 | - phase1 * qb(ih,jh,nt,ind) * & | |
2173 | - becp%r(ikb,m) * rbecp2(jkb,n) | |
2174 | - ENDDO | |
2175 | - else if (noncolin) then | |
2176 | - DO n=1,nbnd | |
2177 | - IF (excluded_band(n)) CYCLE | |
2178 | - if (lspinorb) then | |
2179 | - Mkb(m,n) = Mkb(m,n) + & | |
2180 | - phase1 * ( & | |
2181 | - qq_so(ih,jh,1,nt) * conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 1, n) & | |
2182 | - + qq_so(ih,jh,2,nt) * conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 2, n) & | |
2183 | - + qq_so(ih,jh,3,nt) * conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 1, n) & | |
2184 | - + qq_so(ih,jh,4,nt) * conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 2, n) & | |
2185 | - ) | |
2186 | - else | |
2187 | - Mkb(m,n) = Mkb(m,n) + & | |
2188 | - phase1 * qb(ih,jh,nt,ind) * & | |
2189 | - (conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 1, n) & | |
2190 | - + conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 2, n) ) | |
2191 | - endif | |
2192 | - ENDDO | |
2193 | - ELSE | |
2194 | - DO n=1,nbnd | |
2195 | - IF (excluded_band(n)) CYCLE | |
2196 | - Mkb(m,n) = Mkb(m,n) + & | |
2197 | - phase1 * qb(ih,jh,nt,ind) * & | |
2198 | - conjg( becp%k(ikb,m) ) * becp2(jkb,n) | |
2199 | - ENDDO | |
2200 | - ENDIF | |
2201 | - ENDDO ! m | |
2202 | - ENDDO !ih | |
2203 | - ENDDO !jh | |
2204 | - ijkb0 = ijkb0 + nh(nt) | |
2205 | - ENDIF !ityp | |
2206 | - ENDDO !nat | |
2207 | - ELSE !tvanp | |
2208 | - DO na = 1, nat | |
2209 | - IF ( ityp(na) == nt ) ijkb0 = ijkb0 + nh(nt) | |
2210 | - ENDDO | |
2211 | - ENDIF !tvanp | |
2212 | - ENDDO !ntyp | |
2213 | - ENDIF ! any_uspp | |
2214 | - ! | |
2215 | - ! | |
2216 | -! loops on bands | |
2151 | + ! loops on bands | |
2217 | 2152 | ! |
2218 | 2153 | IF (wan_mode=='standalone') THEN |
2219 | 2154 | IF (ionode) WRITE (iun_mmn,'(7i5)') ik, ikp, (g_kpb(ipol,ik,ib), ipol=1,3) |
@@ -2228,7 +2163,7 @@ SUBROUTINE compute_mmn | ||
2228 | 2163 | istart=(ipol-1)*npwx+1 |
2229 | 2164 | iend=istart+npw-1 |
2230 | 2165 | psic_nc(dffts%nl (igk_k(1:npw,ik) ),ipol ) = evc(istart:iend, m) |
2231 | - IF (.not.zerophase(ik,ib)) THEN | |
2166 | + IF (.not.zerophase(ik,ib)) THEN | |
2232 | 2167 | CALL invfft ('Wave', psic_nc(:,ipol), dffts) |
2233 | 2168 | psic_nc(1:dffts%nnr,ipol) = psic_nc(1:dffts%nnr,ipol) * & |
2234 | 2169 | phase(1:dffts%nnr) |
@@ -2260,7 +2195,6 @@ SUBROUTINE compute_mmn | ||
2260 | 2195 | IF (excluded_band(n)) CYCLE |
2261 | 2196 | mmn = zdotc (npwq, aux,1,evcq(1,n),1) & |
2262 | 2197 | + conjg(zdotc(npwq,aux2,1,evcq(1,n),1)) |
2263 | - CALL mp_sum(mmn, intra_pool_comm) | |
2264 | 2198 | Mkb(m,n) = mmn + Mkb(m,n) |
2265 | 2199 | IF (m/=n) Mkb(n,m) = Mkb(m,n) ! fill other half of matrix by symmetry |
2266 | 2200 | ENDDO |
@@ -2273,19 +2207,88 @@ SUBROUTINE compute_mmn | ||
2273 | 2207 | mmn = mmn + zdotc (npwq, aux_nc(1,1),1,evcq(1,n),1) & |
2274 | 2208 | + zdotc (npwq, aux_nc(1,2),1,evcq(npwx+1,n),1) |
2275 | 2209 | ! end do |
2276 | - CALL mp_sum(mmn, intra_pool_comm) | |
2277 | 2210 | Mkb(m,n) = mmn + Mkb(m,n) |
2278 | 2211 | ENDDO |
2279 | 2212 | ELSE |
2280 | 2213 | DO n=1,nbnd |
2281 | 2214 | IF (excluded_band(n)) CYCLE |
2282 | 2215 | mmn = zdotc (npwq, aux,1,evcq(1,n),1) |
2283 | - CALL mp_sum(mmn, intra_pool_comm) | |
2284 | 2216 | Mkb(m,n) = mmn + Mkb(m,n) |
2285 | 2217 | ENDDO |
2286 | 2218 | ENDIF |
2287 | 2219 | ENDDO ! m |
2288 | - | |
2220 | + ! | |
2221 | + ! updating of the elements of the matrix Mkb | |
2222 | + ! | |
2223 | + DO n=1,nbnd | |
2224 | + IF (excluded_band(n)) CYCLE | |
2225 | + CALL mp_sum(Mkb(:,n), intra_pool_comm) | |
2226 | + ENDDO | |
2227 | + ! | |
2228 | + IF (any_uspp) THEN | |
2229 | + ijkb0 = 0 | |
2230 | + DO nt = 1, ntyp | |
2231 | + IF ( upf(nt)%tvanp ) THEN | |
2232 | + DO na = 1, nat | |
2233 | + ! | |
2234 | + arg = dot_product( dxk(:,ind), tau(:,na) ) * tpi | |
2235 | + phase1 = cmplx( cos(arg), -sin(arg) ,kind=DP) | |
2236 | + ! | |
2237 | + IF ( ityp(na) == nt ) THEN | |
2238 | + DO jh = 1, nh(nt) | |
2239 | + jkb = ijkb0 + jh | |
2240 | + DO ih = 1, nh(nt) | |
2241 | + ikb = ijkb0 + ih | |
2242 | + ! | |
2243 | + DO m = 1,nbnd | |
2244 | + IF (excluded_band(m)) CYCLE | |
2245 | + IF (gamma_only) THEN | |
2246 | + DO n=1,m ! Mkb(m,n) is symmetric in m and n for gamma_only case | |
2247 | + IF (excluded_band(n)) CYCLE | |
2248 | + Mkb(m,n) = Mkb(m,n) + & | |
2249 | + phase1 * qb(ih,jh,nt,ind) * & | |
2250 | + becp%r(ikb,m) * rbecp2(jkb,n) | |
2251 | + ENDDO | |
2252 | + else if (noncolin) then | |
2253 | + DO n=1,nbnd | |
2254 | + IF (excluded_band(n)) CYCLE | |
2255 | + if (lspinorb) then | |
2256 | + Mkb(m,n) = Mkb(m,n) + & | |
2257 | + phase1 * ( & | |
2258 | + qq_so(ih,jh,1,nt) * conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 1, n) & | |
2259 | + + qq_so(ih,jh,2,nt) * conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 2, n) & | |
2260 | + + qq_so(ih,jh,3,nt) * conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 1, n) & | |
2261 | + + qq_so(ih,jh,4,nt) * conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 2, n) & | |
2262 | + ) | |
2263 | + else | |
2264 | + Mkb(m,n) = Mkb(m,n) + & | |
2265 | + phase1 * qb(ih,jh,nt,ind) * & | |
2266 | + (conjg( becp%nc(ikb, 1, m) ) * becp2_nc(jkb, 1, n) & | |
2267 | + + conjg( becp%nc(ikb, 2, m) ) * becp2_nc(jkb, 2, n) ) | |
2268 | + endif | |
2269 | + ENDDO | |
2270 | + ELSE | |
2271 | + DO n=1,nbnd | |
2272 | + IF (excluded_band(n)) CYCLE | |
2273 | + Mkb(m,n) = Mkb(m,n) + & | |
2274 | + phase1 * qb(ih,jh,nt,ind) * & | |
2275 | + conjg( becp%k(ikb,m) ) * becp2(jkb,n) | |
2276 | + ENDDO | |
2277 | + ENDIF | |
2278 | + ENDDO ! m | |
2279 | + ENDDO !ih | |
2280 | + ENDDO !jh | |
2281 | + ijkb0 = ijkb0 + nh(nt) | |
2282 | + ENDIF !ityp | |
2283 | + ENDDO !nat | |
2284 | + ELSE !tvanp | |
2285 | + DO na = 1, nat | |
2286 | + IF ( ityp(na) == nt ) ijkb0 = ijkb0 + nh(nt) | |
2287 | + ENDDO | |
2288 | + ENDIF !tvanp | |
2289 | + ENDDO !ntyp | |
2290 | + ENDIF ! any_uspp | |
2291 | + ! | |
2289 | 2292 | ibnd_n = 0 |
2290 | 2293 | DO n=1,nbnd |
2291 | 2294 | IF (excluded_band(n)) CYCLE |
@@ -2303,7 +2306,7 @@ SUBROUTINE compute_mmn | ||
2303 | 2306 | ENDIF |
2304 | 2307 | ENDDO |
2305 | 2308 | ENDDO |
2306 | - | |
2309 | + ! | |
2307 | 2310 | ENDDO !ib |
2308 | 2311 | ENDDO !ik |
2309 | 2312 |