Fortran中的方位角平均值?在 Fortran 中查找索引?

计算科学 正则 矩阵 特征值 拉帕克
2021-12-13 06:02:59

我正在研究 fortran 中的特征值问题。我已经使用 Lapack 来解决问题并获得特征值和特征向量。这是为201×101波数,由于对称性,只有一半的波空间,并且对于大域(海洋中)的每个网格点。我正在寻找每个网格点的最大特征值,并且我想不只是选择绝对最大值201×101特征值矩阵,但在波空间中执行方位角平均 - 然后选择最大平均值。我正在努力寻找如何做到这一点。

起初我是这样编码的:

波数域

dx=4000.
pi = 4.*atan(1.)

DO m=1,ktot 
    kx(m) = -(2.*pi)/(dx) + ((m-1)*2.*pi)/(100.*dx)
END DO

DO l=1,ltot
    ly(l)= ((l-1)*2.*pi)/(100.*dx)
END DO

!径向距离

DO m=1,ktot
DO l=1,ltot
    raddist(m,l)=sqrt(kx(m)**2+ly(l)**2)
END DO
END DO

方位角平均值(omegai 是我发现的特征值,一个ktot*ltot大矩阵)

DO i=1,ltot-1   
    ind=(raddist(:,i).GE.ly(i).AND.raddist(:,i).LT.ly(i+1))
    length=count(ind)
    WHERE (ind) average_omegai = sum(omegai)/length
END DO

但似乎我正在为 k 方向上的所有波数求和一个水平块,介于ly(i) and ly(i+1). 我宁愿需要在波空间中制作一个半圆来总结它之间的所有 omegai 值。有人能帮忙吗?

提前非常感谢!!

(顺便说一句:我也试过

 DO m=1,ktot-1
 DO l=1,ltot-1   
    ind=(raddist(m,l).GE.ly(l).AND.raddist(m,l).LT.ly(l+1))
    length=count(ind)
    WHERE (ind) average_omegai = sum(omegai)/length
 END DO
 END DO

但我现在对自己做错了什么视而不见!我的问题表述不同的是:在 Fortran 中是否有另一种方法可以在矩阵中找到满足某些标准的索引?Matlab 中的查找函数可以完成这项工作,但我没有在 Fortran 中找到等效的内在函数?)

2个回答

我没有花太多时间查看您的代码,但我会以稍微不同的方式处理这个问题。我不会询问哪些波数对应于给定的半径范围,而是将空间划分为您想要的(径向)箱,然后遍历波矢量,询问哪个箱包含每个波矢量(例如使用整数除法)。通过对每个 bin 中的值求和并计算每个 bin 中有多少,您可以轻松计算平均值。这也应该更有效率。

要在 Fortran 数组中查找索引:创建您的销售掩码,并使用MAXLOC或 MINLOC