Редактирование: Обратный каскад энергии (двумерная турбулентность)

Перейти к: навигация, поиск

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 59: Строка 59:
  
 
// Версия 16.12.16
 
// Версия 16.12.16
 
 
// Версия Total 19.12.16
 
//Stepanov MD
 
  
 
function MainBalls(canvas, slider_01, text_01, slider_02, text_02) {
 
function MainBalls(canvas, slider_01, text_01, slider_02, text_02) {
Строка 79: Строка 75:
 
     var a0 = 1;                        // масштаб расстояния (диаметр шара)
 
     var a0 = 1;                        // масштаб расстояния (диаметр шара)
  
    var g0 = a0 / T0 / T0;              // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
 
    var k0 = 2 * Pi / T0;              // масштаб частоты
 
 
     var C0 = m0 * k0 * k0;              // масштаб жесткости
 
     var C0 = m0 * k0 * k0;              // масштаб жесткости
 
     var B0 = 2 * m0 * k0;              // масштаб вязкости
 
     var B0 = 2 * m0 * k0;              // масштаб вязкости
 
+
  var L = 0;
+
var G = 0;
  var G = 0;
+
var G1 = 0;
  var G1 = 0;
+
var G2 = 0;
  var G2 = 0;
 
  
 
     // *** Задание физических параметров ***
 
     // *** Задание физических параметров ***
  
     var Ny = 20;                        // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
+
     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 B = 0.000 * B0;                // вязкость среды*/
 
 
   
 
   
 
     var Bball = 0.01 * B0;              // вязкость между частицами
 
     var Bball = 0.01 * B0;              // вязкость между частицами
 
     var Bwall = 0.03 * B0;              // вязкость на стенках
 
     var Bwall = 0.03 * B0;              // вязкость на стенках
    var mg = 0.25 * m * g0;            // сила тяжести
 
 
     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: Строка 101:
 
     var spf = 100;                      // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
 
     var spf = 100;                      // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
 
     var dt  = 0.045 * T0 / fps;        // шаг интегрирования (качество расчета)
 
     var dt  = 0.045 * T0 / fps;        // шаг интегрирования (качество расчета)
                       
+
                       
 
                        var steps = 0;
 
                       
 
                       
 
 
     // Выполнение программы
 
     // Выполнение программы
  
Строка 122: Строка 108:
 
     var a2 = a * a;                    // ___в целях оптимизации___
 
     var a2 = a * a;                    // ___в целях оптимизации___
 
     var D = a2 * Cball / 72;            // энергия связи между частицами
 
     var D = a2 * Cball / 72;            // энергия связи между частицами
                          var Temp = 0;
+
                          Temp0 = 0.12 * D;
+
var steps = 0;
                          var B1 = 12*Math.sqrt((2*D)/a2);
+
var Temp = 0;
                          var B = 0.026 * B1;
+
Temp0 = 0.12 * D;
                          var betta = 3.5*B;
+
var B1 = 12*Math.sqrt((2*D)/a2);
                         
+
var B = 0.026 * B1;
                          var LJCoeff = 6 * D / a2;          // коэффициент для расчета потенциала Л-Дж
+
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: Строка 123:
 
     var grad;                          // должен ли работать градиент (регулируется в функции setNy())
 
     var grad;                          // должен ли работать градиент (регулируется в функции setNy())
  
  this.set_01 = function(p) {betta = p * B;};
+
this.set_01 = function(p) {betta = p * B;};
  this.set_02 = function(pT) {Temp0 = pT *D;};
+
this.set_02 = function(pT) {Temp0 = pT *D;};
 
+
 
     this.setNy = function(ny) {
 
     this.setNy = function(ny) {
 
         Ny = ny;
 
         Ny = ny;
Строка 160: Строка 148:
 
     };
 
     };
  
  // настройка слайдеров и текстовых полей
+
    // настройка слайдеров и текстовых полей
 
     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: Строка 154:
 
     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(                  // определить график
+
var vGraph1 = new TM_graph(                  // определить график
                  "#vGraph1",                              // на html-элементе #vGraph
+
"#vGraph1",                              // на html-элементе #vGraph
                  20000,                                    // сколько шагов по оси "x" отображается
+
20000,                                    // сколько шагов по оси "x" отображается
                  0, 1,0.1);                            // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
+
0, 1,0.1);                            // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
// график
+
var vGraph2 = new TM_graph(                  // определить график
 
"#vGraph2",                              // на html-элементе #vGraph
 
20000,                                    // сколько шагов по оси "x" отображается
 
0, 19000,1000);                            // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
 
 
 
 
     // Работа с массивом
 
     // Работа с массивом
  
Строка 197: Строка 180:
 
             }
 
             }
 
         }
 
         }
   
+
 
         var b = [];
 
         var b = [];
  
Строка 205: Строка 188:
  
 
       // balls[balls.length] = b;                // добавить элемент в конец массива
 
       // balls[balls.length] = b;                // добавить элемент в конец массива
    balls.push(b);
+
balls.push(b);
 
         return b;
 
         return b;
 
     };
 
     };
 
+
  this.setMy = function() {
+
this.setMy = function() {
    balls = [];
+
  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
+
addNewBall(w*j/Ny + r, h*i/Ny + r , true);                // задаем 50x50
    document.getElementById('ballsNum').innerHTML = balls.length;
+
document.getElementById('ballsNum').innerHTML = balls.length;
    vGraph1.vArray = new Array();
+
}
vGraph2.vArray = new Array();
+
    steps = 0;
 
    G1 = 0;
 
    G2 = 0;
 
  }
 
 
 
 
     // Основной цикл программы
 
     // Основной цикл программы
  
Строка 234: Строка 212:
 
         for (var s = 1; s <= spf; s++) {
 
         for (var s = 1; s <= spf; s++) {
  
L = 0;
+
for (var i0 = 0; i0 < balls.length; i0++) {
 
            // пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами
 
          // for (var i0 = 0; i0 < balls.length; i0++) {
 
          //    balls[i0].vx += - B * balls[i0].vx*dt;
 
          //    balls[i0].vy += -B * balls[i0].vy*dt;
 
          //  }
 
      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);
+
var stat = Math.sqrt(Temp0/Temp);
        balls[i0].vx*=stat;
+
balls[i0].vx*=stat;
        balls[i0].vy*=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: Строка 241:
 
                     // сила взаимодействия
 
                     // сила взаимодействия
 
                     var s2 = a2 / r2;        var s4 = s2 * s2;        // ___в целях оптимизации___
 
                     var s2 = a2 / r2;        var s4 = s2 * s2;        // ___в целях оптимизации___
                        var s8 = s4 * s4;
+
var s8 = s4 * s4;
                        var F = LJCoeff * s8 * s2 * ((aCut - rLen)/(aCut - a));          // сила взаимодействия Леннарда-Джонса
+
var F = LJCoeff * s8 * s2 * ((aCut - rLen)/(aCut - a));          // сила взаимодействия Леннарда-Джонса
                       
+
                        var vx21 = b.vx - b2.vx;    var vy21 = b.vy - b2.vy;    // вектор смотрит на первый шар (b)
+
var vx21 = b.vx - b2.vx;    var vy21 = b.vy - b2.vy;    // вектор смотрит на первый шар (b)
                        var ex = rx / rLen;        var ey = ry / rLen;
+
var ex = rx / rLen;        var ey = ry / rLen;
                        var v = vx21 * ex + vy21 * ey;
+
var v = vx21 * ex + vy21 * ey;
                        F -= betta * ((aCut - rLen)/(aCut - a)) * v * (1/rLen);
+
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;
+
b.vx += Fx;        b.vy += Fy;
          b2.vx -= Fx;        b2.vy -= Fy;
+
b2.vx -= Fx;        b2.vy -= Fy;
  
          G2 += b.vx * b2.vx + b.vy * b2.vy;
+
G2 += b.vx * b2.vx + b.vy * b2.vy;
          G1 += 1;
+
G1 += 1;
         
+
 
                 }
 
                 }
  
Строка 297: Строка 266:
  
 
             }   
 
             }   
      for (var i0 = 0; i0 < balls.length; i0++) {
+
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;
L += Math.abs((balls[i0].x - w/2) * balls[i0].vy) + Math.abs((balls[i0].y - h/2) * balls[i0].vx);
 
 
             }
 
             }
     
+
      G = G2 / G1 / 2/ Temp0/Ny;
+
G = G2 / G1 / 2/ Temp0/Ny;
     
+
      steps++;
+
steps++;
 
             if (steps % 200 == 0) {
 
             if (steps % 200 == 0) {
        vGraph1.graphIter(steps, G);
+
vGraph1.graphIter(steps, (G))}
vGraph2.graphIter(steps, L);
 
      }
 
 
         }
 
         }
 
     }
 
     }
Строка 335: Строка 301:
 
     // Запуск системы
 
     // Запуск системы
 
     this.newSystem();
 
     this.newSystem();
  /*for (var i0 = 0; i0 < balls.length; i0++) {    // задаем частицам случайные скорости
+
/*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){
+
if(!window.requestAnimationFrame){
    window.requestAnimationFrame = (function(){
+
window.requestAnimationFrame = (function(){
      return window.webkitRequestAnimationFrame
+
return window.webkitRequestAnimationFrame
        || window.mozRequestAnimationFrame
+
|| window.mozRequestAnimationFrame
        || window.oRequestAnimationFrame
+
|| window.oRequestAnimationFrame
        || window.msRequestAnimationFrame
+
|| window.msRequestAnimationFrame
        || function(callback, element){window.setTimeout(callback, 1000 / fps);
+
|| function(callback, element){window.setTimeout(callback, 1000 / fps);};
    };
+
})();
  })();
 
 
}
 
}
 
     //setInterval(control, 1000 / fps);
 
     //setInterval(control, 1000 / fps);
  
  function animate(){
+
function animate(){
    requestAnimationFrame(animate);
+
requestAnimationFrame(animate);
    control();
+
control();
  }
+
}
  animate();
+
animate();
    // след. функция обновляет информацию о количестве частиц на поле
 
  //setInterval(function(){document.getElementById('ballsNum').innerHTML = balls.length;}, 1000 / 20);
 
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)