-1

我想阅读 .xyz 文件,它看起来像....

3                                !no. of particles
1.0000                           ! time step
a   2.345   2.458  0.564         ! ID x y z for 1st particle
a   5.455   2.486  5.456         ! ID x y z for 2nd particle
a   6.545   4.566  2.665         ! ID x y z for 3rd particle
3                                !no.of particles (same as before)
2.000                            ! next time step
a   4.345   3.458  4.564         ! ID x y z for 1st particle
a   4.455   3.486  4.456         ! ID x y z for 2nd particle
a   8.545   3.566  4.665         ! ID x y z for 3rd particle
...... continue..... for 1000 time step

我想在每个时间步计算每个粒子与其他粒子的距离。如何读取这个文件?

program size
implicit none  
integer i,j,k  
integer,parameter :: n=400,t=714  
integer dn(n),n1  
real*8 px(n,t),py(n,t),dt,pz  
character(75) nam  
open (unit=50,file='vmd.xyz',status='old',action='read')  

do k=1,t   
do i=1,n  
read(50,*) n1   
read(50,*) dt  
read(50,*) nam,px(i,k),py(i,k),pz  
end do  
end do  


close(50)
end program
4

1 回答 1

1

既然您发布了代码,那么帮助您就容易多了。

  1. 无论粒子数量是多少,您总是读取 400 个坐标。

  2. 您重复 400 次读取粒子数和时间步长。只有行read(50,*) nam,px(i,k),py(i,k),pz应该在循环中。尝试

    program size
    implicit none  
    integer i,j,k  
    integer,parameter :: n=400,t=2
    integer dn(n),n1  
    real*8 px(n,t),py(n,t),dt,pz  
    character(75) nam  
    open (unit=50,file='vmd.xyz',status='old',action='read')  
    
    do k=1,t   
    read(50,*) n1   
    read(50,*) dt  
    do i=1,n1
    read(50,*) nam,px(i,k),py(i,k),pz  
    end do  
    end do  
    
    close(50)
    end program
    
  3. 这种分析 MD 数据的方法(在内存中读取所有数据然后继续)可能会占用大量内存,并且仅适用于短/小型模拟。

您可以尝试现有的库:

  1. Chemfiles 有一个 Fortran 接口,可以轻松读取坐标:http ://chemfiles.org/chemfiles.f03/0.7.4/ (Fortran 绑定)
  2. 考虑其他语言。MDAnalysis是用 Python 编写的,支持 xyz 文件,并提供了很多用于轨迹分析的基本功能。
于 2017-10-26T18:59:59.300 回答