Редактирование: Обратный каскад энергии (двумерная турбулентность)
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Файл:ObratnyKasakad2vyhrya.jpg|thumb|Рис.1 Взаимодействие двух вихрей.|450px]] | [[Файл:ObratnyKasakad2vyhrya.jpg|thumb|Рис.1 Взаимодействие двух вихрей.|450px]] | ||
Строка 52: | Строка 39: | ||
Частички расположены впритык друг к другу и образуют прямоугольную решетку. С помощью написанной программы можно изменять количество шаров, коэффициент вязкости и температуру в среде(термостат). | Частички расположены впритык друг к другу и образуют прямоугольную решетку. С помощью написанной программы можно изменять количество шаров, коэффициент вязкости и температуру в среде(термостат). | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Stepanov/inverse% | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Stepanov/inverse%20cascade3_17.12.16/newVar.html |width=950 |height=1400 |border=0 }} |
<div class="mw-collapsible mw-collapsed"> | <div class="mw-collapsible mw-collapsed"> | ||
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content"> | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content"> | ||
Строка 59: | Строка 46: | ||
// Версия 16.12.16 | // Версия 16.12.16 | ||
− | |||
− | |||
− | |||
− | |||
function MainBalls(canvas, slider_01, text_01, slider_02, text_02) { | function MainBalls(canvas, slider_01, text_01, slider_02, text_02) { | ||
Строка 79: | Строка 62: | ||
var a0 = 1; // масштаб расстояния (диаметр шара) | var a0 = 1; // масштаб расстояния (диаметр шара) | ||
− | |||
− | |||
var C0 = m0 * k0 * k0; // масштаб жесткости | var C0 = m0 * k0 * k0; // масштаб жесткости | ||
var B0 = 2 * m0 * k0; // масштаб вязкости | var B0 = 2 * m0 * k0; // масштаб вязкости | ||
− | + | ||
− | + | var G = 0; | |
− | + | var G1 = 0; | |
− | + | var G2 = 0; | |
− | |||
// *** Задание физических параметров *** | // *** Задание физических параметров *** | ||
− | var Ny = | + | var Ny = 30; // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна) |
var m = 1 * m0; // масса | var m = 1 * m0; // масса | ||
var Cwall = 10 * C0; // жесткость стен | var Cwall = 10 * C0; // жесткость стен | ||
var Cball = 0.1 * Cwall; // жесткость между частицами | var Cball = 0.1 * Cwall; // жесткость между частицами | ||
− | |||
− | |||
var Bball = 0.01 * B0; // вязкость между частицами | var Bball = 0.01 * B0; // вязкость между частицами | ||
var Bwall = 0.03 * B0; // вязкость на стенках | var Bwall = 0.03 * B0; // вязкость на стенках | ||
− | |||
var r = 0.5 * a0; // радиус частицы в расчетных координатах | var r = 0.5 * a0; // радиус частицы в расчетных координатах | ||
var K = 0.7; // все силы, зависящие от радиуса, ограничиваются значением, реализующимся при r/a = K | var K = 0.7; // все силы, зависящие от радиуса, ограничиваются значением, реализующимся при r/a = K | ||
Строка 111: | Строка 88: | ||
var spf = 100; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | var spf = 100; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | ||
var dt = 0.045 * T0 / fps; // шаг интегрирования (качество расчета) | var dt = 0.045 * T0 / fps; // шаг интегрирования (качество расчета) | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
// Выполнение программы | // Выполнение программы | ||
Строка 122: | Строка 95: | ||
var a2 = a * a; // ___в целях оптимизации___ | var a2 = a * a; // ___в целях оптимизации___ | ||
var D = a2 * Cball / 72; // энергия связи между частицами | var D = a2 * Cball / 72; // энергия связи между частицами | ||
− | + | ||
− | + | var steps = 0; | |
− | + | var Temp = 0; | |
− | + | Temp0 = 0.12 * D; | |
− | + | var B1 = 12*Math.sqrt((2*D)/a2); | |
− | + | var B = 0.026 * B1; | |
− | + | var betta = 3.5*B; | |
+ | var LJCoeff = 6 * D / a2; // коэффициент для расчета потенциала Л-Дж | ||
+ | |||
var Ka = K * a; // ___в целях оптимизации___ | var Ka = K * a; // ___в целях оптимизации___ | ||
var K2a2 = K * K * a2; // ___в целях оптимизации___ | var K2a2 = K * K * a2; // ___в целях оптимизации___ | ||
Строка 135: | Строка 110: | ||
var grad; // должен ли работать градиент (регулируется в функции setNy()) | var grad; // должен ли работать градиент (регулируется в функции setNy()) | ||
− | + | this.set_01 = function(p) {betta = p * B;}; | |
− | + | this.set_02 = function(pT) {Temp0 = pT *D;}; | |
− | + | ||
this.setNy = function(ny) { | this.setNy = function(ny) { | ||
Ny = ny; | Ny = ny; | ||
Строка 160: | Строка 135: | ||
}; | }; | ||
− | + | // настройка слайдеров и текстовых полей | |
slider_01.min = 0.1; slider_01.max = 20; | slider_01.min = 0.1; slider_01.max = 20; | ||
slider_01.step = 0.1; | slider_01.step = 0.1; | ||
Строка 166: | Строка 141: | ||
text_01.value = betta / B; | text_01.value = betta / B; | ||
− | // настройка слайдеров и текстовых полей | + | // настройка слайдеров и текстовых полей |
slider_02.min = 0.1; slider_02.max = 1; | slider_02.min = 0.1; slider_02.max = 1; | ||
slider_02.step = 0.1; | slider_02.step = 0.1; | ||
slider_02.value = Temp0 / D; // начальное значение ползунка должно задаваться после min и max | slider_02.value = Temp0 / D; // начальное значение ползунка должно задаваться после min и max | ||
text_02.value = Temp0 / D; | text_02.value = Temp0 / D; | ||
− | + | ||
− | + | // график | |
− | + | var vGraph1 = new TM_graph( // определить график | |
− | + | "#vGraph1", // на html-элементе #vGraph | |
− | + | 20000, // сколько шагов по оси "x" отображается | |
− | + | 0, 1,0.1); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
// Работа с массивом | // Работа с массивом | ||
Строка 197: | Строка 167: | ||
} | } | ||
} | } | ||
− | + | ||
var b = []; | var b = []; | ||
Строка 205: | Строка 175: | ||
// balls[balls.length] = b; // добавить элемент в конец массива | // balls[balls.length] = b; // добавить элемент в конец массива | ||
− | + | balls.push(b); | |
return b; | return b; | ||
}; | }; | ||
− | + | ||
− | + | this.setMy = function() { | |
− | + | balls = []; | |
for (var j = 0; j < Ny; j++) | for (var j = 0; j < Ny; j++) | ||
for (var i = 0; i < Ny; i++) | for (var i = 0; i < Ny; i++) | ||
− | + | addNewBall(w*j/Ny + r, h*i/Ny + r , true); // задаем 50x50 | |
− | + | document.getElementById('ballsNum').innerHTML = balls.length; | |
− | + | } | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
// Основной цикл программы | // Основной цикл программы | ||
Строка 234: | Строка 199: | ||
for (var s = 1; s <= spf; s++) { | for (var s = 1; s <= spf; s++) { | ||
− | + | for (var i0 = 0; i0 < balls.length; i0++) { | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Temp = 1/2 * (balls[i0].vx * balls[i0].vx + balls[i0].vy * balls[i0].vy) / Ny; | Temp = 1/2 * (balls[i0].vx * balls[i0].vx + balls[i0].vy * balls[i0].vy) / Ny; | ||
− | + | var stat = Math.sqrt(Temp0/Temp); | |
− | + | balls[i0].vx*=stat; | |
− | + | balls[i0].vy*=stat; | |
− | } | + | } |
− | |||
for (var i = 0; i < balls.length; i++) | for (var i = 0; i < balls.length; i++) | ||
− | + | { | |
// расчет взаимодействия производится со всеми следующими шарами в массиве, | // расчет взаимодействия производится со всеми следующими шарами в массиве, | ||
// чтобы не считать каждое взаимодействие дважды | // чтобы не считать каждое взаимодействие дважды | ||
− | var b = balls[i]; | + | var b = balls[i]; |
− | |||
for (var j = i + 1; j < balls.length; j++) { | for (var j = i + 1; j < balls.length; j++) { | ||
var b2 = balls[j]; | var b2 = balls[j]; | ||
var rx = b.x - b2.x; var ry = b.y - b2.y; // вектор смотрит на первый шар (b) | var rx = b.x - b2.x; var ry = b.y - b2.y; // вектор смотрит на первый шар (b) | ||
− | var r2 = rx * rx + ry * ry; // квадрат расстояния между шарами | + | var r2 = rx * rx + ry * ry; // квадрат расстояния между шарами |
if (r2 > aCut2) continue; // проверка на радиус обрезания | if (r2 > aCut2) continue; // проверка на радиус обрезания | ||
var rLen = (Math.sqrt(r2)); | var rLen = (Math.sqrt(r2)); | ||
Строка 272: | Строка 228: | ||
// сила взаимодействия | // сила взаимодействия | ||
var s2 = a2 / r2; var s4 = s2 * s2; // ___в целях оптимизации___ | var s2 = a2 / r2; var s4 = s2 * s2; // ___в целях оптимизации___ | ||
− | + | var s8 = s4 * s4; | |
− | + | var F = LJCoeff * s8 * s2 * ((aCut - rLen)/(aCut - a)); // сила взаимодействия Леннарда-Джонса | |
− | + | ||
− | + | var vx21 = b.vx - b2.vx; var vy21 = b.vy - b2.vy; // вектор смотрит на первый шар (b) | |
− | + | var ex = rx / rLen; var ey = ry / rLen; | |
− | + | var v = vx21 * ex + vy21 * ey; | |
− | + | F -= betta * ((aCut - rLen)/(aCut - a)) * v * (1/rLen); | |
− | + | ||
// суммируем силы | // суммируем силы | ||
var Fx = F * rx*dt; var Fy = F * ry*dt; | var Fx = F * rx*dt; var Fy = F * ry*dt; | ||
− | + | ||
− | + | b.vx += Fx; b.vy += Fy; | |
− | + | b2.vx -= Fx; b2.vy -= Fy; | |
− | + | G2 += b.vx * b2.vx + b.vy * b2.vy; | |
− | + | G1 += 1; | |
− | + | ||
} | } | ||
Строка 297: | Строка 253: | ||
} | } | ||
− | + | for (var i0 = 0; i0 < balls.length; i0++) { | |
balls[i0].x += dt * balls[i0].vx; | balls[i0].x += dt * balls[i0].vx; | ||
balls[i0].y += dt * balls[i0].vy; | balls[i0].y += dt * balls[i0].vy; | ||
− | |||
} | } | ||
− | + | ||
− | + | G = G2 / G1 / 2/ Temp0/Ny; | |
− | + | ||
− | + | steps++; | |
if (steps % 200 == 0) { | if (steps % 200 == 0) { | ||
− | + | vGraph1.graphIter(steps, (G))} | |
− | |||
− | |||
} | } | ||
} | } | ||
Строка 335: | Строка 288: | ||
// Запуск системы | // Запуск системы | ||
this.newSystem(); | this.newSystem(); | ||
− | + | /*for (var i0 = 0; i0 < balls.length; i0++) { // задаем частицам случайные скорости | |
balls[i0].vx = (3 * (1 - 2 * Math.random())); | balls[i0].vx = (3 * (1 - 2 * Math.random())); | ||
balls[i0].vy = (3 * (1 - 2 * Math.random())); | balls[i0].vy = (3 * (1 - 2 * Math.random())); | ||
}*/ | }*/ | ||
− | + | if(!window.requestAnimationFrame){ | |
− | + | window.requestAnimationFrame = (function(){ | |
− | + | return window.webkitRequestAnimationFrame | |
− | + | || window.mozRequestAnimationFrame | |
− | + | || window.oRequestAnimationFrame | |
− | + | || window.msRequestAnimationFrame | |
− | + | || function(callback, element){window.setTimeout(callback, 1000 / fps);}; | |
− | + | })(); | |
− | |||
} | } | ||
//setInterval(control, 1000 / fps); | //setInterval(control, 1000 / fps); | ||
− | + | function animate(){ | |
− | + | requestAnimationFrame(animate); | |
− | + | control(); | |
− | + | } | |
− | + | animate(); | |
− | |||
− | |||
− | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 364: | Строка 313: | ||
==Анализ== | ==Анализ== | ||
− | С помощью графика можно наблюдать за зависимостью корреляции скоростей <big><math> Г | + | С помощью графика можно наблюдать за зависимостью корреляции скоростей <big><math> Г </math></big> от входных параметров (вязкость, температура, кол-во частиц). |
Уравнение для корреляции скоростей : | Уравнение для корреляции скоростей : | ||
Строка 375: | Строка 324: | ||
\end{cases} | \end{cases} | ||
</math></big> | </math></big> | ||
− | |||
Например, для начальной конфигурации на 60 000 шаге по времени будет наблюдаться график 1. | Например, для начальной конфигурации на 60 000 шаге по времени будет наблюдаться график 1. | ||
Строка 408: | Строка 356: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Ссылки== | ==Ссылки== | ||
*Vitaly A. Kuzkin, Anton M. Krivtsov. Interscale energy transport and velocity correlations in thermostated dissipative soft disc system. | *Vitaly A. Kuzkin, Anton M. Krivtsov. Interscale energy transport and velocity correlations in thermostated dissipative soft disc system. |