【答案】应助回帖
引用回帖: Originally posted by Gina88 at 2011-05-09 09:51:06:
en,相减的数据不包含augmentation occupancies的那部分,
相减的是384 160 24以下,augmentation occupancies以上的那部分数据。
即CHGCAR1=CHGCAR1-CHGCAR2。
谢谢大侠了!
数据就是EIGENVAL,还有C ...
给一个实现,但与你最初的想法可能不一样,由于你只进行部分差减,因为除此以外部分的数据,全部以字符串形式读入与输出,只定义为数不多几个数组,而且把数组的维数也降下来,你看一下吧……CODE: program diff_CHGCAR
!announcement begin********************
implicit none
real(8),allocatable::densityup(:,:)
real(8),allocatable::densitydn(:,:)
integer,allocatable::atomnum(:)
integer i,k,n,ios,fileunit
integer filenum,atomsum,typenum,line_len
integer FFTx,FFTy,FFTz
character(len=80)::line
character(len=80)::filename
character(len=80)::subline
!End announcement**********************
!Begin reading data from "EIGENVAL"******
real(8)::atomnum1,atomnum2,notkown3
integer spin
open(unit=18,file="EIGENVAL")
read(18,*)atomnum1,atomnum2,notkown3,spin
close(18)
!End reading data from "EIGENVAL"********
write(*,*)"number of files:(2 or 3?)"
read(*,*)filenum
open(unit=68,file="CHGCAR",status="replace")
do n=1,filenum
write(filename,'(a,i0)') 'CHGCAR',n
fileunit = 28 + n-1
open(unit=fileunit,file=filename,status='old')
read(fileunit,'(a)')line
if (n==1) write(68,'(a)') trim(line)
read(fileunit,'(a)')line
if (n==1) write(68,'(a)') trim(line)
do i=1,3
read(fileunit,'(a)')line
if (n==1) write(68,'(a)') trim(line)
end do
read(fileunit,'(a)')line
if (n==1) then
write(68,'(a)') trim(line)
line=adjustl(line)
line_len=len_trim(line)
typenum=1
do i=1,line_len
if(line(i:i)==' ' .and. line(i:i+1)/=' ') typenum=typenum+1
end do
allocate(atomnum(typenum))
end if
read(fileunit,'(a)') line
if (n==1) then
write(68,'(a)') trim(line)
read(line,*) (atomnum(i),i=1,typenum)
atomsum=sum(atomnum)
end if
read(fileunit,'(a)') line
if(n==1) write(68,'(a)') trim(line)
do i=1,atomsum
read(fileunit,'(a)') line
if(n==1) write(68,'(a)') trim(line)
end do
read(fileunit,'(a)') line
if(n==1) write(68,'(a)')
read(fileunit,'(a)') line
if(n==1) write(68,'(a)') trim(line)
subline = adjustl(line)
read(line,*) FFTx,FFTy,FFTz
if (n==1) allocate(densityup(FFTx*FFTy*FFTz,filenum))
read(fileunit,*)(densityup(i,n),i=1,FFTx*FFTy*FFTz)
if (n/=1) then
do k=2,FFTx*FFTy*FFTz
densityup(k,1) = densityup(k,1)-densityup(k,n)
end do
end if
if (spin /=2 .and. n/=1) close(fileunit)
end do
write(68,'(5e16.9)')(densityup(k,1),k=1,FFTx*FFTy*FFTz)
do n=1,filenum
fileunit = 28 + n-1
do
read(fileunit,'(a)',iostat=ios) line
if (ios < 0) exit
if (index (line, trim(subline)) /= 0) exit
if (n == 1) then
write(68,'(a)') trim(line)
endif
end do
if (spin /=2) exit
if (n == 1) then
write(68,'(a)') trim(line)
allocate(densitydn(FFTx*FFTy*FFTz,filenum))
end if
read(fileunit, *) (densityup(i,n),i=1,FFTx*FFTy*FFTz)
if (n/=1) then
do k=2,FFTx*FFTy*FFTz
densityup(k,1) = densityup(k,1)-densityup(k,n)
end do
end if
if(n/=1) close(fileunit)
end do
if (spin == 2) then
write(68,'(5e16.9)')(densitydn(k,1),k=1,FFTx*FFTy*FFTz)
do
read(28,'(a)',iostat=ios) line
if (ios < 0) exit
write(68,'(a)') trim(line)
end do
end if
close(28)
close(68)
stop
end