Учебник Fortran для начинающих
Fortran — старейший из живых языков программирования и одновременно главный рабочий инструмент вычислительной науки: на нём считают погоду, моделируют ядерные реакторы, рассчитывают аэродинамику и крутят суперкомпьютеры из списка TOP500. Этот курс — не музейная экскурсия, а введение в современный Fortran (стандарты 2008 и 2018): вы научитесь думать массивами, понимать модель точности через параметр KIND, писать чистые процедуры и использовать конструкции, ради которых физики и инженеры выбирают именно этот язык.
Первая половина курса закладывает прочный фундамент: история и ниши языка, базовые типы и выражения, управление потоком, массивы как сердце Fortran и процедуры. Каждый урок — обстоятельный разбор с примерами кода, объяснением «почему так устроено» и разбором типичных ошибок. Курс рассчитан на тех, кто уже немного программировал и хочет освоить инструмент серьёзных численных расчётов.
Курс «Fortran: научные и инженерные вычисления» состоит из 10 разделов и 40 уроков: Что такое Fortran и почему он жив, Основы: программа, переменные, типы, Управление потоком, Массивы — сердце Fortran, Процедуры, Модули и интерфейсы, Производные типы и ООП, Ввод-вывод и файлы, Численные вычисления и производительность и Параллелизм и современный Fortran. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Что такое Fortran и почему он жив
- Что такое Fortran и почему он жив
История Fortran от 1957 до стандарта 2018, его ниши в HPC и науке, и почему старейший язык до сих пор актуален.
- Синтаксис: формат, комментарии, структура программы
Свободный формат Fortran, комментарии, продолжение строк амперсандом и каркас программной единицы.
- Компиляторы, флаги и сборка проекта
Компиляторы gfortran и ifx, важные флаги, многофайловая сборка через модули и инструменты make, CMake, fpm.
- Fortran среди других языков и связь с C
Честное сравнение Fortran с C++, Python и Julia, его сильные и слабые стороны и связывание с C через iso_c_binding.
- Что такое Fortran и почему он жив
2 Основы: программа, переменные, типы
- Переменные и пять встроенных типов
Пять встроенных типов Fortran (integer, real, complex, logical, character), объявление переменных и обязательный implicit none.
- Параметр KIND и точность вычислений
Как KIND управляет точностью и диапазоном чисел, переносимый запрос двойной точности и почему нельзя сравнивать real на равенство.
- Константы и литералы
Именованные константы через parameter, целые/вещественные/комплексные/логические и символьные литералы в Fortran.
- Выражения, преобразование типов и операторы
Арифметика Fortran: приоритет операторов, ловушка целочисленного деления, преобразование типов и логические выражения.
- Переменные и пять встроенных типов
3 Управление потоком
- Условный оператор if/else if/else
Блочный и однострочный if, цепочки else if, именованные конструкции и почему в Fortran нет гарантии короткого замыкания.
- Множественный выбор: select case
Конструкция select case со списками и диапазонами значений, отличие от switch в C и таблица переходов под капотом.
- Счётный цикл do
Счётный цикл do: шаг, обратный отсчёт, вложенность, тонкости управляющей переменной и числа итераций.
- do while, exit, cycle и do concurrent
Условный цикл do while, бесконечный do, управление потоком через exit/cycle с именами и параллельный do concurrent.
- Условный оператор if/else if/else
4 Массивы — сердце Fortran
- Объявление массивов, ранг и форма
Объявление массивов в Fortran, произвольные границы индексов, ранг, форма и размер, запросные функции и конструкторы.
- Операции над массивами целиком
Поэлементная арифметика, broadcasting скаляров, элементные функции и редукции (sum, dot_product, matmul) без явных циклов.
- Секции, шаги и условный where
Секции массивов через триплет low:high:stride, вырезание строк и столбцов матриц, условное присваивание where/elsewhere.
- Динамическая память и хранение по столбцам
Allocatable-массивы, безопасное выделение, автоперевыделение и критичное для скорости хранение по столбцам (column-major).
- Объявление массивов, ранг и форма
5 Процедуры
- subroutine и function
Два вида процедур Fortran: subroutine для действий и function для вычислений, раздел contains и явный интерфейс.
- Аргументы и intent
Передача аргументов по ссылке и атрибут intent (in/out/inout) как контракт, защищающий данные и помогающий компилятору.
- Рекурсия, optional-аргументы и save
Рекурсивные процедуры, необязательные и именованные аргументы с present, атрибут save и его ловушка неявной инициализации.
- Чистые и элементные процедуры
Атрибуты pure и elemental: процедуры без побочных эффектов, поэлементное применение к массивам и безопасный параллелизм.
- subroutine и function
6 Модули и интерфейсы
- Модули: module, use и контроль доступа
Что такое модуль в Fortran, зачем он нужен, как работают use, only, rename, public и private, и почему модули вытеснили COMMON-блоки и include-файлы.
- Явные интерфейсы: почему компилятор должен видеть сигнатуру
Явный и неявный интерфейс процедуры в Fortran, блок interface для внешних процедур, и почему ассумированные массивы и intent требуют явного интерфейса.
- Generic-интерфейсы и перегрузка операторов
Generic-интерфейсы Fortran: одно имя для процедур с разными типами, перегрузка операторов через interface operator и присваивания через interface assignment.
- Submodules: разделение спецификации и реализации
Submodules в Fortran 2008: разделение интерфейса (module) и реализации (submodule) для ускорения сборки, разрыва циклов и сокрытия деталей.
- Модули: module, use и контроль доступа
7 Производные типы и ООП
- Производные типы и связанные процедуры
Производные типы Fortran: объявление type, компоненты, конструкторы, и type-bound procedures с передаваемым аргументом pass для методов объекта.
- Наследование через extends
Наследование в Fortran: расширение типа через extends, добавление компонентов и методов, доступ к родителю и переопределение связанных процедур.
- Полиморфизм: class, select type и динамическая диспетчеризация
Полиморфизм в Fortran: переменные class, динамический выбор метода, конструкция select type, allocate с полиморфными объектами и контейнеры разнородных типов.
- Абстрактные типы, deferred и финализация
Абстрактные производные типы в Fortran: abstract, deferred-процедуры и abstract interface, паттерн интерфейс плюс реализации, и финализаторы final.
- Производные типы и связанные процедуры
8 Ввод-вывод и файлы
- Форматный ввод-вывод и дескрипторы формата
Форматный вывод в Fortran: оператор format и строки формата, дескрипторы I, F, E, ES, A, X, и управление шириной, точностью и выравниванием чисел.
- Списочный ввод-вывод и namelist
Списочный ввод-вывод Fortran (print star) и namelist: удобный вывод без формата, чтение свободных данных и группы namelist для конфигурационных файлов.
- Неформатный и потоковый (stream) доступ
Неформатный (binary) и потоковый stream-ввод-вывод в Fortran: запись чисел без потери точности, record-маркеры sequential против stream access и совместимость с C.
- open, close и обработка ошибок через iostat
Управление файлами в Fortran: open с newunit, спецификаторы status и action, close, и надёжная обработка ошибок ввода-вывода через iostat, iomsg и end/err.
- Форматный ввод-вывод и дескрипторы формата
9 Численные вычисления и производительность
- Intrinsic-функции и управление точностью
Встроенные функции Fortran для массивов (sum, maxval, pack) и точность вычислений: параметр kind, selected_real_kind, одинарная и двойная точность, epsilon.
- Матрицы, matmul, dot_product и BLAS/LAPACK
Линейная алгебра в Fortran: операции с массивами, matmul и dot_product, транспонирование, и когда переходить на библиотеки BLAS и LAPACK для больших систем.
- Кэш и порядок по столбцам: как устроена скорость
Производительность Fortran и память: column-major порядок хранения массивов, локальность данных, иерархия кэша и правильный порядок вложенных циклов.
- Векторизация и оптимизация
Векторизация в Fortran: SIMD-инструкции, как помочь компилятору векторизовать циклы, чистые процедуры, флаги оптимизации и измерение производительности.
- Intrinsic-функции и управление точностью
10 Параллелизм и современный Fortran
- Coarrays: параллелизм, встроенный в язык
Coarrays в Fortran 2008: модель образов (images), синтаксис codimension и квадратных скобок, доступ к данным других образов и синхронизация sync all.
- do concurrent, OpenMP и MPI
Три модели параллелизма Fortran: do concurrent для независимых циклов, OpenMP-директивы для многоядерности с общей памятью и MPI для кластеров с распределённой памятью.
- Интероперабельность с C: iso_c_binding и bind(c)
Связь Fortran и C: модуль iso_c_binding, атрибут bind(c), совместимые типы c_int и c_double, передача массивов и строк, вызов C-функций и c_ptr.
- Экосистема: fpm, stdlib и современный Fortran
Современная экосистема Fortran: пакетный менеджер fpm, стандартная библиотека stdlib, как организован проект, тесты и куда движется язык Fortran 2018/2023.
- Coarrays: параллелизм, встроенный в язык