Когда-то я регулярно участвовал в контестах по программированию, и мне очень нравилась простота и объективность концепции - ты пишешь код, отправляешь решение на сервер, там оно компилируется и проходит набор тестов, которые тебе заранее не известны. Если тест не пройден, ты получаешь код ошибки и номер теста, на котором задача завалилась. Со стороны не очень зрелищно, но как метод объективного сравнения способностей участников - прекрасно.
Меня давно посещала мысль сделать какое-нибудь соревнование по компьютерному моделированию физических процессов. Ведь с одной стороны, эти все модельки и контурные графики, это же очень красиво (может, конечно, это только мне так кажется). С другой стороны, принципиально есть и объективный фактор сравнения - моделирование же в конечном счете должно привести к какому-то объективно измеримому результату. Ну и вообще, давно уже стало интересно, насколько хорошей будет точность, если решить какую-то реальную задачу с нуля в экспресс-режиме. И кто бы мог подумать, что эта идея материализуется в виде вот этого:
Но обо всем по порядку.
Вообще, в данном посте я рассказал об этой истории так, как рассказывал бы для тех, кто в теме. Получилось, возможно, скучно, и уж точно - длинно. Наверное, как-нибудь в другой раз попытаюсь рассказать об этом в совсем другом формате так, чтобы далеким от этих тем людям было понятно, что же в этом веселого. Можете подождать лучших времен и забить на простыню, которая начинается с этого места.
Итак, идея предельно проста. Есть физический процесс, его надо смоделировать, получить какой-то количественный ответ. В финале эксперимент проводится, как говорится, IRL, и у кого расчетный результат ближе к полученному, тот и победил.
Вопрос в том, какой физический процесс взять. Критерии отбора у меня были следующие.
1. Бюджет. Любой каприз - но за мои деньги. Так что учитывая что проект пилотный, а участвующих команд (внимание!) две, хотелось не уйти за 2К рублей.
2. Физическая задача должна быть нелинейной (ну т.е. не электростатику посчитать), иначе совсем скучно. В то же время это должно быть что-то доступное для простого эксперимента. Я взял гидродинамику.
3. Среда должна быть стабильной, с хорошо известными свойствами, чтобы можно было сосредоточиться на моделировании, а не на изучении сортов трансформаторного масла. Я взял воду.
4. Должна быть трехмерная задача. Чтобы можно было подумать над тем, можно ли ее свести к двумерной или нет.
5. Измеряемый параметр должен быть предельно объективным и легко регистрироваться (см. пункт 1).
6. В рассматриваемой системе должна быть какая-то прикольная деталюшка, которую можно просто не заметить (а она важна), и не понятно сразу, можно ли ее выбросить или нет.
7. Это должна быть нетривиальная конструкция, чтобы ее нельзя было просто взять, по быстрому воспроизвести дома, и проверить свой ответ. Потому что соревнование должно включать в себя проверку чувства достоверности, когда у тебя нет под рукой верифицирующего объекта, и ты только по своему опыту и интуиции должен понять, все ли нормально с твоей моделью (да-да, привет сеточной сходимости и прочим радостям жизни).
Да, не все так просто. Пытаясь найти оптимальный вариант по всем этим параметрам, я пришел к той самой красной воронке из "ОБИ". Из класса осесимметричных в класс трехмерных она была переведена принудительно путем сгибания трубки.
Идея состояла в том, чтобы набрать в воронку воды, а затем слить ее естественным образом. При этом момент, когда вода сливается целиком, зафиксировать сложно, поскольку в конце вода льется тонкой струйкой или каплями, и четкого момента, когда слив прекратился, по сути нет. Поэтому я решил замерять интервал времени, за который поверхность воды проходит от одной риски до другой - риски прекрасно видны, если смотреть на воду сверху.
Чем мне понравилась эта воронка? Она достаточно большая, соответственно, эксперимент проводить легче, поскольку измеряемое время больше, и допустимая пространственная погрешность тоже больше. У нее хитрый профиль, поэтому, если не найти в магазине такую же воронку (а логотипа не ней, к счастью, не было), проверить дома ответ не получится. У нее есть ситечко (можно подумать, нужно ли его учитывать):
Сначала я думал выдать ребятам чертеж и вперед, моделить. Однако чертеж ведь пришлось бы делать мне. Поэтому дальше мои мысли пошли обычным мршрутом, и я понял, что лишать людей такого интересного этапа, как измерение параметров воронки обычной линейкой - это неправильно. Таким образом, первым этапом стало измерение параметров этого устройства.
Интересно, что хотя команд было всего две, они реализовали совершенно разные подходы.
Первая команда решила пилить трехмерку.
Любители комсола с его кривовато реализованным построителем геометрии оценят тщательно отрисованную согнутую гофру.
Дальше народ посчитал ряд стационарных задач с разным уровнем жидкости, задавая нулевое давление на вход и на выход. Оказалось, что результаты расчета хорошо описываются простой формулой Торичелли, но почему-то с множителем два. Откуда множитель два - для меня осталось загадкой. Возможно, просто совпадение - участок смоделированной зависимости короткий, аппроксимируется линейной функцией. Ну положим.
Чтобы ответить на вопрос, влияет ли ситечко на процесс, народ смоделировал одну ячейку, поставив на боковые границы условия симметрии. На верх задавалась однородная скорость, а на низ - нулевое давление.
Водичка обтекает сетку красиво, с вихрями. Ребята поварьировали скорость, и оказалось, что потеря давления на этом элементе составляет не более 10 Па при скоростях в пределах 15 см/с. Это, конечно, ничтожно мало, учитывая, что сила тяжести создает на воронке перепад давления в 2.5 тыс. Па.
Взяв представленную выше зависимость выходной скорости от высоты столба жидкости в воронке и подставив в уравнение Бернулли с учетом конической формы верхней части воронки, ребята умудрились проинтегрировать уравнение аналитически при помощи Вольфрам-Математики:
И получили ответ: 10.7 с.
Вторая команда решила обойтись двумерной постановкой, отдельно выяснив, наскольку большую погрешность внесет изгиб. При этом для моделирования разного уровня жидкости просто занулялась объемная сила выше определенной координаты.
Ситечко, как и первая команда, тут смоделировали отдельно, причем экономично дорезав модельку до 1/8 части. P-V - характеристика почему-то отличается от первой команды раза в три. Кто прав - неизвестно. Однако того, кто не прав, спасло то, что в любом случае падение давления на ситечке очень мало.
Отдельно промоделировав изгиб, вторая команда пришла к выводу, что на изгибе теряется всего 7 Па, и этим можно пренебречь.
Поэтому в итоге ребята пришли к чисто осесимметричной постановке. При этом в данном случае благодаря тому, что это комсол, обыкновенный дифур на уровень воды в воронке, удается просто прикрепить к конечноэлементной модели и решать все совместно.
И в результате получился ответ 5.8 с. Отметим - разница почти в два раза с первой командой! Уже интересно.
Про то, кто победил - трехмерщики или двухмерщики - в другой раз.