Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

belsen85

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Итак, даю подробное объяснение начальных условий и проблем своей задачи, так сказать:
 

  1. Проблема первая - я не программист, а инженер, что кодил до этого только инженерные проблемы.
  2. Есть программа - пакет для расчета методом конечных элементов Abaqus, которая имеет, естественно закрытый код. Но у нее есть полезная возможность - к ней можно писать сабрутины на Фортране, что компилируются с основным кодом перед запуском расчета.  
  3. Естественно, что при написании этих сабрутин надо следовать строгим правилам, чтобы они могли скомпилиться с основным кодом (названия и тип переменных), а так же они выполняются по определенным основным кодом (то есть разработчиками Абакуса, годах этак в 1980-х) принципам.  
  4. Два главных правила:
  5. Параллизация расчета - модель делится на "куски", в зависимости от количества задействованных ядер. И каждый кусок считается в отдельно запущенном отдельном процессе explicit.exe.  
  6. Векторизция расчета - все действия на user defined variables производятся только с циклом не больше nblock. Сам nblock определяется основным кодом и зависит от типа процессора (скорее всего связан с кэшем процессора). Просто этот цикл повтиряется, пока не пройдет все элементы в модели.  
    То есть, мне надо посчитать среднее значение (Sred) какой-то определенной мной переменной (X) по всем элементам в модели (N=650) и nblock для моего процессора = 136.  
    Так вот, если я напишу

    Код:
     do k=1, N  
        Sred = X(k)/sum(X(1:N))
        end do
     

     
    Программа на самом деле автоматически выполнит 5 циклов:

    Код:
    do k=1, nblock  
        Sred = X(k)/sum(X(1:nblock))
        end do
     
    do k=nblock+1, nblock*2  
        Sred = X(k)/sum(X(nblock+1:nblock*2))
        end do
     
    и так далее
     

    И в результате Sred, что я получу, будет только значение за последние 106 элементов. Можно конечно задавать ее как array изоначально, но если у меня 1,5 млн //элементов? Это ж сколько вложенных подциклов будет?
     
    При этом если я использую больше 1 процессора, описать как доставать данные с других explicit.exe я не знаю, кроме как писать все это дело в txt файлы, что тоже нелегко, так как процессы конфликтуют между собой (если файл уже открыт одним, то другие выдают ошибку доступа к файлу и расчет выходит обрывается).

 
Я пока нашел некрасивое решение - это обращение к данным, что программа создает в конце рассчета автоматически (то есть это было накодино создателями), и обрабатывается Питоном (есть спец аддон для работы с этими данными для Питона), но потом опять проблема - как посчитаное значение Sred в Питоне передать назад в сабрутину, если больше одного процессора задействовано + такой подход явно сказывается на производительности (запись данных, зактырие расчета, обработка питоном, рестарт расчета и чтение данных, созданных Питоном)
 
Собственно, высказался. У кого какие идеи?

Всего записей: 26 | Зарегистр. 11-07-2012 | Отправлено: 13:10 23-07-2012 | Исправлено: belsen85, 13:13 23-07-2012
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru