Fortran 《分子动力学密码》中的几个问题;理解分子模拟:从算法到应用;

Fortran 《分子动力学密码》中的几个问题;理解分子模拟:从算法到应用;,fortran,Fortran,您需要阅读本书才能回答我的问题。 -背景- 我正在努力学习分子动力学,我开始读那些应该是入门的书,但我在理解方程或它们的解释时遇到了很多困难。我尝试了6到7本不同的书,从导论章节开始,然后翻阅这本书,寻找我可以复制的代码,为方程提供一些上下文,因为我无法理解它们。很明显,他们希望你有很多先决的物理知识(特别是MD知识)来理解方程如何转化为一段代码。我参加了物理课程和3D物理引擎课程,但这些知识对这项工作没有帮助。我能找到的唯一代码是《理解分子模拟:从算法到应用》,我有一些问题在书中找不到答案如果

您需要阅读本书才能回答我的问题。

-背景- 我正在努力学习分子动力学,我开始读那些应该是入门的书,但我在理解方程或它们的解释时遇到了很多困难。我尝试了6到7本不同的书,从导论章节开始,然后翻阅这本书,寻找我可以复制的代码,为方程提供一些上下文,因为我无法理解它们。很明显,他们希望你有很多先决的物理知识(特别是MD知识)来理解方程如何转化为一段代码。我参加了物理课程和3D物理引擎课程,但这些知识对这项工作没有帮助。我能找到的唯一代码是《理解分子模拟:从算法到应用》,我有一些问题在书中找不到答案如果您有任何对初学者更友好的必备书籍或课程来帮助我了解本书中的内容,那将是令人惊讶的-背景结束-

这就是代码在书中显示的方式,我读到你应该在主程序结束后放置子程序,所以我就是这么做的。因为我只能找到使用非常小的代码片段的fortran教程,所以我不确定是否应该在此处显示的所有位置使用
停止
结束
、和
返回
,如果
implicit none
是它应该在的位置,如果我应该将每个子例程放在不同的文件或类似文件中。 循环基本上与python中的相同,因此我已经能够理解一些代码,但我还没有看到更大的画面

我面临的主要问题是,我使用的一系列变量在书中的任何地方都没有声明(尽管我找到了一些解释,说明它们代表了其中一些变量),这可能就是程序无法运行的原因。我收到此错误消息“启动失败。未找到二进制文件”

如何声明变量
delt
tmax
f
(力),
en
(能量),
ranf
lattice\u pos
x
v
temp
xm
dt
xr
box
r2i
xx
vi
?其中一些甚至可能不是变量,但我不认为它们内置在fortran中,因为我找不到任何关于它们的信息。另外,我猜tmax与npart(N个粒子)的数值相同,那么为什么它们会使用两个不同的变量呢

这些变量意味着什么?(我能找到的
f
en
除外)

每个原子的x,y,z坐标存储在哪里?我假设它们将存储在1个列表(或fortran中的任何等价物)中,存储每个列表有3个值(对于x、y、z)的列表,或包含每个列表中所有x、y、z坐标的3个列表,在
init
子例程中。然而,情况并非如此,因为只有
x
v
循环通过

为什么在子例程的开头将
en
立即设置为0时,它是
force()
的输入?不能在函数中声明它而不将其作为输入吗

program main
call init

t=0
do while (t.lt.tmax)
call force(f,en)
call integrate(f,en)
t=t+delt
call sample
enddo
stop
end

subroutine init
sumv=0
sumv2=0
do i=1, npart
    x(i)=lattice_pos(i)
    v(i)=(ranf()-0.5)
    sumv=sumv+v(1)
    sumv2=sumv2+v(i)**2
enddo
sumv=sumv/npart
sumv2=sumv2/npart
fs=sqrt(3*temp/sumv2)
do i=1,npart
    v(i)=(v(i)-sumv)*fs
    xm(i)=x(i)-v(i)*dt
enddo
return

subroutine force(f, en)
en=0
do i=1, npart-1
    do j=i+1, npart
        xr=xr-box*nint(xr/box)
        r2=xr**2
        if (r2.lt.rc2) then
            r2i=1/r2
            r6i=r2i**3
            ff=48*r2i*r6i*(r6i-0.5)
            f(i)=f(i)+ff*xr
            f(j)=f(j)-ff*xr
            en=en+4*r6i*(r6i-1)-ecut
        endif
    enddo
enddo
return
end

subroutine integrate(f,en)
sumv=0
sumv2=0
dp i=1,npart
    xx=2*x(i)-xm(i)+delt**2*f(i)
    vi=(xx-xm(i))/(2*delt)
    sumv=sumv+vi
    sumv2=sumv2+vi**2
    xm(i)=x(i)
    x(i)=xx
enddo
temp=sumv2/(3*npart)
etot=(en+0.5*sumv2)/npart
return
end
    implicit none
end program main
与许多其他教科书一样,“理解分子模拟:从算法到应用”中的示例代码是伪代码。它并不完整(例如,缺少声明),其目的是要比“仅仅是数学”更明确地说明算法。在本书中,这是令人困惑的,因为他们为伪代码编写了不完整的Fortran

这仍然是一个很好的“一般问题”:了解如何使用Fortran编写的老式教科书材料:-)

在(阿姆斯特丹多尺度建模中心的网站)上,你可以找到这本书的实际Fortran代码,正如Ian Bush所写,代码是老式的,Allen&Tildesley的书有一个更新和更新的代码:

关于你的问题:

  • 如何声明变量delt、tmax、f(力)、en(能量)、ranf、lattice_pos、x、v、temp、xm、dt、xr、box、r2i、r6i、ff、xx和vi?其中一些甚至可能不是变量,但我不认为它们内置在fortran中,因为我找不到任何关于它们的信息。另外,我猜tmax与npart(N个粒子)的数值相同,那么为什么它们会使用两个不同的变量呢

    你必须阅读有关算法的章节才能理解变量。然而,在本书的第“xxi”页上可以找到它们的列表

  • 每个原子的x,y,z坐标存储在哪里?我假设它们将存储在init子例程中的1个列表(或fortran中的任何等价物)中,存储每个列表有3个值(对于x、y、z)的列表,或包含每个列表中所有x、y、z坐标的3个列表。然而,情况并非如此,因为只有x和v循环通过

    在这里,伪代码有点限制。您有几个选项来声明变量:(i)作者(参见上面的链接了解文件)使用“公共块”,这是一种Fortran特定类型的全局变量。(ii)Fortran 90和更新版本中提供的模块变量是“更好的全局变量”。(iii)将所有数据封装在派生类型中,这些派生类型可以在主程序中声明并传递给子例程

    位置存储(在示例中)为数组
    x(npmax)
    y(npmax)
    z(npmax)
    npmax
    是粒子的最大数量。这在伪代码中没有显示。请注意,在较新版本的Fortran(90 a