★ ★ ★ ★ ★ ★ 小木虫(金币+0.5 ):给个红包,谢谢回帖交流 nono2009(金币+5 ,VIP+0 ):向你学习! 11-19 23:14
按照你的格式改写好了
用你发的数据测试了一下是可以的。
其实本来根本就不用去操心有多少行的,因为你只是为了计算总和。
直接按照前面的那样只判断到文件末没有就可以了。
这样改写只是为了随便试试而已。如果只是关心总和也不用去计算到底多少行。
使用了eof函数,intel编译器可以。CVF不大清楚,没有安装。
如果不行的话就使用前面说的read的IOSTAT来判断到行末没有。
==================
这个是会计算行数,然后再分配空间的
=================
program read_data
implicit none
real*8 ljcc,vicc
real*8,external :: cljinteraction
real*8,allocatable :: x(: ),y(: ),z(: )
character*5,allocatable :: atomname(: )
integer*4 row,i
row=0
open(32,file='co2ben.txt')
do while (.not. eof(32))
row=row+1
read(32,*)
end do
rewind(32)
allocate(x(row),y(row),z(row),atomname(row))
vicc=0.0
do i=1, row
read(32,*) atomname(i),x(i),y(i),z(i)
if (atomname(i) .eq. 'Cb') then !如果原子是Cb,就调用下面函数
ljcc=cljinteraction(x(i),y(i),z(i))
vicc=vicc+ljcc !累加函数数值
endif
enddo
write(6,*) vicc !输出函数数值的总和
deallocate(x,y,z,atomname)
end program
function cljinteraction(x,y,z)
implicit none
real*8 cljinteraction
real*8 x,y,z !输入变量
real*8 ri2c, sr2c, sr6c, sr12c !中间使用量
ri2c=(x-3.08)**2+(y-3.37)**2+(z-3.129)**2
sr2c=0.32535/ri2c
sr6c=sr2c*sr2c*sr2c
sr12c=sr6c**2
cljinteraction=sr12c-sr6c
return
end function
===================
这个就是只计算这个结果的版本
====================
program read_data
implicit none
real*8 ljcc,vicc
real*8,external :: cljinteraction
real*8 x,y,z
character*5 atomname
vicc=0.0
open(32,file='co2ben.txt')
do while (.not. eof(32))
read(32,*) atomname,x,y,z
if (atomname .eq. 'Cb') then !如果原子是Cb,就调用下面函数
ljcc=cljinteraction(x,y,z)
vicc=vicc+ljcc !累加函数数值
endif
enddo
write(6,*) vicc !输出函数数值的总和
end program
function cljinteraction(x,y,z)
implicit none
real*8 cljinteraction
real*8 x,y,z !输入变量
real*8 ri2c, sr2c, sr6c, sr12c !中间使用量
ri2c=(x-3.08)**2+(y-3.37)**2+(z-3.129)**2
sr2c=0.32535/ri2c
sr6c=sr2c*sr2c*sr2c
sr12c=sr6c**2
cljinteraction=sr12c-sr6c
return
end function引用回帖: Originally posted by tpp001 at 2009-11-19 21:47:
这是我的输入文件 'co2ben.txt' 部分数据
Oa 3.106000 3.385000 3.639000
Cb 3.119000 3.271000 3.627000
Oc 4.060000 -2.784000 1.788000
Oa 2 ...
[ Last edited by tjyl on 2009-11-19 at 22:37 ]