2015-02-23 4 views
0

У меня ошибка, когда я использую подпрограмму abaqus для чтения файла с несколькими процессорами (cpus), не могли бы вы помочь мне справиться с этой ошибкой. Значит, многоОшибка при использовании функции abaqus для чтения файла с несколькими процессорами (cpus)

Я хочу читать переменные из файла, когда используется один процессор, все в порядке, , но когда используется более одного процессора, будет ошибка, кажется, что каждый процессор повторяется одна и та же команда.

, например, следующее содержимое файла для чтения из, имя файла data.dat

* matID, 2,1

131000,000, 8880,000, 8180,000

0.324,  0.324,  0.300 

3990.000, 5320.000, 5320.000 

1871.000,  59.700,  59.700 

1291.000,  215.000,  215.000 

    90.000,  102.000,  102.000 

мой подпрограммой показан следующим образом: символа * 12 check1 целого Check2, ошибка ОТКРЫТО (10, файл = 'data.dat', статус = 'старая', IOSTAT = ошибка)
, если (error.EQ.0), то чтения (10, *, IOSTAT = ошибка) check1, Нм конец, если
близко (10)
печати *, '= Н', нм, ошибка печати *, '**'

, когда я использую 2 процессора, распечатанные результаты будут:

Nm = 2 0

Nm = 8880 0

**

**

ответ

0

В зависимости от причины для чтения в данных из файла, есть несколько способов избежать этой проблемы:

Если вам необходимо получить доступ к данным один раз только: Читать в данные в подпрограмме, которая всегда вызывается в последовательном порядке. UEXTERNALDB является хорошим примером и может быть использован для открытия файла только в начале анализа или в начале приращения по мере необходимости. Затем вы можете аккуратно хранить информацию в общих блоках. Чтение из общего блока параллельно должно работать нормально, но не писать им из параллельных подпрограмм.

Другой способ получить меньшее количество данных - вместо этого определить переменные решения в вашем входном файле.

Если вам действительно нужно открыть этот файл локально в каждом параллельном потоке (не могу понять, почему, но открыт для коррекции), вы можете использовать GETNUMCPUS и GETRANK открывать различные копии файлов в каждом потоке. GETRANK возвращает целое число, дающее вам ранг/идентификатор процесса. Однако я бы посоветовал против этого метода. Если ваша проблема достаточно велика, чтобы гарантировать параллелизм, вам следует избегать ее замещения при чтении файлов.

Для получения дополнительной информации см. Разделы 1.1.31 и 2.1.4 документов Abaqus 6.14.