@brief Spin-pairing parts of singlet and triplet MRSF Lagrangian
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=dp), | intent(out), | dimension(:,:) | :: | xhxa | ||
real(kind=dp), | intent(out), | dimension(:,:) | :: | xhxb | ||
real(kind=dp), | intent(in), | dimension(:,:) | :: | ca | ||
real(kind=dp), | intent(in), | dimension(:,:) | :: | cb | ||
real(kind=dp), | intent(in), | dimension(:,:) | :: | xv | ||
real(kind=dp), | intent(in), | target, dimension(:,:,:) | :: | fmrsf | ||
integer, | intent(in) | :: | noca | |||
integer, | intent(in) | :: | nocb |
subroutine mrsfsp(xhxa, xhxb, ca, cb, xv, fmrsf, noca, nocb) use precision, only: dp use messages, only: show_message, with_abort implicit none real(kind=dp), intent(out), dimension(:,:) :: xhxa, xhxb real(kind=dp), intent(in), dimension(:,:) :: ca, cb, xv real(kind=dp), intent(in), target, dimension(:,:,:) :: fmrsf integer, intent(in) :: noca, nocb integer :: nbf, i, j, lr1, lr2, ok real(kind=dp), allocatable :: scr(:,:), scr2(:,:) real(kind=dp), pointer, dimension(:,:) :: & adco1, adco2, ado1v, ado2v, aco12, ao21v ado2v => fmrsf(1,:,:) ado1v => fmrsf(2,:,:) adco1 => fmrsf(3,:,:) adco2 => fmrsf(4,:,:) ao21v => fmrsf(5,:,:) aco12 => fmrsf(6,:,:) nbf = ubound(ca, 1) lr1 = nocb+1 lr2 = noca allocate(scr(nbf,nbf), & scr2(nbf,nbf), & source=0.0_dp, stat=ok) if (ok /= 0) call show_message('Cannot allocate memory', with_abort) ! Spin-pairing coupling contributions of xhxa ! o1v call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ao21v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do j = noca+1, nbf xhxa(:,lr2) = xhxa(:,lr2)+scr(:,j)*xv(lr1,j) xhxa(:,lr1) = xhxa(:,lr1)-scr(:,j)*xv(lr2,j) end do ! co1 call dgemm('t', 'n', nbf, nbf, nbf, & -1.0_dp, ca, nbf, & aco12, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxa(:,i) = xhxa(:,i)+scr(:,lr2)*xv(i,lr1) xhxa(:,i) = xhxa(:,i)-scr(:,lr1)*xv(i,lr2) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & adco2, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do j = noca+1, nbf xhxa(:,lr1) = xhxa(:,lr1)+scr(:,j)*xv(lr1,j) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & adco1, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do j = noca+1, nbf xhxa(:,lr2) = xhxa(:,lr2)+scr(:,j)*xv(lr2,j) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ado2v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, 1, nbf, & 2.0_dp, scr2, nbf, & cb(:,lr1), nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxa(:,i) = xhxa(:,i)+scr(:,1)*xv(i,lr1) end do ! co2 call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ado1v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, 1, nbf, & 2.0_dp, scr2, nbf, & cb(:,lr2), nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxa(:,i) = xhxa(:,i)+scr(:,1)*xv(i,lr2) end do ! Spin-pairing coupling contributions of xhxb call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ao21v, nbf,& 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do j = noca+1, nbf xhxb(:,j) = xhxb(:,j)+scr(lr2,:)*xv(lr1,j) end do call dgemm('t', 'n', nbf, nbf, nbf, & -1.0_dp, ca, nbf, & ao21v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do j = noca+1, nbf xhxb(:,j) = xhxb(:,j)+scr(lr1,:)*xv(lr2,j) end do ! co1 call dgemm('t', 'n', nbf, nbf, nbf, & -1.0_dp, ca, nbf, & aco12, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxb(:,lr2) = xhxb(:,lr2)+scr(i,:)*xv(i,lr1) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & aco12, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxb(:,lr1) = xhxb(:,lr1)+scr(i,:)*xv(i,lr2) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ado2v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n' ,'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxb(:,lr1) = xhxb(:,lr1)+scr(i,:)*xv(i,lr1) end do call dgemm('t', 'n', nbf, nbf, nbf, & 1.0_dp, ca, nbf, & ado1v, nbf, & 0.0_dp, scr2, nbf) call dgemm('n', 'n', nbf, nbf, nbf, & 2.0_dp, scr2, nbf, & cb, nbf, & 0.0_dp, scr, nbf) do i = 1, nocb xhxb(:,lr2) = xhxb(:,lr2)+scr(i,:)*xv(i,lr2) end do ! O1V call dgemm('t', 'n', 1, nbf, nbf, & 1.0_dp, ca(:, lr1), nbf, & adco2, nbf, & 0.0_dp, scr2, 1) call dgemm('n', 'n', 1, nbf, nbf, & 2.0_dp, scr2, 1, & cb, nbf, & 0.0_dp, scr, 1) do j = noca+1, nbf xhxb(:,j) = xhxb(:,j)+scr(:,1)*xv(lr1,j) end do call dgemm('t', 'n', 1, nbf, nbf, & 1.0_dp, ca(:, lr2), nbf, & adco1, nbf, & 0.0_dp, scr2, 1) call dgemm('n', 'n', 1, nbf, nbf, & 2.0_dp, scr2, 1, & cb, nbf, & 0.0_dp, scr, 1) do j = noca+1, nbf xhxb(:,j) = xhxb(:,j)+scr(:,1)*xv(lr2,j) end do return end subroutine mrsfsp