Переполнение при распределении массивов Фортрана - PullRequest
0 голосов
/ 15 января 2019

Я новичок в Fortran и в подпрограмме, которая находится внутри модуля, я пытаюсь объявить следующую переменную:

real(kind = 8), dimension(dim*nnds, dim*nnds) :: Kgel

И я получаю следующее:

Unhandled exception at 0x009F4029 in Solver.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00602000).

dim и nnds - переменные, поступающие из другого модуля, и я знаю, что они правильно передаются как:

integer(kind = 8) :: nnds, dim
dim = 2
nnds = 937

Если я объявлю переменную как:

real(kind = 8), dimension(2*937, 2*937) :: Kgel

Или даже как:

real(kind = 8), dimension(:, :), allocatable :: Kgel

allocate(Kgel(dim*nnds, dim*nnds))

Это работает, так почему я не могу объявить 'Kgel' как:

real(kind = 8), dimension(dim*nnds, dim*nnds) :: Kgel

Большое спасибо за ваше время ...

UPDATE

Мой код выглядит примерно так:

program MainTest

    use FirstModule
    use SecondModule

    call FirstSubRoutine
    call SecondSubRoutine

end program

.

module FirstModule

    integer(kind = 8) :: nnds, dim

    contains

    subroutine FirstSubRoutine()

        !does stuff and eventually
        dim = 2
        nnds = 937

    end subroutine

end module

.

module SecondModule

    use FirstModule

    contains

    subroutine SecondSubRoutine()

        real(kind = 8), dimension(nnds*dim, nnds*dim) :: Kgel
        !print *, dim -> dim = 2
        !print *, nnds -> nnds = 937
        !pause
            !but this works:
            !real(kind = 8), dimension(:, :), allocatable :: Kgel
            !allocate(Kgel(dim*nnds, dim*nnds))

    end subroutine

end module

Этот небольшой тестовый код повторяет мою проблему.

UPDATE

Изменяя «Резервный размер стека», теперь он работает нормально:

enter image description here

1 Ответ

0 голосов
/ 15 января 2019

Чтобы решить эту проблему, переменная должна быть объявлена ​​следующим образом:

real(kind = 8), dimension(:, :), allocatable :: Kgel
!...
allocate(Kgel(dim*nnds, dim*nnds))

Или, поскольку я использую компилятор Intel Fortran в Visual Studio, в разделе «Свойства проекта»> «Свойства конфигурации»> «Fortran»> «Оптимизация» установите для массивов кучи значение от 0 до n:

"Массивы кучи: выделяйте временные массивы минимального размера n (в килобайтах) в куче, а не в стеке. Используйте 0, чтобы всегда размещать их в куче. Оставьте пустым, чтобы не активировать."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...