2017-05-26 38 views
0

我经常需要调试使用大型复杂数据阵列的旧Fortran代码,并且可用的最佳选项是TotalView。我创建了自己的可视化工具来查看数据(按照TotalView的说明here),效果很好。它比默认的更灵活,并且能够摄取和显示复杂的数据,但TotalView不会通过可视化管道发送复杂的数组。如何将复杂数据发送到TotalView中的可视化工具?

有没有什么办法让TotalView能够显示复杂的数据,而无需使用额外的调试数组重新编译代码来获取绝对值?

E.g.像下面这个简短的示例代码,我可以使Fortran的另一个数组,但我真的很想刚刚停下来检查的变量my_arr

program main 

implicit none 

integer N, M, i, j 
parameter (N=100, M=30) 
complex my_arr(N, M) 
real pi 

pi = ACOS(-1.0) 

do j = 1, M 
    do i = 1, N 
     my_arr(i,j) = cmplx(i*cos(j/pi), i*sin(j/pi)) 
    end do 
end do 

return 

end 

对于小数组,我可以像逃脱这作为一个表达式:

my_arr%Real_Part**2 + my_arr%Imaginary_Part**2 

但这不会工作的东西非常大,TotalView抱怨内存。

我正在使用TotalView 8.13。

回答

0

你可以做到这一点,如果你的数组是在内存中连续你可以调整你的可视化输入复杂的数据与含有实部和虚部分一个额外的维度真正的数组。

在你上面的例子,如果你“潜水”到变量my_arr,它会显示为类型

COMPLEX(4)(100,30) 

这实际上是作为TotalView的内置$complex_8相同。您可以通过简单地重新键入以下到重铸的类型和尺寸“类型:”字段:

$real_4(2,100,30) 

然后实部和虚部将驻留在第一(最快的迭代)维和TotalView软件将让你将3D浮点数组传递给可视化工具。注意:默认情况下,TotalView将自身限制为可视化2D数组,因此您需要在“最大化”下的“启用Visualizer启动”框中的“首选项 - >启动字符串”下将其更改为3D(或无论您的可视化工具可以处理多少)阵列排名“。

分配数组:

动态大小的数组可以以同样的方式来处理,但是需要几个额外的步骤。

  1. 通常参考阵列的地址不在存储器中的实际数组的地址,所以你将不得不手动调整潜水窗口的地址。

    在右侧的潜水窗口中,滚动条上方有一个选项按钮,用于指示窗口中显示的列 - 打开“地址”并记下阵列中第一个元素的十六进制地址。通过更改类型字符串重新进行重新设置后,将该十六进制地址键入顶部的“地址”字段,然后您的数据将正确显示。

    TotalView variable window with button circled

  2. 类型字符串将包含沿COMPLEX(4),allocatable::(:,:)线的东西,而“实际类型”串会告诉你的尺寸。重做时,请确保删除,allocatable::并将(:,:)更改为实际尺寸(例如(100,30))。