В этом разделе В.И. Артемов хочет поделиться полезными наработками, которые «возникли» в процессе работы с кодом Anes.

Для работы с кодом Anes используются два языка программирования. Диалоговая часть создана с использованием языка Free Pascal и системы программирования Lazarus. Вся «вычислительная» часть реализована с использованием языка Фортран (Fortran). Именно об этом языке программирования и поговорим в этом разделе.

Первый язык программирования, который нам был доступен, был Фортран (ЭВМ Минск-32 и БЭСМ-6). С тех пор я считаю, что это лучший язык для программирования научных задач.

Язык Фортран был придуман одним человеком - Джоном Бекусом (John W. Backus) и был первым процедурным языком программирования. Естественно после оглушительного успеха первого языка программирования высокого уровня была разработана «правильная» теория языков программирования и были разработаны «правильные» языки Algol и PL/I. К сожалению, этих языков уже давно нет, а Фортран жив и успешно развивается.

Информация для «продвинутых молодых» программистов: версия Фортран-4 отличается от Фортрана версии 2008 так же, как отличается ВАЗ-«Копейка» от Mercedes.
 В настоящее время существует несколько компиляторов языка Фортран. Наиболее известный платный компилятор - Intel Fortran Composer XE. Он реализован для трех наиболее известных ОС (Windows, Linux и MacOS). Однако удобнее (и дешевле) воспользоваться бесплатным компилятором Фортрана из коллекции компиляторов GCC - gFortran компилятором. Этот компилятор также работает в ОС Windows, Linux и MacOS. Если вы установили Anes, то «усеченная» версия 4.7 компилятора gFortran установлена  в каталог gfor-rt каталога anes20xe. Но для «серьезной» работы лучше всего установить полный комплекс программ, необходимый для работы с GNU Фортран.

Для этого можно воспользоваться следующими ссылками:

  • Прекрасный документ о том, как работать с современным Фортраном    «Ten minutes to setup Modern Fortran 2003-2008 on Windows», написан Mohammad Rahmani.
  • Сайт Darius Markauskas, посвященный использованию IDE Code::Blocks для работы с Фортраном  - cbfortran.sourceforge.net. Автор разработал плагин для работы с Фортраном в IDE Code::Blocks. Начиная с версии C::B 13.12 этот плагин включен в стандартный дистрибутив, который можно скачать с официального сайта IDE Code::Blocks.
  • Сайт GNU компилятора Фортрана gFortran.
  • Фортран WIKI - Все о современном Фортране
  • Если вам не жалко потратить $59, то все современные продукты, связанные с gFortran (включая последнюю версию компилятора), вы можете купить на сайте
  • Прекрасное описание Фортран-2008 Ильи Чернова.  

Для работы с примерами, приведенными ниже, вы можете скачать gFortran версии 4.9 (для 64-разрядной версии Windows) с нашего сайта по этой ссылке. Нужно распаковать архив в произвольный каталог. В примерах используется каталог: c:\myCompiler\gfortran-4.9-64.

Утилита adepf90

Для работы с большими проектами на Фортране удобно использовать IDE Code::Blocks (смотрите документ Мохаммеда Рахмани), которая прекрасно работает и в Windows и в Linux. Однако при работе в режиме командной строки или при подготовке дистрибутивов удобнее использовать пакетный режим сборки проекта. В этом случае идеальным инструментом является утилита make. Существует много версий этой утилиты, в коде Anes используется утилита GNU make, которая входит в пакет GCC (Описание GNU make). Идея работы утилиты достаточно простая. В текстовом файле с именем makefile (описания команд утилиты) содержится набор «правил», которые вызывают нужные консольные программы (например, компиляции) при выполнении определенных условий (например, если файл с исходным кодом новее его объектного файла).

При работе с современным Фортраном, в котором основой связи между подпрограммами являются объекты типа Module, возникают проблемы с автоматизацией связей файлов Фортрана с файлами, содержащими операторы Module. В Интернете можно найти средства для решения этой проблемы. Но они основаны на использовании скриптов, написанных на языках Phyton, Perl и Php. Это не всегда удобно, поскольку необходимо установить соответствующие интерпретаторы. Для работы кода Anes была разработана утилита adepf90, написанная на Фортране-90. Заметим, что утилита работает в двух ОС: Windows и Linux. Поскольку она предназначена для работы «внутри» кода Anes, то для определения ОС используется переменная окружения ANESOS.   

Идея утилиты следующая. В файле makefile для обработки фортрановских файлов используется правило «стандартного» типа:


.f90.o:
    $(for) $(for_opt)  $<


которое вызывает компилятор Фортрана (макропеременная $(for)) c ключами $(for_opt) для компиляции всех файлов с расширением *.f90, время редактирования которых позднее, чем их  объектные файлы.
Утилита adepf90 анализирует все файлы каталога с исходными файлами Фортрана. Для файлов, содержащих операторы  USE и MODULE, создаются дополнительные правила следующей структуры. Пусть файл aSolver.f90 содержит оператор USE модуля из файла aData.f90. В этом случае будет сгенерированы два правила:


$(mod_dir)/adata.mod :  $(src_dir)/adata.f90 $(obj_dir)/adata.o
    @echo Check MOD file: aData

$(obj_dir)/aSolver.o :  $(src_dir)/aSolver.f90 \
        $(mod_dir)/adata.mod
    -@$(for) $(for_opt) "$<"


Эти правила «перекроют» правила по умолчанию и будут поддерживать правильные связи между файлами. Все правила помещаются в текстовый файл с именем set.adep. Этот файл нужно просто с помощью оператора include включить в файл makefile.

Вызов утилиты:

    adepf90  -sd:<src_dir> [-df:<depFile>] [-c:"<CompileCommand>"] [-o:obj] [-m:mod] [-pd:/]'

где
-sd:     - ключ определяет каталог с исходными файлами,
-df:     - имя файл с выходными правилами утилиты (по умолчанию set.adep),
-с:       - команда выполнения «правила» (по умолчанию: -@$(for) $(for_opt) "$<"),
             если указан ключ "-@c:", то указывается имя файла с командами
             выполнения правила,
-o:         - расширение объектного файла (по умолчанию "obj"),
-m:     - расширение MOD-файла (по умолчанию "mod"),
-pd:     - разделитель имен в путях (по умолчанию для Windows - "\",
             для Linux - "\").
 

Скачать утилиту можно по ссылке

Использование классов Фортрана

Начиная со стандарта Фортран-95 в языке появились объекты типа классов. Начиная с версии 4.9 gFortran, все возможности классов (включая полный полиморфизм) реализованы полностью.

Классы широко используются в коде Anes. В качестве примера прилагается класс TARList, который работает с одномерными действительными массивами произвольного размера. В коде Anes эти массивы используются для хранения параметров частиц LDP-модели.

Скачать файл

Вызов LUA-скрипта из программы на Фортране

При разработке «универсальных» научных приложений возникает проблема интерфейса пользователя - необходимость добавления произвольных алгоритмов пользователя для  вычисления параметров прикладной задачи. В принципе есть два пути:

  • пользователь пишет свои подпрограммы на языке программирования приложения и приложение «собирается» заново (или пользователь создает динамическую библиотеку, которая загружается приложением),
  • в приложении реализуется «интерпретатор» формул и дается возможность пользователю описывать свои алгоритмы в виде формул.

В большинстве универсальных CFD кодов реализованы обе возможности. В коде Anes также реализованы обе возможности. Первая возможность реализована через виртуальные функции, интерпретатор формул - через подсистему myFORM.

Подсистема myFORM реализована с помощью эффективной виртуальной стековой машины (автор - бывший аспирант кафедры «Физика-2» МЭИ Дмитрий Ефременко, сейчас - сотрудник Германского аэрокосмического центра DLR). Но в процессе экспериментов была разработана модель организации myFORM с помощью скриптового языка Lua (www.lua.org), которая продемонстрировала свою практическую эффективность.

Ниже прилагаются файлы для реализации интерфейса между Фортраном и Lua и два примера: тестирование эффективности скиптов на языке Lua и утилиту для создания осесимметричных STL-файлов.

Скачать файл

CFD на планшете с Андроид

Сейчас очень модны Планшеты и Смартфоны. Они работают на операционной системе Андроид (говорить про серию «Ай» я не могу, не использовал). ОС Андроид имеет несколько интересных особенностей:

  • ОС представляет собой ядро Linux, над которым создана надстройка в виде виртуальной машины Java. При этом уровень Linux фактически «закрыт» для пользователя отсутствием доступа к root-правам.
  • Но поскольку диалоговые программы Андроид должны как-то взаимодействовать с файлами Linux, то разработчики Android дали возможность программам делать все, что они хотят, но в пределах своих каталогов в специальном каталоге /data/data.

В связи с этим появились приложения Андроид, которые фактически «портируют» gnu-компиляторы (gcc, tс, freePascal, Java и т. д.) из Linux в Андроид. Для запуска этих компиляторов разработчики пишут «простенькие» оболочки, главная задача которых запустить программы в обычной консоли Linux «внутри» своей оболочки (и внутри своих каталогов).
Наиболее удачное приложение – это CCTools. Оно наряду с компилятором gcc реализует компилятор фортрана gFortran 4.8 и интерпретатор языка LUA – интерпретатор LuaJIT. Для работы приложение содержит простенький редактор и Linux-терминал для выполнения. В рамках этого приложения можно собирать с помощью утилиты make проекты и выполнять их в собственной консоли приложения.

Недавно в Андроид была реализована идея, которая позволяет фактически реализовать CFD коды (например, Anes) в Андроид. Автор этой идеи - Kevin Boone (сайт KBOX2), использовал идеологию Cygwin. Cygwin – это порт Linux для работы в операционной системе Windows. Cygwin создает в рамках файловой системы Windows виртуальную файловую систему Linux, но как обычный каталог Windows.

Суть идеи Кевина заключается в следующем. Все «программы в рамках Андроида» имеют полный доступ (читать, писать и выполнять) к своему каталогу, расположенному в

/data/data/<имя приложения>

Остальные каталоги (кроме каталогов на sdcard) могут только читать, при этом к каталогам /data доступ отсутствует.
Кевин, используя любую терминальную программу (например, Android Terminal Emulator), создает в рамках ее «родного» каталога виртуальную систему каталогов Linux. Для работы с этими каталогами нужно запустить специальный скрипт kbox_shell в терминале и все ОК. Мы получаем полный набор каталогов Linux (bin, etc, usr …) к которым имеется полный доступ.

Самое главное:

  • мы можем в терминале выполнить любую консольную программу Linux, скомпилированную под ARM-архитектуру.
  • мы имеем полный доступ ко всем системным каталогам виртуальной Linux.
  • и при этом мы имеем доступ чтение-запись к файлам на sdcard.

Кевин подготовил пакет с набором консольных утилит Linux – busybox, который позволяет в консоли выполнить любую консольную команду Linux. Другие разработчики портировали некоторые приложения. Я тоже подготовил «портацию» следующих продуктов в систему kbox :

  • файлового коммандера mc.
  • утилиты make.
  • компилятор языка C - gcc 4.7.
  • компилятор Фортрана gfortran 4.7 и интерпретатор LUA - luaJIT .
  • средства Anes для работы с проектами Фортрана.

Всего этого уже достаточно для компиляции Anes на Анроиде и выполнения расчетов. Следует отметить одну особенность. Проекты пользователя могут располагаться на sdcard, что позволяет использовать для просмотра и редактирования все средства Android, например, прекрасный текстовый редактор DroidEdit . В этом режиме только исполняемый модуль будет записываться в виртуальную файловую систему Linux (иначе его нельзя выполнить), все остальные файлы будут с полным доступом храниться на карте.

Возникает только один вопрос – как анализировать результаты расчетов? Здесь есть пока два приложения: приложение для просмотра vtk-файлов – KiwiViewer  и приложение DroidPlot, реализующее утилиту gnuplot и примитивную утилиту просмотра.   

В настоящее время для проверки работы с kbox реализована подсистема для проведения расчетов с простыми проектами на Фортране. Пользователь может работать с проектом на Фортране, состоящим из любого числа файлов. В качестве примера прилагается проект diffusion – решение двумерной задачи теплопроводности методом структурного МКО (с выводом результатов расчета в vtk-файл).

Если у кого-то возникнет интерес - пишите на электронную почту. Я выложу здесь ссылки на необходимые файлы (они достаточно объемные).