下面有个例子:我的程序里面的,想要更高的效率,可以看看主流的软件怎么写的。
!===================================================================
do p = 1,Nbas
do q = 1,p
! first step
if(method == "mp2") then
NTemp = Nocc
else
NTemp = Nbas
end if
do r = 1,Nbas
do l = 1,NTemp
A_T(l,r) = 0.0d0
do s = 1,Nbas
A_T(l,r) = A_T(l,r) + MoCu(s,l)*g_Mo(EI(s,r),EI(p,q))
end do
end do
end do
! second step
do k = 1+FCstar,Nbas
if(method == "mp2") then
NTemp = min(k,Nocc)
else
NTemp = k
end if
do l = 1+FCstar,NTemp
g_Mo(EI(l,k),EI(p,q)) = 0.0d0
do r = 1,Nbas
g_Mo(EI(l,k),EI(p,q)) = g_Mo(EI(l,k),EI(p,q)) + MoCu(r,k)*A_T(l,r)
end do
end do
end do
!---------------------------------------------------------------
end do
end do
deallocate(A_T)
do k = 1+FCstar,Nbas
if(method == "mp2") then
NTemp = min(k,Nocc)
else
NTemp = k
end if
do l = 1+FCstar,NTemp
! step 3
do p = 1,Nbas
do j = 1,NBas
B_T(j,p) = 0.0d0
do q = 1,Nbas
B_T(j,p) = B_T(j,p) + MoCu(q,j)*g_Mo(EI(l,k),EI(p,q))
end do
end do
end do
! step 4
do i = 1+FCstar,Nbas
do j = 1+FCstar,i
if( i*(i-1)+2*j < k*(k-1)+2*l ) cycle
g_Mo(EI(l,k),EI(j,i)) = 0.0d0
do p = 1,Nbas
g_Mo(EI(l,k),EI(j,i)) = g_Mo(EI(l,k),EI(j,i)) + MoCu(p,i)*B_T(j,p)
end do
end do
end do
!---------------------------------------------------------------
end do
end do
deallocate(B_T)
do k = 1+FCstar,Nbas
if(method == "mp2") then
NTemp = min(k,Nocc)
else
NTemp = k
end if
do l = 1+FCstar,NTemp
do i = 1+FCstar,Nbas
do j = 1+FCstar,i
if( i*(i-1)+2*j < k*(k-1)+2*l ) cycle
g_Mo(EI(j,i),EI(l,k)) = g_Mo(EI(l,k),EI(j,i))
end do
end do
end do
end do
|