пятница, 24 марта 2017 г.

Время Ляпунова | Lyapunov time

English text below

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



Звучит хорошо и звонко. Что это значит? Это означает, что, согласно расчётам [Bello et al., 2014], мы не можем, зная с доступной нам сейчас точностью то, что творится внутри Земли (плотность вещества, температура и некоторые другие параметры), мы не можем с той же точностью сказать, что у неё будет внутри через сто миллионов лет. То есть Земля будет всё также с твёрдой мантией, магнитным полем и движущимися континентами, но точное их состояние (положение) предсказать нельзя.

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

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

Некоторое время назад я писал заметку про особенностинаучного программирования, теперь я её проиллюстрирую. Мы разрабатываем программы для моделирования эволюции планет, и доказательство их работоспособности является первостепенной задачей. Мы можем проверить простые случаи как на получаемые цифры, так и на их погрешность. Но мы не можем посмотреть, какой будет Земля через 100 миллионов лет или любой геологически значимый промежуток времени. Численное моделирование стоит перед вызовом неопределённости, глядит в лицо хаоса: как заглянуть за 100 миллионов лет и не соврать? Быть или не быть? Лгать или не защитить диссертацию? Вопрос открытый.

Собственно, весь текст, написанный выше — это прелюдия к тому, чтобы написать короткую оду замечательной программе, называемой valgrind. Это виртуальная машина, которая умеет исполнять программный код и очень внимательно следить за тем, как он работает с памятью — не использует ли неинициированных переменных или же не случается ли ошибок записи. Благодаря ему я нашёл один злобный баг. Наш код использует параллельные вычисления, и одной из критичных операций является сведение данных между процессорами. Ошибка состояла в том, что из-за опечатки программа пыталась усреднить и записать два значения там, где было место только под одно значение, а второго не было в исходных данных. Эта ошибка в 4 байта (размер целочисленной переменной) вела к очень большим последствиям для всех расчётов. При этом она не ловилась ни компилятором, ни библиотеками, ни ОС. 

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

Мне эта история очень хорошо показала адаптивность и устойчивость математических методов. Программа не знала, что у неё болеет, но на основании косвенных признаков изменяла своё поведение таким образом, чтобы получить качественное решение.

Итак, подытоживая эту очень краткую и поверхностную заметку.
(1) Да, полностью корректное тестирование геодинамических программ — это непростая задача как по финансовым (гранты на 100 миллионов лет пока не выдают, увы), так и по физическим (динамический хаос) причинам.
(2) Вариации входных данных, равно как и исправление ошибок, не ведёт к принципиальным изменениям получаемых результатов. Да, время Ляпунова запрещает нам говорить о том, что мы сможем успешно предсказать будущее на количественном уровне. Но моделированные сценарии имеют физический смысл.
(3) Современные математические методы очень сильно ушли от уровня «что засунули, то и получили». Они умеют принимать решения, адаптируясь под конкретные условия задачи, включая даже изначально неизвестные (например, ошибки). Шутка про то, что даже код в свои 20 лет может принимать решения и отвечает за свою жизнь.

Ну а для тех, кто в Теме, скажу: не используйте openmpi, используйте mpich. Куда как меньше странностей с инициализацией коммутатора.

English version

The Earth is predictable for only 95 millions of years. This is less than duration of geodynamic events - like Atlantic's ocean opening. All the longer predictions are uncertain, and Earth becomes unpredictable.

That sounds nice and simple. What does it mean? Basically,  [Bello et al., 2014] said that if we know what's up inside the Earth with the precision available nowadays (density, temperature and some other constrains on the Earth interior), we will be not able to say with the same precision what will be in 100 millions of years. The Earth will very similar, with solid mantle, magnetic field and moving continents, but their exact position or values can't be predicted well. 

Such systems are said to be in chaotic dynamics. Model itself is determined strictly, as if we know the exact state of the system in one moment of time, we can say precisely what will happen next. But even small uncertainties in the input data produce misfits, which accumulate to make a robust solution impossible. For example, if we compress a spring, it bends at a certain moment. We know and we can calculate how it will bend, what will be the applied stress, but the exact plain of bending, it's direction, depends on fingers' tremor, pressure variations and other mess. The same works for geophysicists and physicists who can predict Earth's magnetic field inversion and describe this in very details, but we can't predict when it will happen in our realm - besides that each droplet of liquid metal follows well-known equations.

If we can not predict the future, it doesn't mean that we are wrong about the past or consider several options of the future. Historical geology, a science to write the chronicles of the Earth, is not a fairy-tale. Past is something happened once, and we use numerous methods to tell how were continents located in the past, what was the depth of seas around them, and who was swimming in these seas to eat somebody else.

I wrote a note about scientific programming some time ago, and now I gonna to expand this topic. We develop software to model planetary evolution, and there is an important task to show them working correctly. We can test some simple cases for some values and their misfits. However, we can't take a photo of the Earth from 100 millions of years in the future or any geologically significant period of time. Numerical simulations are in front of the indeterminacy, are faced with chaos in front of them: how to take a look for 100 Ma and do not false? To be or not to be? To lie of not defend your PhD thesis? That's a good question.

Well, somebody might be wondering why I wrote all the text above. This is just an intro to sing praises to a software called valgrind. This is a virtual machine to execute a program and draw attention to memory access: does it use uninitialized variables, or do any memory read/write problems occur. That helped me to find an annoying bug in our code. We use parallel computations, and one of the most critical moments is data exchange between nodes. The error was in averaging of one value between the cores: it wanted to sum and write two values in a place having only one position in memory for data. Those 4 bytes (size of integer variable) resulted in great changes in overall computations, but it isn't caught by a compiler, libraries or operating system.

Does it mean our computations are totally wrong and you can't trust them? The answer is "no, of course". Code has intrinsic mechanisms to solve the problems. It started to decrease the timestep and make additional iterations to solve the equations with required precision.  But in some cases it needed twice more time for the same solution. So it was a misfortune but not a disaster like old joke tells:
- What is the difference between misfortune and disaster?
- For example a kitten was walking a bridge, fell down and drawn. This is a misfortune, but not a disaster. But if an airplane with all the government members crashes, it is a disaster, but not a misfortune.

This story seems to me be a perfect illustration on how stable and adaptive  numerical methods can be. Our program didn't knew what is wrong, but she was able to change the behavior to obtain nice results.

Just a brief summary:
(1) It's a tough challenge to test geodynamic software because of financial (they do not give grants for 100 millions of years) and physical (chaotic dynamics) reasons.
(2) Input variations and some mistakes do not change the result we obtain. Lyapunov time forbid us to say our modeling is robust to predict the exact future. But variants predicted by code make sense!
(3) Modern numerical methods are very far from "your output is more bad than input". They can make decisions to fit specific conditions, even unknown like bugs in code. A joke that even 20-years-old program is maturated enough to make decisions about life.

And just a note for people in the same crab bucket: do not use openmpi, use mpich. Much less strange things with initialization of a communicator.

Комментариев нет:

Отправить комментарий