Fortran - 避免在循环中投射

时间:2013-12-18 03:40:06

标签: casting fortran

这个问题似乎总是出现在我面前,所以我想知道一个比我现在做的更好的解决方案。 我想使用循环构建一个数组,其中迭代参数用于计算。问题是数组索引中的整数工作正常,但在计算中使用时会导致错误。也许这个问题的一个例子很有用。

DO ii = 1,N
ir = real(ii,kind=dp)  ! Cast this to real
DO ji=1,N
    jr = real(ji,kind=dp)  ! Cast this to real.
    IF (abs(sqrt((ir-1)**2 + (jr-1)**2)) < Lim) THEN
        A(ii,ji) = 1;
    ELSEIF (abs(sqrt((ir-1)**2 + (jr-N)**2)) < Lim) THEN
        A(ii,ji) = 1;
    ELSEIF (abs(sqrt((ir-N)**2 + (jr-1)**2)) < Lim) THEN
        A(ii,ji) = 1;
    ELSEIF (abs(sqrt((ir-N)**2 + (jr-N)**2)) < Lim) THEN
        A(ii,ji) = 1;
    END IF        
END DO
END DO

有没有办法做到这一点,而不是每次都通过循环强制转换?我觉得这是一个瓶颈。

1 个答案:

答案 0 :(得分:0)

我怀疑转换是一个瓶颈,但你可以尝试实际使用实数并在循环中递增:

ri = 1.0
do ii=1,n
   rj = 1.0
   do jj=1,n
      ..math...
      rj = rj + 1.0
   enddo
   ri = ri + 1.0
enddo