Редактирование: Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[ Курсовые_работы_по_ВМДС:_2016-2017 | Курсовые работы 2016-2017 учебного года]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
+
[[Курсовые работы по МДС: 2016-2017]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
  
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''
Строка 8: Строка 8:
  
 
'''Семестр:''' осень 2016
 
'''Семестр:''' осень 2016
 +
  
 
== Описание задачи ==
 
== Описание задачи ==
[[Файл:KR.png|thumb|Рис.1 Периодическая система ячеек.|450px]]
+
Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом было произведено
Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongational flow) было произведено
 
 
методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами  
 
методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами  
 
описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических
 
описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических
 
граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются,
 
граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются,
относительно вертикального положения (Рис.1).
+
относительно вертикального положения.
 
 
Ниже привеведен код граничных периодических условий Крайника-Реинельта:
 
 
 
 
 
<math> if (x > w - sx) </math>
 
<math>\{x = x - w;\} </math>
 
 
 
<math> if (x < -sx) </math>
 
<math>\{x = x + w;\} </math>
 
 
 
 
 
<math> if (y > h) </math>
 
<math>\{y = y - h;
 
        x = x - sy;\} </math>
 
 
 
<math> if (y < 0) </math>
 
<math>\{y = y + h;
 
        x = x + sy;\} </math>
 
 
 
Где <math>x</math> и <math>у</math> - это координаты частицы, <math>w</math> и <math>h</math> - ширина и высота ячейки периодичности.
 
<math> sx </math> и <math> sy </math> - смещение по x b y при переходе через границы
 
ячейки периодичности.
 
 
 
==Программа==
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/MuschakND/Elongational%20flow/NNN-1.html |width=800 |height=800 |border=0 }}
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"NNNN.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
function main_particle_1(canvas_particle_1,slider_01) {
 
    // Предварительные установки
 
var w_1 = canvas_particle_1.width;          // Ширина рабочего поля
 
    var h_1 = canvas_particle_1.height;        // Высота рабочего поля
 
 
    var w = w_1/3;                                // Ширина ячеки периодичности
 
    var h = h_1/3;         
 
 
var ctx = canvas_particle_1.getContext("2d");
 
   
 
this.newSystem = function() {
 
var w_1 = canvas_particle_1.width;          // Ширина рабочего поля
 
    var h_1 = canvas_particle_1.height;        // Высота рабочего поля
 
 
    var w = w_1 / 3;                                // Ширина ячеки периодичности
 
    var h = h_1 / 3;                                // Высота ячейки периодичности
 
};     
 
  var sh = -10 * 15;
 
  // Наклоненность боковых границ ячеек ее можно менять
 
      this.set_01 = function(o) {sh = 10 * o;};
 
 
 
    // настройка слайдеров и текстовых полей
 
    slider_01.min = -15;              slider_01.max = 15;
 
    slider_01.step = 1;
 
    slider_01.value = sh/10;          // начальное значение ползунка должно задаваться после min и max
 
    text_01.value = sh/10; 
 
 
 
var s  = 0;                                  // предустановка
 
    var s1 = 2/3 * sh;                          // Начальный сдвиг при переходе через гориз. границу
 
    var se = -(2 * sh / h_1) * (h - 0.5 * h_1); // Начальный сдвиг при переходе через верт. границу
 
  var r    = 10;                      // Радиус частиц
 
  var N    = 10;                      // Число частиц можно менять
 
  rx = new Array();                // Содержит координаты частиц по оси Х
 
  ry = new Array();                // Содержит координаты частиц по оси У
 
  rxI0 = new Array();              // Координаты для ячеек перидичностей - клонов
 
  rxI1 = new Array();
 
  rxI2 = new Array();
 
  rxI3 = new Array();
 
  rxI4 = new Array();
 
  rxI5 = new Array();
 
  rxI6 = new Array();
 
  rxI7 = new Array();                         
 
  ryI0 = new Array();
 
  ryI1= new Array();
 
  ryI2= new Array();
 
  ryI3= new Array();
 
  ryI4= new Array();
 
  ryI5= new Array();
 
  ryI6= new Array();
 
  ryI7= new Array();                 
 
  vx = new Array();                //Скорость по Х
 
  vy = new Array();                //Скорость по У
 
  vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array();
 
  var distR0,distR2,distR3,distR;
 
 
 
  L = new Array();              // Кинетический момент
 
  var D = 5;                    // Энергия связи
 
  var a0 = w * 0.1;
 
  var c = 72 * D/r;              // Жесткость связи частиц
 
  var W = Math.sqrt(c);
 
  var T = 2 * Math.PI/W;
 
  dt = 0.03;
 
  //0.04380741654852822
 
 
 
 
 
 
 
 
 
  for (i = 0; i < N/2; ++i) 
 
  {
 
      vx_p[i] = Math.random()*15;
 
      vy_p[i] = Math.random()*15;
 
      vx_m[i] = Math.random()*15;
 
      vy_m[i] = Math.random()*15;
 
      vx = vx_p.concat(vx_m);
 
      vy = vy_p.concat(vy_m);
 
  }
 
 
 
  var kol = 1;
 
  var prx = 0;
 
  var pry = 0;
 
  var dist= 0;
 
  var f;
 
  rx[0] = Math.random() * (w - 10) ;//-s;
 
  ry[0] =  Math.random() * (h - 10);
 
  while (kol < N)
 
  {
 
    f = 0;
 
    prx = Math.random() * (w - 10);//-s;
 
    pry = Math.random() * (h - 10);
 
    for (i = 0; i < kol; i++)
 
    {
 
      dist = Math.pow((rx[i] - prx),2) + Math.pow((ry[i] - pry),2);
 
      if (dist < Math.pow(2 * a0,2))
 
      {
 
        f = f+1;
 
      }
 
    }
 
    if (f==0)
 
    {
 
      rx[kol] = prx;
 
      ry[kol] = pry;
 
      kol++;
 
    }
 
  }
 
 
 
  var steps = 0;
 
 
 
 
 
  function step()
 
  {
 
    tick();
 
    draw();
 
  }
 
  var vGraph = new TM_graph(                        // определить график
 
          "#vGraph",                                // на html-элементе #vGraph
 
          1000,                                      // сколько шагов по оси "x" отображается
 
          -1, 1,0.2);                              // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
 
     
 
  function tick()
 
  {
 
    for (i = 0; i < N ; i++)
 
    { 
 
     
 
      steps += 1;
 
     
 
      rx[i] += vx[i]*dt;
 
      ry[i] += vy[i]*dt;
 
       
 
        s = -(2 * sh / h_1) * (ry[i] - 0.5 * h_1);
 
   
 
  if (rx[i] >= w - s) {rx[i] = rx[i] - w ;}
 
      if (rx[i] <= 0 - s) {rx[i] = rx[i] + w;}
 
     
 
  if (ry[i] >= h)  {ry[i] = ry[i] - h ;
 
                    rx[i]=rx[i]- 2 * se;  }
 
      if (ry[i] <= 0)  {ry[i] = ry[i] + h;
 
                      rx[i]=rx[i]+2*se;  }
 
     
 
        rxI0[i] = rx[i] + w;
 
        ryI0[i] = ry[i];
 
 
 
        rxI3[i] = rx[i] + w +s1;
 
        ryI3[i] = ry[i] + h;
 
       
 
        rxI6[i] = rx[i] + w +s1 +s1;
 
        ryI6[i] = ry[i] + 2*h;
 
       
 
        rxI1[i] = rx[i] + 2*w ;
 
        ryI1[i] = ry[i];
 
       
 
        rxI4[i] = rx[i] + 2*w +s1;
 
        ryI4[i] = ry[i] + h;
 
       
 
        rxI7[i] = rx[i] + 2*w +s1 +s1 ;
 
        ryI7[i] = ry[i] + 2*h;
 
       
 
        rxI2[i] = rx[i] +s1;
 
        ryI2[i] = ry[i] + h;
 
       
 
        rxI5[i] = rx[i] +s1 +s1 ;
 
        ryI5[i] = ry[i] + 2*h;
 
       
 
       
 
       
 
        //раcсчет расстояний
 
       
 
        for (j = 0; j < N ; j++)
 
        {
 
          if (i != j)
 
          {
 
            distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
 
            distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
 
            distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
 
            distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
 
           
 
            //раcсчет сил
 
            a = 4 * r;
 
            if (distR0 < 2*r)
 
            {
 
              var mod_fR0,fxR0,fyR0;
 
 
 
              mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
 
              //console.log(mod_fR0);
 
              if (mod_fR0 >=0)
 
              {
 
                fxR0 = mod_fR0*(rx[i]-rxI0[j]);
 
                fyR0 = mod_fR0*(ry[i]-ryI0[j]);
 
                vx[i]+=fxR0*dt;
 
                vx[j]-=fxR0*dt;
 
                vy[i]+=fyR0*dt;
 
                vy[j]-=fyR0*dt;
 
              }
 
            }
 
            if (distR2 < 2*r)
 
            {
 
              var mod_fR2,fxR2,fyR2;
 
 
 
              mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
 
           
 
              if (mod_fR2 >=0)
 
              {
 
                fxR2 = mod_fR2*(rx[i]-rxI2[j]);
 
                fyR2 = mod_fR2*(ry[i]-ryI2[j]);
 
                vx[i]+=fxR2*dt;
 
                vx[j]-=fxR2*dt;
 
                vy[i]+=fyR2*dt;
 
                vy[j]-=fyR2*dt;
 
              }
 
            }
 
            if (distR3 < 2*r)
 
            {
 
              var mod_fR3,fxR3,fyR3;
 
 
 
              mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
 
             
 
              if (mod_fR3 >=0)
 
              {
 
                fxR3 = mod_fR3*(rx[i]-rxI3[j]);
 
                fyR3 = mod_fR3*(ry[i]-ryI3[j]);
 
                vx[i]+=fxR3*dt;
 
                vx[j]-=fxR3*dt;
 
                vy[i]+=fyR3*dt;
 
                vy[j]-=fyR3*dt;
 
              }
 
            }
 
           
 
            if (distR < 2*r)
 
            {
 
              var mod_fR,fxR,fyR;
 
              mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
 
              if (mod_fR >=0)
 
              {
 
                fxR = mod_fR*(rx[i]-rx[j]);
 
                fyR = mod_fR*(ry[i]-ry[j]);
 
                vx[i]+=fxR*dt;
 
                vx[j]-=fxR*dt;
 
                vy[i]+=fyR*dt;
 
                vy[j]-=fyR*dt;
 
              }
 
            }
 
           
 
  Array.prototype.sum = function()
 
  {
 
  for (var i=0, sum=0; i < this.length; sum += this[i++]);
 
  return sum;
 
  }
 
 
 
           
 
          // L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/6000;
 
            var sumL = L.sum();
 
            //график
 
          // if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
 
            //console.log(sumL);
 
 
 
          }
 
         
 
        }     
 
    }
 
  }
 
       
 
 
 
  function draw()
 
  {
 
    ctx.clearRect(0, 0, w_1+100 , h_1+100);              // очистить экран
 
    for (var i = 0; i < N; i++)
 
     
 
    {
 
      var x = rx[i];         
 
      var y = ry[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(x, y, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
      var xI0 = rxI0[i];         
 
      var yI0 = ryI0[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
  var xI1 = rxI1[i];         
 
      var yI1 = ryI1[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
  var xI2 = rxI2[i];         
 
      var yI2 = ryI2[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
   
 
var xI3 = rxI3[i];         
 
      var yI3 = ryI3[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
   
 
var xI4 = rxI4[i];         
 
      var yI4 = ryI4[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
  var xI5 = rxI5[i];         
 
      var yI5 = ryI5[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
  var xI6 = rxI6[i];         
 
      var yI6 = ryI6[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
  var xI7 = rxI7[i];         
 
      var yI7 = ryI7[i];
 
      ctx.beginPath();
 
      ctx.fillStyle = "#00008B";
 
      ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
 
      ctx.closePath();
 
      ctx.fill();
 
     
 
    }   
 
      ctx.beginPath();                            // начать рисование
 
      ctx.fillStyle="#000000";
 
      ctx.moveTo(w-sh, 0);                            // переместить "карандаш" в точку
 
      ctx.lineTo(w+sh, h_1);                          // нарисовать "карандашом" линию до точки
 
      ctx.stroke();
 
     
 
      ctx.beginPath();
 
      ctx.fillStyle="#000000";   
 
      ctx.moveTo(2 * w-sh, 0);                           
 
      ctx.lineTo(2 * w+sh, h_1);                           
 
      ctx.stroke();
 
     
 
  ctx.beginPath();
 
      ctx.fillStyle="#000000";   
 
      ctx.moveTo( 0- sh, 0);                           
 
      ctx.lineTo(  sh, h_1);                           
 
      ctx.stroke();
 
     
 
      ctx.beginPath();
 
      ctx.fillStyle="#000000";   
 
      ctx.moveTo(w_1 - sh, 0);                           
 
      ctx.lineTo(w_1 + sh, h_1);                           
 
      ctx.stroke();
 
 
 
      ctx.beginPath(); 
 
      ctx.fillStyle="#000000";
 
      ctx.moveTo(0, h);                           
 
      ctx.lineTo(w_1, h);                           
 
      ctx.stroke();
 
     
 
      ctx.beginPath();
 
      ctx.fillStyle="#000000";   
 
      ctx.moveTo(0, 2 * h);                           
 
      ctx.lineTo(w_1, 2 * h);                           
 
      ctx.stroke();
 
  }
 
    // Запуск системы
 
    this.newSystem();
 
  setInterval(step, 1000/120);                      // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
 
   
 
}
 
</syntaxhighlight>
 
</div>
 
==Ссылки по теме==
 
 
 
* Danis J. Evans, Garry Morriss "Statitical mechanics of nonequilibrium liquids", 2008, pages 146-150.
 
* A. M. KRAYNIK  and D. A. REINELT "EXTENSIONAL MOTIONS OF SPATIALLY PERIODIC LATTICES ",1992.
 
* B. D. Todd, Peter J. Daivis "Nonequilibrium Molecular Dynamics Simulations of Planar Elongational Flow with Spatially
 
and Temporally Periodic Boundary Conditions", 1992.
 
* B.D.Todd, Peter J. Daivis "New algorithm for unrestricted duration nonequilibrium molecular dynamics
 
simulations of planar elongational flow", 2003.
 
Вам запрещено изменять защиту статьи. 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:

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