Fortran用openmp编译出stackoverflow问题

分配的数组太大,会引发如下错误:

0x000007FE083F86C8 (DH0_fortran_DLL.dll) (GccCallfortranDLLexample.exe 中)处有未经处理的异常: 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x0000000000033000)。

应该用动态数组:

      REAL,ALLOCATABLE :: W2(:),W3(:),W4(:),W5(:),DSP_A(:)
      ALLOCATE(W2(MAXFR))
      ALLOCATE(W3(MAXFR))
      ALLOCATE(W4(MAXFR))
      ALLOCATE(W5(MAXFR))
      ALLOCATE(DSP_A(MAXFR))
      DO I=1,MAXFR
          DSP_A(I)=DSP1(I)
      END DO

在subroutine调用的时候,应该给方法写上interface

      SUBROUTINE ESCG1(NITR,EITR)
C
      IMPLICIT NONE
      PARAMETER(MAXND=80000,MAXFR=MAXND*3)
C
      interface
        subroutine AXMLT1(aaa,bbb)
          real, intent(inout) :: aaa(:), bbb(:)
        end subroutine AXMLT1
      end interface
C
C
      COMMON/EQUA/DSP1(MAXFR)
      REAL,ALLOCATABLE :: W2(:),W3(:),W4(:),W5(:),DSP_A(:)
      ALLOCATE(W2(MAXFR))
      ALLOCATE(W3(MAXFR))
      ALLOCATE(W4(MAXFR))
      ALLOCATE(W5(MAXFR))
      ALLOCATE(DSP_A(MAXFR))
      DO I=1,MAXFR
          DSP_A(I)=DSP1(I)
      END DO
      CALL AXMLT1(DSP_A,W2)
      RETURN
      END

原本的方法改为这样:

      SUBROUTINE AXMLT1(X,Z)
C
      IMPLICIT REAL*8(A-Z)
      real,allocatable,dimension(:)::X,Z
C
      RETURN
      END

猜你喜欢

转载自my.oschina.net/u/2996334/blog/1809097