Что такое spice модель
Компьютерное моделирование электрических схем
Компьютеры могут быть мощным инструментом при правильном использовании, особенно в области науки и техники. Существует программное обеспечение для моделирования электрических схем, и эти программы могут быть очень полезны, помогая разработчикам проверять идеи перед сборкой реальных схем, экономя много времени и денег.
Эти же программы могут быть фантастическими помощниками для начинающих студентов-электронщиков, позволяя быстро и легко исследовать идеи без необходимости сборки реальных схем. Конечно, ничто не заменит сборку и тестирование реальных схем, но компьютерное моделирование определенно помогает в процессе обучения, позволяя студенту экспериментировать с изменениями значений и видеть их влияние на схему. В этой книге я буду часто использовать распечатки схем моделирования, чтобы проиллюстрировать важные концепции. Наблюдая за результатами компьютерного моделирования, учащийся может получить интуитивное представление о поведении схемы без пугающего абстрактного математического анализа.
Моделирование схем с помощью SPICE
Чтобы смоделировать схемы на компьютере, я использую специальную программу под названием SPICE, которая работает, описывая схему для компьютера с помощью текстового списка. По сути, этот список сам по себе является своего рода компьютерной программой и должен соответствовать синтаксическим правилам языка SPICE. Затем компьютер используется для обработки или «запуска» программы SPICE, которая интерпретирует текстовый список, описывающий схему, и выводит результаты его подробного математического анализа, также в текстовой форме. Если кому-то нужна дополнительная информация, то многие детали использования SPICE описаны в томе 5 «Справочная информация» этой серии книг. Здесь я просто представлю основные концепции, а затем мы применим SPICE для анализа этих простых схем, о которых читали.
Во-первых, нам нужно установить SPICE на нашем компьютере. Как бесплатная программа, она обычно доступна для загрузки в Интернете в форматах, подходящих для многих различных операционных систем. В этой книге я использую одну из более ранних версий SPICE (версию 2G6) из-за простоты использования. Далее нам понадобится схема для анализа SPICE. Давайте попробуем одну из схем, показанных ранее в данной главе. Вот эта принципиальная схема:
Рисунок 1 – Принципиальная схема
Эта простая схема состоит из батареи и резистора, соединенных напрямую вместе. Нам известно напряжение батареи (10 В) и сопротивление резистора (5 Ом), но больше ничего неизвестно о схеме. Если мы опишем эту схему для SPICE, она сможет сказать нам (по крайней мере), какой ток у нас будет в цепи, используя закон Ома (I=E/R).
SPICE – это программа, использующая текст
SPICE не может напрямую понять диаграмму схемы или любую другую форму графического описания. SPICE – это компьютерная программа, использующая текст, которая требует, чтобы схема была описана относительно ее составляющих компонентов и точек соединений. Каждая уникальная точка соединения в цепи описывается для SPICE номером «узла». Точки, которые являются электрически общими друг для друга в моделируемой цепи, обозначаются одним номером. Возможно, будет полезно думать об этих числах как о номерах «проводов», а не как о номерах «узлов», следуя определению, данному в предыдущем разделе. Так компьютер узнает, что с чем связано: через общие номера проводов или узлов. В схеме из нашего примера есть только два «узла»: верхний провод и нижний провод. SPICE требует, чтобы где-то в цепи был узел 0, поэтому мы обозначим наши провода 0 и 1:
Рисунок 2 – Обозначение узлов на схеме
На приведенной выше иллюстрации я показал несколько меток «1» и «0» вокруг каждого провода, чтобы подчеркнуть концепцию общих точек, имеющих общие номера узлов; но всё же это графическое изображение, а не текстовое описание. Прежде чем можно будет продолжить анализ, SPICE должен получить значения компонентов и номера узлов в текстовой форме.
Использование текстового редактора для создания файлов SPICE
Создание текстового файла на компьютере включает использование программы, называемой текстовым редактором. В текстовых редакторах отсутствует возможность форматирования текстовых процессоров (без курсивных, полужирных или подчеркнутых символов), и это хорошо, поскольку такие программы, как SPICE, не знают, что делать с этой дополнительной информацией. Если мы хотим создать простой текстовый файл, в котором абсолютно ничего не записано, кроме символов клавиатуры, мы выбираем, текстовый редактор.
При использовании операционной системы Microsoft, такой как DOS или Windows, с системой идут несколько текстовых редакторов. В DOS есть старая программа редактирования текста Edit, которую можно вызвать, набрав edit в командной строке. В Windows стандартным выбором будет текстовый редактор Notepad. Доступно множество и других программ для редактирования текста. Я использую бесплатный текстовый редактор под названием Vim и запускаю его в операционных системах Windows 95 и Linux. Неважно, какой редактор вы используете, поэтому не беспокойтесь, если скриншоты в этом разделе не похожи на ваши; здесь важна информация о том, что вы вводите, а не о том, какой редактор вы используете.
Примечание: возможно, вам будет удобно использовать редактор Notepad++, для которого есть плагин для подсветки синтаксиса SPICE.
Чтобы описать для SPICE эту простую схему из двух компонентов, я начну с вызова моей программы текстового редактора и ввода строки «названия» для схемы:
Рисунок 3 – Текстовый редактор. Название схемы
Мы можем описать батарею, набрав строку текста, начинающуюся с буквы «v» (означает «voltage source», источник напряжения), указав, к какому проводу подключается каждая клемма батареи (номера узлов), и напряжение батареи, например:
Рисунок 4 – Текстовый редактор. Описание батареи на схеме
Данная строка сообщает SPICE, что у нас есть источник напряжения, подключенный между узлами 1 и 0, являющийся источником постоянного напряжения (DC), с напряжением 10 вольт. Это всё, что нужно знать компьютеру о батарее.
Теперь обратимся к резистору: SPICE требует, чтобы резисторы были описаны буквой «r», номерами двух узлов (точек соединения) и сопротивлением в омах. Поскольку это компьютерное моделирование, указывать номинальную мощность резистора не нужно. В «виртуальных» компонентах есть одна хорошая черта: им не могут повредить чрезмерное напряжение или ток!
Рисунок 5 – Текстовый редактор. Описание резистора, подключенного между узлами
Теперь SPICE будет знать, что между узлами 1 и 0 подключен резистор со значением 5 Ом. Эта очень короткая строка текста сообщает компьютеру, что у нас есть резистор («r»), подключенный между теми же двумя узлами, что и батарея (1 и 0), со значением сопротивления 5 Ом.
Рисунок 6 – Текстовый редактор. Список соединений (netlist) схемы для SPICE
Перемещение текстовых файлов в SPICE
После того, как мы закончили вводить все необходимые команды SPICE, нам нужно «сохранить» их в файл на жестком диске компьютера, чтобы SPICE мог ссылаться на него при запуске. Поскольку это мой первый список соединений SPICE, я сохраню его под именем « circuit1.cir » (фактическое имя произвольно). Вы можете назвать свой первый список соединений SPICE совершенно другим именем, при условии, что вы не нарушаете никаких правил именования файлов своей операционной системы, например, используя не более 8 + 3 символов (восемь символов в имени и три символа в расширении: 12345678.123) в DOS.
Чтобы вызвать SPICE (указать ему, что необходимо обработать содержимое файла списка соединений circuit1.cir ), мы должны выйти из текстового редактора и получить доступ к командной строке, где мы можем ввести текстовые команды для операционной системы компьютера. Этот «примитивный» способ вызова программы может показаться архаичным пользователям компьютеров, привыкшим к графической среде «укажи и щелкни», но это очень мощный и гибкий способ решения задач. Помните, что то, что вы делаете здесь, используя SPICE, является простой формой компьютерного программирования, и чем больше вы будете привыкать давать компьютеру команды в текстовой форме (в отличие от простого щелчка мышью по иконкам), тем большее мастерство в управлении компьютером вы приобретете.
В командной строке введите следующую команду, а затем нажмите клавишу Enter (в этом примере используется имя файла circuit1.cir ; если вы выбрали другое имя файла для файла списка соединений, замените его):
Вот как это выглядит на моем компьютере (под управлением операционной системы Linux) непосредственно перед нажатием клавиши Enter :
Рисунок 7 – Запуск SPICE
Как только вы нажмете клавишу Enter для выполнения этой команды, на экране компьютера должен будет напечататься текст из вывода SPICE. Ниже приведен скриншот, показывающий, что SPICE вывел на моем компьютере (я увеличил окно «терминала», чтобы показать вам полный текст; в терминале обычного размера текст легко превышает длину одной страницы):
Рисунок 8 – Вывод SPICE в терминале
Одним из преимуществ использования «примитивной», использующей текст программы, такой как SPICE, является то, что текстовые файлы, с которыми мы имеем дело, чрезвычайно малы по сравнению с другими форматами файлов, особенно графическими форматами, используемыми в другом программном обеспечении для моделирования схем. Кроме того, тот факт, что вывод SPICE представляет собой обычный текст, означает, что вы можете направить вывод SPICE в другой текстовый файл, где он может быть обработан. Для этого мы повторно отправляем команду операционной системе компьютера, чтобы запустить SPICE, на этот раз перенаправляя вывод в файл, который я назову « output.txt »:
Рисунок 9 – Запуск SPICE с выводом результатов в текстовый файл
Рисунок 10 – Вывод SPICE в текстовом файле
Теперь я могу свободно редактировать этот файл, удаляя любой посторонний текст (например, «баннеры», показывающие дату и время), оставляя только текст, который, как мне кажется, имеет отношение к анализу моей схемы:
Рисунок 11 – Отредактированный вывод SPICE в текстовом файле
После соответствующего редактирования и повторного сохранения под тем же именем файла (в этом примере output.txt ) текст может быть вставлен в любой документ, причем «простой текст» является универсальным форматом файла почти для всех компьютерных систем. Я даже могу включить его прямо в текст этой книги, вместо графического изображения «скриншота», например:
Кстати, этот формат для вывода текста из моделирования SPICE в этой серии книг является предпочтительным: в виде текста, а не в виде картинок скриншотов.
Изменение значений в SPICE
Чтобы изменить значение компонента в моделировании, нам нужно открыть файл списка соединений ( circuit1.cir ) и внести необходимые изменения в текстовое описание схемы, затем сохранить эти изменения в файле с тем же именем и повторно запустить SPICE через командную строку. Этот процесс редактирования и обработки текстового файла знаком каждому программисту. Одна из причин, по которой мне нравится преподавать SPICE, заключается в том, что он подготавливает студента к тому, чтобы думать и работать как программист, и это хорошо, потому что программирование – это важная область работы, связанная с передовой электроникой.
Ранее мы исследовали последствия изменения одной из трех переменных в электрической цепи (напряжения, тока или сопротивления), используя закон Ома, чтобы математически предсказать, что произойдет. Теперь давайте попробуем сделать то же самое с помощью SPICE, чтобы он выполнил вычисления за нас.
Если бы мы утроили напряжение в схеме из нашего последнего примера с 10 до 30 вольт и оставили сопротивление цепи неизменным, мы бы ожидали, что ток также утроится. Давайте попробуем выполнить это, изменив имя нашего файла списка соединений, чтобы не перезаписывать первый файл. Таким образом, оба варианта моделирования схемы будут храниться на жестком диске нашего компьютера для будущего использования. Результатом работы SPICE для этого измененного списка соединений будет следующий текстовый список:
Как мы и ожидали, ток утроился с увеличением напряжения. Раньше ток составлял 2 ампера, но теперь он увеличился до 6 ампер (-6,000 x 10 0 ). Также обратите внимание, как увеличилась общая рассеиваемая мощность в цепи. Раньше она составлял 20 Вт, а сейчас 180 Вт (1,8 x 10 2 ). Если вспомнить, что мощность пропорциональна квадрату напряжения (закон Джоуля: P=E 2 /R), то этого можно было ожидать. Если мы утроим напряжение в цепи, мощность должна увеличиться в девять раз (3 2 = 9). Результат произведения 9 и 20 действительно равен 180, поэтому выходные данные SPICE действительно коррелируют с тем, что мы знаем о мощности в электрических цепях.
Создание комментариев в SPICE
Команды печати и вывода графиков
В обоих выходных форматах левый столбец чисел представляет напряжение батареи на каждом этапе, и по нему видно, что оно увеличивается от 0 до 100 вольт, по 5 вольт за раз. Числа в правом столбце указывают силу тока в цепи для каждого из этих напряжений. Посмотрите внимательно на эти числа, и вы увидите пропорциональную связь в каждой паре значений: закон Ома (I=E/R) верен в каждом случае, каждое значение силы тока составляет 1/5 соответствующего значения напряжения, потому что сопротивление цепи составляет ровно 5 Ом. Опять же, отрицательные числа для силы тока в данном анализе SPICE – это скорее причуда, чем что-либо еще. Просто обращайте внимание на абсолютное значение каждого числа, если не указано иное.
Программы для интерпретации и преобразования данных SPICE
Существуют даже некоторые программы, способные интерпретировать и преобразовывать неграфические данные, выводимые SPICE, в графические диаграммы. Одна из этих программ называется Nutmeg, и ее выходные данные выглядят примерно так:
Рисунок 12 – Результат преобразования выходных данных SPICE программой Nutmeg
Обратите внимание, как Nutmeg выводит график напряжения на резисторе v(1) (напряжение между узлом 1 и предполагаемой опорной точкой узла 0) в виде линии с положительным наклоном (от нижнего левого к верхнему правому углу). Станете ли вы когда-нибудь опытным в использовании SPICE, не имеет отношения к его применению в данной книге. Важно только то, чтобы вы поняли, что означают числа в отчете, созданном SPICE. В следующих примерах я приложу все усилия, чтобы аннотировать численные результаты SPICE, чтобы устранить любую путаницу и раскрыть всю мощь этого удивительного инструмента, который поможет вам понять поведение электрических цепей.
Программный пакет LTspice
В качестве альтернативы консольному симулятору SPICE можно рассмотреть использование программного обеспечения LTspice от Analog Devices. LTspice представляет собой мощный программный пакет, включающий в себя SPICE-симулятор, редактор принципиальных схем и средство просмотра осциллограмм с улучшениями и моделями, позволяющими упростить моделирование аналоговых схем.
Основы работы с LTspice представлены в следующих статьях:
А ниже показаны скриншоты примера схемы и ее анализа.
Рисунок 13 – Пример схемы в LTspice
Рисунок 14 – Пример анализа схемы в LTspice
Node-SPICE: Моделирование переходных процессов в электрической сети
Всем привет! Сегодня я хочу рассказать об одном своем проекте, который создавался как один из инструментов получения данных для диссертации, и так как на данный момент он свою основную задачу выполнил, я хочу пустить его в GPLv3-плавание — быть может, он будет полезен кому-то еще. Однако перед тем, как отдать швартовы, я решил воспользоваться профилировщиком Intel Vtune Amplifier, чтобы убедиться в том, что мой пакет имитационного моделирования древовидной сети электроснабжения оптимально расходует вычислительные ресурсы компьютера.
Под катом подробности про себя, про проект и про оптимизацию производительности (которую за полчаса удалось повысить более, чем в два раза)
Введение
Последние 6 лет я занимаюсь вопросами энергосбережения и повышения показателей качества электроэнергии на промышленных объектах. В первую очередь, это компенсация реактивной мощности на уровне потребителя электроэнергии, дабы эта самая реактивная мощность не потреблялась из промышленной сети электроснабжения. Параллельно этой задаче стоит задача стабилизации напряжения в узлах нагрузок, непосредственно возле потребителей.
Представьте себе обычный асинхронный электродвигатель. Тысячи их. Выглядят так:
В различных авторитетных и не очень источниках можно найти статистическую информацию о том, что до 70% вырабатываемой электроэнергии потребляется именно асинхронными электродвигателями. Не думаю что реальная цифра далека от этого значения.
Так вот, замечали когда-нибудь, что если дома запускается старый холодильник, свет моргает? Этот эффект — фликер — возникает из-за того, что при пуске электродвигатель потребляет ток в 5-7 раз больше номинального. В самые первые моменты пуска намагничивание статора отсутствует, индуктивное сопротивление минимально и сеть фактически нагружается чисто довольно малым активным сопротивлением обмотки статора. Потом, когда двигатель начинает набирать обороты, статор намагничивается, реактивное сопротивление обмотки статора увеличивается и ток уменьшается.
А теперь представьте себе электрическую сеть предприятия:
Рис. 1 — Магистральные схемы питания электроприемников: а — с распределенными нагрузками; б — с сосредоточенными нагрузками; в — блок трансформатор — магистраль; 1 — распределительный щит подстанции; 2 — распределительный силовой пункт; 3 — электроприемник; 4 — магистраль; 5 — шинная сборка.
Это такая древовидная разветвленная электрическая сеть с множеством электроприемников. В обобщенном виде ее можно нарисовать вот так:
Рис. 2 — Обобщенная структурная схема питания электроприемников.
В схеме на рис. 2 узел Ve является точкой подключения источника питания сети(промышленная сеть переменного тока, судовой генератор, инвертор ветрогенератора и т.п.), в результате чего напряжение узла становится равным Ue. К источнику посредством активно-индуктивной питающей линии с сопротивлением Ze=Re+jLe, подключен распределительный узел V0 с напряжением U0, которое определяется как:
где I_ — ток потребляемый от узла Ve, который равен сумме токов, потребляемых нижестоящими нагрузками:
где N— число нагрузок, запитанных от данного узла. Для схемы на рис. 2 от узла Ve питаются все имеющиеся в системе узлы-нагрузки — V3 — V6. К узлу V1 подключены узлы-нагрузки V3, V4; а к узлу V2 узлы-нагрузки V5, V6 соответственно.
Зачем создавался Node-SPICE
Если какая-то из нагрузок изменяется, изменяется ток во всей цепи до корня, следовательно, изменяется напряжение в корне, а за ним и во всех остальных узлах. И если нам нужно стабилизировать напряжение в нескольких точках цепи, то возникает задача сделать это оптимально, ибо два стабилизатора будут оказывать влияние друг на друга. Чтобы проследить это влияние на множестве вариантов необходимо произвести имитационное моделирование сети.
Схему на рис. 2 Вполне себе можно нарисовать в пакете Matlab Simulink. Но есть одна загвоздка — если схема большая, или этих схем много, то рисовать каждую схему, запускать моделирование, снимать и сохранять результаты моделирования, графики переходных процессов, чертовски муторно, и решил я, что создать свой собственный моделлер будет быстрее (фигушки) и интереснее (а вот тут я был прав).
Для того, чтобы разработка была еще более интересной и полезной, я, суровый Сишник-железячник, в качестве языка разработки решил разобраться уже наконец с C++.
Установка
Исходники представляют собой проект Visual Studio 2013 и выложены на GitHub.
Для сборки приложения необходимо скачать библиотеку линейной алгебры Eigen и указать путь к папке с библиотекой с помощью системной переменной среды $(EIGEN_DIR). Visual Studio должна будет подхватить путь к этой папке и без особых шорохов скомпилировать приложение.
Для вывода и сохранения графиков приложение использует пакет gnuplot с модулем cairo — gnuplot должен уметь сохранять изображения в формате PNG. Проверить это можно выполнив в консоли gnuplot команду set terminal png. Gnuplot не должен ругаться на неверный аргумент — последним грешил gnuplot, идущий в комплекте с octave. Путь к gnuplot должен быть указан в $(PATH).
Архитектура приложения
Приложение должно было состоять из независимых друг от друга модулей(рис 3), но что-то пошло не так:
Рис. 3 — Структурная схема программы
Основными модулями системы являются:
Команда запуска выглядит следующим образом:
Формат конфигурационного файла — текстовый, состоящий из строк вида:
где a,b,c,d,e — ключи параметров, часть из которых (a, b) имеют булев тип данных — активную или неактивную опцию или режим. Другая часть, например c, d, e — имеющие текстовое или числовое значение параметра.
Конфигурационный файл, в котором в трехфазному источнику напряжения через анализатор качества подключен электромотор и несимметричная нагрузка выглядит следующим образом:
На рабочем столе Workbench может располагаться любое число элементарных узлов Node, подключенных в древовидной конфигурации.
Каждый узел имеет вход для подключения источника напряжения и выход для питания последующей нагрузки. К выходу одного узла может быть входами подключено несколько дочерних узлов. Родительский узел устанавливает напряжение на клеммах дочернего узла и запрашивает потребляемый им ток. Если у дочернего узла есть свои дочерние узлы, то операция производится рекурсивно. Отличается поведение у узла — источника напряжения, который в системе единственный. После этапа моделирования источнику предоставляется информация об общем потребляемом токе и возвращается информация о текущем значении напряжения на выходе источника.
Вне зависимости от своего типа узлы имеют общий интерфейс, позволяющий создавать различные конфигурации оборудования. Добавление элементарного узла осуществляется с помощью команды load.
Общий вид команды load:
Существуют следующие общие для всех узлов ключи конфигурации:
Ключ | Значение по умолчанию | Описание |
-name | noname | Уникальное имя узла. В системе не может быть несколько узлов с одинаковыми именами. |
-wb | None | Имя рабочего стола, на котором расположен электроприемник. По умолчанию узел располагается на последнем объявленном рабочем столе |
-On | 0 | Время подключения элементарного узла. Время задается в секундах. Значение по умолчанию: «0» |
-Off | Равно общему времени моделирования | Время отключения элементарного узла. Задается в секундах. Можно отключить источник напряжения. |
-t | Без типа | Тип узла (рассмотрен ниже). |
-Imax | 0(без ограничений) | Ток срабатывания максимально-токовой защиты. |
-width | 800 | Ширина графиков |
-heigth | 600 | Высота графиков |
-font | Arial,10 | Шрифт текста на графиках |
-raw | Сохранение файла сырых данных графика |
Реализованые типы элементарных узлов Node:
Предполагается, что каждый рабочий стол представляет собой некую схему и должна существовать возможность создавать вложенные схемы, т. е. вложенные рабочие столы. Эта возможность заложена в тестовой версии программы(но, естественно, не реализована :)). Уникальные ключи для рабочего стола отсутствуют. Так как может существовать несколько рабочих столов, после введения второго и более рабочего стола для узлов следует указывать, к какому рабочему столу они относятся. Если ключ -wb не указать, то элементарный узел будет размещен на последнем созданном рабочем столе.
В текущей версии программного комплекса может быть только один источник напряжения, что несколько ограничивает возможности программы, но является достаточным для моей задачи.
Есть у меня мыслишки взять все и переписать, используя комплексное исчисление, любое число источников и приемников электроэнергии любой конфигурации, но я слезно умоляю себя если и садиться за это, то ПОСЛЕ защиты диссертации. Пока держусь.
На рисунке 5 показан процесс моделирования источника напряжения без нагрузки:
Рис. 5 — Графики тока и напряжения источника напряжения, работающего в режиме холостого хода
Анализатор качества потребления включается в любой участок системы и анализирует различные параметры потребления. Данный узел отвечает за построение графиков.
После проведения имитационного моделирования данный узел с помощью модуля Plot выводит требуемые графики и сохраняет их на диске в виде изображений.
Данный элементарный узел реализует математическую модель асинхронного электродвигателя.
Ключ | Значение по умолчанию | Описание |
-Rs | 0 | Сопротивление обмотки статора |
-Rr | 0 | Сопротивление обмотки ротора |
-Ls | 0 | Индуктивность обмотки статора |
-Lr | 0 | Индуктивность обмотки ротора |
-Lm | 0 | Индуктивность рассеяния |
-J <> | 0 | Момент инерции ротора |
-p <> | 0 | Число полюсов обмотки статора |
-Ms | 0 | Статический момент на валу |
-Tload | 0 | Время наброса нагрузки |
-saveGraph | None | Активация построения графиков момента на валу и частоты вращения привода |
На рисунке 6 показан процесс пуска асинхронного электродвигателя. В момент времени 1 с. к валу прикладывается момент 700 Н*м и двигатель переходит в рабочий режим.
Рис. 6 — Графики частоты вращения вала двигателя, а также момента на валу и статического момента при пуске двигателя
Данный элементарный узел представляет собой параллельное соединение активного сопротивления, индуктивности и емкости. В зависимости от параметров позволяет производить моделирование следующих штатных и нештатных режимов воздействия на источник напряжения: одно- и двухфазная нагрузка, несимметричная нагрузка, короткое замыкание по фазе краткое и длительное по времени, короткое замыкание на землю по всем фазам, краткое и длительное во времени.
Ключ | Значение по умолчанию | Описание |
-Ra <Ом> -Rb <Ом> -Rc | 0(отключен) | Сопротивление резистора в фазе |
-R | 0(отключен) | Сопротивление резистора во всех фазах |
-La <Гн> -Lb <Гн> -Lc | 0(отключен) | Индуктивность дросселя в фазе |
-L | 0(отключен) | Индуктивность дросселя во всех фазах |
-Ca <мкФ> -Cb <мкФ> -Cc | 0(отключен) | Емкость конденсатора в фазе |
-C | 0(отключен) | Емкость конденсатора во всех фазах |
Моделируем кратковременное КЗ в сети:
КЗ 0,1 с. Скорость не успевает упасть ниже критической, двигатель восстанавливает скорость после снятия КЗ.
КЗ 0,5 с, двигатель успевает затормозиться и после включения момент двигателя становится меньше момента на валу и происходит аварийный останов двигателя
Замыкание в Фазе А. Скорость практически не проседает, из-за особенностей работы асинхронного электродвигателя ему достаточно двух фаз. Вращающееся магнитное поле в зазоре принимает овальную форму и вал начинает вибрировать с частотой питающей сети.
Оптимизация кода
Вообще, как оказалось в результате, сам основной процесс моделирования написан достаточно аккуратно и по результатам моделирования каких-либо архитектурных изменений сделано не было. Но дьявол кроется в деталях.
Открываем Intel Vtune Amplifier, создаем новый проект:
Указываем путь к нашей программе и ключи запуска. Неплохо будет воспользоваться кнопками Binary/Symbol Search и Source Search и указать пути к исходному коду и бинарникам с Debud-символами – потом будет удобнее перемещаться по проекту и исходному коду.
Используем следующий конфиг:
Все приведенные конфиг-файлы есть в папке /doc проекта.
Начнем с самого простого basic hotspot с интервалом 1ms
И запускаем.
Elapsed Time: | 52.548s |
CPU Time: | 37.460s |
Total Thread Count: | 1,035 |
Top Hotspots:
Святые нейтроны… Я конечно знал что iostream работает медленно, но чтобы настолько… Это, кстати, с отключением синхронизации с
20 секунд процессорного времени из общих 35 секунд. Больше 50% времени. Это не лезет ни в какие ворота.
Больше о том, насколько медленны потоки можно прочитать здесь. Имеет смысл переписать все на бронепаровозный fprintf(). Еще меня заинтересовало что в таблице функция cout фигурирует дважды. И точно — прослойка для gnuplot создает временные файлы, а потом удаляет их. Добавим ключик -raw к node для сохранения сырых файлов графиков. Есть ключи — сохранил, нет, не сохранил.
Запускаем профилировщик. Ха!
Elapsed Time: | 22.421s |
CPU Time: | 17.107s |
Total Thread Count: | 1,035 |
Top Hotspots:
В лидерах по-прежнему файловый вывод, но потребляющий уже меньше 5% процессорного времени. Серьезный успех! Смотрим Bottom-Up three
Второе и третье место занимают указатели и итераторы:
И что весьма логично — места достаются анализатору качества электроэнергии, ибо последний делает кучу всякой работы.
Данный код писался как проверка концепции скользящего режима измерений. Как видно из кода, каждый новый шаг солвера сопряжен со сдвигом небольшого (64-128 символов), но все же массива. Имеет смысл воспользоваться кольцевым буфером для решения данной задачи. Тогда операция добавления нового элемента будет иметь стоимость О(1) вместо О(N).
«Зачем это надо?» скажете вы, мол, анализатор качества один в системе, моторов лучше добавь в конфиг. И окажетесь наполовину правы — моторы мы обязательно добавим, вот только анализаторов в системе может быть ровно столько сколько в системе узлов — это фишка моей диссертации такая.
Глянем заодно что там такого с GetVoltage и GetCurrent нехорошего:
Хм, как насчет воспользоваться ссылками?
Elapsed Time: | 23.197s |
CPU Time: | 16.551s |
Total Thread Count: | 1,048 |
Top Hotspots:
Bottom-Up three показывает, что первый в списке опять таки наш fprintf и pango, вылезающий из-под gnuplot – в них лезть уже не будем (хотя стоило бы).
А что действительно радует, так это то что NewStep, от которого пара шагов до Solve вырвался в лидеры. Запустим моделирование на 40 секунд и посмотрим как изменится картина:
Elapsed Time: | 73.235s |
CPU Time: | 61.790s |
Total Thread Count: | 1,048 |
Эффект масштабируется, так что здесь нам пока делать нечего.
Подведем итог
Было | Стало | Эффект | |
CPU Time: | 37.460s | 16.551s | 226% |
Неплохо для получаса работы?
Добавим в систему пяток моторов:
Из Bottom-Up three мало что уже понятно:
Вот если заглянуть в Caller counter то можно увидеть куда деваются ресурсы. На решение матричных уравнений при расчете мат. модели электродвигателя — большую часть времени работает библиотека Eigen.
В библиотеку мы не полезем, лучше заменим моторы на rl-нагрузки. Они для меня намного важнее — можно создавать всякие разные перекосы фаз, КЗ, возмущения и прочие радости.
Так как на один тик толком считать ничего не надо, увеличим частоту тактирования солвера, да и нагрузок доведем до 10 штук.
Elapsed Time: | 11.008s |
CPU Time: | 6.485s |
Total Thread Count: | 1.245 |
Fprintf мы не трогаем, а вот основной виновник:
Здесь мы копируем векторы double[4] друг в друга. Как видно, копирование вектора средствами самого вектора не очень оптимально. Забабахаем-ка мы цикл — для 4-х элементов особо изгаляться не стоит:
И последний раз
Elapsed Time: | 9.563s |
CPU Time: | 6.386s |
Total Thread Count: | 1.245 |
Выводы:
А нету их. Я решил для себя, что негоже в OpenSource выкладывать тормозные приложения и посидел немножко с удобным и мощным инструментом профилирования. В отличие от расстановки таймстампов внутри кода, Vtune, что называется, «мордой тычет» в медленный код, намекая на то, что неплохо бы тот или иной кусок переписать.
Мое приложение, на самом деле, можно бесконечно оптимизировать — ибо костыль на костыле. Можно выкинуть Eigen и переписать Acmotor используя Boost, можно на том же Boost написать вывод графиков, можно переписать кучу мест используя векторные инструкции(здесь кстати будет кстати профилировщик Intel Advisor), переписать программу используя многопоточность(TBB, OpenMP, OpenCL) и т.д.
Кстати вот здесь можно получить бесплатную версию Intel parallel Studio для студенческих и обучающих нужд.