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

时间:2017-03-03 00:45:17

标签: if-statement fortran fortran90

我正在尝试编写一个包含很多if语句的程序。但是,我无法理解这个错误来自何处。任何帮助,将不胜感激。

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

'unknown'

不断出现的错误是:

    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

3 个答案:

答案 0 :(得分:1)

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

这样的东西

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

答案 1 :(得分:0)

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

@Ianbush也提到了一些好处。

也许......它是一些更流畅的/插补器?

更顺畅的例子:

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)

可能需要返回NewThing(1:L,1:L)

答案 2 :(得分:-1)

使用SELECTED CASE或WHERE和ELSEWHERE,这会更容易一些。或者让我构建并在其中输入j测试。

如果没有看到剩下的代码,我只能猜测这可能与某些插值类似......

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