Fortran程序在没有子程序的情况下不会收敛

时间:2018-03-19 14:20:05

标签: fortran gfortran fortran90

我正在使用下面的Fortran 90脚本使用迭代方法求解偏微分方程,但我有一个关于程序结构的问题。如果我使用程序调用的子程序,解决方案会正确收敛,但如果我只是将计算放在迭代中,解决方案就不会收敛。

以下是不起作用的程序:

...
DO IT = 2,ITMAX
DO I = 1,IMAX
    PHIN(IT-1,I,1) = PHIN(IT-1,I,2) - (Y(2) - Y(1))*UINF*PHIY(I)
END DO

PHIN(IT,I,1) = PHIN(IT-1,I,1)

DO J = 2,JMAX-1
    DO I = 2,IMAX-1
        LPHI(I,J) = AX(I)*PHIN(IT-1,I-1,J) - &
                    BX(I)*PHIN(IT-1,I,J) + &
                    CX(I)*PHIN(IT-1,I+1,J) + &
                    AY(J)*PHIN(IT-1,I,J-1) - &
                    BY(J)*PHIN(IT-1,I,J) + &
                    CY(J)*PHIN(IT-1,I,J+1)
    ENDDO
ENDDO

SELECT CASE(SOL)
    CASE(1)
      CALL NPJ()
    CASE(2)
      CALL NPGS()
    CASE(3)
      CALL NSOR()
END SELECT

PHIN(IT,:,:) = PHIN(IT-1,:,:) + C(:,:)

RESI(IT) = MAXVAL(ABS(LPHI(:,:)))

IF (RESI(IT)<EPS) THEN
    ITVALUE = IT
        EXIT
ENDIF

LPHI(:,:) = 0

WRITE(*,*) IT,RESI(IT)
ENDDO
...


subroutIne NPGS()
use var_mesh
use var_solve

    C(:,:) = 0

    DO J = 2,JMAX-1
        DO I = 2,IMAX-1
            C(I,J) = 1/(2*(DELTAX(I)**2 + DELTAY(J)**2))* &
                     (((DELTAX(I)*DELTAY(J))**2)*LPHI(I,J) + &
                     (PHIN(IT,I-1,J) - PHIN(IT-1,I-1,J))*DELTAY(J) + &
                     (PHIN(IT,I,J-1) - PHIN(IT-1,I,J-1))*DELTAX(I))
        END DO
    END DO

RETURN
END SUBROUTINE NPGS

和解决方案正常,

{{1}}

有人可以解释主要区别是什么以及为什么两个程序都不同?

1 个答案:

答案 0 :(得分:0)

分配C = 0有助于脚本收敛,但我发现错误是什么,我在这一行的程序中只分配了边界条件的一部分:

PHIN(IT,I,1) = PHIN(IT-1,I,1)

但正确的方法是完全矩阵和:

PHIN(IT,:,:) = PHIN(IT-1,:,:)