24小时热门版块排行榜    

查看: 3864  |  回复: 59
本帖产生 3 个 程序强帖 ,点击这里进行查看

Gina88

木虫 (正式写手)

引用回帖:
Originally posted by snoopyzhao at 2011-05-09 10:05:26:
你没有给我 EIGENVAL 啊,你给的是一个压缩文件,其中的内容是 CHGCAR1……

嗯,这次上传EIGENVAL了。
谢谢啦:)
41楼2011-05-09 10:33:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
Originally posted by Gina88 at 2011-05-09 10:33:24:
嗯,这次上传EIGENVAL了。
谢谢啦:)

给个 spin=2 时的 CHGCAR1 文件看一下……
42楼2011-05-09 14:29:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Gina88

木虫 (正式写手)

引用回帖:
Originally posted by snoopyzhao at 2011-05-09 14:29:27:
给个 spin=2 时的 CHGCAR1 文件看一下……

呵呵,这次的是有自旋的,而且是两种元素的情况。
非常非常感谢了!
43楼2011-05-09 15:13:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

引用回帖:
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

44楼2011-05-09 16:41:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
微尘、梦想(金币+2): 2011-05-09 18:07:21
上面的程序中有一个地方错了,更正了一下:
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, *) (densitydn(i,n),i=1,FFTx*FFTy*FFTz)
   if (n/=1) then
      do k=2,FFTx*FFTy*FFTz
         densitydn(k,1) = densitydn(k,1)-densitydn(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

45楼2011-05-09 16:45:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


余泽成(金币+1): 谢谢参与应助! 2011-05-19 19:22:17
其实,densitydn也不是必须的。densityup 用完之后,还可以用来盛放 densitydn 的东西,这两个数组是一样的大小的。如果不要 densitydn,那么程序内存占用可能会减小近一半。
46楼2011-05-09 16:47:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★
微尘、梦想(金币+2): 谢谢如此耐心的回答! 2011-05-09 18:07:47
哦,在
CODE:
write(68,'(5e16.9)')(densityup(k,1),k=1,FFTx*FFTy*FFTz)

之后,应该加上 DEALLOCATE(densityup)

同样,在
CODE:
write(68,'(5e16.9)')(densitydn(k,1),k=1,FFTx*FFTy*FFTz)

之后,也应该加上DEALLOCATE(densitydn)
47楼2011-05-09 17:02:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


余泽成(金币+1): 谢谢参与应助! 2011-05-19 19:22:33
程序中还有两处错误

请将程序中两处:
CODE:
do k=2,FFTx*FFTy*FFTz

改为
CODE:
do k=1,FFTx*FFTy*FFTz

48楼2011-05-09 19:29:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Gina88

木虫 (正式写手)

引用回帖:
Originally posted by snoopyzhao at 2011-05-09 19:29:37:
程序中还有两处错误

请将程序中两处:
CODE:
do k=2,FFTx*FFTy*FFTz

改为
CODE:
do k=1,FFTx*FFTy*FFTz


谢谢您!您给我的程序所用内存比我的应该节省很多,运行实现了我想要的功能。真的非常感谢!

从得到您写的程序我一直在看,大部分能看懂。
除了下面读写
augmentation occupancies   1  33
  0.5246464E+00 -0.3787519E+00  0.5632211E-24  0.9813096E-01 -0.5674925E-24
  0.1721307E-24 -0.6489097E-01 -0.1721307E-24  0.3600302E+00  0.0000000E+00
  0.5255511E+00  0.0000000E+00 -0.2341957E-25  0.1750307E+00  0.2692635E-26
  0.7649248E+00  0.0000000E+00  0.1090754E-24  0.2306250E+00 -0.1012863E-24
  0.5314240E-17  0.2497328E+00  0.0000000E+00  0.5526112E-25  0.8797233E-01
-0.6241027E-25  0.4471885E-17  0.2937433E-01  0.0000000E+00 -0.2790149E-26
  0.1616863E-01  0.3756390E-26 -0.2151094E-18
augmentation occupancies   2  33
  0.5478887E+00  0.1007788E+00  0.1268635E-24 -0.5136288E-01 -0.1258005E-24
  0.2057362E-25  0.4940735E-01 -0.2461255E-25  0.1845513E-01  0.3143559E-24
  0.1146283E+00 -0.3276243E-24 -0.2114718E-25  0.3425659E-01  0.2167872E-25
  0.1329006E+01  0.0000000E+00 -0.8091556E-25  0.8198887E-01  0.8251071E-25
  0.4708363E-18  0.3142530E+00 -0.1295663E-26  0.6056954E-25  0.6759688E-01
-0.7514666E-25 -0.2222845E-17  0.2562290E-01  0.0000000E+00  0.1816476E-25
  0.1262322E-01 -0.1922575E-25  0.1530643E-18
  0.100000000000E+01  0.100000000000E+01
  160  160  160
部分的程序之外,这部分能看出来是反复读取和写入,可是怎么判断循环结束还是看不懂。另外
160 160 160没有看见读,怎么就能写入了呢。
这个程序真是奇妙啊。
也就高手能写出这样的程序。
要是我自己,打死我也想不出还有这个写法。
真的非常感谢snoopyzhao 了:)

   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
49楼2011-05-10 00:52:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
微尘、梦想(金币+2): 2011-05-10 19:03:47
引用回帖:
Originally posted by Gina88 at 2011-05-10 00:52:37:
谢谢您!您给我的程序所用内存比我的应该节省很多,运行实现了我想要的功能。真的非常感谢!

从得到您写的程序我一直在看,大部分能看懂。
除了下面读写
augmentation occupancies   1  33
  0.5246464E ...

部分的程序之外,这部分能看出来是反复读取和写入,可是怎么判断循环结束还是看不懂。另外
160 160 160没有看见读,怎么就能写入了呢。
这个程序真是奇妙啊。
也就高手能写出这样的程序。
要是我自己,打死我也想不出还有这个写法。
真的非常感谢snoopyzhao 了:)

在进入下面这个循环之前,如果是 spin ==2,那么所有的文件都没有关闭,如果是 spin /=2,那么除文件 1 以外都关闭了。

   do
      read(fileunit,'(a)',iostat=ios) line
      if (ios < 0) exit
      if (index (line, trim(subline)) /= 0) exit !这一行是判断是不是 160 160 160 那行的。如果是跳出读 augmentation occupancies 部分的循环。
      if (n == 1) then
         write(68,'(a)') trim(line)
      endif
   end do
   if (spin /=2) exit ! 如果 spin /=2,程序到这里已经结束了,因为 iostat 显示已经读到文件的最后了……
   if (n == 1) then
       write(68,'(a)') trim(line) !这就是写 160 160 160 那一行的
       allocate(densitydn(FFTx*FFTy*FFTz,filenum))
   end if

后面应该是这个部分一样,但那只是关系 spin ==2 的事了……
50楼2011-05-10 06:50:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 Gina88 的主题更新
信息提示
请填处理意见