Hi Peter, When I tried to compile your code using fortran compiler following error appeared:
*HSX.f95:6.15: use modul_log 1 Fatal Error: Can't open module file 'modul_log.mod' for reading at (1): No such file or directory * I can't find in siesta code such a module. I also thought that maybe the name was changed, but I can't find any similar one. Can you help me with that? Best Regards, Magda 2010/3/13 Peter Koval <koval.pe...@googlemail.com> > 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 <na...@cmu.edu> wrote: > >> Hi, >> I'm trying to obtain the overlap matrix of basis set functions, >> does anyone know how? >> Thanks, >> Doron. >> >> > > > -- > Dr. Peter Koval > email: koval.pe...@gmail.com > inet: http://sites.google.com/site/kovalpeter/ >