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/

Responder a