Hi! I think H must be complex valued (in principle), but I am not sure how it is treated in SIESTA. And you are right, H and S must be just transposed, because rows and columns are messed up in the code (sorry)
Best wishes, Peter On Sun, Mar 14, 2010 at 3:11 AM, Doron Naveh <[email protected]> wrote: > Hi Peter, > Thank you so much for sharing your code with me. > I did not understand what are the modifications needed for a periodic > case: I should just take the transpose of the matrix? > > Thanks very much, > -Doron. > > > > > > On Sat, March 13, 2010 3:11 am, Peter Koval wrote: > > Hello Doron! > > > > > > I think you can use my program for this, although it is not perfect. The > > program reads the .HSX file. At least one thing must be obviously > > corrected in the program: the row and columns are interchanged, therefore > > it might be necessary to interchange them in periodic systems. > > > > Best regards, > > > > > > Peter > > > > > > !! > > !! > > !! > > subroutine import_hsx(fname, haux, saux, iv) use modul_log use > > modul_precision use modul_orbital_vars, only : norbitals, nspin, orb_occ, > > Temp, > > total_electronic_charge !! external > > character(len=*), intent(in) :: fname real(dp) :: haux(norbitals, > > norbitals, nspin), saux(norbitals, norbitals); integer, intent(in) :: > iv > > > > > > !! internal > > integer, allocatable :: int_buff(:) !! buffer for pointers (to > nonzero > > elements) within a column real(sp), allocatable :: sp_buff(:) !! > > buffer for vector values (of nonzero elements) within a column integer :: > > ifile, iostat, icol, i, ispin, sum_col2nnzero, maxnnzero integer(4) :: > > norbitals_in, norbitals_in_supercell, nspin_in logical(4) :: gamma > > ! Gamma point or not > > > > > > ifile = get_free_handle(); > > > > open(ifile,file=trim(fname),form='unformatted',action='read',status='old' > > ,iostat=iostat); > > if(iostat/=0) then; write(ilog,*)'import_hsx: error: file ', trim(fname), > " > > ?"; stop; endif; > > rewind(ifile) read(ifile,iostat=iostat) norbitals_in, > > norbitals_in_supercell, nspin_in, nnonzero if (norbitals /= norbitals_in) > > then write(ilog,*)norbitals_in, norbitals_in_supercell, nspin_in, > nnonzero > > write(ilog,*)"import_hsx: norbitals, norbitals_in:", norbitals, > > norbitals_in stop "import_hsx: (norbitals /= norbitals_in)" endif if > > (nspin_in /= nspin) then > > write(ilog,*) "import_hsx: nspin, nspin_in:", nspin, nspin_in stop > > "import_hsx: (nspin /= nspin_in)" > > endif if (nspin==1) then; orb_occ=2; else if (nspin==2) then; orb_occ=1; > > else; write(ilog,*)'import_hsx: nspin', nspin; stop '(nspin/=1 .and. > > nspin/=2)'; endif > > > > if(iv>1) write(ilog,*) "import_hsx: norbitals_in, norbitals_in_supercell, > > nspin_in, nnonzero" if(iv>1) write(ilog,*) norbitals_in, > > norbitals_in_supercell, nspin_in, nnonzero > > > > read(ifile,iostat=iostat) gamma if (.not. gamma)stop "import_hsx: .not. > > gamma"; > > > > !! allocate the buffers > > allocate(col2nnzero(norbitals), col2displ(norbitals), > > sparse_ind2row(nnonzero)) allocate(H_sparse(nnonzero,nspin), > stat=iostat); > > ! Hamiltonian matrix in > > packed form allocate(S_sparse(nnonzero), stat=iostat); ! Overlap > > matrix in packed form > > > > read(ifile,iostat=iostat)col2nnzero sum_col2nnzero = sum(col2nnzero) if > > (sum_col2nnzero > nnonzero) then > > write(ilog,*) 'import_hsx: sum_col2nnzero > nnonzero ', sum_col2nnzero, > > nnonzero; write(ilog,*) col2nnzero; stop 'import_hsx:'; endif > > > > maxnnzero = maxval(col2nnzero) allocate(int_buff(maxnnzero), > > sp_buff(maxnnzero)); > > > > !! Fill the displacements (according to col2nnzero) col2displ > > col2displ(1)=0 do icol=2, norbitals col2displ(icol) = col2displ(icol-1) + > > col2nnzero(icol-1) enddo > > > > !! Fill the rows for each index in *_sparse arrays > > do icol=1, norbitals > read(ifile,iostat=iostat)int_buff(1:col2nnzero(icol)) > > ! read set of rows > > where nonzero elements reside if (iostat/=0) stop "import_hsx: > (iostat/=0) > > int_buff" > > > > do i=1, col2nnzero(icol) sparse_ind2row(col2displ(icol)+i) = int_buff(i) > > enddo enddo > > > > !! Read the data to H_sparse array > > do ispin=1,nspin do icol=1,norbitals > > read(ifile,iostat=iostat)sp_buff(1:col2nnzero(icol)) > > if (iostat /= 0) stop "import_hsx: (iostat/=0) Hamiltonian matrix" do > > i=1,col2nnzero(icol); H_sparse(col2displ(icol)+i, ispin) = sp_buff(i); > > enddo; enddo enddo > > > > !! Read the data to S_sparse array > > do icol=1,norbitals read(ifile,iostat=iostat)sp_buff(1:col2nnzero(icol)) > > if (iostat /= 0) stop "import_hsx: (iostat/=0) overlap matrix" do > > i=1,col2nnzero(icol); S_sparse(col2displ(icol)+i) = sp_buff(i); enddo > > enddo > > > > do ispin=1, nspin call sparse2full(norbitals, Haux(:,:,ispin), > > H_sparse(:,ispin), > > col2nnzero, col2displ, sparse_ind2row); if(ispin==1) & call > > sparse2full(norbitals, Saux, S_sparse(:), col2nnzero, col2displ, > > sparse_ind2row); enddo > > > > read(ifile,iostat=iostat) total_electronic_charge, Temp ! Total > > electronic charge and Temperature if(iv>0)write(ilog,*) "import_hsx: > > total_electronic_charge, Temp (Ry):", real(total_electronic_charge,4), > > real(Temp,4) deallocate(int_buff, sp_buff); close(ifile); > > > > end subroutine !import_hsx > > > > !! > > !! > > !! > > subroutine sparse2full(ndim, M_full, M_sparse, col2nnzero, col2displ, > > sparse_ind2row) use modul_precision !! external > > integer(4), intent(in) :: ndim real(dp), intent(out) :: > M_full(ndim,ndim) > > real(dp), intent(in) :: M_sparse(:) integer(4), intent(in) :: > > col2nnzero(ndim), col2displ(ndim), sparse_ind2row(:) > > > > > > !! internal > > integer :: icol, i, irow, sparse_ind > > > > do icol=1,ndim do i=1,col2nnzero(icol); sparse_ind = col2displ(icol)+i; > irow > > = sparse_ind2row(sparse_ind); > > M_full(irow, icol) = M_sparse(sparse_ind) > > enddo enddo > > > > end subroutine !sparse2full > > > > > > On Fri, Mar 12, 2010 at 7:41 PM, Doron Naveh <[email protected]> wrote: > > > > > >> Hi, > >> I'm trying to obtain the overlap matrix of basis set functions, > >> does anyone know how? Thanks, > >> Doron. > >> > >> > >> > > > > > > -- > > Dr. Peter Koval > > email: [email protected] > > inet: http://sites.google.com/site/kovalpeter/ > > > > > > > -- Dr. Peter Koval email: [email protected] inet: http://sites.google.com/site/kovalpeter/
