Ошибка в коде, стоившая целой АЭС

Иногда аварии, чтобы она запомнилась надолго, не надо быть техногенкой с кучей жертв. Именно так случилось в январе 2012 года, когда на калифорнийской АЭС Сан-Онофре произошла утечка радиоактивной воды из первого контура в парогенераторе. Авария неприятная, но она не привела к значимому повышению радиационного фона и если бы не её косвенные последствия, то прошла бы в отчётах МАГАТЭ и NRC (американский атомный регулятор), как незначительное происшествие. Проблема была в том, что устранить её быстро было невозможно, а без парогенератора энергоблок требовалось отправить в простой. И это лишь начало истории.

zqphpi-fbiezlmp7p0xqc5-fom4.jpeg
АЭС Сан-Онофре уютно расположилась на берегу Тихого океана в сейсмически активной Калифорнии

Что такое парогенератор и зачем он нужен? Внутри реактора у нас идёт ядерная реакция с выделением большого количества энергии, которая греет воду и превращает её в пар. Так как пар радиоактивный, то пускать его на турбину небезопасно и требуется промежуточное звено — парогенератор.

pqrjhtlwwsllfy67jgmlmxemgbe.jpeg
Очень упрощённая схема работы АЭС, но на ней присутствует наш герой

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

owqwqrmads7h3zkek2z132zxnvo.jpeg
Собственно, вот вам парогенератор

rekwxxayvzn5npqkps74_qiloug.jpeg
А это тепловые потоки в нём

Если вы видели кипящий чайник, то знаете, что кипящая вода имеет свойство создавать течения, под действием разности температур. Трубки внутри парогенератора на входе и выходе имеют разную температуру за счёт отдачи тепла воде, вода тоже, это приводит к тому, что трубки под действием течений начинают вибрировать и если колебания слишком велики, то может произойти их разрушение. Как раз это и случилось на третьем энергоблоке Сан-Онофре.

vlcfojpn5ruksx2borpe5q1gec0.jpeg
А вот амплитуда вибраций в трубках парогенератора зависимости от скорости потока

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

numfgihckupjy4gu6ds5mun8igy.jpeg
Антивибрационные решётки и теплообменные трубки

В процессе эксплуатации некоторые трубки всё равно выйдут из строя, но не 80 штук разом, как в данном случае. И уж тем более очень странно, когда такая авария происходит в новом, проработавшем меньше года парогенераторе! Проблема заключалась ещё и в том, что в этот момент заканчивали монтаж точно такого же парогенератора на 2 энергоблоке (всего на АЭС было два блока) и через несколько месяцев и на нём будут зафиксированы повышенные вибрации. Всё, вся станция встала, но в чём причина проблемы?

Во время выбора поставщика ещё в далёком 2004 году американцы выбрали японскую «Mitsubishi Heavy Industries» (MHI). Да, у неё не было опыта создания столь больших парогенераторов, как были необходимы, но их продукция хорошо себя зарекомендовала, да и японцы очень хотели закрепиться на рынке США. Осмотр парогенераторов Сан-Онофре специалистами из MHI подтвердил, что понятно, что ничего не понятно. Был зафиксирован повышенный износ вызванный большими, чем ожидалось вибрациями, но причина вибраций была неясна. Владелец АЭС «Southern California Edison Company» (SCE) надеялся, что удастся обойтись малой кровью и всего лишь заменить испортившиеся трубки, после чего пустить блок, но японцы, потупив взор, сказали, что не могут дать гарантии, что это решит проблему. И они были чертовски правы.

Следующие месяцы обе стороны пытались с одной стороны найти причину аварии, с другой придумать план ремонта. Проблема была ровно одна: причину аварии никто пока не понимал. И японцы, и американцы согласились, что именно повышенные вибрации стали разрушили теплообменные трубки, но почему они появились было загадкой. В качестве компенсирующей меры японцы предлагали установку новых антивибрационных решёток, но, во-первых, гарантий того, что это поможет не было, а во-вторых, все предложенные варианты замены трубок и установки новых решёток были признаны рискованными. Кроме того в дело вмешался и американский регулятор NRC, который настаивал, что даже в случае ремонта или замены парогенератора можно будет пустить только один блок и только в экспериментальном режиме с кучей ограничений из-за того, что генезис вибрации так и не был установлен.

xwiyx2mj5inknvtgjbq7jq62e1w.jpeg
Японцы при любом упоминании о возможности замены парогенераторов

Ситуация выходила презабавная. Обе стороны хотели бы провести ремонт, так как это дешевле и быстрее, но не могли, потому что японцы так и не смогли предложить адекватного плана. А даже если ремонт и сделать, то АЭС будет работать долгое время с половинной мощностью. Альтернативой была замена парогенераторов, но это означало как минимум 5–7 лет на изготовление и поставку, всё это время АЭС будет стоять заглушенной. При этом каждый месяц простоя стоил SCE 100 миллионов долларов на покупку мощностей у других производителей для поставок по долгосрочным контрактам. Т.е. лучшего решения не было вообще, поэтому американцы тянули резину и ждали, что японцы родят решение, а японцы, которые в июне 2012 тоже уже поняли, что ничего путного с ремонтом не выйдет, поддерживали игру, так как не хотели влетать на 400 миллионов долларов расходов на новые парогенераторы. Поэтому обе стороны тянули резину, надеясь, что решение все же свалится им на головы. Но не свалилось. В июле 2013 года, подбив счёт, прикинув размер потерь, и посмотрев на недобро глядящего регулятора, в SCE решили, что АЭС надо закрывать, а на «джапов» подать в арбитражный суд за невыполнение контракта.

Стоп. Так причину вибраций не нашли? Нашли, и ещё много чего интересного нашли, но чтобы собрать все факты в общую картину потребовался арбитраж.

Одна ошибка в коде, и ты в пролёте


Ещё в апреле 2012 года (т.е. всего через 3 месяца после аварии) японцы, взявшиеся перепроверять расчёты вибрации, выявили в них ошибку, названную Gap Velocity Error.
Расчётный комплекс на котором японцы обсчитывали новый парогенератор состоял из пяти программ (кодов), каждая из которых была собственной разработкой кампании.

rz3-et055sx7mglqmmrb8vbks-q.jpeg
Цепочка расчётных кодов по которым японцы считали вибрации

Первый из кодов в цепочке расчётов — SSPC (Steam Generator Steady State Performance Calculation Code) считал основные теплогидравлические характеристики парогенераторов.

Результаты расчётов по коду SSPC использовались в качестве исходных данных для следующего кода — FIT-III, который выполнял расчёты скоростей потока и паросодержания в парогенераторе. Результаты расчётов по FIT-III передавались через код «FIT-III Post-processor одновременно в коды — FIVATS и IVHET. Код FIVATS (Flow-Induced Vibration Analysis of Tubular Structures) рассчитывал вибрации, а IVHET (Impact Vibration of Heat Exchanger Tube with Gap Support Code) — виброизнос трубок.

Проблема оказалась в том, что код FIT-III выдавал меньшее значение скорости потока, чем оно было в реальности. Как выяснится в ходе расследования, изначально код был разработан для сетки пучков трубок, расположенных с квадратным шагом, но позже MHI перешли к треугольному шагу, так как он позволял в одном и том же объёме расположить больше теплообменных трубок. Программистам фирмы поставили задачу переделать код под новый шаг сетки и они сделали это, учтя новые геометрические положения трубок.

Но по непонятной причине они забыли поменять точки для которых производился расчёт, и программа вместо расчёта потока в самом узком месте (между двумя любыми расположенными рядом трубками) рассчитывала их в широком зазоре между трубками, как если бы они стояли в решётке с квадратным шагом, что давало скорости потока в 2,3 раза ниже. То есть код программы при в целом верном моделировании процесса просто выдавал на следующий уровень расчетов не ту величину, которая была нужна.

rn46aq7tuedzhwjihubv0mr0hru.jpeg
Трубки парогенератора и набегающий поток: PASME — требуемое для расчёта вибраций значение расстояния между трубками, PFIT-III — значение, выдаваемое программой

А теперь несколько нюансов:

1) Данный код был вовсе не новым и разработан за 20 лет (!) до случая с Сан-Онофре. До этого на нём был рассчитан не один парогенератор с треугольным шагом сетки трубок. Ни один из них не был подвержен преждевременному износу, а потому никто не проводил ревизию кода. Как проводилась верификация переработанного кода, при которой эту ошибку не заметили, осталось загадкой.

2) Ещё в январе 2005 года консультант японцев Пол Ланфорд при анализе результатов расчетов выразил сомнение в адекватности скорости потока и предположил, что его просто забыли умножить на какой-то коэффициент. Японцы по требованию заказчика провели проверку, но ошибок в коде не нашли, а потому вопрос спустили на тормозах, договорившись просто усилить контроль качества. При этом других работников, выражавших сомнения в менеджменте качества, просто увольняли.

3) Американцы в ходе подготовки к арбитражу попытались по имеющемуся набору алгоритмов из Технического описания расчётного комплекса восстановить программный код для подтверждения его работоспособности. Из трёх рассмотренных кодов (FIT-III, SSPC и FIVATS) удалось получить работоспособный прототип только для последнего, а остальные имели ошибки и были крайне плохо задокументированы. При этом даже в ходе арбитража японцы отказались предоставлять полные коды ПО SCE на ревизию, но предоставили их NRC, где сделали вывод, что в кодах содержатся ошибки.

4) Сама по себе ошибка в коде не могла привести к запроектным вибрациям, так как даже исправленные расчёты показывали, что колебания в пределах нормы. Но, тут как раз в нашу историю входят технические амбиции.

Широко шагаешь Митсубиси, штаны не порви


Изготовление антивибрационных решёток, которые должны были не допустить слишком сильные по амплитуды колебания теплообменных трубок из-за вибраций это довольно сложная задача. В случае, если зазор между трубкой и ячейкой решётки будет слишком большой, то возникнет разрушающая вибрация. Но при этом чем меньше зазор, тем выше требования к точности изготовления, так как при различии величины зазоров вдоль длины трубки она может искривиться. Поэтому выбор величины зазора обычно осуществляется исходя из компромисса между технологическими возможностями и величинами колебаний, которые прямо зависят от скорости потока.

Японцы, исходя из цели увеличить запас прочности, решили сделать зазор как можно меньшим — предполагалось возможным сделать его не более 0,003 дюйма (0,076 мм). Таким образом колебания удалось бы гасить даже при значительно больших скоростях потока, чем расчетные. Т.е. в теории данное решение невзначай полностью компенсировало бы ошибку расчётов.
Проблема оказалась в ином. Во время разбирательств по причине аварии первой идеей было несовершенство изготовления из-за чего зазоры оказались больше допустимых. MHI даже в начале признали эту версию, тем более, что при обследовании на парогенераторе 3 энергоблока таки нашли увеличенные зазоры. Но парогенератор 2 энергоблока был изготовлен куда аккуратнее, а проблема присутствовала и там. Более того, рассмотрение карты распределения неравномерностей зазоров в ходе арбитража показало, что вышедшие из строя трубки находятся далеко от области с повышенными зазорами. Тем не менее американцы настаивали именно на этой версии причины, так как она позволяла обвинить MHI в браке.

u4l9oa4ejidhnjvo48qxmw7xub8.jpeg
Красным показана область с максимальными зазорами, зелёным цветом трубки с увеличенными зазорами, не испытавшие дефектов, жёлтым — такие же трубки, у которых дефекты или были, или не были. Чёрным вышедшие из строя трубки.

Возможное решение выявленного несоответствия подсказали специалисты Areva, нанятые американцами в качестве консультантов. Они провели численные расчёты и выяснили, что ранее применявшаяся гипотеза о том, что при сверхмалых зазорах величина колебаний постоянна до некоего критического значения, когда происходят разрушительные вибрации, не полна. Моделирование выявило, что также значительные колебания возможны и при экстремально узких зазорах из-за, возникающих в них, турбулентных потоков. Это была новая для отрасли проблема, так как до этого никто не сталкивался с таким. И японцы уцепились именно за эту версию.

mulu6affmshyiy48yl1a3rzxuaw.jpeg
Зависимость амплитуды колебаний от величины зазора между трубкой и решёткой

Да, в этом случае возникает вопрос о недостаточном объёме подтверждающих расчётов для нового технического решения. Но с другой стороны новизна и отсутствие до этого каких-либо гипотез о наличии подобного явления прежде позволяли откреститься от ответственности и списать всё на форс-мажор. Самое смешное, что арбитраж так и не смог утвердительно ответить на то, чья версия правильная. Требовались дополнительные исследования для проверки гипотез, но это было не в компетенции судей, а потому формально вину возложили на японцев, но с парой очень больших нюансов.

MHI была обязана компенсировать американским заказчикам расходы, связанные с поиском причин инцидента, попытками вернуть блоки в строй и выполненными на станции ремонтными работами в размере всего-то 125 миллионов долларов. Американцы же требовали от суда 7 миллиардов, чтобы покрыть расходы на простой и преждевременное закрытие станции, но из-за так и не выявленной коренной причины аварии арбитры не могли возложить всю ответственность на MHI. При этом и SCE должна была выплатить японцам 58 миллионов долларов для компенсации затрат на арбитраж, так как фирма так и не смогла доказать в нём свою правоту.

Какие выводы из всей этой истории можно сделать


  1. некритичная ошибка в ПО в расчёте всего одного параметра, привела к фатальным результатам из-за непрогнозируемого явления;
  2. непрогнозируемость явления вызвана отсутствием должного количества подтверждающих расчётов;
  3. обе стороны спустя рукава подошли к процессу контроля качества документации и процессам верификации и валидации результатов;
  4. при этом вопросов к менеджменту качества японцев всё же больше, так как они ещё в ходе разработки парогенераторов увольняли работников, высказывающих претензии к качеству работ;
  5. техническое описание ПО в 2 из 3 случаев не давало понимания как оно работает и имело ошибочные данные;
  6. если бы ошибки в ПО не было, авария все равно могла бы случиться, так как коренная причина ее лежит в технических решениях, но она непосредственно повлияла на выбор этого технического решения.


Желаю всем надлежащей документации по проектам, спасибо за внимание.

edc538e6255d34ae50ab967f05e1ea16.png

© Habrahabr.ru