我正在使用大型计算流体动力学(有限差分)代码来模拟太阳系的形成。它用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索引开始的循环来找到下一个最大值,然后继续直到我找到它们的方式。我认为这种蛮力方法应该有效,但它看起来很笨拙而且计算量很大。
在我成为程序员之前,我是一名物理学家。我只是希望有人能指出我这样做更优雅的方式。这看起来很简单,所以我想知道为什么没有内在功能可以做到这一点。
感谢您的帮助。