cla*_*ith 3 arrays fortran gfortran
如何将 r(i,j) 转换为一维数组,以便我可以轻松地对数字进行排序?
program sort
implicit none
character CN*8,O*7
integer j,iconf,nconf
integer i,nbins,t
integer n,nmax,ind,num,b
parameter (n=216)
double precision xbox,rq
parameter (nmax=3091,nconf=1)
double precision atom(nmax),id(nmax),ox(nmax),oy(nmax),oz(nmax)
double precision xij,yij,zij,rij
double precision r(n,n),A(n)
open(unit=10,status='unknown',file='1000.gro')
do iconf= 1,nconf
write(*,*)iconf
read(10,*)
read(10,*)
do i=1,n
read(10,'(A8,A7,1i5,3f8.3)')CN,O,num,ox(i),oy(i),oz(i)
enddo
read(10,*)xbox ! read the xbox for PBC
open(unit=3,file='dist.txt')
do i=1,n
do j=1,n
if(i .ne. j) then
xij=ox(i)-ox(j)
yij=oy(i)-oy(j)
zij=oz(i)-oz(j)
r(i,j)=dsqrt(xij**2 + yij**2 + zij**2)
write(3,'(i3,2x,i3,4x,f17.15)') i,j, r(i,j)
endif
enddo
enddo
enddo
END
Run Code Online (Sandbox Code Playgroud)
我必须计算距离并将其保存在数组中作为r (i,j)
. 我想转换r(i,j)
为一维数组,以便我可以r(i,j)
轻松地对其进行排序。
之前的两个答案着眼于如何将 rank-2 数组“转换”为 rank-1 数组的字面问题。他们使用不同的方法:
我们可以扩展这两种方法。
reshape
以最简单的形式返回所需的 rank-1 数组。作为替代方案,我们可以说这种形式的数组构造函数[x]
也这样做:
real r1d(6), r2d(3,2)
r2d=5.
r1d = [r2d]
Run Code Online (Sandbox Code Playgroud)
当实参是数组元素时,数组虚实参与包含和跟随实参的数组元素按顺序关联。
通过序列关联,虚拟数组将是假定大小或显式形状。在这种情况下,我们对整个数组感兴趣,我们可以只传递整个数组:
real r2d(3,2)
call sub(r2d)
Run Code Online (Sandbox Code Playgroud)
在哪里
subroutine sub(r1d)
real r1d(*) ! or r1d(6), etc.
end subroutine
Run Code Online (Sandbox Code Playgroud)
这里重要的是,对于显式形状和假定大小的虚拟参数,等级不需要与实际参数的等级匹配。
如前所述,第一组方法涉及创建一个新数组。序列关联的使用没有。第三种方法也是可用的:让一个 rank-1 指针指向一个 rank-2 目标。当然,创建副本也意味着任何更改都不会反映在原始 rank-2 数组中。序列关联和指针将看到传递的更改。
可以在其他问题和答案中找到有关其中任何一项的更多详细信息。
对于排序,将 rank-2 数组视为 rank-1 数组是否有意义是一个不同的考虑因素。