arrays - 如何在Fortran代码中将二维数组转换为一维数组?

标签 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

我必须计算距离并将其保存在数组中作为r (i,j)。我想将 r(i,j) 转换为一维数组,以便可以轻松对 r(i,j) 进行排序。

最佳答案

之前的两个答案研究了如何将 2 级数组“转换”为 1 级数组的字面问题。他们使用不同的方法:

  • 将值复制到新的 1 级数组中;
  • 在最后的子例程中,有一个与 2 级实际参数关联的 1 级虚拟参数。

我们可以扩展这两种方法。

reshape以最简单的形式返回所需的 1 级数组。作为替代方案,我们可以说 [x] 形式的数组构造函数也可以这样做:

real r1d(6), r2d(3,2)
r2d=5.
r1d = [r2d]

当实际参数是 array element 时数组虚拟参数和数组中包含和跟随实际参数的元素按顺序关联。

通过序列关联,虚拟数组将被假定大小或显式形状。在本例中,我们对整个数组感兴趣,因此我们可以传递整个数组:

real r2d(3,2)
call sub(r2d)

哪里

subroutine sub(r1d)
  real r1d(*) ! or r1d(6), etc.
end subroutine

这里重要的是,对于显式形状和假定大小的虚拟参数,排名不需要与实际参数匹配。

如前所述,第一组方法涉及创建一个新数组。使用序列关联则不然。第三种方法也是可用的:让 1 级指针指向 2 级目标。当然,创建副本也意味着任何更改都不会反射(reflect)在原始的 2 级数组中。序列关联和指针将看到传递的更改。

有关其中任何一件事的更多详细信息可以在其他问题和答案中找到。

对于排序来说,将 2 级数组视为 1 级数组是否有意义是一个不同的考虑因素。

关于arrays - 如何在Fortran代码中将二维数组转换为一维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51912396/

相关文章:

javascript - 在 foreach 中遍历两个不同的数组

python - Scipy interp2d 插值屏蔽填充值

java - 类数组中的空指针异常

c - 如何从 Fortran 访问 C 指针?

linux - OpenMP 和并行化问题

javascript - 如何对对象值数组求和并将它们分配给相关的键名

optimization - 优化零乘法

python - 使用并行 NetCDF 保存分布式 3D 复数组

arrays - Fortran 中虚拟参数显式形状数组的声明

fortran - 变量定义上下文编译错误中的非变量表达式