else 语句后的意外垃圾:(i == 1 .AND. 1 < j < L)

Unexpected junk after else statement: (i == 1 .AND. 1 < j < L)

我正在尝试编写一个包含很多 else if 语句的程序。但是,我不明白这个错误是从哪里来的。任何帮助,将不胜感激。

下面是我目前拥有的 if 块:

    if (i == 1 .AND. j==1) then
        E = E + A(i+1,j) + A(i,j+1) + A(L,j) + A(i,L)

    else if (i == 1 .AND. j==L) then
        E = E + A(i,j-1) + A(i+1,j) + A(i,1) + A(L,j)

    else if (i == L .AND. j == 1) then
        E = E + A(i,j+1) + A(i-1,j) + A(1,j) + A(i,L)

    else if (i == L .AND. j == L) then
        E = E + A(i,j-1) + A(i-1,j) + A(1,j) + A(i,1)

    else if (i == 1 .AND. 1 < j < L) then
        E = E + A(i+1,j) + A(i,j+1) + A(i,j-1) + A(L,j)

    else if (i == L .AND. 1 < j < L) then
        E = E + A(i-1,j) + A(i,j+1) + A(i,j-1) + A(1,j)

    else if (1 < i < L .AND. j == 1) then
        E = E + A(i-1,j) + A(i+1,j) + A(i,j+1) + A(i,L)

    else if (1 < i < L .AND. j == L) then
        E = E + A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,1)
    else
        E = E + A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,j+1)
    end if

不断出现的错误是:

Ising.f90:56:15:

     else if (i == 1 .AND. 1 < j < L) then
           1
Error: Unexpected junk after ELSE statement at (1)
Ising.f90:59:15:

     else if (i == L .AND. 1 < j < L) then
           1
Error: Unexpected junk after ELSE statement at (1)
Ising.f90:62:15:

     else if (1 < i < L .AND. j == 1) then
             1
Error: Unexpected junk after ELSE statement at (1)
Ising.f90:65:15:

     else if (1 < i < L .AND. j == L) then
           1
Error: Unexpected junk after ELSE statement at (1)

您不能使用像 1 < i < L 这样的表达式来确定 i 是否在 1 到 L 的范围内。 您需要使用两个不等式测试的交集。使用像

这样的东西

else if (1 < i .AND. i < L .AND. j == L) then

如果使用 SELECTED CASE 或 WHERE 和 ELSEWHERE ,这会更容易一些。或者制作 I if 结构,然后将 j 测试放入其中。

在没有看到其余代码的情况下,我只能猜测这可能类似于某种插值...

如果数组是从 (0:n+1) 索引的,那么可以在单个数学语句行上执行此操作。

@VladimirF 正如我提到的,它看起来像是一些插值...

@Ianbush 也提到了一些好的地方。

也许...是一些smoother/interpolator?

更流畅的例子:

L = UBOUND(OldThing, 1)   !assumes it is square!
ALLOCATE(newthing(0:L+1, 0:L+1) )
DO I = 1, L
  DO J = 1, L
    NewThing(I,j) = OldThing(I,j)
  ENDDO 
ENDDO

! Probably a derivative to extrapolate the outliers is better...
! Kindergarten example below is for simplicity. 
DO I= 1, L
  NewThing(0,(I))= OldThing(1,I)
  NewThing(0,(I))= OldThing(1,I)
  NewThing(0,(I))= OldThing(1,I)
  NewThing(0,(I))= OldThing(1,I)
ENDDO

NewThing(0  ,  0) = OldThing(1,1)
NewThing(0,  L+1) = OldThing(1,L)
NewThing(L+1,  0) = OldThing(L,1)
NewThing(L+1,L+1) = OldThing(L,L)

!then one is always within the bounds... And the normal case is executed.
E = E + NewThing(I-1,j) + NewThing(i+1,j) + NewThing(i,j-1) + NewThing(i,j+1)

可能需要 return NewThing(1:L,1:L)