2013-10-09 2 views
1

Я пишу userubroutine с помощью Fortran (Intel Composer (2011.1.107)) для ANSYS14.5.7 Я отредактировал код, чтобы записать некоторые данные во внешний последовательный файл и прочитать их в массиве для расчетов следующим образом:ошибка сегментации в linux для ansys

c Writes the array elements into the relevent elementID file and Integration point 
    Do ElementNo=1,MaxEleNo 
c writes the file name for the relevent element 
    write (filename1, '("Element_", I4)') ElementNo 
c opens the relevent file for the element data 
    OPEN(unit=ElementNo,status='unknown',ACCESS='APPEND' 
& ,file=filename1)  
    Write(ElementNo,fmt='(*(D))')(sthistory(ElementNo,:)) 
    close (ElementNo) 
    end do 
    sthistory=ZERO 
    else 
    endif 

когда я запускаю это я получаю эту ошибку из системы HPC:

Lyra: Ansys (v14.5.7) loaded. 
Lyra: Intel Composer (2011.1.107) module loaded. 
/pkg/suse11/ansys/v145/ansys/bin/ansys145: line 817: 50102 Segmentation fault   /pkg/suse11/ansys/v145/ansys/bin/linx64/ansys.e145 -np 4 

Но никаких проблем с кодом, когда я бегом со статическим массивом с сохранением атрибута в подпрограмма. Но это не является достаточным для хранения всех данных в моих расчетах. Может кто-нибудь помочь мне найти, что может быть проблемой.

+0

Какой линии в вашем код точно соответствует строке 817? –

+0

бит о статических массивах не имеет смысла, так как вы не показываете никаких объявлений/распределений .. нужен больше контекста. – agentp

+0

HPC == Высокопроизводительные вычисления? == Параллельно ?? Если это должно быть потокобезопасным, то есть целая другая проблема, и вам нужно уточнить. – agentp

ответ

3

Низкие номера единиц, как правило, зарезервированы для «специальных единиц», таких как STDOUT, STDERR, STDIN. Не используйте их (если вы не знаете, что делаете), или что-то неожиданное может случиться. Я мягко осознаю, что есть некоторый верхний предел для номеров единиц, но я не могу найти ссылку на данный момент.

Таким образом, самый простой способ решить вашу проблему - добавить смещение к устройству (что опять-таки приведет к проблемам для больших массивов) или использовать newunit=, если ваш компилятор его поддерживает. Но поскольку вы закрываете файлы в конце тела цикла, не используйте фиксированное число, например 1234?

Но у вас есть больше проблем с вашим кодом: Линия

write (filename1, '("Element_", I4)') ElementNo 

приведет к проблемам (для большинства компиляторов).

Рассмотрим эту простую программу:

program test 
    write (*, '("Element_", I4)') 1 
    write (*, '("Element_", I4)') 10 
    write (*, '("Element_", I4)') 100 
    write (*, '("Element_", I4)') 1000 
    write (*, '("Element_", I4)') 10000 
end program 

Выход есть:

Element_ 1 
Element_ 10 
Element_ 100 
Element_1000 
Element_**** 

Это приводит к имени файла, который содержит пробелы. Это может привести к ошибке! Что вы можете сделать, это изменить спецификатор формата, чтобы использовать фиксированную длину с помощью '("Element_", I4.4)', который даст вам:

Element_0001 
Element_0010 
Element_0100 
Element_1000 
Element_**** 

Вы можете видеть, что четыре цифры еще слишком мала, чтобы удерживать большие элементы, но без пробелов любых Больше.

Наконец, если вы хотите цифры, чтобы начать после косой черты непосредственно без ведущих нулей, вы можете использовать комбинацию adjustl() и trim():

program test 
    character(len=32) :: filename 

    write (filename, '(I4)') 1 
    filename = "Element_" // adjustl(trim(filename)) 
    write(*,'(a)') filename 
    write (filename, '(I4)') 10 
    filename = "Element_" // adjustl(trim(filename)) 
    write(*,'(a)') filename 
    write (filename, '(I4)') 100 
    filename = "Element_" // adjustl(trim(filename)) 
    write(*,'(a)') filename 
end program 

результатов в

Element_1      
Element_10      
Element_100 
+0

На самом деле нет причин, по которым я могу видеть, чтобы использовать разные номера единиц для каждого файла вообще, так как у вас есть только один файл одновременно используйте тот же номер. Документы Ansys должны сообщать вам, какие числа разрешены.Не знаю, может ли это вызвать ошибку seg, но я все равно исправлю. – agentp

Смежные вопросы