如何在 Fortran 中读取分子动力学混合变量的 vmd 文件(.xyz 格式)
how to read vmd file (.xyz format) of mixed variable for molecular dynamics in Fortran
我想阅读看起来像....
的 .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
既然你把代码贴出来了,帮到你就容易多了。
无论粒子数量多少,你总是读取 400 个坐标。
您重复 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
这种分析 MD 数据的方法(读取所有内存然后继续)可能会占用大量内存并且仅对 short/small 模拟有用。
您可以尝试现有的库:
- Chemfiles 有一个 Fortran 界面,可以简化坐标的读取:http://chemfiles.org/chemfiles.f03/0.7.4/(Fortran 绑定)
- 考虑其他语言。 MDAnalysis写在Python,支持xyz文件,提供了很多轨迹分析的基本功能。
我想阅读看起来像....
的 .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
既然你把代码贴出来了,帮到你就容易多了。
无论粒子数量多少,你总是读取 400 个坐标。
您重复 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
这种分析 MD 数据的方法(读取所有内存然后继续)可能会占用大量内存并且仅对 short/small 模拟有用。
您可以尝试现有的库:
- Chemfiles 有一个 Fortran 界面,可以简化坐标的读取:http://chemfiles.org/chemfiles.f03/0.7.4/(Fortran 绑定)
- 考虑其他语言。 MDAnalysis写在Python,支持xyz文件,提供了很多轨迹分析的基本功能。