使用maxloc和maxval在多维fortran数组中查找多个局部最大值

时间:2017-02-28 20:01:26

标签: multidimensional-array fortran max

我正在使用大型计算流体动力学(有限差分)代码来模拟太阳系的形成。它用fortran编写并使用3D圆柱网格来保存量(质量,动量,......)。我没有编写代码,而是用它来进行研究。我目前正在对输出文件执行数据分析,我在查找3D密度数组中的多个局部最大值时遇到了一些麻烦。

我首先尝试使用基本的maxloc和maxval内部函数:

print*, maxloc(array)
print*, maxval(array)

这只为我提供了遇到的第一个最大值。我正在寻找阵列中的超密度,这可能是形成星子的前兆。我需要找到所有这些,它们的位置,然后执行更多分析以找到它们在网格中的“边缘”,并进行整合以找到每个过密区域中的总质量。首先,首先要做的事情。我需要找到所有局部最大值。

我发现了这两个讨论,但似乎都没有解决问题: 1)FORTRAN - MAXLOC which returns all positions of maximum values in array? 2)Finding [index of] the minimal value in array which satisfies a condition in Fortran

在第一次讨论中使用信息时,我尝试编写自己的多个maxima finder,但只设法执行内部函数所做的事情。

temp=0.0
do L = 0, LMAX-1
 do K = 0, KMAX-1
  do J = 0, JMAX-1
   if (array(j,k,l)>=temp) then
    temp = array(j,k,l)
    tempj = j
    tempk = k
    templ = l
   end if
  end do
 end do
end do

我也尝试过:

temp(j,k,l)=0.0
do L = 0, LMAX-1
 do K = 0, KMAX-1
  do J = 0, JMAX-1
   if (array(j,k,l).gt.maxval(array)) then
    temp(j,k,l) = array(j,k,l)
    print*, temp(j,k,l), j,k,l
   else 
    go to 20
   end if
  end do
 end do
end do
20 continue

希望它会跳过第一个最大值,然后继续下一个。这也不起作用,但我现在看到了我的逻辑中的缺陷。我现在想我可以使用maxloc(数组)找到第一个最大值的j,k,l位置,然后写一个从j,k,l索引开始的循环来找到下一个最大值,然后继续直到我找到它们的方式。我认为这种蛮力方法应该有效,但它看起来很笨拙而且计算量很大。

在我成为程序员之前,我是一名物理学家。我只是希望有人能指出我这样做更优雅的方式。这看起来很简单,所以我想知道为什么没有内在功能可以做到这一点。

感谢您的帮助。

0 个答案:

没有答案