«В военное время значение синуса может достигать четырех» (С) Willebrord Snel van Royen, Cyclometricus, 1621 Приветствую вас, глубокоуважаемые! Представьте, каким был бы наш мир, если бы условия распространения звука в нем были бы несколько иными. Например, иногда ваш крик был бы не слышен на расстоянии десяти метров, но становился бы вполне различим на сотне-другой и, скажем, на паре километров? А иногда, негромкий разговор или даже шепот разносился бы на километры от вас. Уверен, что пословица «слово - не воробей..» - заиграла бы совершенно новыми красками! А еще, все эти эффекты сильно зависели бы от времени года и суток, погоды и даже наклона вашей головы. Как бы нам жилось в таком мире? К счастью, нам даже не придется напрягать воображение, потому что такой мир существует рядом с нами и сегодня я немного расскажу о нем.  Для тех, кто услышал мой «шепот» в современном потоке информации - добро пожаловать под кат, у нас сегодня не только ликбез и культпросвет, но модель с красивыми картинками, исходным кодом на двух языках и онлайн-симулятором, а также видео, где за 15 минут отображаются все научные морские экспедиции с 1961 по 2010 год.  Для всех нас должна быть поучительной жизнь и судьба мореплавателя Кристобаля Колона, который четырежды топтал земли нового света, пребывая в упрямой уверенности, что ступает то по благословенной индийской земле, то по беднейшей части восточного Китая. Так до самой смерти и не узнавший, что он стал первым из европейцев, кто бороздил просторы карибского и саргассова морей. Кто знает, может быть его бы и не расстроило, что на тихоокеанскую плиту наползает Северо-Американская, а не Северо-Колумбийская, но вот то, что доливкой кипятка в эспрессо получают Американо, а не Колумбиано - точно бы опечалило. Поэтому, не то чтобы необходимо, но исключительно важно: понимать, где ты находишься иметь связь, как минимум, чтобы спросить у того, кто понимает. Конечно, Америго Веспуччи, или, по другим данным, Ричард Америке обошлись судя по всему и без этого, но это лишь делает им честь, которая на нас автоматически не экстраполируется. Проект геометрического трассировщика лучей в слоистой среде: uRayTracerDemo Архив с приложением и набором профилей из разных мест мирового океана и разных годов: uRayTracerDemo (zip) Онлайн версия трассировщика: uRayTracer - Online Видео, показывающее научные экспедиции с 1961 по 2010 год с отображением температуры поверхности, 49 лет за 15 минут: Marine scientific expeditions 1961-2010 in 15 minutes И именно поэтому, так живучи дежурные фразы про то, что большая часть океана до сих пор не исследована, и то, что поверхность марса картирована лучше, чем поверхность земли. Но почему так происходит? Помимо того, что под водой, как известно, на нас оказывается огромное давление и благодаря эволюции мы утратили жабры, а вместе с ними и возможность дышать растворенным кислородом, под водой практически не распространяются радиоволны, а еще там в основном темно, холодно и страшно. Все задачи, которые на земле и в воздухе решаются при помощи радиоволн: GPS, радар, спутниковая связь и мобильная связь перекладываются на узкие, рахитичные плечики гидроакустики. Кратко напомню, что глубина Бездны Челленджера (самой глубокой точки земных океанов) определена с точностью +/- 10 метров - и на сегодняшний день это все, что может современная наука. А все потому, что скорость звука в океане не остается неизменной: она очень сильно зависит от температуры, солености и глубины. Это приводит к искривлению траектории распространения звуковых волн в вертикальной плоскости, говоря научным языком - к рефракции акустического поля. Сложная стратифицированность присуща не только океанической среде, но вполне наблюдается и в более мелких водоемах - вспомните хотя бы теплый, прогретый слой воды в речке летом. Кроме этого, ни поверхность ни дно никогда не являются идеально ровными и гладкими границами раздела, все это тоже вносит свой вклад в искажение траектории распространения звуковых колебаний, но сегодня мы ограничимся рассмотрением влияния профиля скорости звука. В прошлой статье мы уже познакомились с понятием профиля скорости звука: ученые непосредственно измеряют скорость звука по всей глубине, и затем интегрируют (суммируют) времена прохождения звука через слои и таким образом более точно определяют глубину. Пару слов про источники данных. Наборы измерений CTD (температура/соленость) я брал у NOAA.  Я уже как-то рассказывал про этот кладезь и несметные сокровища в статье "Кто, как и на чем исследовал мировой океан". И было собирался написать вторую статью про эти данные, но утратил интерес. Поэтому предлагаю просто посмотреть результат работы - видео, которое за пятнадцать минут отображает на карте 49 лет морских экспедиций с 1961 по 2010. Примерно 20 дней в секунду. Цвет точки - температура поверхности, текущие измерения выделяются яркостью. Профили могут быть самые разнообразные, и для иллюстрации этого я приведу пару примеров.  Вниз по вертикали направлена ось глубин, желтым отображается температурный профиль, а бирюзовым - профиль солености. Зеленый график - вычисленные по глубине, температуре и солености значения скорости звука.  А что же будет, если нам нужна не просто глубина, а, скажем, горизонтальная дальность? А вот здесь, «как сказал поэт, к нам и повернется, черное лицо досуга».   Я уже упомянул о «изгибании» траектории звуковых волн, но давайте сначала порассуждаем на стихийно-бытовом уровне и вспомним школьные уроки физики: Волны, будь то свет или звук, падая под неким углом на границу раздела сред с разной плотностью преломляются. Этот феномен описывается законом Снеллиуса, или Снелля. Он гласит, что: Отношение синусов угла под которым волна падает на границу раздела сред и угла, под которым она покидает границу, равно отношению скоростей распространения волны в этих средах. Пока я не забыл, для нашего рассказа удобно ввести понятие луча - перпендикуляра к касательной, проведенной в какой-либо точке к фронту волны. В курсе школьной физики мы как раз и рисовали лучи. Давайте я нарисую парочку, для демонстрации закона Снелля. Если кто-то не помнит, как он выводится, то может заглянуть под спойлер и освяжить память. Осознать закон Снелля очень просто. У нас есть два параллельных луча, которые падают на границу раздела под углом θ. Очевидно, что время хода второго луча на отрезке А’B должно совпадать времени хода первого луча на отрезке АB’ - в противном случае пришлось бы принять, что они перестали быть параллельными. Для обоих лучей это время равно отношению длины пройденного пути к скорости распространения волны: Если взглянуть на два прямоугольных треугольника AA’B и AB’B, то окажется, что у них общая сторона AB, которую можно выразить двумя способами: Исключив из выражения отрезки A’B и AB’ получаем закон Снелля, Снеллиуса или закон синусов: Это очень глубокая штука. Я предлагаю тщательно ее обдумать, ведь фактически, волна решает оптимизационную задачу: она старается двигаться по пути наименьшего (экстремального) времени распространения. (Принцип Ферма). Запомните это. Дальше выяснится, что это приводит к неожиданным результатам. Если вас пугают следовые количества математики, то можно смело пропустить спойлер ниже и сразу переходить к картинкам и обсуждению. Здесь же я кратко изложу, как и почему такие картинки получаются. Где-то осенью 2020 года ко мне в линкедин постучался американский молодой разраб, с просьбой помочь ему с трассировкой лучей в подводе. В тот момент я не сильно интересовался темой (почему - станет понятно в конце статьи) и знал только, что качественную трассировку можно сделать винрарным приложением BELLHOP. Я вежливо отнекивался, ведь мне действительно нечем было ему помочь! Я упомянул невзначай про пресловутый BELLHOP, на что получил обескураживающий ответ: у меня не получилось запустить это приложение. А ведь да, если просто запустить BELLHOP, то просто моргнет черное окно консоли. BELLHOP - утилита, работающая из командной строки, с кучей параметров, берущая на вход один файл и выдающая на выходе другой. По которому можно потом строить красивые картинки в Matlab.  Терпение, мы уже практически полностью вооружены всей необходимой математикой, чтобы это начать. Нам понадобится только вспомнить совсем простое правило, что: Угол падения равен углу отражения И договориться о том, что мы считаем дно и поверхность воды совершенно плоским, но каждый раз, когда звук отражается ото дна или поверхности, энергия, им переносимая уменьшается определенным образом, скажем умножается на какой-нибудь коэффициент от 0 до 1.  Итак, о входных и выходных параметрах. В качестве входных у нас будут: Профиль скорости звука, как набор значений скорости звука с привязкой к глубине Число лучей Положение источника на оси Z (т.е. глубина) Диаграмма направленности - угол, в пределах которого лучи выходят из источника Интервал интегрирования по глубине  Максимальные значения по горизонтальной координате и длине луча - по достижении одного из этих параметров симуляция для данного луча останавливается Коэффициенты отражения для дна и поверхности С выходом все предельно понятно: мы хотим иметь траектории движения лучей. То есть последовательные наборы точек, где сопоставляются горизонтальная и вертикальные координаты, к которым можно добавить параметр, определяющий “энергию” луча в данной точек Напомню, в нашей упрощенной модели луч теряет энергию только при отражениях ото дна и от поверхности.  Перед тем, как выполнить симуляцию нужно подготовить профиль скорости звука к удобному виду: доступные по базам NOAA профили собирались в разные годы и зачастую интервал по глубине может отличаться и для двух соседних измерений. Поэтому линейно интерполируем профиль через 0.1 м. В проекте на C# это выполняется в методе BuildVSSP() класса Simulator. После этого создаем список экземпляров класса Ray, каждому из которых передаем угол из заданного диапазона: Последним параметров в конструктор класса Ray передается функция, возвращающая скорость звука на заданной глубине. Она ищет ближайшее значение в интерполированном профиле и кэширует все возвращаемые значения в словаре для ускорения работы всей симуляции в целом, т.к. как минимум до первого отражения все лучи проходят по одним и тем же слоям. Сама же симуляция выполняется таким образом: Сама же логика поведения луча заключена в методе Step() класса Ray, она-то и делает следующий шаг - решает каково будет следующее положение головы луча. Сама логика достаточно проста. Позволю себе лишь упомянуть, что для удобства мы здесь переходим от угла падения (угол, который луч образует с вертикалью) к углу скольжения (угол, который луч образует с горизонталью) - мне просто удобнее так мыслить, коль скоро процесс у нас развивается слева направо. Закон “синусов” у нас в связи с этим заменяется на закон “косинусов” - синус угла падения это есть косинус угла скольжения. В остальном там нет никаких высоких материй: берется самая последняя точка и последнее значение угла скольжения, в зависимости от его знака, вертикальная координата приращивается или вверх или вниз. Проверяется условие пересечения поверхности или дна. Один скользкий момент связан с тем случаем, когда угол скольжения становится близок к вертикали или горизонтали. Лучевая теория решительно не может нам здесь адекватно помочь: согласно ей тут происходит фокусировка и уровень сигнала стремится к бесконечности. В реальности, конечно, такого произойти не может.  Чтобы избежать деления на ноль или попыток взять арккосинус от значения, большего по модулю чем единица, мы, во-первых, всегда сохраняем предыдущее адекватное значение угла, а во-вторых, когда дело начинает пахнуть керосином, берем это предыдущее значение, но с противоположным знаком. Это приводит к тому, что угол, стремящийся к горизонтали, как бы отразится от нее и начнет изменяться в противоположную сторону. Так же дело обстоит и при стремлении угла к вертикали. Ну что ж, достаточно о реализации. Скучная часть окончена, перейдем к картинкам. Взяв на себя смелость я быстренько накидал простое приложение на С#, который мне ближе всего при разработке чего-нибудь для десктопа. Проект, как обычно, положил на наш гихаб. И собрался было уже писать статью, как вспомнил, что на одну из таких статей с исходниками и скомпиленным релизом кто-то написал в комментариях: “Открыл ссылку - а там win exe :(“ Мне очень хотелось, чтобы поиграться с моделью для читателей было бы совсем просто, настолько, насколько я вообще могу себе представить. Вооружившись блокнотом я погрузился на пару дней в чуждый для меня мир JavaScript. Этим я как бы покупаю у вас индульгенцию на неряшливый код :)  Результатом стала онлайн версия трассировщика лучей. Так давайте же уже запустим это! Устанавливаю в поле δZ значение 0.1 (глубина первого профиля всего 38 метров и разрешение по умолчанию в 1 метр нам будет недостаточно) и загружаем предустановленный профиль GR-553 при помощи одноименной кнопки. В заголовке профиля указано где, когда и кем он был получен: Профиль был получен славными эллинами, 5 сенября 1991 года на вот этом исследовательском судне вот здесь. Оно кстати, до сих пор бороздит просторы. Нажимаем кнопку “RUN SIMULATION” и через некоторое время скрипт генерирует такую красоту: Сентябрь, греческий Корфу, жаркий (наверное) полдень - теплая вода у поверхности и прохладная у дна. Я не был в греции, но могу сказать, что у нас на р. Пичуга под Волгоградом в самое июльское пекло на 15-20 метрах температура обычно 13-14°С.  Слева мы видим сам профиль, значения скорости звука (зеленый график) почти 1 в 1 повторяют график температуры. Соленость не влияет совсем, т.к. меняется лишь незначительно от 38.3 до 38.5 PSU. Скорость звука же уменьшается от 1537 м/с на поверхности, достигая минимума в 1528 м/с у дна. Все это приводит к тому, что звук, от расположенного на глубине Z0 = 2 метра источника, придет к поверхности не далее чем в 400 метрах от положения этого самого источника. Это будут т.н. “прямые лучи”. Все остальное - отражения от дна и многократные поверхность-дно-поверхность.  Мы видим, что лучи “загибаются” вниз. А что там такого, что им туда так хочется попасть? Вот здесь мы подходим к самому основному, фактически, это самый минимум, который я хочу, чтобы вы запомнили. Из этого выводится все остальное. Траектории лучей загибаются в сторону уменьшения скорости звука. Такие условия, когда минимум скорости звука лежит у дна называются отрицательной рефракцией. Это одни из самых неудобных условий для гидроакустической связи. А помните, я обращал ваше внимание на то, что суть закона Снелля в том, что при преодолении границы раздела сред, волна идет путем экстремального (минимального) времени распространения? Ирония состоит в том, что волна, локально сокращая время распространения всегда стремится в область с меньшей скоростью звука, что в глобальном смысле наоборот увеличивает время распространения. Чтобы закрепить, откроем следующий профиль NA-35, но немного изменим параметры симуляции: максимум по оси X установим равным 2000 метров. Что же мы видим? Ого, глубина уже лодочная! А температура падает от 16°С у поверхности до 6°С у дна. И снова отрицательная рефракция, и снова звук стремится ко дну.  21 июня 1996 года. В России вовсю свирепствуют девяностые, я закончил 6 класс и наверное отдыхаю на даче с братьями, а судно под названием Dr. Fridtjof Nansen берет CTD пробы у берегов Намибии.  Необычайно прохладная для этих мест вода обязана холодному течению Бенгела. Почему это важно? Мы, например, производим гидроакустические модемы, у которых среди характеристик указана т.н. энергетическая дальность - дальность, на которой два таких модема могут передать данные между собой. Для самых маленьких наших модемов она составляет 1000 метров. Длины лучей на картинке выше как раз и ограничены одним километром.  И сложно не заметить, что максимум, что можно получить опустив модемы чуть ниже поверхности воды - метров 400. А учитывая волнение и вовсе не гладкую поверхность воды - десятки метров. А вот если опустить приемник хотя бы метров на 10-20, можно уверенно получить фактическую дальность в районе километра. Ладно, надоела уже эта отрицательная рефракция. Поехали дальше. Профиль US-32437. Я поставил предел по оси Х и максимальную длину луча равными 2000 метров. Остальные условия те же. 30 января 2009 года. Исследовательское судно NOAA Delaware II на своем 41 году жизни берет пробы у восточной оконечности Лонг-Айленда. Невероятно, но факт: marinetraffic сообщает, что Delaware II до сих пор в строю в свои 53 года. Правда называется теперь Med Surveyor и ходит под флагом Панамы. Ситуация с точностью до наоборот: минимум скорости звука на поверхности. В этом нет ничего удивительного: 30 января, северная атлантика. В нью-йорке, говорят, иногда идет снег. Когда упоминается Нью-Йорк, в моей голове сразу возникает “Let it snow, let it snow, let it snow” голосом Фрэнка Синатры. Так вот, сверху “летит сноу” и возможно даже небольшой минус, а у дна вода не остыла, плюс это все-таки атлантика. Все это приводит к тому, что звук в таких условиях загибается наоборот - к поверхности.  Но иногда, это даже хуже: при обсуждении предыдущего профиля я привел совсем уж невероятный пример. И правда: зачем кому-то связываться по гидроакустике на километре в двух метрах ото дна? Вот например, связаться с каким-нибудь роботом или осуществлять его трекинг какой-нибудь навигационной системой - это реалистичный сценарий.  И что же мы видим на картинке? Если наш робот находится глубже 30 метров и отошел от нас метров на 400 - связь может стать очень неустойчивой и даже полностью пропасть. На дальности более 1000 метров и глубине более 20 ничего, кроме возможных отражений от поверхности мы не поймаем. Кстати, большой привет тем, кто работает с УКБ и использует вертикальный угол прихода сигнала для определения глубины объекта. Но скорее всего не поймаем даже эти отражения: январь, атлантика. Наверняка ветрено и большие волны, они явно больше длины волны нашего сигнала - вот и на отражения от поверхности можно не рассчитывать. Тем временем, мы подходим к следующему профилю из онлайн-трассировщика. Я уменьшил угол диаграммы направленности до 60° и установил глубину источника в 60 метров. Вот что получается: Этот профиль особенно примечателен. Мы видим, что график скорости звука (и температуры) имеет экстремумы. То есть главный минимум находится ни у дна ни у поверхности. К чему это приводит? Звук, как мы уже выяснили, загибается в сторону уменьшения скорости распространения. И, будучи излученным под небольшими углами скольжения в области минимума скорости звука оказывается “заперт”: он обречен постоянно пересекать горизонт минимума и постоянно возвращаться к нему. Такую область называют каналом, а условия распространения - канальными. Впервые описали и объяснили условия канального распространения звука в океане в 1947 году советские ученые во главе с академиком Бреховских и доктором технических наук Розенбергом. Иногда упоминают, что на звукоподводный канал был открыт и описан немного раньше, в 1944 году Американскими учеными, правда, все было описано в закрытых работах. Но вернемся к нашему профилю.  19 ноября 1996, легкий ледокол George R. Pearkes 1986 года постройки (все еще в строю) брал пробы в дельте реки Сент-Лоуренс, где она впадает в одноименный залив. Давайте попробуем поугадывать, откуда взялся такой интересный профиль с двумя впадинами. Я бы сказал, что теплый летний слой не успел еще исчезнуть совсем (ноябрь все-таки), а вода у поверхности уже начала значительно охлаждаться. А еще, если обратить внимание на профиль солености - она значительно ниже у поверхности, что по всей видимости, связано с впадением пресной речной воды в океанические воды. А теперь посмотрим, что происходит с лучами в канале. Для этого я увеличу предел по оси Х и максимальную длину луча до, скажем, 20 километров.  Вот что мы получим: Лучи, вышедшие из источника под небольшими углами к горизонту остаются в пределах канала, не касаясь ни дна ни поверхности: звукоподводный канал на мелководье!  Звук распространяется совсем неглубоко и в верхней точки выходит на глубины порядка 20-25 метров. Так он может проходить десятки километров. Напомню: по оси Z всего около 170 метров, а по оси Х -  20 000. То есть фактическое соотношение сторон у графика более 1:100, это примерно как столешница, или лужа на асфальте. Мы переходим к заключительному профилю, самому глубокому из рассмотренных нами: SU-7464.  22 апреля 1991 года. Судно "Прилив" (на marinetraffic я его не нашел), еще под советским флагом, управляющая организация - Тихоокеанский Океанологический Институт, г. Владивосток. Место взятия проб - камчатский залив.  Этот профиль и выполненная по нему симуляция иллюстрируют еще один занимательный феномен: так называемый, приповерхностный звуковой канал. Такое бывает, когда самые холодные слои воды находятся под поверхностью, что приводит к формированию приповерхностного слоя с минимальной скоростью звука между немного прогретым поверхностным и более теплыми глубокими слоями. Здесь мы также можем наблюдать пресловутый “слой скачка” - резкого изменения скорости звука, от которого как от зеркала отражаются лучи, идущие под пологими и средними углами к горизонту.  Наш луч, вопреки определению из школьного курса геометрии, здесь окончательно теряет энергию и вежливо намекает на то, что пора бы подвести итоги. Что же у нас в “сухом” остатке? Звук распространяется в водоемах не по прямым линиям, а изгибается в виду наличия слоев воды разной плотности, а соответственно - с разной скоростью звука Звук всегда поворачивает в сторону минимума скорости звука, от чего при определенных условиях в водоемах могут образовываться каналы Примерный (примерный!) характер траекторий звуковых волн можно получить используя очень простые закономерности Диапазон условий необычайно широк, а конкретные условия в конкретном месте склонны иногда к быстрым изменениям Добавлю, что мало знать профиль скорости звука, нужно знать условия на поверхности, профиль и материал дна. Еще хорошо бы понимать где на пути вашего сигнала проплывает косяк макрели, или какие-то другие объемные неоднородности, на которых звук рассеивается.  Профиль же сам по себе не дает никаких гарантий: он взят вот “в этой конкретной точке”, а реальное распределение параметров в океане меняется непрерывно в пространстве и времени. Если вы не знаете какую-то часть исходных данных, то трассировка - это не путь, а только направление и поэтому не очень применима на практике.  Закончить свое повествование хочу такими аналогиями: Гидроакустическая связь, особенно на дальние расстояния, это всегда немножко попытка скинуть ключи с балкона 16 этажа человеку с завязанными глазами. А гидроакустическая навигация - попытка измерять что-то постоянно извивающейся или как минимум провисшей рулеткой. Традиционно благодарю за внимание, буду признателен за конструктивную критику и указание на ошибки. Обратная связь позволяет не думать о своем труде, как о напрасном. Embedded software developer