网格的前10个值的坐标

时间:2013-06-12 08:12:28

标签: algorithm fortran

我有一个大小为NxNxN的3D网格。在名为data维度N**3的数组中,我存储了与每个网格点对应的标量值。任何人都可以建议一个FORTRAN程序,它给我网格的T点坐标,其中最高T值为data的CSV格式?

输出应该是这样的,

x1,y1,z1,value1
x2,y2,z2,value2
...............
...............
x9,y9,z9,value9
x10,y10,z10,value10

如果值是按排序顺序,那就太好了。

1 个答案:

答案 0 :(得分:3)

按照@Yossarian的建议,我扔掉了我的旧答案并提供了这个改进版本。大部分功劳归功于Yossarian。

PROGRAM sort

  USE, INTRINSIC :: iso_fortran_env

  INTEGER, PARAMETER :: ne = 50
  INTEGER, PARAMETER :: tops = 10

  REAL(real64), DIMENSION(ne,ne,ne) :: data_array
  LOGICAL, DIMENSION(ne,ne,ne) :: mask_array
  INTEGER, DIMENSION(tops,SIZE(SHAPE(data_array))) :: top_array
  INTEGER :: ix

  CALL RANDOM_SEED(put=[1])
  CALL RANDOM_NUMBER(data_array)

  mask_array = .TRUE.

  DO ix = 1, tops
     top_array(ix,:) = MAXLOC(data_array,mask=mask_array)
     mask_array(top_array(ix,1),top_array(ix,2),top_array(ix,3)) = .FALSE.
  END DO

END PROGRAM sort

现在,在程序结束时top_array包含tops的最大data_array元素的索引。

我仍然怀疑这是否与编写良好的排序例程一样有效,但我已经在最多512^3个元素的数组上进行了测试,并且它在合理的时间内运行。