diff --git a/src/mo_guess/h_core_guess_routine.irp.f b/src/mo_guess/h_core_guess_routine.irp.f index 8fc3f6f2..429f77ec 100644 --- a/src/mo_guess/h_core_guess_routine.irp.f +++ b/src/mo_guess/h_core_guess_routine.irp.f @@ -5,9 +5,19 @@ subroutine hcore_guess implicit none character*(64) :: label label = "Guess" - call mo_as_eigvectors_of_mo_matrix(mo_one_e_integrals, & - size(mo_one_e_integrals,1), & - size(mo_one_e_integrals,2),label,1,.false.) - call save_mos - SOFT_TOUCH mo_coef mo_label + if (is_periodic) then + call mo_as_eigvectors_of_mo_matrix_complex(mo_one_e_integrals_complex, & + size(mo_one_e_integrals_complex,1), & + size(mo_one_e_integrals_complex,2),label,1,.false.) + call save_mos + !TODO: is this correct? decide how to handle separate real/imag parts of mo_coef + SOFT_TOUCH mo_coef_complex mo_label + + else + call mo_as_eigvectors_of_mo_matrix(mo_one_e_integrals, & + size(mo_one_e_integrals,1), & + size(mo_one_e_integrals,2),label,1,.false.) + call save_mos + SOFT_TOUCH mo_coef mo_label + endif end diff --git a/src/mo_guess/mo_ortho_lowdin_complex.irp.f b/src/mo_guess/mo_ortho_lowdin_complex.irp.f new file mode 100644 index 00000000..5e1dacbe --- /dev/null +++ b/src/mo_guess/mo_ortho_lowdin_complex.irp.f @@ -0,0 +1,48 @@ +BEGIN_PROVIDER [complex*16, ao_ortho_lowdin_coef_complex, (ao_num,ao_num)] + implicit none + BEGIN_DOC +! matrix of the coefficients of the mos generated by the +! orthonormalization by the S^{-1/2} canonical transformation of the aos +! ao_ortho_lowdin_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_lowdin orbital + END_DOC + integer :: i,j,k,l + complex*16, allocatable :: tmp_matrix(:,:) + allocate (tmp_matrix(ao_num,ao_num)) + tmp_matrix(:,:) = (0.d0,0.d0) + do j=1, ao_num + tmp_matrix(j,j) = (1.d0,0.d0) + enddo + call ortho_lowdin_complex(ao_overlap_complex,ao_num,ao_num,tmp_matrix,ao_num,ao_num) + do i=1, ao_num + do j=1, ao_num + ao_ortho_lowdin_coef_complex(j,i) = tmp_matrix(i,j) + enddo + enddo + deallocate(tmp_matrix) +END_PROVIDER + +BEGIN_PROVIDER [complex*16, ao_ortho_lowdin_overlap_complex, (ao_num,ao_num)] + implicit none + BEGIN_DOC +! overlap matrix of the ao_ortho_lowdin +! supposed to be the Identity + END_DOC + integer :: i,j,k,l + complex*16 :: c + do j=1, ao_num + do i=1, ao_num + ao_ortho_lowdin_overlap_complex(i,j) = (0.d0,0.d0) + enddo + enddo + do k=1, ao_num + do j=1, ao_num + c = (0.d0,0.d0) + do l=1, ao_num + c += dconjg(ao_ortho_lowdin_coef_complex(j,l)) * ao_overlap_complex(k,l) + enddo + do i=1, ao_num + ao_ortho_lowdin_overlap_complex(i,j) += ao_ortho_lowdin_coef_complex(i,k) * c + enddo + enddo + enddo +END_PROVIDER diff --git a/src/mo_guess/pot_mo_ortho_canonical_ints.irp.f b/src/mo_guess/pot_mo_ortho_canonical_ints.irp.f index 984d45a5..10363a00 100644 --- a/src/mo_guess/pot_mo_ortho_canonical_ints.irp.f +++ b/src/mo_guess/pot_mo_ortho_canonical_ints.irp.f @@ -23,3 +23,29 @@ BEGIN_PROVIDER [double precision, ao_ortho_canonical_nucl_elec_integrals, (mo_nu !$OMP END PARALLEL DO END_PROVIDER +BEGIN_PROVIDER [complex*16, ao_ortho_canonical_nucl_elec_integrals_complex, (mo_num,mo_num)] + implicit none + integer :: i1,j1,i,j + complex*16 :: c_i1,c_j1 + + ao_ortho_canonical_nucl_elec_integrals_complex = (0.d0,0.d0) + !$OMP PARALLEL DO DEFAULT(none) & + !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & + !$OMP SHARED(mo_num,ao_num,ao_ortho_canonical_coef_complex, & + !$OMP ao_ortho_canonical_nucl_elec_integrals_complex, ao_integrals_n_e_complex) + do i = 1, mo_num + do j = 1, mo_num + do i1 = 1,ao_num + c_i1 = ao_ortho_canonical_coef_complex(i1,i) + do j1 = 1,ao_num + c_j1 = c_i1*dconjg(ao_ortho_canonical_coef_complex(j1,j)) + ao_ortho_canonical_nucl_elec_integrals_complex(j,i) = & + ao_ortho_canonical_nucl_elec_integrals_complex(j,i) + & + c_j1 * ao_integrals_n_e_complex(j1,i1) + enddo + enddo + enddo + enddo + !$OMP END PARALLEL DO +END_PROVIDER + diff --git a/src/mo_guess/pot_mo_ortho_lowdin_ints.irp.f b/src/mo_guess/pot_mo_ortho_lowdin_ints.irp.f index 5a9f9978..7ec94296 100644 --- a/src/mo_guess/pot_mo_ortho_lowdin_ints.irp.f +++ b/src/mo_guess/pot_mo_ortho_lowdin_ints.irp.f @@ -23,3 +23,29 @@ BEGIN_PROVIDER [double precision, ao_ortho_lowdin_nucl_elec_integrals, (mo_num,m !$OMP END PARALLEL DO END_PROVIDER +BEGIN_PROVIDER [complex*16, ao_ortho_lowdin_nucl_elec_integrals_complex, (mo_num,mo_num)] + implicit none + integer :: i1,j1,i,j + complex*16 :: c_i1,c_j1 + + ao_ortho_lowdin_nucl_elec_integrals = (0.d0,0.d0) + !$OMP PARALLEL DO DEFAULT(none) & + !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & + !$OMP SHARED(mo_num,ao_num,ao_ortho_lowdin_coef_complex, & + !$OMP ao_ortho_lowdin_nucl_elec_integrals_complex, ao_integrals_n_e_complex) + do i = 1, mo_num + do j = 1, mo_num + do i1 = 1,ao_num + c_i1 = ao_ortho_lowdin_coef_complex(i1,i) + do j1 = 1,ao_num + c_j1 = c_i1*dconjg(ao_ortho_lowdin_coef_complex(j1,j)) + ao_ortho_lowdin_nucl_elec_integrals_complex(j,i) = & + ao_ortho_lowdin_nucl_elec_integrals_complex(j,i) + & + c_j1 * ao_integrals_n_e_complex(j1,i1) + enddo + enddo + enddo + enddo + !$OMP END PARALLEL DO +END_PROVIDER +